ESPHome 2026.10.2
Loading...
Searching...
No Matches
canbus.cpp
Go to the documentation of this file.
1#include "canbus.h"
2#include <algorithm>
3#include "esphome/core/log.h"
4
5namespace esphome::canbus {
6
7static const char *const TAG = "canbus";
8
10 if (!this->setup_internal()) {
11 ESP_LOGE(TAG, "setup error!");
12 this->mark_failed();
13 }
14}
15
17 if (this->use_extended_id_) {
18 ESP_LOGCONFIG(TAG, "config extended id=0x%08" PRIx32, this->can_id_);
19 } else {
20 ESP_LOGCONFIG(TAG, "config standard id=0x%03" PRIx32, this->can_id_);
21 }
22}
23
24canbus::Error Canbus::send_data(uint32_t can_id, bool use_extended_id, bool remote_transmission_request,
25 const std::vector<uint8_t> &data) {
26 struct CanFrame can_message;
27
28 uint8_t size = static_cast<uint8_t>(data.size());
29 if (use_extended_id) {
30 ESP_LOGD(TAG, "send extended id=0x%08" PRIx32 " rtr=%s size=%d", can_id, TRUEFALSE(remote_transmission_request),
31 size);
32 } else {
33 ESP_LOGD(TAG, "send standard id=0x%03" PRIx32 " rtr=%s size=%d", can_id, TRUEFALSE(remote_transmission_request),
34 size);
35 }
36 if (size > CAN_MAX_DATA_LENGTH)
37 size = CAN_MAX_DATA_LENGTH;
38 can_message.can_data_length_code = size;
39 can_message.can_id = can_id;
40 can_message.use_extended_id = use_extended_id;
41 can_message.remote_transmission_request = remote_transmission_request;
42
43 for (int i = 0; i < size; i++) {
44 can_message.data[i] = data[i];
45 ESP_LOGVV(TAG, " data[%d]=%02x", i, can_message.data[i]);
46 }
47
48 canbus::Error error = this->send_message(&can_message);
49 if (error != canbus::ERROR_OK) {
50 if (use_extended_id) {
51 ESP_LOGW(TAG, "send to extended id=0x%08" PRIx32 " failed with error %d!", can_id, error);
52 } else {
53 ESP_LOGW(TAG, "send to standard id=0x%03" PRIx32 " failed with error %d!", can_id, error);
54 }
55 }
56 return error;
57}
58
60 if (trigger->use_extended_id_) {
61 ESP_LOGVV(TAG, "add trigger for extended canid=0x%08" PRIx32, trigger->can_id_);
62 } else {
63 ESP_LOGVV(TAG, "add trigger for std canid=0x%03" PRIx32, trigger->can_id_);
64 }
65 this->triggers_.push_back(trigger);
66};
67
69 struct CanFrame can_message;
70 uint32_t message_counter = 0;
71 for (; message_counter < this->max_frames_per_loop_; message_counter++) {
72 if (this->read_message(&can_message) != canbus::ERROR_OK) {
73 break;
74 }
75
76 if (can_message.use_extended_id) {
77 ESP_LOGD(TAG, "received can message (#%" PRIu32 ") extended can_id=0x%" PRIx32 " size=%d", message_counter + 1,
78 can_message.can_id, can_message.can_data_length_code);
79 } else {
80 ESP_LOGD(TAG, "received can message (#%" PRIu32 ") std can_id=0x%" PRIx32 " size=%d", message_counter + 1,
81 can_message.can_id, can_message.can_data_length_code);
82 }
83
84 std::vector<uint8_t> data;
85
86 // show data received
87 for (int i = 0; i < std::min(can_message.can_data_length_code, CAN_MAX_DATA_LENGTH); i++) {
88 ESP_LOGV(TAG, " can_message.data[%d]=%02x", i, can_message.data[i]);
89 data.push_back(can_message.data[i]);
90 }
91
92 this->callback_manager_(can_message.can_id, can_message.use_extended_id, can_message.remote_transmission_request,
93 data);
94
95 // fire all triggers
96 for (auto *trigger : this->triggers_) {
97 if ((trigger->can_id_ == (can_message.can_id & trigger->can_id_mask_)) &&
98 (trigger->use_extended_id_ == can_message.use_extended_id) &&
99 (!trigger->remote_transmission_request_.has_value() ||
100 trigger->remote_transmission_request_.value() == can_message.remote_transmission_request)) {
101 trigger->trigger(data, can_message.can_id, can_message.remote_transmission_request);
102 }
103 }
104 }
105
106 if (message_counter == this->max_frames_per_loop_) {
107 ESP_LOGW(TAG,
108 "Reached max_frames_per_loop=%" PRIu32 ", deferring remaining CAN frames. Some frames might be dropped",
109 this->max_frames_per_loop_);
110 }
111}
112
113} // namespace esphome::canbus
void mark_failed()
Mark this component as failed.
CallbackManager< void(uint32_t can_id, bool extended_id, bool rtr, const std::vector< uint8_t > &data)> callback_manager_
Definition canbus.h:104
void loop() override
Definition canbus.cpp:68
canbus::Error send_data(uint32_t can_id, bool use_extended_id, bool remote_transmission_request, const std::vector< uint8_t > &data)
Definition canbus.cpp:24
void setup() override
Definition canbus.cpp:9
void add_trigger(CanbusTrigger *trigger)
Definition canbus.cpp:59
uint32_t max_frames_per_loop_
Definition canbus.h:100
void dump_config() override
Definition canbus.cpp:16
virtual Error send_message(struct CanFrame *frame)=0
virtual bool setup_internal()=0
std::vector< CanbusTrigger * > triggers_
Definition canbus.h:98
virtual Error read_message(struct CanFrame *frame)=0
uint16_t size
Definition helpers.cpp:33
static void uint32_t
uint8_t can_data_length_code
Definition canbus.h:60