From acdd5f193daeacc13d1112c8b666a728537b6e6a Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Wed, 15 Nov 2023 09:42:28 -0500 Subject: [PATCH 1/6] backport to humble --- src/pi/pi_main/launch/pi_launch.py | 20 ++++++++--------- src/pi/pi_main/pi_main/install_on_boot.py | 25 +++++++++++++-------- src/pi/pi_main/pi_main/udev_copy.py | 1 + src/pi/pi_main/setup.py | 4 +--- src/pi/pi_main/test/test_install_on_boot.py | 25 +++++++++++++++++++++ 5 files changed, 53 insertions(+), 22 deletions(-) create mode 100644 src/pi/pi_main/test/test_install_on_boot.py diff --git a/src/pi/pi_main/launch/pi_launch.py b/src/pi/pi_main/launch/pi_launch.py index fbb550e4..59460c25 100644 --- a/src/pi/pi_main/launch/pi_launch.py +++ b/src/pi/pi_main/launch/pi_launch.py @@ -9,16 +9,16 @@ def generate_launch_description(): NS = 'pi' - # Manipulator Controller - manip_path: str = get_package_share_directory('manipulators') + # # Manipulator Controller + # manip_path: str = get_package_share_directory('manipulators') - manip_launch = IncludeLaunchDescription( - PythonLaunchDescriptionSource([ - os.path.join( - manip_path, 'launch', 'manip_launch.py' - ) - ]) - ) + # manip_launch = IncludeLaunchDescription( + # PythonLaunchDescriptionSource([ + # os.path.join( + # manip_path, 'launch', 'manip_launch.py' + # ) + # ]) + # ) # Camera Streamer cam_path: str = get_package_share_directory('camera_streamer') @@ -57,7 +57,7 @@ def generate_launch_description(): namespace_launch = GroupAction( actions=[ PushRosNamespace(NS), - manip_launch, + # manip_launch, pixhawk_launch, cam_launch, # realsense_launch diff --git a/src/pi/pi_main/pi_main/install_on_boot.py b/src/pi/pi_main/pi_main/install_on_boot.py index cc0e4bf0..4bae0312 100644 --- a/src/pi/pi_main/pi_main/install_on_boot.py +++ b/src/pi/pi_main/pi_main/install_on_boot.py @@ -1,9 +1,10 @@ import os -import subprocess import sys +import subprocess +import pathlib from ament_index_python.packages import get_package_share_directory -from robot_upstart import Job +from robot_upstart.job import Job def main(): @@ -20,14 +21,20 @@ def main(): os.symlink(launch_src, launch_dst) - udev_script = os.path.join(pi_main_share, 'udev_copy', 'udev_copy.py') + file_location = pathlib.Path(__file__).parent.resolve() + udev_script = os.path.join(file_location, 'udev_copy.py') - major_num = sys.version_info[0] - minor_num = sys.version_info[1] - udev_script = os.path.join(os.path.dirname(os.path.abspath(pi_main_share)), '../', 'lib', - f'python{major_num}.{minor_num}', - 'site-packages', 'pi_main', 'udev_copy.py') - subprocess.call(['/usr/bin/sudo', 'python3', udev_script, pi_main_share]) + cmd = ['/usr/bin/sudo'] + ['/usr/bin/python3'] + [udev_script] + [pi_main_share] + + try: + p = subprocess.run(cmd, capture_output=True, check=True) + # Logs Error + except subprocess.CalledProcessError as e: + print(e.stderr) + sys.exit(1) + + # Success Message + print(p.stdout.decode()) cwrubotix_job = Job(name='cwrubotix_pi', rmw='rmw_cyclonedds_cpp') cwrubotix_job.symlink = True diff --git a/src/pi/pi_main/pi_main/udev_copy.py b/src/pi/pi_main/pi_main/udev_copy.py index 29c0ba17..539eaac4 100644 --- a/src/pi/pi_main/pi_main/udev_copy.py +++ b/src/pi/pi_main/pi_main/udev_copy.py @@ -9,3 +9,4 @@ udev_dst_dir = os.path.join('/etc', 'udev', 'rules.d') shutil.copytree(udev_src_dir, udev_dst_dir, dirs_exist_ok=True) + print("Copying udev rules.") diff --git a/src/pi/pi_main/setup.py b/src/pi/pi_main/setup.py index ecc7df52..d0959413 100644 --- a/src/pi/pi_main/setup.py +++ b/src/pi/pi_main/setup.py @@ -18,9 +18,7 @@ (os.path.join('share', package_name, 'launch'), glob('launch/*launch.[pxy][yma]*')), (os.path.join('share', package_name, 'udev_rules'), - glob('udev_rules/*')), - (os.path.join('share', package_name, 'udev_copy'), - glob('pi_main/udev_copy.py')) + glob('udev_rules/*')) ], install_requires=['setuptools'], zip_safe=True, diff --git a/src/pi/pi_main/test/test_install_on_boot.py b/src/pi/pi_main/test/test_install_on_boot.py new file mode 100644 index 00000000..37c8834a --- /dev/null +++ b/src/pi/pi_main/test/test_install_on_boot.py @@ -0,0 +1,25 @@ +import os + +from pi_main.install_on_boot import main + +ROS_DISTRO = os.getenv("ROS_DISTRO") + +EXPECTED_SYSTEM_FILES = [f"/etc/ros/{ROS_DISTRO}/cwrubotix_pi.d/.installed_files", + f"/etc/ros/{ROS_DISTRO}/cwrubotix_pi.d/pi.launch.py", + "/usr/sbin/cwrubotix_pi-start", + "/usr/sbin/cwrubotix_pi-stop"] + + +def test_install_on_boot(): + """Test that file copying and systemd are made.""" + main() + + # Test for rules files being copied correctly + # Could be split into a septate test but main() does both + actual_rules_files = set(os.listdir(os.path.join("/etc", "udev", "rules.d"))) + expected_rules_files = set(["i2c.rules", "camera.rules", "pixhawk.rules"]) + assert expected_rules_files.issubset(actual_rules_files) + + # Checks for files created by robot_upstart + for file in EXPECTED_SYSTEM_FILES: + assert os.path.isfile(file) From 4247f6b3dfc52409bc1dcd1fede05788ddc93c76 Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Wed, 15 Nov 2023 09:49:12 -0500 Subject: [PATCH 2/6] added back explicit path --- src/pi/pi_main/pi_main/install_on_boot.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/pi/pi_main/pi_main/install_on_boot.py b/src/pi/pi_main/pi_main/install_on_boot.py index 4bae0312..393f4627 100644 --- a/src/pi/pi_main/pi_main/install_on_boot.py +++ b/src/pi/pi_main/pi_main/install_on_boot.py @@ -1,3 +1,4 @@ +from gettext import install import os import sys import subprocess @@ -33,10 +34,13 @@ def main(): print(e.stderr) sys.exit(1) - # Success Message + # Sucess Message print(p.stdout.decode()) - cwrubotix_job = Job(name='cwrubotix_pi', rmw='rmw_cyclonedds_cpp') + install_path = os.path.join(pi_main_share, "..", "..") + workspace_path = os.path.join(install_path, "setup.bash") + cwrubotix_job = Job(name='cwrubotix_pi', rmw='rmw_cyclonedds_cpp', + workspace_setup=workspace_path) cwrubotix_job.symlink = True cwrubotix_job.uninstall() cwrubotix_job.add(package='pi_main', filename='launch/pi.launch.py') From 7c43724b075c46e9b996f9817b527d8fc7392b6b Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Wed, 15 Nov 2023 09:53:34 -0500 Subject: [PATCH 3/6] remove mystery import --- src/pi/pi_main/pi_main/install_on_boot.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pi/pi_main/pi_main/install_on_boot.py b/src/pi/pi_main/pi_main/install_on_boot.py index 393f4627..c5733ba6 100644 --- a/src/pi/pi_main/pi_main/install_on_boot.py +++ b/src/pi/pi_main/pi_main/install_on_boot.py @@ -1,4 +1,3 @@ -from gettext import install import os import sys import subprocess @@ -34,7 +33,7 @@ def main(): print(e.stderr) sys.exit(1) - # Sucess Message + # Success Message print(p.stdout.decode()) install_path = os.path.join(pi_main_share, "..", "..") From 645032cc3433314e8f2e0a1c6811dc1e71d810c9 Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Mon, 20 Nov 2023 17:24:17 -0500 Subject: [PATCH 4/6] added missing type annotation --- src/pi/pi_main/test/test_install_on_boot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pi/pi_main/test/test_install_on_boot.py b/src/pi/pi_main/test/test_install_on_boot.py index 37c8834a..e73554d8 100644 --- a/src/pi/pi_main/test/test_install_on_boot.py +++ b/src/pi/pi_main/test/test_install_on_boot.py @@ -10,7 +10,7 @@ "/usr/sbin/cwrubotix_pi-stop"] -def test_install_on_boot(): +def test_install_on_boot() -> None: """Test that file copying and systemd are made.""" main() From f2f55b1d66f2e413271359931cf15fdee2101ba6 Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Mon, 20 Nov 2023 17:39:18 -0500 Subject: [PATCH 5/6] spelling --- src/pi/pi_main/test/test_install_on_boot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pi/pi_main/test/test_install_on_boot.py b/src/pi/pi_main/test/test_install_on_boot.py index e73554d8..c37ffa54 100644 --- a/src/pi/pi_main/test/test_install_on_boot.py +++ b/src/pi/pi_main/test/test_install_on_boot.py @@ -15,7 +15,7 @@ def test_install_on_boot() -> None: main() # Test for rules files being copied correctly - # Could be split into a septate test but main() does both + # Could be split into a separate test but main() does both actual_rules_files = set(os.listdir(os.path.join("/etc", "udev", "rules.d"))) expected_rules_files = set(["i2c.rules", "camera.rules", "pixhawk.rules"]) assert expected_rules_files.issubset(actual_rules_files) From 5a2b82a6401076203e9afc941bde0729aebd5239 Mon Sep 17 00:00:00 2001 From: Michael Carlstrom Date: Mon, 20 Nov 2023 17:45:58 -0500 Subject: [PATCH 6/6] ben change --- src/pi/pi_main/pi_main/install_on_boot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pi/pi_main/pi_main/install_on_boot.py b/src/pi/pi_main/pi_main/install_on_boot.py index f788ceb0..48808544 100644 --- a/src/pi/pi_main/pi_main/install_on_boot.py +++ b/src/pi/pi_main/pi_main/install_on_boot.py @@ -24,7 +24,7 @@ def main() -> None: file_location = pathlib.Path(__file__).parent.resolve() udev_script = os.path.join(file_location, 'udev_copy.py') - cmd = ['/usr/bin/sudo'] + ['/usr/bin/python3'] + [udev_script] + [pi_main_share] + cmd = ['/usr/bin/sudo', '/usr/bin/python3', udev_script, pi_main_share] try: p = subprocess.run(cmd, capture_output=True, check=True)