From 88b5523d475af6b17ee0766890e71bc63a3cb4ce Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 30 Nov 2020 10:47:32 +1100 Subject: [PATCH] AP_UAVCAN: added logging of UAVCAN LogMessage messages this allows us to log internal errors from nodes into main flight controller log --- libraries/AP_UAVCAN/AP_UAVCAN.cpp | 27 +++++++++++++++++++++++++++ libraries/AP_UAVCAN/AP_UAVCAN.h | 4 +++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/libraries/AP_UAVCAN/AP_UAVCAN.cpp b/libraries/AP_UAVCAN/AP_UAVCAN.cpp index e1b6b2b0cc..ec874eeabe 100644 --- a/libraries/AP_UAVCAN/AP_UAVCAN.cpp +++ b/libraries/AP_UAVCAN/AP_UAVCAN.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -129,6 +130,10 @@ static uavcan::Subscriber UC_REGISTRY_BINDER(ESCStatusCb, uavcan::equipment::esc::Status); static uavcan::Subscriber *esc_status_listener[HAL_MAX_CAN_PROTOCOL_DRIVERS]; +// handler DEBUG +UC_REGISTRY_BINDER(DebugCb, uavcan::protocol::debug::LogMessage); +static uavcan::Subscriber *debug_listener[HAL_MAX_CAN_PROTOCOL_DRIVERS]; + AP_UAVCAN::esc_data AP_UAVCAN::_escs_data[]; HAL_Semaphore AP_UAVCAN::_telem_sem; @@ -302,6 +307,11 @@ void AP_UAVCAN::init(uint8_t driver_index, bool enable_filters) if (esc_status_listener[driver_index]) { esc_status_listener[driver_index]->start(ESCStatusCb(this, &handle_ESC_status)); } + + debug_listener[driver_index] = new uavcan::Subscriber(*_node); + if (debug_listener[driver_index]) { + debug_listener[driver_index]->start(DebugCb(this, &handle_debug)); + } _led_conf.devices_count = 0; if (enable_filters) { @@ -871,4 +881,21 @@ bool AP_UAVCAN::is_esc_data_index_valid(const uint8_t index) { return true; } +/* + handle LogMessage debug + */ +void AP_UAVCAN::handle_debug(AP_UAVCAN* ap_uavcan, uint8_t node_id, const DebugCb &cb) +{ +#ifndef HAL_NO_LOGGING + const auto &msg = *cb.msg; + if (AP::can().get_log_level() != AP_CANManager::LOG_NONE) { + // log to onboard log and mavlink + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "CAN[%u] %s", node_id, msg.text.c_str()); + } else { + // only log to onboard log + AP::logger().Write_MessageF("CAN[%u] %s", node_id, msg.text.c_str()); + } +#endif +} + #endif // HAL_NUM_CAN_IFACES diff --git a/libraries/AP_UAVCAN/AP_UAVCAN.h b/libraries/AP_UAVCAN/AP_UAVCAN.h index 7bfd3bd33a..abce884e91 100644 --- a/libraries/AP_UAVCAN/AP_UAVCAN.h +++ b/libraries/AP_UAVCAN/AP_UAVCAN.h @@ -56,6 +56,7 @@ class ButtonCb; class TrafficReportCb; class ActuatorStatusCb; class ESCStatusCb; +class DebugCb; #if defined(__GNUC__) && (__GNUC__ > 8) #define DISABLE_W_CAST_FUNCTION_TYPE_PUSH \ @@ -241,12 +242,13 @@ private: // safety status send state uint32_t _last_safety_state_ms; - // safety button handling + // incoming button handling static void handle_button(AP_UAVCAN* ap_uavcan, uint8_t node_id, const ButtonCb &cb); static void handle_traffic_report(AP_UAVCAN* ap_uavcan, uint8_t node_id, const TrafficReportCb &cb); static void handle_actuator_status(AP_UAVCAN* ap_uavcan, uint8_t node_id, const ActuatorStatusCb &cb); static void handle_ESC_status(AP_UAVCAN* ap_uavcan, uint8_t node_id, const ESCStatusCb &cb); static bool is_esc_data_index_valid(const uint8_t index); + static void handle_debug(AP_UAVCAN* ap_uavcan, uint8_t node_id, const DebugCb &cb); }; #endif // #if HAL_ENABLE_LIBUAVCAN_DRIVERS