From 5e54d727fc8eecfc578fbf0d2e791aa075ebb102 Mon Sep 17 00:00:00 2001 From: Eric Katzfey Date: Tue, 4 Mar 2025 13:50:45 -0800 Subject: [PATCH] voxl_esc: Limit frequency of UART passthru writes to 20Hz --- src/drivers/actuators/voxl_esc/voxl_esc.cpp | 22 +++++++++++++-------- src/drivers/actuators/voxl_esc/voxl_esc.hpp | 1 + 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/drivers/actuators/voxl_esc/voxl_esc.cpp b/src/drivers/actuators/voxl_esc/voxl_esc.cpp index ec4db9e2d4..099a552a26 100644 --- a/src/drivers/actuators/voxl_esc/voxl_esc.cpp +++ b/src/drivers/actuators/voxl_esc/voxl_esc.cpp @@ -1336,16 +1336,22 @@ bool VoxlEsc::updateOutputs(uint16_t outputs[MAX_ACTUATORS], uint8_t num_writes = 0; - while (_esc_serial_passthru_sub.updated() && (num_writes < 4)) { - mavlink_tunnel_s uart_passthru{}; - _esc_serial_passthru_sub.copy(&uart_passthru); + // Don't do these faster than 20Hz + if (hrt_elapsed_time(&_last_uart_passthru) > 50_ms) { + _last_uart_passthru = hrt_absolute_time(); - if (_uart_port.write(uart_passthru.payload, uart_passthru.payload_length) != uart_passthru.payload_length) { - PX4_ERR("Failed to send mavlink tunnel data to esc"); - return false; + // Don't do more than a few writes each check + while (_esc_serial_passthru_sub.updated() && (num_writes < 4)) { + mavlink_tunnel_s uart_passthru{}; + _esc_serial_passthru_sub.copy(&uart_passthru); + + if (_uart_port.write(uart_passthru.payload, uart_passthru.payload_length) != uart_passthru.payload_length) { + PX4_ERR("Failed to send mavlink tunnel data to esc"); + return false; + } + + num_writes++; } - - num_writes++; } perf_count(_output_update_perf); diff --git a/src/drivers/actuators/voxl_esc/voxl_esc.hpp b/src/drivers/actuators/voxl_esc/voxl_esc.hpp index c5885b20d7..ee8b931f07 100644 --- a/src/drivers/actuators/voxl_esc/voxl_esc.hpp +++ b/src/drivers/actuators/voxl_esc/voxl_esc.hpp @@ -257,6 +257,7 @@ private: Battery _battery; static constexpr unsigned _battery_report_interval{100_ms}; hrt_abstime _last_battery_report_time; + hrt_abstime _last_uart_passthru{0}; bool _device_initialized{false};