7static const char *
const TAG =
"mk2pvrouter";
13constexpr uint8_t
TAB = 0x9;
21static size_t get_field(
char *dest,
const char *buf_start,
const char *buf_end,
size_t max_len) {
22 const auto *
const field_end =
static_cast<const char *
>(memchr(buf_start,
TAB, buf_end - buf_start));
25 const size_t len = field_end - buf_start;
27 ESP_LOGE(TAG,
"Field too long: %zu bytes (max %zu)",
len, max_len);
31 memcpy(dest, buf_start,
len);
40 for (
size_t i = 0; i < effective_len; i++) {
50 const auto grp_len = grp_end - grp;
52 ESP_LOGE(TAG,
"Empty or too short group");
55 const auto raw_crc = grp[grp_len - 1];
59 if (raw_crc != calculated_crc) {
60 ESP_LOGE(TAG,
"CRC mismatch: expected %d, got %d", calculated_crc, raw_crc);
71 size_t field_len = get_field(this->
tag_, grp, grp_end, MAX_TAG_SIZE);
72 if (!field_len || field_len >= MAX_TAG_SIZE) {
73 ESP_LOGE(TAG,
"Invalid tag");
76 const auto *val_start = grp + field_len + 1;
78 field_len = get_field(this->
val_, val_start, grp_end, MAX_VAL_SIZE);
79 if (!field_len || field_len >= MAX_VAL_SIZE) {
80 ESP_LOGE(TAG,
"Invalid value for tag %s", this->
tag_);
92 const auto received = this->
read();
100 ESP_LOGW(TAG,
"Internal buffer full");
114 ESP_LOGVV(TAG,
"State: WAITING_FOR_START");
119 ESP_LOGVV(TAG,
"State: START_FRAME_RECEIVED");
124 ESP_LOGVV(TAG,
"State: END_FRAME_RECEIVED -> processing");
131 auto *buf_finger = this->
buf_;
136 while ((buf_finger =
static_cast<char *
>(memchr(buf_finger,
LINE_FEED, buf_end - buf_finger))) !=
nullptr) {
139 auto *
const grp_end =
static_cast<char *
>(memchr(buf_finger,
CARRIAGE_RETURN, buf_end - buf_finger));
141 ESP_LOGE(TAG,
"No group found");
147 buf_finger = grp_end;
149 this->buf_index_ = 0;
157#ifdef MK2PVROUTER_LISTENER_COUNT
159 if (strcmp(tag, element->get_tag()) != 0)
161 element->publish_val(
val);
167 ESP_LOGCONFIG(TAG,
"Mk2PVRouter:");
171#ifdef MK2PVROUTER_LISTENER_COUNT
bool check_crc_(const char *grp, const char *grp_end)
static constexpr size_t CRC_SUFFIX_LEN
void process_group_(const char *grp, const char *grp_end)
void publish_value_(const char *tag, const char *val)
bool read_chars_until_(bool drop, uint8_t c)
uint8_t calculate_crc_(const char *grp, size_t grp_len)
static constexpr uint32_t BAUD_RATE
void register_mk2pvrouter_listener(Mk2PVRouterListener *listener)
void dump_config() override
StaticVector< Mk2PVRouterListener *, MK2PVROUTER_LISTENER_COUNT > mk2pvrouter_listeners_
void check_uart_settings(uint32_t baud_rate, uint8_t stop_bits=1, UARTParityOptions parity=UART_CONFIG_PARITY_NONE, uint8_t data_bits=8)
Check that the configuration of the UART bus matches the provided values and otherwise print a warnin...
constexpr uint8_t MAX_ITERATIONS
constexpr uint8_t CARRIAGE_RETURN
constexpr uint8_t START_FRAME
constexpr uint8_t CRC_OFFSET
constexpr uint8_t LINE_FEED
constexpr uint8_t END_FRAME
constexpr uint8_t CRC_MASK
@ UART_CONFIG_PARITY_EVEN