From 53d8938cd2794c62d2d919724e4a0f0ed2f74d49 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Sat, 14 Mar 2026 22:22:18 +0000 Subject: [PATCH] small bug fix --- src/communication/commands.cpp | 2 ++ src/communication/walkieTalkie.cpp | 6 ++--- src/communication/walkieTalkie.h | 2 +- src/main.cpp | 40 ++++++++++++++++++++---------- src/methods/methods.cpp | 28 ++++++++++----------- 5 files changed, 47 insertions(+), 31 deletions(-) diff --git a/src/communication/commands.cpp b/src/communication/commands.cpp index b6dbb5e..08af88f 100644 --- a/src/communication/commands.cpp +++ b/src/communication/commands.cpp @@ -12,6 +12,8 @@ char* CommandToStr(Command id) { return (char*)"CmdDestroyWindow"; case CmdUpdateWinDims: return (char*)"CmdUpdateWinDims"; + case CMDData: + return (char*)"CMDData"; default: return (char*)"CmdUnknown"; } diff --git a/src/communication/walkieTalkie.cpp b/src/communication/walkieTalkie.cpp index 886812f..6503575 100644 --- a/src/communication/walkieTalkie.cpp +++ b/src/communication/walkieTalkie.cpp @@ -61,7 +61,7 @@ namespace WalkieTalkie { return 0; } - static inline size_t RecvETXRoutine(uint8_t *payload, byte *b) { + static inline int RecvETXRoutine(uint8_t *payload, byte *b) { LOG_TRACE(F("READING ETX\n")); state = WaitingSTX; @@ -109,12 +109,12 @@ namespace WalkieTalkie { } case RecvETX: { - return RecvETXRoutine(payload, &byte); + result = RecvETXRoutine(payload, &byte); break; } } } - return 0; + return result; } }; diff --git a/src/communication/walkieTalkie.h b/src/communication/walkieTalkie.h index c4e584f..9bbb5b1 100644 --- a/src/communication/walkieTalkie.h +++ b/src/communication/walkieTalkie.h @@ -4,7 +4,6 @@ #include "communication/commands.h" #include #include -#include namespace WalkieTalkie { typedef enum { @@ -16,6 +15,7 @@ namespace WalkieTalkie { RecvETX = 5, } RecvState; + static uint8_t tempLenBuffer[2]; inline uint8_t buffer[4096]; inline int16_t bufferIndex = 0; inline RecvState state = WaitingSTX; diff --git a/src/main.cpp b/src/main.cpp index 7e62a8a..5dc27fb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -93,12 +93,32 @@ void setup() { } const uint16_t PayloadMax = 2056; +uint8_t payload[PayloadMax] = {0}; +char lineBuffer[64]; // Enough for "XX XX XX XX XX XX XX XX " + // +void print_memory_stats() { + multi_heap_info_t info; + + // MALLOC_CAP_8BIT ensures we are looking at memory capable of + // storing data (Internal RAM + PSRAM if available) + heap_caps_get_info(&info, MALLOC_CAP_8BIT); + + size_t total_free = info.total_free_bytes; + size_t total_allocated = info.total_allocated_bytes; + size_t total_size = total_free + total_allocated; + size_t min_free = info.minimum_free_bytes; // "Low water mark" + + LOG_INFO(F("Memory Stats:\r\n")); + LOG_INFO(F(" Total: %u bytes\r\n"), total_size); + LOG_INFO(F(" Used: %u bytes\r\n"), total_allocated); + LOG_INFO(F(" Free: %u bytes\r\n"), total_free); + LOG_INFO(F(" Min Free: %u bytes (Historic peak usage)\r\n"), min_free); +} void loop(void) { uint64_t cur = millis(); Command cmd = CmdUnknown; - uint8_t payload[PayloadMax] = {0}; if (Serial.available() > 0) { int16_t resp = WalkieTalkie::RecvStream(&cmd, payload, PayloadMax); @@ -106,13 +126,15 @@ void loop(void) { LOG_WARN(F("Failed to receive data from serial")); return; } else if (resp == 0) { - LOG_INFO(F("No data to receive")); + LOG_INFO(F("No data to receive\r\n")); return; } LOG_INFO(F("Command: %s\n"), CommandToStr(cmd)); LOG_INFO(F("Response Payload Len: %d\n"), resp); + print_memory_stats(); + switch(cmd) { case CmdRequestID: IdentificationPacket papers; @@ -163,16 +185,8 @@ void loop(void) { break; } case CMDData: { - // Data groups of: windowData { - // idx int16 4 bytes - // data char* 32 bytes - // } - // Packet will be: Data { - // [windowData] - // } - LOG_WARN(F("Data Received: %d bytes\n"), resp); + LOG_WARN(F("Data Received: %d bytes\r\n"), resp); - char lineBuffer[32]; // Enough for "XX XX XX XX XX XX XX XX " int pos = 0; for (int k = 0; k < resp; k++) { @@ -184,14 +198,14 @@ void loop(void) { if ((k + 1) % 8 == 0 || k == resp - 1) { // Send the completed line to the logger // We use LOG_DEBUG or similar so we don't spam [WARN] on every line - Logger::Printf(F("%s\n"), lineBuffer); + LOG_DEBUG(F("%s\r\n"), lineBuffer); // Reset buffer position for the next line pos = 0; memset(lineBuffer, 0, sizeof(lineBuffer)); } } - LOG_WARN(F("\n")); + LOG_DEBUG(F("\r\n")); Data::Parse(payload, resp, &mainScreen); diff --git a/src/methods/methods.cpp b/src/methods/methods.cpp index 744aa76..3c72b30 100644 --- a/src/methods/methods.cpp +++ b/src/methods/methods.cpp @@ -212,11 +212,12 @@ namespace Window { }; namespace Data { + char buffer[128]; + char strValue[128]; + uint8_t Parse(uint8_t *payload, size_t payloadSize, Curses::Screen* mainScreen) { uint16_t curPos = 0; - char buffer[128]; - for (; curPos < payloadSize;) { // Get the data type from the current position int16_t wID; @@ -228,7 +229,7 @@ namespace Data { switch (type) { case DataTypeUINT8: { uint8_t value = payload[curPos + 1]; - LOG_WARN(F("RECEIVED [%2d]: %d\n"), wID, value); + LOG_DEBUG(F("[0x%02X] RECEIVED [%2d]: %d\r\n"), type, wID, value); sprintf(buffer, "%d", value); @@ -237,7 +238,7 @@ namespace Data { } case DataTypeINT8: { int8_t value = (int8_t)payload[curPos + 1]; - LOG_WARN(F("RECEIVED [%2d]: %d\n"), wID, value); + LOG_DEBUG(F("[0x%02X] RECEIVED [%2d]: %d\r\n"), type, wID, value); sprintf(buffer, "%d", value); @@ -248,7 +249,7 @@ namespace Data { uint16_t value; memcpy(&value, payload + curPos + 1, 2); - LOG_WARN(F("RECEIVED [%2d]: %d\n"), wID, value); + LOG_DEBUG(F("[0x%02X] RECEIVED [%2d]: %d\r\n"), type, wID, value); sprintf(buffer, "%d", value); curPos += 3; // 1 (Type) + 2 (Value) @@ -257,7 +258,7 @@ namespace Data { case DataTypeINT16: { int16_t value; memcpy(&value, payload + curPos + 1, 2); - LOG_WARN(F("RECEIVED [%2d]: %d\n"), wID, value); + LOG_DEBUG(F("[0x%02X] RECEIVED [%2d]: %d\r\n"), type, wID, value); sprintf(buffer, "%d", value); curPos += 3; @@ -266,7 +267,7 @@ namespace Data { case DataTypeUINT32: { uint32_t value; memcpy(&value, payload + curPos + 1, 4); - LOG_WARN(F("RECEIVED [%2d]: %d\n"), wID, value); + LOG_DEBUG(F("[0x%02X] RECEIVED [%2d]: %d\r\n"), type, wID, value); sprintf(buffer, "%d", value); curPos += 5; // 1 (Type) + 4 (Value) @@ -275,7 +276,7 @@ namespace Data { case DataTypeINT32: { int32_t value; memcpy(&value, payload + curPos + 1, 4); - LOG_WARN(F("RECEIVED [%2d]: %d\n"), wID, value); + LOG_DEBUG(F("[0x%02X] RECEIVED [%2d]: %d\r\n"), type, wID, value); sprintf(buffer, "%d", value); curPos += 5; @@ -284,7 +285,7 @@ namespace Data { case DataTypeUINT64: { uint64_t value; memcpy(&value, payload + curPos + 1, 8); - LOG_WARN(F("RECEIVED [%2d]: %d\n"), wID, value); + LOG_DEBUG(F("[0x%02X] RECEIVED [%2d]: %d\r\n"), type, wID, value); sprintf(buffer, "%ld", value); curPos += 9; // 1 (Type) + 8 (Value) @@ -293,7 +294,7 @@ namespace Data { case DataTypeINT64: { int64_t value; memcpy(&value, payload + curPos + 1, 8); - LOG_WARN(F("RECEIVED [%2d]: %d\n"), wID, value); + LOG_DEBUG(F("[0x%02X] RECEIVED [%2d]: %d\r\n"), type, wID, value); sprintf(buffer, "%ld", value); curPos += 9; @@ -301,7 +302,7 @@ namespace Data { } case DataTypeCHAR: { uint8_t value = payload[curPos + 1]; - LOG_WARN(F("RECEIVED [%2d]: %c\n"), wID, value); + LOG_DEBUG(F("[0x%02X] RECEIVED [%2d]: %c\r\n"), type, wID, value); sprintf(buffer, "%c", value); curPos += 2; @@ -310,11 +311,10 @@ namespace Data { case DataTypeSTRING: { // Strings have: Type (1), Len (1), Data (Len) uint8_t len = payload[curPos + 1]; - char strValue[len + 1]; memcpy(strValue, payload + curPos + 2, len); strValue[len] = '\0'; // Null terminator // - LOG_WARN(F("RECEIVED [%2d] [%d]: %s\n"), wID, len, strValue); + LOG_DEBUG(F("[0x%02X] RECEIVED [%2d]: %s\r\n"), type, wID, strValue); sprintf(buffer, "%s", strValue); curPos += (2 + len); @@ -323,7 +323,7 @@ namespace Data { default: // If we hit an unknown type, we are desynced. // Better to stop than to read garbage. - LOG_ERROR(F("Unknown Type 0x%02X at pos %d"), type, curPos); + LOG_ERROR(F("Unknown Type 0x%02X at pos %d\r\n"), type, curPos); continue; }