From 81a8a88db75ddc25f71ef230717443011a5552fb Mon Sep 17 00:00:00 2001 From: Julian Oes Date: Tue, 3 Feb 2026 05:31:16 +1300 Subject: [PATCH] msg/mavlink: report up to 12 motors This makes it consistent with the 12 motor output functions. --- msg/EscStatus.msg | 28 ++++++++++++---------- src/modules/mavlink/streams/ESC_INFO.hpp | 17 +++++++------ src/modules/mavlink/streams/ESC_STATUS.hpp | 11 +++++---- 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/msg/EscStatus.msg b/msg/EscStatus.msg index cd98429941..38bdbdc56b 100644 --- a/msg/EscStatus.msg +++ b/msg/EscStatus.msg @@ -1,5 +1,5 @@ uint64 timestamp # time since system start (microseconds) -uint8 CONNECTED_ESC_MAX = 8 # The number of ESCs supported. Current (Q2/2013) we support 8 ESCs +uint8 CONNECTED_ESC_MAX = 12 # The number of ESCs supported (Motor1-Motor12) uint8 ESC_CONNECTION_TYPE_PPM = 0 # Traditional PPM ESC uint8 ESC_CONNECTION_TYPE_SERIAL = 1 # Serial Bus connected ESC @@ -13,16 +13,20 @@ uint16 counter # incremented by the writing thread everyt uint8 esc_count # number of connected ESCs uint8 esc_connectiontype # how ESCs connected to the system -uint8 esc_online_flags # Bitmask indicating which ESC is online/offline -# esc_online_flags bit 0 : Set to 1 if ESC0 is online -# esc_online_flags bit 1 : Set to 1 if ESC1 is online -# esc_online_flags bit 2 : Set to 1 if ESC2 is online -# esc_online_flags bit 3 : Set to 1 if ESC3 is online -# esc_online_flags bit 4 : Set to 1 if ESC4 is online -# esc_online_flags bit 5 : Set to 1 if ESC5 is online -# esc_online_flags bit 6 : Set to 1 if ESC6 is online -# esc_online_flags bit 7 : Set to 1 if ESC7 is online +uint16 esc_online_flags # Bitmask indicating which ESC is online/offline (in motor order) +# esc_online_flags bit 0 : Set to 1 if Motor1 is online +# esc_online_flags bit 1 : Set to 1 if Motor2 is online +# esc_online_flags bit 2 : Set to 1 if Motor3 is online +# esc_online_flags bit 3 : Set to 1 if Motor4 is online +# esc_online_flags bit 4 : Set to 1 if Motor5 is online +# esc_online_flags bit 5 : Set to 1 if Motor6 is online +# esc_online_flags bit 6 : Set to 1 if Motor7 is online +# esc_online_flags bit 7 : Set to 1 if Motor8 is online +# esc_online_flags bit 8 : Set to 1 if Motor9 is online +# esc_online_flags bit 9 : Set to 1 if Motor10 is online +# esc_online_flags bit 10: Set to 1 if Motor11 is online +# esc_online_flags bit 11: Set to 1 if Motor12 is online -uint8 esc_armed_flags # Bitmask indicating which ESC is armed. For ESC's where the arming state is not known (returned by the ESC), the arming bits should always be set. +uint16 esc_armed_flags # Bitmask indicating which ESC is armed (in motor order) -EscReport[8] esc +EscReport[12] esc diff --git a/src/modules/mavlink/streams/ESC_INFO.hpp b/src/modules/mavlink/streams/ESC_INFO.hpp index d4066a2332..bb8f6b3068 100644 --- a/src/modules/mavlink/streams/ESC_INFO.hpp +++ b/src/modules/mavlink/streams/ESC_INFO.hpp @@ -70,7 +70,7 @@ private: uint16_t counter; uint8_t esc_count; uint8_t esc_connectiontype; - uint8_t esc_online_flags; + uint16_t esc_online_flags; }; struct EscInfo { @@ -98,7 +98,7 @@ private: _interface[i].esc_connectiontype = esc.esc_connectiontype; // Capture online_flags, we will map from index to motor number - uint8_t online_flags = esc.esc_online_flags; + uint16_t online_flags = esc.esc_online_flags; _interface[i].esc_online_flags = 0; for (int j = 0; j < esc_status_s::CONNECTED_ESC_MAX; j++) { @@ -108,11 +108,14 @@ private: if (is_motor) { // Map OutputFunction number to index int index = (int)esc.esc[j].actuator_function - esc_report_s::ACTUATOR_FUNCTION_MOTOR1; - _escs[index].online = online_flags & (1 << j); - _escs[index].failure_flags = esc.esc[j].failures; - _escs[index].error_count = esc.esc[j].esc_errorcount; - _escs[index].timestamp = esc.esc[j].timestamp; - _escs[index].temperature = esc.esc[j].esc_temperature * 100.f; + + if (index >= 0 && index < MAX_ESC_OUTPUTS) { + _escs[index].online = online_flags & (1 << j); + _escs[index].failure_flags = esc.esc[j].failures; + _escs[index].error_count = esc.esc[j].esc_errorcount; + _escs[index].timestamp = esc.esc[j].timestamp; + _escs[index].temperature = esc.esc[j].esc_temperature * 100.f; + } } } } diff --git a/src/modules/mavlink/streams/ESC_STATUS.hpp b/src/modules/mavlink/streams/ESC_STATUS.hpp index 925f77ab81..7e04e3441f 100644 --- a/src/modules/mavlink/streams/ESC_STATUS.hpp +++ b/src/modules/mavlink/streams/ESC_STATUS.hpp @@ -90,10 +90,13 @@ private: if (is_motor) { // Map OutputFunction number to index int index = (int)esc.esc[j].actuator_function - esc_report_s::ACTUATOR_FUNCTION_MOTOR1; - _escs[index].timestamp = esc.esc[j].timestamp; - _escs[index].rpm = esc.esc[j].esc_rpm; - _escs[index].voltage = esc.esc[j].esc_voltage; - _escs[index].current = esc.esc[j].esc_current; + + if (index >= 0 && index < MAX_ESC_OUTPUTS) { + _escs[index].timestamp = esc.esc[j].timestamp; + _escs[index].rpm = esc.esc[j].esc_rpm; + _escs[index].voltage = esc.esc[j].esc_voltage; + _escs[index].current = esc.esc[j].esc_current; + } } } }