small bug fix
This commit is contained in:
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
#include "communication/commands.h"
|
||||
#include <cstdint>
|
||||
#include <Arduino.h>
|
||||
#include <cstring>
|
||||
|
||||
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;
|
||||
|
||||
+27
-13
@@ -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);
|
||||
|
||||
|
||||
+14
-14
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user