From 2da631e4428f3341ab7ef1aa445d8517dac06540 Mon Sep 17 00:00:00 2001 From: protectivedad Date: Tue, 25 Mar 2025 11:22:27 -0300 Subject: [PATCH] missing edits for last commit (#23185) Co-authored-by: Anthony Sepa --- .../tasmota_xsns_sensor/xsns_102_ld2402.ino | 151 ++++++++---------- 1 file changed, 64 insertions(+), 87 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_102_ld2402.ino b/tasmota/tasmota_xsns_sensor/xsns_102_ld2402.ino index 8f5373e4f..60cc77832 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_102_ld2402.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_102_ld2402.ino @@ -236,101 +236,81 @@ void Ld2402HandleConfigData(void) { void Ld2402Input(void) { uint32_t avail; - while (LD2402Serial->available()) { + while ((avail = LD2402Serial->available()) && avail) { + static uint32_t byte_counter = 0; static uint32_union header; - static uint32_union footer; - static uint32_t data_type = 0, byte_counter = 0; - if (!data_type) { - if (!byte_counter) { - avail = LD2402Serial->available(); - if (avail < 4) { - DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "Don't have enough for header.")); - break; - } - for (uint32_t i = 3; i; i--) { - header.buffer_32<<=8; - header.buffer[LD2402.is_big*3] = LD2402Serial->read(); - } - byte_counter = 4; + uint32_t data_type; + if (0 == byte_counter) { + while (LD2402Serial->available() < 4) { + yield(); } - - avail = LD2402Serial->available(); - header.buffer_32<<=8; - header.buffer[LD2402.is_big*3] = LD2402Serial->read(); - - // I will get out of this mess with either: - // - Config/Engineering header match, set data_type (most likely/quickest further processing) - // - Known text match, process line, clear byte count for next line (less likely but no further processing) - // - No header matches, continue, shift in the next character if/when available - data_type = (LD2402_engineering_header == header.buffer_32) ? 2 : 0; - if (!data_type) { - data_type = (LD2402_config_header == header.buffer_32) ? 3 : 0; - if (!data_type) { - if (LD2402_target_Error != header.buffer_32) { - if (LD2402_target_OFF != header.buffer_32) { - if (LD2402_target_distance != header.buffer_32) { - continue; - } else { - // process distance line - byte_counter = LD2402Serial->readBytesUntil(0x0A, LD2402.buffer, LD2402_BUFFER_SIZE); - LD2402.buffer[byte_counter] = 0; - DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "Dist%s"), LD2402.buffer); - // ance:105\r\n - LD2402.detect_distance = atoi((char*) LD2402.buffer + 5); - LD2402.person = 2; - } - } else { - // process OFF line - LD2402.detect_distance = 0; - LD2402.person = 0; - LD2402Serial->read(); - } - LD2402.report_type = 2; - } else { - // preocess Error line - byte_counter = LD2402Serial->readBytesUntil(0x0A, LD2402.buffer, LD2402_BUFFER_SIZE); - LD2402.buffer[byte_counter] = 0; - AddLog(LOG_LEVEL_INFO, PSTR(D_LD2402_LOG_PREFIX "Erro%s"), LD2402.buffer); - LD2402.report_type = 0; - } - byte_counter = 0; - break; - } + for (uint32_t i = 3; i; i--) { + header.buffer_32<<=8; + header.buffer[LD2402.is_big*3] = LD2402Serial->read(); } } + header.buffer_32<<=8; + header.buffer[LD2402.is_big*3] = LD2402Serial->read(); + byte_counter = 4; - static uint32_t length, got; - if (byte_counter < 6) { - avail = LD2402Serial->available(); - if (avail < 2) { - DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "Don't have enough for length.")); - break; - } - length = LD2402Serial->read(); - LD2402Serial->read(); - got = 0; - if (length > LD2402_BUFFER_SIZE) { - data_type = 0; + // I will get out of this mess with either: + // - Config/Engineering header match, set data_type (most likely/quickest further processing) + // - Known text match, process line, clear byte count for next line (less likely but no further processing) + // - No header matches, continue, shift in the next character if/when available + data_type = (LD2402_engineering_header == header.buffer_32) * 2; + if (!data_type) { + data_type = (LD2402_config_header == header.buffer_32) * 3; + if (!data_type) { + if (LD2402_target_Error != header.buffer_32) { + if (LD2402_target_OFF != header.buffer_32) { + if (LD2402_target_distance != header.buffer_32) { + if (LD2402_engineering_footer != header.buffer_32) { + continue; + } + DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "Found engineering footer but have no header!")); + } else { + // process distance line + byte_counter = LD2402Serial->readBytesUntil(0x0A, LD2402.buffer, LD2402_BUFFER_SIZE); + LD2402.buffer[byte_counter] = 0; + DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "Dist%s"), LD2402.buffer); + // ance:105\r\n + LD2402.detect_distance = atoi((char*) LD2402.buffer + 5); + LD2402.person = 2; + } + } else { + // process OFF line + LD2402.detect_distance = 0; + LD2402.person = 0; + LD2402Serial->read(); + } + LD2402.report_type = 2; + } else { + // preocess Error line + byte_counter = LD2402Serial->readBytesUntil(0x0A, LD2402.buffer, LD2402_BUFFER_SIZE); + LD2402.buffer[byte_counter] = 0; + AddLog(LOG_LEVEL_INFO, PSTR(D_LD2402_LOG_PREFIX "Erro%s"), LD2402.buffer); + LD2402.report_type = 0; + } byte_counter = 0; break; } - byte_counter = 6; } + byte_counter = 0; - avail = LD2402Serial->available(); - if (avail < (length - got)) { - got += LD2402Serial->readBytes(LD2402.buffer + got, avail); + while (LD2402Serial->available() < 2) { yield(); } + uint32_t length = LD2402Serial->read(); + LD2402Serial->read(); + if (length > LD2402_BUFFER_SIZE) { break; } - if (got < length) { - got += LD2402Serial->readBytes(LD2402.buffer + got, length - got); - } - avail = LD2402Serial->available(); - if (avail < 4) { - DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "Don't have enough for footer.")); + if (LD2402Serial->readBytes(LD2402.buffer, length) < length) { + DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "Wasn't able to get whole line!")); break; } + + uint32_union footer; + while (LD2402Serial->available() < 4) { yield(); } for (uint32_t i = 4; i; i--) { footer.buffer_32<<=8; footer.buffer[LD2402.is_big*3] = LD2402Serial->read(); @@ -342,22 +322,19 @@ void Ld2402Input(void) { } else { DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "Head %*_H"), 4, header.buffer); DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "Eng %*_H"), length, LD2402.buffer); - DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "byte_counter: %d, avail: %d, got %d, length %d"), byte_counter, avail, got, length); + DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "avail: %d, length %d"), avail, length); DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "Foot %*_H"), 4, footer.buffer); } } else { if (LD2402_config_footer == footer.buffer_32) { Ld2402HandleConfigData(); - LD2402Serial->setReadChunkMode(0); } else { DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "Head %*_H"), 4, header.buffer); DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "Cmd %*_H"), length, LD2402.buffer); - DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "byte_counter: %d, avail: %d, got %d, length %d"), byte_counter, avail, got, length); + DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "avail: %d, length %d"), avail, length); DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "Foot %*_H"), 4, footer.buffer); } } - data_type = 0; - byte_counter = 0; break; } // If here then LD2402.byte_counter could still be partial correct for next loop @@ -381,7 +358,6 @@ void Ld2402SendCommand(uint8_t command, uint32_t val_len) { DEBUG_SENSOR_LOG(PSTR(D_LD2402_LOG_PREFIX "Send %*_H"), val_len + 12, buffer); LD2402.sent_ack = command; - LD2402Serial->setReadChunkMode(1); // Enable chunk mode introducing possible Hardware Watchdogs LD2402Serial->flush(); LD2402Serial->write(buffer, val_len + 12); } @@ -689,6 +665,7 @@ void Ld2402Detect(void) { LD2402Serial = new TasmotaSerial(Pin(GPIO_LD2402_RX), Pin(GPIO_LD2402_TX), 2, 0, LD2402_BUFFER_SIZE); if (LD2402Serial->begin(115200)) { if (LD2402Serial->hardwareSerial()) { ClaimSerial(); } + LD2402Serial->setTimeout(200); #ifdef ESP32 AddLog(LOG_LEVEL_DEBUG, PSTR(D_LD2402_LOG_PREFIX "Serial UART%d"), LD2402Serial->getUart()); #endif @@ -836,7 +813,7 @@ void CmndLd2402Mode(void) { ArgV(Argument,1); memset(LD2402.cmnd_param, 0x00, 6); LD2402.cmnd_param[2] = atoi(Argument) ? 0x04 : 0x64; - Response_P(PSTR(D_COMMAND_PREFIX_JSON "%d}"), D_CMD_MODE, (0x04 == LD2402.cmnd_param[2])); + Response_P(PSTR(D_COMMAND_PREFIX_JSON "\"%s\"}"), D_CMD_MODE, (0x04 == LD2402.cmnd_param[2] ? "Engineering" : "Normal")); Ld2402ExecConfigCmnd(LD2402_CMND_MODE); }