From 74c5b1d12c8df71370cd370d4f50b34a4ea31101 Mon Sep 17 00:00:00 2001 From: Bill Finger Date: Tue, 4 Feb 2025 13:41:05 +0300 Subject: [PATCH] Enhance CAN bus scripts with argparse and error handling - Improved error handling in `python_enable_motor.py` by capturing and displaying exception details. - Ensured proper CAN bus shutdown in `python_enable_motor.py` with a `finally` block. - Refactored `python_send_angle.py` to accept a command-line argument for the target angle instead of looping indefinitely. - Refactored `python_send_velocity.py` to accept a command-line argument for target speed and removed infinite loops for better usability. - Added `send_velocity_impulses.py`, a new script to send alternating velocity impulses over the CAN bus. --- .../fw/embed/test/python_enable_motor.py | 11 ++++-- controller/fw/embed/test/python_send_angle.py | 15 ++++---- .../fw/embed/test/python_send_velocity.py | 20 ++++++----- .../fw/embed/test/send_velocity_impulses.py | 35 +++++++++++++++++++ 4 files changed, 64 insertions(+), 17 deletions(-) create mode 100644 controller/fw/embed/test/send_velocity_impulses.py diff --git a/controller/fw/embed/test/python_enable_motor.py b/controller/fw/embed/test/python_enable_motor.py index d42a47c..c491eb7 100644 --- a/controller/fw/embed/test/python_enable_motor.py +++ b/controller/fw/embed/test/python_enable_motor.py @@ -20,12 +20,13 @@ def send_motor_enable(bus, enable): state = "enabled" if enable else "disabled" print(f"Sent message to {state} motor") print(f"Message data: {msg.data}") - except can.CanError: - print("Message failed to send") + except can.CanError as e: + print(f"Message failed to send: {e}") sys.exit(1) # Exit the program on failure def main(): # CAN interface setup + bus = None # Define outside the try block for proper shutdown try: bus = can.interface.Bus(channel='can0', bustype='socketcan', bitrate=1000000) # Ensure the bitrate matches the microcontroller settings print("CAN bus initialized.") @@ -43,5 +44,11 @@ def main(): print(f"Error initializing CAN bus: {e}") sys.exit(1) + finally: + # Ensure the bus is properly shut down + if bus is not None: + bus.shutdown() + print("CAN bus shut down.") + if __name__ == '__main__': main() diff --git a/controller/fw/embed/test/python_send_angle.py b/controller/fw/embed/test/python_send_angle.py index cbb399d..dc23d9b 100644 --- a/controller/fw/embed/test/python_send_angle.py +++ b/controller/fw/embed/test/python_send_angle.py @@ -1,6 +1,7 @@ import can import struct import time +import argparse # Function to send the target angle def send_target_angle(bus, target_angle): @@ -17,18 +18,20 @@ def send_target_angle(bus, target_angle): except can.CanError: print("Message failed to send") +# Main function def main(): + parser = argparse.ArgumentParser(description="Send target angles over CAN bus.") + parser.add_argument("--angle", type=float, required=True, help="Target angle to send over the CAN bus") + args = parser.parse_args() + + target_angle = args.angle + # CAN interface setup bus = can.interface.Bus(channel='can0', bustype='socketcan', bitrate=1000000) # Ensure the bitrate matches the microcontroller settings print("CAN bus initialized, sending target angles...") - # Target angle - target_angle = 0.0 - # Loop to send messages - while True: - send_target_angle(bus, target_angle) - time.sleep(1) # Delay before sending the next message + send_target_angle(bus, target_angle) if __name__ == '__main__': main() diff --git a/controller/fw/embed/test/python_send_velocity.py b/controller/fw/embed/test/python_send_velocity.py index c485085..e01f24f 100644 --- a/controller/fw/embed/test/python_send_velocity.py +++ b/controller/fw/embed/test/python_send_velocity.py @@ -1,6 +1,6 @@ import can import struct -import time +import argparse # Function to send the target speed def send_target_speed(bus, target_speed): @@ -17,18 +17,20 @@ def send_target_speed(bus, target_speed): except can.CanError: print("Message failed to send") +# Main function def main(): + parser = argparse.ArgumentParser(description="Send target speed over CAN bus.") + parser.add_argument("--speed", type=float, required=True, help="Target speed to send over the CAN bus (in m/s)") + args = parser.parse_args() + + target_speed = args.speed + # CAN interface setup bus = can.interface.Bus(channel='can0', bustype='socketcan', bitrate=1000000) # Ensure the bitrate matches the microcontroller settings - print("CAN bus initialized, sending target speeds...") + print("CAN bus initialized, sending target speed...") - # Target speed - target_speed = 0.0 # in meters per second - - # Loop to send messages - while True: - send_target_speed(bus, target_speed) - time.sleep(1) # Delay before sending the next message + # Send the message once + send_target_speed(bus, target_speed) if __name__ == '__main__': main() diff --git a/controller/fw/embed/test/send_velocity_impulses.py b/controller/fw/embed/test/send_velocity_impulses.py new file mode 100644 index 0000000..4d9a21c --- /dev/null +++ b/controller/fw/embed/test/send_velocity_impulses.py @@ -0,0 +1,35 @@ +import can +import struct +import time + +# Function to send the target speed +def send_target_speed(bus, target_speed): + msg = can.Message() + msg.arbitration_id = 1 # Message ID + msg.is_extended_id = False + msg.dlc = 5 # Message length + msg.data = [ord('V')] + list(struct.pack('