diff --git a/robotics_application_manager/manager/launcher/launcher_o3de.py b/robotics_application_manager/manager/launcher/launcher_o3de.py index fce536c..0bb9af1 100644 --- a/robotics_application_manager/manager/launcher/launcher_o3de.py +++ b/robotics_application_manager/manager/launcher/launcher_o3de.py @@ -14,7 +14,6 @@ from robotics_application_manager import LogManager - class LauncherO3de(ILauncher): running: bool = False threads: List[Any] = [] diff --git a/robotics_application_manager/manager/manager.py b/robotics_application_manager/manager/manager.py index 2e6b4f7..2e49bde 100644 --- a/robotics_application_manager/manager/manager.py +++ b/robotics_application_manager/manager/manager.py @@ -686,13 +686,13 @@ def on_change_style(self, event): lxde_conf_dir = os.path.expanduser("~/.config/lxsession/LXDE") lxde_conf_path = os.path.join(lxde_conf_dir, "desktop.conf") os.makedirs(lxde_conf_dir, exist_ok=True) - + # Read existing or create new conf_lines = [] if os.path.exists(lxde_conf_path): with open(lxde_conf_path, "r") as f: conf_lines = f.readlines() - + # Ensure GTK section exists and update theme name gtk_section_found = False for i, line in enumerate(conf_lines): @@ -705,20 +705,23 @@ def on_change_style(self, event): if not gtk_section_found: conf_lines.append("[GTK]\\n") conf_lines.append(f"sNet/ThemeName={gtk_theme}\\n") - + with open(lxde_conf_path, "w") as f: f.writelines(conf_lines) # Reload window manager (Openbox) and LXPanel subprocess.run( - ["bash", "-c", "export DISPLAY=:1; lxpanelctl restart; openbox --reconfigure"], + [ + "bash", + "-c", + "export DISPLAY=:1; lxpanelctl restart; openbox --reconfigure", + ], stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL + stderr=subprocess.DEVNULL, ) except Exception as e: LogManager.logger.exception(f"Error refreshing GTK applications: {e}") - def on_run_application(self, event): """ Handle the 'run_application' event. @@ -763,7 +766,7 @@ def on_run_application(self, event): _, file_extension = os.path.splitext(entrypoint) - if file_extension == ".cpp": + if file_extension == ".cpp" or entrypoint.endswith(".launch.py"): fds = os.listdir("/dev/pts/") console_fd = str(max(map(int, fds[:-1]))) @@ -780,23 +783,37 @@ def on_run_application(self, event): executable="/bin/bash", ) returncode = compile_process.wait() - print(returncode) if returncode != 0: raise Exception("Failed to compile") self.unpause_sim() - self.application_process = subprocess.Popen( - [ - "source /workspace/code/install/setup.bash && ros2 run academy academyCode" - ], - stdin=open("/dev/pts/" + console_fd, "r"), - stdout=open("/dev/pts/" + console_fd, "w"), - stderr=sys.stdout, - bufsize=1024, - universal_newlines=True, - shell=True, - executable="/bin/bash", - ) + if entrypoint.endswith(".launch.py"): + self.application_process = subprocess.Popen( + [ + f"source /workspace/code/install/setup.bash && ros2 launch {entrypoint}" + ], + stdin=open("/dev/pts/" + console_fd, "r"), + stdout=open("/dev/pts/" + console_fd, "w"), + stderr=sys.stdout, + bufsize=1024, + universal_newlines=True, + shell=True, + executable="/bin/bash", + ) + else: + + self.application_process = subprocess.Popen( + [ + "source /workspace/code/install/setup.bash && ros2 run academy academyCode" + ], + stdin=open("/dev/pts/" + console_fd, "r"), + stdout=open("/dev/pts/" + console_fd, "w"), + stderr=sys.stdout, + bufsize=1024, + universal_newlines=True, + shell=True, + executable="/bin/bash", + ) return # Pass the linter diff --git a/test/conftest.py b/test/conftest.py index b7fe9b5..2bf2ca6 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -76,8 +76,13 @@ def stop(self): def manager(monkeypatch): """Fixture to provide a Manager instance with patched dependencies for testing.""" - monkeypatch.setattr("robotics_application_manager.comms.websocket_server.WebsocketServer", DummyServer) - monkeypatch.setattr("robotics_application_manager.manager.manager.ManagerConsumer", DummyConsumer) + monkeypatch.setattr( + "robotics_application_manager.comms.websocket_server.WebsocketServer", + DummyServer, + ) + monkeypatch.setattr( + "robotics_application_manager.manager.manager.ManagerConsumer", DummyConsumer + ) # Patch subprocess.check_output for ROS_DISTRO and IMAGE_TAG def fake_check_output(cmd, *a, **k): @@ -91,14 +96,16 @@ def fake_check_output(cmd, *a, **k): # Patch check_gpu_acceleration where it is used monkeypatch.setattr( - "robotics_application_manager.manager.manager.check_gpu_acceleration", lambda x=None: "OFF" + "robotics_application_manager.manager.manager.check_gpu_acceleration", + lambda x=None: "OFF", ) def dummy_run(self, start_pose=None): print("run around") monkeypatch.setattr( - "robotics_application_manager.manager.launcher.launcher_robot.LauncherRobot.run", dummy_run + "robotics_application_manager.manager.launcher.launcher_robot.LauncherRobot.run", + dummy_run, ) # Patch os.makedirs and os.path.isdir to avoid real FS operations @@ -121,7 +128,9 @@ def run(self): def terminate(self): pass - monkeypatch.setattr("robotics_application_manager.manager.manager.LauncherWorld", DummyLauncherWorld) + monkeypatch.setattr( + "robotics_application_manager.manager.manager.LauncherWorld", DummyLauncherWorld + ) class DummyFileWatchdog: def __init__(self, path, update_callback): @@ -146,7 +155,9 @@ def run(self, consumer): def terminate(self): pass - monkeypatch.setattr("robotics_application_manager.manager.manager.LauncherTools", DummyToolsLauncher) + monkeypatch.setattr( + "robotics_application_manager.manager.manager.LauncherTools", DummyToolsLauncher + ) # Deprecated # monkeypatch.setattr("robotics_application_manager.manager.manager.Server", DummyServer) # monkeypatch.setattr("robotics_application_manager.manager.manager.FileWatchdog", DummyFileWatchdog) diff --git a/test/test_terminate_transitions.py b/test/test_terminate_transitions.py index 5b9b800..4c2a1a4 100644 --- a/test/test_terminate_transitions.py +++ b/test/test_terminate_transitions.py @@ -105,9 +105,7 @@ def test_terminate_tools_invalid_machine_error(manager, monkeypatch): Ensure that the transition raises an error when executed from an invalid state. """ - monkeypatch.setattr( - "robotics_application_manager.libs.server.Server", DummyServer - ) + monkeypatch.setattr("robotics_application_manager.libs.server.Server", DummyServer) # Ensure the manager is in a state where it can stop setup_manager_to_application_running(manager, monkeypatch) diff --git a/test/test_utils.py b/test/test_utils.py index 65ad84f..2d7d485 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -70,7 +70,9 @@ def run(self, consumer=None): def terminate(self): pass - monkeypatch.setattr("robotics_application_manager.manager.manager.LauncherTools", DummyToolsLauncher) + monkeypatch.setattr( + "robotics_application_manager.manager.manager.LauncherTools", DummyToolsLauncher + ) # Trigger visualization ready state manager.trigger( @@ -129,7 +131,8 @@ def fake_open(file, mode="r", *args, **kwargs): ) monkeypatch.setattr("base64.b64decode", lambda s: b"print('hello')") monkeypatch.setattr( - "robotics_application_manager.manager.manager.Manager.unpause_sim", lambda self: None + "robotics_application_manager.manager.manager.Manager.unpause_sim", + lambda self: None, ) # Mock linter to return no errors manager.linter.evaluate_code = lambda code, ros_version: ""