From a90233475dcc5c26bbd0f3fee8b7cc1a72d6363a Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 28 Mar 2025 18:27:10 +0100 Subject: [PATCH 1/4] Callback for `Get_Temperature` --- src/ODriveCAN.cpp | 7 +++++++ src/ODriveCAN.h | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/ODriveCAN.cpp b/src/ODriveCAN.cpp index d84ffe6..2ac187e 100644 --- a/src/ODriveCAN.cpp +++ b/src/ODriveCAN.cpp @@ -171,6 +171,13 @@ void ODriveCAN::onReceive(uint32_t id, uint8_t length, const uint8_t* data) { Serial.println(F("missing callback")); break; } + case Get_Temperature_msg_t::cmd_id: { + Get_Temperature_msg_t temperature; + temperature.decode_buf(data); + if (temperature_callback_) + temperature_callback_(temperature, temperature_user_data_); + break; + } default: { if (requested_msg_id_ == REQUEST_PENDING) return; diff --git a/src/ODriveCAN.h b/src/ODriveCAN.h index 8b6d06d..9dc62c8 100644 --- a/src/ODriveCAN.h +++ b/src/ODriveCAN.h @@ -222,6 +222,14 @@ class ODriveCAN { torques_user_data_ = user_data; } + /** + * @brief Registers a callback for ODrive temperature feedback. + */ + void onTemperature(void (*callback)(Get_Temperature_msg_t& feedback, void* user_data), void* user_data = nullptr) { + temperature_callback_ = callback; + temperature_user_data_ = user_data; + } + /** * @brief Processes received CAN messages for the ODrive. */ @@ -332,8 +340,10 @@ class ODriveCAN { void* axis_state_user_data_; void* feedback_user_data_; void* torques_user_data_; + void* temperature_user_data_; void (*axis_state_callback_)(Heartbeat_msg_t& feedback, void* user_data) = nullptr; void (*feedback_callback_)(Get_Encoder_Estimates_msg_t& feedback, void* user_data) = nullptr; void (*torques_callback_)(Get_Torques_msg_t& feedback, void* user_data) = nullptr; + void (*temperature_callback_)(Get_Temperature_msg_t& feedback, void* user_data) = nullptr; }; From 830184a5d67d035085eab359546bc2469512e21e Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 28 Mar 2025 18:28:20 +0100 Subject: [PATCH 2/4] Callback for `Get_Bus_Voltage_Current` --- src/ODriveCAN.cpp | 7 +++++++ src/ODriveCAN.h | 11 +++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/ODriveCAN.cpp b/src/ODriveCAN.cpp index 2ac187e..9a5c177 100644 --- a/src/ODriveCAN.cpp +++ b/src/ODriveCAN.cpp @@ -178,6 +178,13 @@ void ODriveCAN::onReceive(uint32_t id, uint8_t length, const uint8_t* data) { temperature_callback_(temperature, temperature_user_data_); break; } + case Get_Bus_Voltage_Current_msg_t::cmd_id: { + Get_Bus_Voltage_Current_msg_t bus_vi; + bus_vi.decode_buf(data); + if (busVI_callback_) + busVI_callback_(bus_vi, busVI_user_data_); + break; + } default: { if (requested_msg_id_ == REQUEST_PENDING) return; diff --git a/src/ODriveCAN.h b/src/ODriveCAN.h index 9dc62c8..28c16d4 100644 --- a/src/ODriveCAN.h +++ b/src/ODriveCAN.h @@ -171,6 +171,7 @@ class ODriveCAN { * @brief Requests ODrive DC bus voltage and current * * This function will block and wait for up to timeout_ms (default 10msec) for ODrive to reply + * May trigger onBusVI callback if it's registered. */ bool getBusVI(Get_Bus_Voltage_Current_msg_t& msg, uint16_t timeout_ms = 10); @@ -230,6 +231,14 @@ class ODriveCAN { temperature_user_data_ = user_data; } + /** + * @brief Registers a callback for ODrive bus voltage/current feedback. + */ + void onBusVI(void (*callback)(Get_Bus_Voltage_Current_msg_t& feedback, void* user_data), void* user_data = nullptr) { + busVI_callback_ = callback; + busVI_user_data_ = user_data; + } + /** * @brief Processes received CAN messages for the ODrive. */ @@ -341,9 +350,11 @@ class ODriveCAN { void* feedback_user_data_; void* torques_user_data_; void* temperature_user_data_; + void* busVI_user_data_; void (*axis_state_callback_)(Heartbeat_msg_t& feedback, void* user_data) = nullptr; void (*feedback_callback_)(Get_Encoder_Estimates_msg_t& feedback, void* user_data) = nullptr; void (*torques_callback_)(Get_Torques_msg_t& feedback, void* user_data) = nullptr; void (*temperature_callback_)(Get_Temperature_msg_t& feedback, void* user_data) = nullptr; + void (*busVI_callback_)(Get_Bus_Voltage_Current_msg_t& feedback, void* user_data) = nullptr; }; From 394babcf5768a087d325234fd103cfc02685255a Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 28 Mar 2025 18:31:26 +0100 Subject: [PATCH 3/4] Callback for `Get_Iq` --- src/ODriveCAN.cpp | 7 +++++++ src/ODriveCAN.h | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/ODriveCAN.cpp b/src/ODriveCAN.cpp index 9a5c177..bde8b0c 100644 --- a/src/ODriveCAN.cpp +++ b/src/ODriveCAN.cpp @@ -185,6 +185,13 @@ void ODriveCAN::onReceive(uint32_t id, uint8_t length, const uint8_t* data) { busVI_callback_(bus_vi, busVI_user_data_); break; } + case Get_Iq_msg_t::cmd_id: { + Get_Iq_msg_t iq; + iq.decode_buf(data); + if (currents_callback_) + currents_callback_(iq, currents_user_data_); + break; + } default: { if (requested_msg_id_ == REQUEST_PENDING) return; diff --git a/src/ODriveCAN.h b/src/ODriveCAN.h index 28c16d4..0c5599e 100644 --- a/src/ODriveCAN.h +++ b/src/ODriveCAN.h @@ -239,6 +239,14 @@ class ODriveCAN { busVI_user_data_ = user_data; } + /** + * @brief Registers a callback for ODrive currents feedback. + */ + void onCurrents(void (*callback)(Get_Iq_msg_t& feedback, void* user_data), void* user_data = nullptr) { + currents_callback_ = callback; + currents_user_data_ = user_data; + } + /** * @brief Processes received CAN messages for the ODrive. */ @@ -351,10 +359,12 @@ class ODriveCAN { void* torques_user_data_; void* temperature_user_data_; void* busVI_user_data_; + void* currents_user_data_; void (*axis_state_callback_)(Heartbeat_msg_t& feedback, void* user_data) = nullptr; void (*feedback_callback_)(Get_Encoder_Estimates_msg_t& feedback, void* user_data) = nullptr; void (*torques_callback_)(Get_Torques_msg_t& feedback, void* user_data) = nullptr; void (*temperature_callback_)(Get_Temperature_msg_t& feedback, void* user_data) = nullptr; void (*busVI_callback_)(Get_Bus_Voltage_Current_msg_t& feedback, void* user_data) = nullptr; + void (*currents_callback_)(Get_Iq_msg_t& feedback, void* user_data) = nullptr; }; From f7db784b0e79ac9bbd2a7c5ddcfc7d3c7b8d92f8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 28 Mar 2025 18:35:35 +0100 Subject: [PATCH 4/4] Callback for `Get_Error` --- src/ODriveCAN.cpp | 7 +++++++ src/ODriveCAN.h | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/ODriveCAN.cpp b/src/ODriveCAN.cpp index bde8b0c..52b2150 100644 --- a/src/ODriveCAN.cpp +++ b/src/ODriveCAN.cpp @@ -192,6 +192,13 @@ void ODriveCAN::onReceive(uint32_t id, uint8_t length, const uint8_t* data) { currents_callback_(iq, currents_user_data_); break; } + case Get_Error_msg_t::cmd_id: { + Get_Error_msg_t error; + error.decode_buf(data); + if (error_callback_) + error_callback_(error, error_user_data_); + break; + } default: { if (requested_msg_id_ == REQUEST_PENDING) return; diff --git a/src/ODriveCAN.h b/src/ODriveCAN.h index 0c5599e..ef21221 100644 --- a/src/ODriveCAN.h +++ b/src/ODriveCAN.h @@ -247,6 +247,14 @@ class ODriveCAN { currents_user_data_ = user_data; } + /** + * @brief Registers a callback for ODrive error messages. + */ + void onError(void (*callback)(Get_Error_msg_t& msg, void* user_data), void* user_data = nullptr) { + error_callback_ = callback; + error_user_data_ = user_data; + } + /** * @brief Processes received CAN messages for the ODrive. */ @@ -360,6 +368,7 @@ class ODriveCAN { void* temperature_user_data_; void* busVI_user_data_; void* currents_user_data_; + void* error_user_data_; void (*axis_state_callback_)(Heartbeat_msg_t& feedback, void* user_data) = nullptr; void (*feedback_callback_)(Get_Encoder_Estimates_msg_t& feedback, void* user_data) = nullptr; @@ -367,4 +376,5 @@ class ODriveCAN { void (*temperature_callback_)(Get_Temperature_msg_t& feedback, void* user_data) = nullptr; void (*busVI_callback_)(Get_Bus_Voltage_Current_msg_t& feedback, void* user_data) = nullptr; void (*currents_callback_)(Get_Iq_msg_t& feedback, void* user_data) = nullptr; + void (*error_callback_)(Get_Error_msg_t& msg, void* user_data) = nullptr; };