ESPHome 2026.3.0
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 {
6namespace canbus {
7
8static const char *const TAG = "canbus";
9
11 if (!this->setup_internal()) {
12 ESP_LOGE(TAG, "setup error!");
13 this->mark_failed();
14 }
15}
16
18 if (this->use_extended_id_) {
19 ESP_LOGCONFIG(TAG, "config extended id=0x%08" PRIx32, this->can_id_);
20 } else {
21 ESP_LOGCONFIG(TAG, "config standard id=0x%03" PRIx32, this->can_id_);
22 }
23}
24
25canbus::Error Canbus::send_data(uint32_t can_id, bool use_extended_id, bool remote_transmission_request,
26 const std::vector<uint8_t> &data) {
27 struct CanFrame can_message;
28
29 uint8_t size = static_cast<uint8_t>(data.size());
30 if (use_extended_id) {
31 ESP_LOGD(TAG, "send extended id=0x%08" PRIx32 " rtr=%s size=%d", can_id, TRUEFALSE(remote_transmission_request),
32 size);
33 } else {
34 ESP_LOGD(TAG, "send standard id=0x%03" PRIx32 " rtr=%s size=%d", can_id, TRUEFALSE(remote_transmission_request),
35 size);
36 }
37 if (size > CAN_MAX_DATA_LENGTH)
38 size = CAN_MAX_DATA_LENGTH;
39 can_message.can_data_length_code = size;
40 can_message.can_id = can_id;
41 can_message.use_extended_id = use_extended_id;
42 can_message.remote_transmission_request = remote_transmission_request;
43
44 for (int i = 0; i < size; i++) {
45 can_message.data[i] = data[i];
46 ESP_LOGVV(TAG, " data[%d]=%02x", i, can_message.data[i]);
47 }
48
49 canbus::Error error = this->send_message(&can_message);
50 if (error != canbus::ERROR_OK) {
51 if (use_extended_id) {
52 ESP_LOGW(TAG, "send to extended id=0x%08" PRIx32 " failed with error %d!", can_id, error);
53 } else {
54 ESP_LOGW(TAG, "send to standard id=0x%03" PRIx32 " failed with error %d!", can_id, error);
55 }
56 }
57 return error;
58}
59
61 if (trigger->use_extended_id_) {
62 ESP_LOGVV(TAG, "add trigger for extended canid=0x%08" PRIx32, trigger->can_id_);
63 } else {
64 ESP_LOGVV(TAG, "add trigger for std canid=0x%03" PRIx32, trigger->can_id_);
65 }
66 this->triggers_.push_back(trigger);
67};
68
70 struct CanFrame can_message;
71 // read all messages until queue is empty
72 int message_counter = 0;
73 while (this->read_message(&can_message) == canbus::ERROR_OK) {
74 message_counter++;
75 if (can_message.use_extended_id) {
76 ESP_LOGD(TAG, "received can message (#%d) extended can_id=0x%" PRIx32 " size=%d", message_counter,
77 can_message.can_id, can_message.can_data_length_code);
78 } else {
79 ESP_LOGD(TAG, "received can message (#%d) std can_id=0x%" PRIx32 " size=%d", message_counter, can_message.can_id,
80 can_message.can_data_length_code);
81 }
82
83 std::vector<uint8_t> data;
84
85 // show data received
86 for (int i = 0; i < std::min(can_message.can_data_length_code, CAN_MAX_DATA_LENGTH); i++) {
87 ESP_LOGV(TAG, " can_message.data[%d]=%02x", i, can_message.data[i]);
88 data.push_back(can_message.data[i]);
89 }
90
91 this->callback_manager_(can_message.can_id, can_message.use_extended_id, can_message.remote_transmission_request,
92 data);
93
94 // fire all triggers
95 for (auto *trigger : this->triggers_) {
96 if ((trigger->can_id_ == (can_message.can_id & trigger->can_id_mask_)) &&
97 (trigger->use_extended_id_ == can_message.use_extended_id) &&
98 (!trigger->remote_transmission_request_.has_value() ||
99 trigger->remote_transmission_request_.value() == can_message.remote_transmission_request)) {
100 trigger->trigger(data, can_message.can_id, can_message.remote_transmission_request);
101 }
102 }
103 }
104}
105
106} // namespace canbus
107} // namespace esphome
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:106
void loop() override
Definition canbus.cpp:69
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:25
void setup() override
Definition canbus.cpp:10
void add_trigger(CanbusTrigger *trigger)
Definition canbus.cpp:60
void dump_config() override
Definition canbus.cpp:17
virtual Error send_message(struct CanFrame *frame)=0
virtual bool setup_internal()=0
std::vector< CanbusTrigger * > triggers_
Definition canbus.h:101
virtual Error read_message(struct CanFrame *frame)=0
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7
size_t size
Definition helpers.h:929
static void uint32_t
uint8_t can_data_length_code
Definition canbus.h:61