[canbus] Add callback for use by other components (#8578)

Co-authored-by: clydeps <U5yx99dok9>
This commit is contained in:
Clyde Stubbs 2025-04-30 19:10:54 +10:00 committed by GitHub
parent caa255f5d1
commit 07ba9fdf8f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 19 additions and 0 deletions

View File

@ -86,6 +86,9 @@ void Canbus::loop() {
data.push_back(can_message.data[i]); data.push_back(can_message.data[i]);
} }
this->callback_manager_(can_message.can_id, can_message.use_extended_id, can_message.remote_transmission_request,
data);
// fire all triggers // fire all triggers
for (auto *trigger : this->triggers_) { for (auto *trigger : this->triggers_) {
if ((trigger->can_id_ == (can_message.can_id & trigger->can_id_mask_)) && if ((trigger->can_id_ == (can_message.can_id & trigger->can_id_mask_)) &&

View File

@ -81,6 +81,20 @@ class Canbus : public Component {
void set_bitrate(CanSpeed bit_rate) { this->bit_rate_ = bit_rate; } void set_bitrate(CanSpeed bit_rate) { this->bit_rate_ = bit_rate; }
void add_trigger(CanbusTrigger *trigger); void add_trigger(CanbusTrigger *trigger);
/**
* Add a callback to be called when a CAN message is received. All received messages
* are passed to the callback without filtering.
*
* The callback function receives:
* - can_id of the received data
* - extended_id True if the can_id is an extended id
* - rtr If this is a remote transmission request
* - data The message data
*/
void add_callback(
std::function<void(uint32_t can_id, bool extended_id, bool rtr, const std::vector<uint8_t> &data)> callback) {
this->callback_manager_.add(std::move(callback));
}
protected: protected:
template<typename... Ts> friend class CanbusSendAction; template<typename... Ts> friend class CanbusSendAction;
@ -88,6 +102,8 @@ class Canbus : public Component {
uint32_t can_id_; uint32_t can_id_;
bool use_extended_id_; bool use_extended_id_;
CanSpeed bit_rate_; CanSpeed bit_rate_;
CallbackManager<void(uint32_t can_id, bool extended_id, bool rtr, const std::vector<uint8_t> &data)>
callback_manager_{};
virtual bool setup_internal(); virtual bool setup_internal();
virtual Error send_message(struct CanFrame *frame); virtual Error send_message(struct CanFrame *frame);