diff --git a/src/sailboat_main/sailboat_main/trim_sail/trim_sail.py b/src/sailboat_main/sailboat_main/trim_sail/trim_sail.py index 631f1d0..6e3067e 100644 --- a/src/sailboat_main/sailboat_main/trim_sail/trim_sail.py +++ b/src/sailboat_main/sailboat_main/trim_sail/trim_sail.py @@ -55,7 +55,7 @@ def calculate_sail_angles(self, wind_dir): half_no_go = constants.WIND.NO_GO_WIDTH / 2 # Set the jib on the port side of the boat if we're on the left side of the no-go zone. - jib_side_flag = constants.PHYSICAL.JIB_SIDE_PORT if wind_dir > constants.WIND.NO_GO_CENTER else constants.PHYSICAL.JIB_SIDE_STB + jib_side_flag = constants.PHYSICAL.JIB_SIDE_PORT if wind_dir < constants.WIND.NO_GO_CENTER else constants.PHYSICAL.JIB_SIDE_STB # No longer care about side: map angles on the left side of the no-go zone symmetrically to the right side. if 180 < wind_dir < 360: wind_dir = 360 - wind_dir @@ -63,6 +63,7 @@ def calculate_sail_angles(self, wind_dir): if wind_dir > (constants.WIND.NO_GO_CENTER - half_no_go): # In the no-go zone. mainsail_angle = constants.PHYSICAL.MAINSAIL_MIN_ANGLE jib_angle = constants.PHYSICAL.JIB_MIN_ANGLE + self.get_logger().info(f"=== BOAT IN IRONS. ===") else: # Not in no-go zone: linearly map wind direction to sail angles. mainsail_angle = int(np.interp(wind_dir, [0, constants.WIND.NO_GO_CENTER - half_no_go], [constants.PHYSICAL.MAINSAIL_MAX_ANGLE, constants.PHYSICAL.MAINSAIL_MIN_ANGLE])) diff --git a/teensy/src/Control Tasks/SerialControlTask.cpp b/teensy/src/Control Tasks/SerialControlTask.cpp index f9b342c..5e39b16 100644 --- a/teensy/src/Control Tasks/SerialControlTask.cpp +++ b/teensy/src/Control Tasks/SerialControlTask.cpp @@ -2,18 +2,14 @@ SerialControlTask::SerialControlTask() : last_telemetry_send_time(0), current_time(0), send_telemetry(false) {} -void SerialControlTask::execute() -{ - if (current_time - last_telemetry_send_time >= constants::serial::TX_PERIOD_MS) - { - send_telemetry = true; - } - if (send_telemetry) - { - uint8_t data[] = { +void SerialControlTask::execute() { + if (current_time - last_telemetry_send_time >= constants::serial::TX_PERIOD_MS) send_telemetry = true; + + if (send_telemetry) { + const uint8_t data[] = { constants::serial::TX_START_FLAG, - static_cast((uint8_t)(sfr::anemometer::wind_angle >> 8)), - static_cast((uint8_t)(sfr::anemometer::wind_angle & 0xFF)), + static_cast(sfr::anemometer::wind_angle >> 8), + static_cast(sfr::anemometer::wind_angle & 0xFF), sfr::servo::mainsail_angle, sfr::servo::rudder_angle, sfr::servo::jib_angle, @@ -21,10 +17,9 @@ void SerialControlTask::execute() sfr::serial::dropped_packets, constants::serial::TX_END_FLAG }; - last_telemetry_send_time = millis(); Serial.write(data, sizeof(data)); send_telemetry = false; } current_time = millis(); -} \ No newline at end of file +} diff --git a/teensy/src/Control Tasks/SerialControlTask.hpp b/teensy/src/Control Tasks/SerialControlTask.hpp index 296620b..2aa50d1 100644 --- a/teensy/src/Control Tasks/SerialControlTask.hpp +++ b/teensy/src/Control Tasks/SerialControlTask.hpp @@ -10,4 +10,4 @@ class SerialControlTask { uint32_t last_telemetry_send_time; uint32_t current_time; bool send_telemetry; -}; \ No newline at end of file +}; diff --git a/teensy/src/Control Tasks/ServoControlTask.cpp b/teensy/src/Control Tasks/ServoControlTask.cpp index 9b4ae75..92ed3f1 100644 --- a/teensy/src/Control Tasks/ServoControlTask.cpp +++ b/teensy/src/Control Tasks/ServoControlTask.cpp @@ -12,59 +12,32 @@ ServoControlTask::ServoControlTask() { // Pre-set the rudder to center and all sail servos to "all-out" (for manual setup). actuate_servo(rudder_servo, constants::servo::RUDDER_MID_PULSE); actuate_servo(mainsail_servo, constants::servo::MAINSAIL_MIN_PULSE); - actuate_servo(jib_port_servo, constants::servo::JIB_PORT_MIN_PULSE); - actuate_servo(jib_stb_servo, constants::servo::JIB_STB_MIN_PULSE); + actuate_servo(jib_port_servo, constants::servo::JIB_PORT_MAX_PULSE); + actuate_servo(jib_stb_servo, constants::servo::JIB_STB_MAX_PULSE); } /** - * Updates the servos if valid serial data is ready and waiting. - * Radio mode (radio_flag != 0) takes priority over Jetson/ROS mode. + * Update the servos if valid data is ready and waiting.

+ * Note that radio mode ( \code radio_flag != 0\endcode ) takes priority over Jetson/ROS mode. Flags differ between + * modes, but the resultant servo behavior should be identical. * - * Radio buffer layout: [radio_flag, mainsail_angle, rudder_angle, jib_angle, jib_side_flag] - * ROS buffer layout: [mainsail_angle, rudder_angle, jib_angle, jib_side_flag] + * - Radio buffer layout: [radio_flag, mainsail_angle, rudder_angle, jib_angle, jib_side_flag] + * - ROS buffer layout: [mainsail_angle, rudder_angle, jib_angle, jib_side_flag] */ void ServoControlTask::execute() { - - // RADIO MODE - if (sfr::serial::radio_flag != 0) { + if (sfr::serial::radio_flag != 0) { // RADIO MODE. if (!sfr::serial::update_servos_radio) return; - - const uint8_t mainsail_angle = sfr::serial::radio_buffer[1]; - const uint8_t rudder_angle = sfr::serial::radio_buffer[2]; - const uint8_t jib_angle = sfr::serial::radio_buffer[3]; - const uint8_t jib_side_flag = sfr::serial::radio_buffer[4]; - - if (mainsail_angle >= constants::servo::MAINSAIL_MIN_ANGLE && mainsail_angle <= constants::servo::MAINSAIL_MAX_ANGLE) - sfr::servo::radio_sail_angle = mainsail_angle; - if (rudder_angle >= constants::servo::RUDDER_MIN_ANGLE && rudder_angle <= constants::servo::RUDDER_MAX_ANGLE) - sfr::servo::radio_rudder_angle = rudder_angle; - - apply_commands(mainsail_angle, rudder_angle, jib_angle, jib_side_flag); + apply_commands(sfr::serial::radio_buffer[1], sfr::serial::radio_buffer[2], + sfr::serial::radio_buffer[3], sfr::serial::radio_buffer[4]); sfr::serial::update_servos_radio = false; - - // Jetson (ROS) mode - } else { - if (!sfr::serial::update_servos_ros) return; - - const uint8_t mainsail_angle = sfr::serial::ros_buffer[0]; - const uint8_t rudder_angle = sfr::serial::ros_buffer[1]; - const uint8_t jib_angle = sfr::serial::ros_buffer[2]; - const uint8_t jib_side_flag = sfr::serial::ros_buffer[3]; - - if (mainsail_angle >= constants::servo::MAINSAIL_MIN_ANGLE && mainsail_angle <= constants::servo::MAINSAIL_MAX_ANGLE) - sfr::servo::ros_sail_angle = mainsail_angle; - if (rudder_angle >= constants::servo::RUDDER_MIN_ANGLE && rudder_angle <= constants::servo::RUDDER_MAX_ANGLE) - sfr::servo::ros_rudder_angle = rudder_angle; - - apply_commands(mainsail_angle, rudder_angle, jib_angle, jib_side_flag); + } else if (sfr::serial::update_servos_ros) { // JETSON (ROS) MODE. + apply_commands(sfr::serial::ros_buffer[0], sfr::serial::ros_buffer[1], + sfr::serial::ros_buffer[2], sfr::serial::ros_buffer[3]); sfr::serial::update_servos_ros = false; } } -/** - * Applies commands to servos based on flags inputted. Flags differ if reciving an input from ROS - * or from radio, but resultant servo behavior should be identical. - **/ +/** A utility method to actually apply values to servos, based on the received data and if checks on the data pass. */ void ServoControlTask::apply_commands(const uint8_t mainsail_angle, const uint8_t rudder_angle, const uint8_t jib_angle, const uint8_t jib_side_flag) { if (mainsail_angle >= constants::servo::MAINSAIL_MIN_ANGLE && mainsail_angle <= constants::servo::MAINSAIL_MAX_ANGLE) { @@ -83,13 +56,13 @@ void ServoControlTask::apply_commands(const uint8_t mainsail_angle, const uint8_ sfr::servo::jib_side_flag = jib_side_flag; if (jib_side_flag == constants::servo::JIB_SIDE_PORT) { - sfr::servo::jib_stb_pwm = constants::servo::JIB_STB_MIN_PULSE; - actuate_servo(jib_stb_servo, constants::servo::JIB_STB_MIN_PULSE); + sfr::servo::jib_stb_pwm = constants::servo::JIB_STB_MAX_PULSE; + actuate_servo(jib_stb_servo, constants::servo::JIB_STB_MAX_PULSE); sfr::servo::jib_port_pwm = jib_to_pwm(jib_angle, jib_side_flag); actuate_servo(jib_port_servo, sfr::servo::jib_port_pwm); } else { - sfr::servo::jib_port_pwm = constants::servo::JIB_PORT_MIN_PULSE; - actuate_servo(jib_port_servo, constants::servo::JIB_PORT_MIN_PULSE); + sfr::servo::jib_port_pwm = constants::servo::JIB_PORT_MAX_PULSE; + actuate_servo(jib_port_servo, constants::servo::JIB_PORT_MAX_PULSE); sfr::servo::jib_stb_pwm = jib_to_pwm(jib_angle, jib_side_flag); actuate_servo(jib_stb_servo, sfr::servo::jib_stb_pwm); } @@ -112,15 +85,13 @@ uint32_t ServoControlTask::rudder_to_pwm(const uint8_t angle) { * @return the PWM to actuate \code mainsail_servo\endcode to. */ uint32_t ServoControlTask::mainsail_to_pwm(const uint8_t angle) { - const uint32_t delta = law_of_cos_map(angle, + const uint32_t new_pwm = law_of_cos_map(angle, constants::servo::TWO_BOOM_LEN_SQD_CM, constants::servo::MAINSAIL_PULSE_PER_TURN, constants::servo::MAINSAIL_WHEEL_CIRCUM_CM, true - ); - constexpr uint32_t range = constants::servo::MAINSAIL_MAX_PULSE - constants::servo::MAINSAIL_MIN_PULSE; - if (delta >= range) return constants::servo::MAINSAIL_MAX_PULSE; - return constants::servo::MAINSAIL_MIN_PULSE + delta; + ) + constants::servo::MAINSAIL_MIN_PULSE; + return new_pwm <= constants::servo::MAINSAIL_MAX_PULSE ? new_pwm : constants::servo::MAINSAIL_MAX_PULSE; } /** Maps a goal sail angle for the jib to a PWM value (for one of the two jib servos). @@ -136,15 +107,13 @@ uint32_t ServoControlTask::jib_to_pwm(const uint8_t angle, const uint8_t jib_sid constants::servo::JIB_PORT_MIN_PULSE : constants::servo::JIB_STB_MIN_PULSE; const uint32_t max_pulse = (jib_side_flag == constants::servo::JIB_SIDE_PORT) ? constants::servo::JIB_PORT_MAX_PULSE : constants::servo::JIB_STB_MAX_PULSE; - const uint32_t delta = law_of_cos_map(angle, + const uint32_t new_pwm = law_of_cos_map(angle, constants::servo::TWO_JIB_FOOT_LEN_SQD_CM, constants::servo::JIB_PULSE_PER_TURN, wheel_circum, false - ); - const uint32_t range = max_pulse - min_pulse; - if (delta >= range) return max_pulse; - return min_pulse + delta; + ) + min_pulse; + return new_pwm <= max_pulse ? new_pwm : max_pulse; } /** Send \code pwm\endcode to \code servo\endcode, thereby changing \code servo\endcode 's angle. */ @@ -169,11 +138,12 @@ void ServoControlTask::actuate_servo(Servo &servo, const uint32_t pwm) { * apply the Pythagorean theorem on the right triangle formed by "c", the initial distance from the deck to the * boom, and the actual mainsheet, to obtain the actual goal length of the mainsheet. * - We model similarly for the jib (note that this is less accurate as there is no "boom" for the jib, and it is - * therefore harder to quantify a triangle or angles in general). + * therefore harder to quantify a triangle or angles in general. This is why we multiply by a slight fractional offset + * when trimming the jib). * - "angle" refers to the goal angle we want the jib to be set to. * - We approximate "b" as the length of the foot of the jib. * - Here, "c" on its own is approximately the length of the sheet, which is what we want to solve for. - * - In either case, our final \code sheet_len\endcode value maps to a PWM value based on the specific servo and + * - In either case, this final \code sheet_len\endcode value will map to a PWM value based on the specific servo and * the circumference of its wheel. * * Note that this method assumes that the max PWM value of the servo in question allows for the sail to be set to @@ -183,7 +153,7 @@ uint32_t ServoControlTask::law_of_cos_map(const uint8_t angle, const uint32_t tw const float wheel_circum, const bool mainsail) { const float c_squared = static_cast(two_b_sqd) * (1 - cosf(static_cast(angle) * 0.017453f)); // 0.017453 = pi/180. const float sheet_len = mainsail ? sqrtf(c_squared + constants::servo::MAINSAIL_INITIAL_SQD_CM) - constants::servo::MAINSAIL_INITIAL_CM - : sqrtf(c_squared); + : sqrtf(c_squared) * 0.85f; - return static_cast(PWM_per_turn * (sheet_len / wheel_circum)); // PWM: (PWM_per_turn * turns_needed). + return static_cast(PWM_per_turn * (sheet_len / wheel_circum)); // PWM: (PWM_per_turn * turns_needed). } diff --git a/teensy/src/Control Tasks/ServoControlTask.hpp b/teensy/src/Control Tasks/ServoControlTask.hpp index 61dd697..fbb4709 100644 --- a/teensy/src/Control Tasks/ServoControlTask.hpp +++ b/teensy/src/Control Tasks/ServoControlTask.hpp @@ -18,6 +18,6 @@ class ServoControlTask { static uint32_t jib_to_pwm(uint8_t angle, uint8_t jib_side_flag); static void actuate_servo(Servo &servo, uint32_t pwm); - static uint32_t law_of_cos_map(uint8_t angle, uint32_t two_b_sqd, float PWM_per_turn, float wheel_circum, bool mainsail); void apply_commands(uint8_t mainsail_angle, uint8_t rudder_angle, uint8_t jib_angle, uint8_t jib_side_flag); -}; \ No newline at end of file + static uint32_t law_of_cos_map(uint8_t angle, uint32_t two_b_sqd, float PWM_per_turn, float wheel_circum, bool mainsail); +}; diff --git a/teensy/src/MainControlLoop.cpp b/teensy/src/MainControlLoop.cpp index 116516f..714446e 100644 --- a/teensy/src/MainControlLoop.cpp +++ b/teensy/src/MainControlLoop.cpp @@ -1,13 +1,7 @@ #include "MainControlLoop.hpp" -MainControlLoop::MainControlLoop() - : anemometer_monitor(), - radio_serial_monitor(), - ros_serial_monitor(), - servo_control_task(), - serial_control_task() -{ - +MainControlLoop::MainControlLoop() : anemometer_monitor(), radio_serial_monitor(), ros_serial_monitor(), + servo_control_task(), serial_control_task() { delay(1000); } @@ -17,4 +11,4 @@ void MainControlLoop::execute() { ros_serial_monitor.execute(); servo_control_task.execute(); serial_control_task.execute(); -} \ No newline at end of file +} diff --git a/teensy/src/MainControlLoop.hpp b/teensy/src/MainControlLoop.hpp index dd72922..890d9b4 100644 --- a/teensy/src/MainControlLoop.hpp +++ b/teensy/src/MainControlLoop.hpp @@ -17,4 +17,4 @@ class MainControlLoop { ROSSerialMonitor ros_serial_monitor; ServoControlTask servo_control_task; SerialControlTask serial_control_task; -}; \ No newline at end of file +}; diff --git a/teensy/src/Monitors/AnemometerMonitor.cpp b/teensy/src/Monitors/AnemometerMonitor.cpp index 0601911..bbf1acf 100644 --- a/teensy/src/Monitors/AnemometerMonitor.cpp +++ b/teensy/src/Monitors/AnemometerMonitor.cpp @@ -8,4 +8,4 @@ void AnemometerMonitor::execute() { // Note that 0.35191 = 360/1023 -- maps analogRead() range of 0-1023 to 0-360 degrees. sfr::anemometer::wind_angle = static_cast(0.35191 * analogRead(constants::anemometer::ANEMOMETER_PIN)); //Serial.println(sfr::anemometer::wind_angle); // Print for testing. -} \ No newline at end of file +} diff --git a/teensy/src/Monitors/ROSSerialMonitor.cpp b/teensy/src/Monitors/ROSSerialMonitor.cpp index abf387d..b98b1aa 100644 --- a/teensy/src/Monitors/ROSSerialMonitor.cpp +++ b/teensy/src/Monitors/ROSSerialMonitor.cpp @@ -30,8 +30,8 @@ void ROSSerialMonitor::execute() // Decode ROS packet: [sail, rudder] sfr::serial::update_servos_ros = true; - sfr::servo::ros_sail_angle = sfr::serial::ros_buffer[0]; - sfr::servo::ros_rudder_angle = sfr::serial::ros_buffer[1]; + // sfr::servo::ros_sail_angle = sfr::serial::ros_buffer[0]; //todo delete + // sfr::servo::ros_rudder_angle = sfr::serial::ros_buffer[1]; //todo delete } else if (packet_started) { diff --git a/teensy/src/Monitors/RadioSerialMonitor.cpp b/teensy/src/Monitors/RadioSerialMonitor.cpp index be4168c..4d57620 100644 --- a/teensy/src/Monitors/RadioSerialMonitor.cpp +++ b/teensy/src/Monitors/RadioSerialMonitor.cpp @@ -44,8 +44,8 @@ void RadioSerialMonitor::execute() // Decode RADIO packet: [radio_flag, mainsail_angle, rudder_angle, jib_angle, jib_side_flag] sfr::serial::radio_flag = sfr::serial::radio_buffer[0]; - sfr::servo::radio_sail_angle = sfr::serial::radio_buffer[1]; - sfr::servo::radio_rudder_angle = sfr::serial::radio_buffer[2]; + // sfr::servo::radio_sail_angle = sfr::serial::radio_buffer[1]; //todo delete + // sfr::servo::radio_rudder_angle = sfr::serial::radio_buffer[2]; //todo delete sfr::serial::update_servos_radio = true; } else if (packet_started) diff --git a/teensy/src/Monitors/RadioSerialMonitor.hpp b/teensy/src/Monitors/RadioSerialMonitor.hpp index c2d0ee8..5a4048f 100644 --- a/teensy/src/Monitors/RadioSerialMonitor.hpp +++ b/teensy/src/Monitors/RadioSerialMonitor.hpp @@ -1,11 +1,8 @@ #pragma once - #include #include "sfr.hpp" -#include "constants.hpp" -class RadioSerialMonitor -{ +class RadioSerialMonitor { public: RadioSerialMonitor(); void execute(); diff --git a/teensy/src/constants.hpp b/teensy/src/constants.hpp index 15cf967..1a0fd38 100644 --- a/teensy/src/constants.hpp +++ b/teensy/src/constants.hpp @@ -5,18 +5,20 @@ namespace constants { namespace anemometer { constexpr uint8_t ANEMOMETER_PIN = 18; } - /** PHYSICAL SERVO NOTES FROM 2025-2026 SEASON: - * - All servos can go from 600 PWM (a "minimum angle") to 2400 PWM (a "maximum angle"). + /** PHYSICAL SERVO NOTES AND CONVENTIONS FROM 2025-2026 SEASON: + * - All servos can go from 600 PWM (a "SMALL" angle) to 2400 PWM (a "LARGE" angle). + * - In general, we choose 800 as a baseline PWM to represent a minimum angle so that, just in case something + * physical changes on the boat, we can recalibrate the PWM that corresponds to this angle by dipping below this + * baseline (until reaching \code SERVO_MIN_PULSE\endcode), and avoiding needing to re-screw the servos. * - Rudder: This servo can turn 0.5 times, but mech did something to cut this in half, so that the rudder will only * go from -45 degrees (600 PWM) to 45 degrees (2400 PWM). * - Mainsail: This servo can turn 7.85 times. - * - Jib: We have two servos; one for each side of the boat. Both servos can turn 7.85 times. + * - Jib: We have two servos, one for each side of the boat. Both servos can turn 7.85 times. * - * NOTE: Anything labeled TODO is ones that will be made runtime-changable over the mobile app. This - * functionality is not implemented yet + * NOTE: Any constants that are labeled TODO are ones that will be made runtime-changeable over the mobile app. This + * functionality is not yet implemented. */ namespace servo { - constexpr uint8_t RUDDER_PIN = 4; constexpr uint8_t MAINSAIL_PIN = 3; constexpr uint8_t JIB_PORT_PIN = 5; @@ -25,17 +27,17 @@ namespace constants { constexpr uint32_t SERVO_MIN_PULSE = 600; constexpr uint32_t SERVO_MAX_PULSE = 2400; - constexpr uint32_t RUDDER_MIN_PULSE = 600; //TODO - constexpr uint32_t RUDDER_MAX_PULSE = 2400; //TODO + constexpr uint32_t RUDDER_MIN_PULSE = 600; //TODO + constexpr uint32_t RUDDER_MAX_PULSE = 2400; //TODO - constexpr uint32_t JIB_PORT_MIN_PULSE = 600; //TODO - constexpr uint32_t JIB_PORT_MAX_PULSE = 1700; //TODO + constexpr uint32_t JIB_PORT_MIN_PULSE = 750; //TODO + constexpr uint32_t JIB_PORT_MAX_PULSE = 1750; //TODO - constexpr uint32_t JIB_STB_MIN_PULSE = 600; //TODO - constexpr uint32_t JIB_STB_MAX_PULSE = 1600; //TODO + constexpr uint32_t JIB_STB_MIN_PULSE = 850; //TODO + constexpr uint32_t JIB_STB_MAX_PULSE = 2200; //TODO - constexpr uint32_t MAINSAIL_MIN_PULSE = 650; - constexpr uint32_t MAINSAIL_MAX_PULSE = 2100; + constexpr uint32_t MAINSAIL_MIN_PULSE = 700; + constexpr uint32_t MAINSAIL_MAX_PULSE = 1800; constexpr uint8_t RUDDER_MIN_ANGLE = 0; // (2025-2026) 0-90 range = -45 to +45 degrees. //TODO constexpr uint8_t RUDDER_MAX_ANGLE = 90; //TODO @@ -49,7 +51,7 @@ namespace constants { constexpr float MAINSAIL_WHEEL_CIRCUM_CM = 16.242; // (2025-2026) Diameter: 5.17cm. //TODO constexpr float MAINSAIL_PULSE_PER_TURN = (SERVO_MAX_PULSE - SERVO_MIN_PULSE) / 7.85; - constexpr uint8_t JIB_MIN_ANGLE = 0; //TODO + constexpr uint8_t JIB_MIN_ANGLE = 0; //TODO constexpr uint8_t JIB_MAX_ANGLE = 90; //TODO constexpr uint32_t TWO_JIB_FOOT_LEN_SQD_CM = 2 * 60 * 60; // (2025-2026) Jib foot length is 60cm. //TODO constexpr float JIB_PORT_WHEEL_CIRCUM_CM = 16.242; // (2025-2026) Diameter: 5.17cm. //TODO @@ -81,7 +83,10 @@ namespace constants { constexpr uint32_t BAUD_RATE = 9600; } + namespace radio { + constexpr uint8_t BUFFER_LEN = 5; + } namespace led { constexpr uint8_t LED_PIN = 13; } -} \ No newline at end of file +} diff --git a/teensy/src/main.cpp b/teensy/src/main.cpp index ec4d20c..17a1b0e 100644 --- a/teensy/src/main.cpp +++ b/teensy/src/main.cpp @@ -2,12 +2,11 @@ MainControlLoop mcl; -void setup() -{ - Serial.begin(constants::serial::BAUD_RATE); // Jetson via USB - Serial2.begin(constants::serial::BAUD_RATE); // XBee on pins 7/8 +void setup(){ + Serial.begin(constants::serial::BAUD_RATE); // The Jetson via USB. + Serial2.begin(constants::serial::BAUD_RATE); // The XBee on pins 7/8. } void loop() { mcl.execute(); -} \ No newline at end of file +} diff --git a/teensy/src/sfr.cpp b/teensy/src/sfr.cpp index 7f009da..9274908 100644 --- a/teensy/src/sfr.cpp +++ b/teensy/src/sfr.cpp @@ -15,18 +15,13 @@ namespace sfr { uint32_t mainsail_pwm = 0; uint32_t jib_port_pwm = 0; uint32_t jib_stb_pwm = 0; - - uint8_t radio_sail_angle = 0; - uint8_t radio_rudder_angle = 0; - uint8_t ros_sail_angle = 0; - uint8_t ros_rudder_angle = 0; } namespace serial { bool update_servos_radio = false; bool update_servos_ros = false; uint8_t dropped_packets = 0; uint8_t ros_buffer[constants::serial::BUFFER_LEN] = {}; - uint8_t radio_buffer[5] = {0}; + uint8_t radio_buffer[constants::radio::BUFFER_LEN] = {}; uint8_t radio_flag = 1; } } diff --git a/teensy/src/sfr.hpp b/teensy/src/sfr.hpp index dda260c..3dd35d6 100644 --- a/teensy/src/sfr.hpp +++ b/teensy/src/sfr.hpp @@ -17,18 +17,13 @@ namespace sfr { extern uint32_t mainsail_pwm; extern uint32_t jib_port_pwm; extern uint32_t jib_stb_pwm; - - extern uint8_t radio_sail_angle; - extern uint8_t radio_rudder_angle; - extern uint8_t ros_sail_angle; - extern uint8_t ros_rudder_angle; } namespace serial { extern bool update_servos_radio; extern bool update_servos_ros; extern uint8_t dropped_packets; extern uint8_t ros_buffer[constants::serial::BUFFER_LEN]; - extern uint8_t radio_buffer[5]; + extern uint8_t radio_buffer[constants::radio::BUFFER_LEN]; extern uint8_t radio_flag; } }