From 143373b0d3107ac01803bc08d81bcc4fe23741b0 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 29 Nov 2022 10:51:56 +0100 Subject: [PATCH] Reduce LD2410 Hardware Watchdogs --- .../tasmota_xsns_sensor/xsns_102_ld2410.ino | 59 ++++++------------- 1 file changed, 17 insertions(+), 42 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_102_ld2410.ino b/tasmota/tasmota_xsns_sensor/xsns_102_ld2410.ino index 6975efda5..474e4e825 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_102_ld2410.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_102_ld2410.ino @@ -27,6 +27,7 @@ #define XSNS_102 102 +#define LD2410_BUFFER_SIZE TM_SERIAL_BUFFER_SIZE // 64 #define LD2410_MAX_GATES 8 // 0 to 8 (= 9) - DO NOT CHANGE #define LD2410_CMND_START_CONFIGURATION 0xFF @@ -65,7 +66,6 @@ struct { uint8_t static_energy; uint8_t step; uint8_t retry; - uint8_t byte_counter; uint8_t settings; bool valid_response; } LD2410; @@ -153,52 +153,27 @@ bool Ld2410Match(const uint8_t *header, uint32_t offset) { } void Ld2410Input(void) { + uint32_t size = LD2410Serial->read(LD2410.buffer, LD2410_BUFFER_SIZE); + if (size) { + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("LD2: Rcvd %*_H"), size, LD2410.buffer); - if (LD2410Serial->overflow()) { - AddLog(LOG_LEVEL_DEBUG, PSTR("LD2: Serial buffer overrun")); - } - - while (LD2410Serial->available()) { - yield(); // Fix watchdogs - - LD2410.buffer[LD2410.byte_counter++] = LD2410Serial->read(); - if (LD2410.byte_counter < 4) { continue; } // Need first four header bytes - - uint32_t header_start = LD2410.byte_counter -4; // Fix interrupted header transmits - bool target_header = (Ld2410Match(LD2410_target_header, header_start)); // F4F3F2F1 - bool config_header = (Ld2410Match(LD2410_config_header, header_start)); // FDFCFBFA - if ((target_header || config_header) && (header_start != 0)) { - memmove(LD2410.buffer, LD2410.buffer + header_start, 4); // Sync buffer with header - LD2410.byte_counter = 4; - } - if (LD2410.byte_counter < 6) { continue; } // Need packet size bytes - - target_header = (Ld2410Match(LD2410_target_header, 0)); // F4F3F2F1 - config_header = (Ld2410Match(LD2410_config_header, 0)); // FDFCFBFA + bool target_header = (Ld2410Match(LD2410_target_header, 0)); // F4F3F2F1 + bool config_header = (Ld2410Match(LD2410_config_header, 0)); // FDFCFBFA if (target_header || config_header) { - uint32_t len = LD2410.buffer[4] +10; // Total packet size - if (len > TM_SERIAL_BUFFER_SIZE) { len = TM_SERIAL_BUFFER_SIZE; } - if (LD2410.byte_counter < len) { continue; } // Need complete packet - - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("LD2: Rcvd %*_H"), len, LD2410.buffer); - - if (target_header) { // F4F3F2F1 - if (Ld2410Match(LD2410_target_footer, len -4)) { // F8F7F6F5 - Ld1410HandleTargetData(); - - // Break to test Hardware Watchdog due to buffer overrun - LD2410.byte_counter = 0; - break; - + uint32_t len = LD2410.buffer[4] +10; // Total packet size + if (size >= len) { // Handle only the first entry (if there are more) + if (target_header) { // F4F3F2F1 + if (Ld2410Match(LD2410_target_footer, len -4)) { // F8F7F6F5 + Ld1410HandleTargetData(); + } } - } - else if (config_header) { // FDFCFBFA - if (Ld2410Match(LD2410_config_footer, len -4)) { // 04030201 - Ld1410HandleConfigData(); + else if (config_header) { // FDFCFBFA + if (Ld2410Match(LD2410_config_footer, len -4)) { // 04030201 + Ld1410HandleConfigData(); + } } } } - LD2410.byte_counter = 0; } } @@ -370,7 +345,7 @@ void Ld2410EverySecond(void) { void Ld2410Detect(void) { if (PinUsed(GPIO_LD2410_RX) && PinUsed(GPIO_LD2410_TX)) { - LD2410.buffer = (uint8_t*)malloc(TM_SERIAL_BUFFER_SIZE); // Default TM_SERIAL_BUFFER_SIZE (=64) size + LD2410.buffer = (uint8_t*)malloc(LD2410_BUFFER_SIZE); // Default 64 if (!LD2410.buffer) { return; } LD2410Serial = new TasmotaSerial(Pin(GPIO_LD2410_RX), Pin(GPIO_LD2410_TX), 2); if (LD2410Serial->begin(256000)) {