made LoRa-UART Command handler more robust

This commit is contained in:
2025-09-18 07:59:01 +02:00
parent 58e9a97804
commit b024bb66a9

View File

@@ -101,28 +101,42 @@ void LoRa_Process()
int receivedSize = 0; int receivedSize = 0;
while (SerialLoRa.available() && !packageReceived) while (SerialLoRa.available() && !packageReceived)
{
if (bufferPtr < sizeof(packageInput) - 1)
{ {
char c = SerialLoRa.read(); char c = SerialLoRa.read();
packageInput[bufferPtr] = c;
packageInput[bufferPtr + 1] = '\0'; // always terminate string // CR ignorieren (falls CRLF)
if (c == '\r')
{
continue;
}
if (c == '\n') if (c == '\n')
{ {
packageReceived = true; // Zeilenende: String sauber terminieren, Größe setzen
packageInput[bufferPtr] = '\0';
receivedSize = bufferPtr; receivedSize = bufferPtr;
bufferPtr = 0; bufferPtr = 0;
packageReceived = true;
Debug_pushMessage("Got LoRa UART: %s\n", packageInput); Debug_pushMessage("Got LoRa UART: %s\n", packageInput);
break;
} }
else if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c == ' ' || c == ',' || c == '.')) // Accept numbers, uppercase letters, and some special chars
// Optional: in Uppercase wandeln (macht Kommandos robust)
if (c >= 'a' && c <= 'z')
c = (char)(c - 'a' + 'A');
// Erlaubte Zeichen (Ziffern, Großbuchstaben, Space, Komma, Punkt, Semikolon)
bool allowed =
(c >= '0' && c <= '9') ||
(c >= 'A' && c <= 'Z') ||
(c == ' ' || c == ',' || c == '.' || c == ';');
if (allowed)
{ {
bufferPtr++; if (bufferPtr < sizeof(packageInput) - 1)
}
else
{ {
Debug_pushMessage("Invalid character received: %c\n", c); packageInput[bufferPtr++] = c;
} packageInput[bufferPtr] = '\0'; // immer NUL-terminiert halten
} }
else else
{ {
@@ -130,9 +144,15 @@ void LoRa_Process()
bufferPtr = 0; bufferPtr = 0;
} }
} }
else
{
Debug_pushMessage("Invalid character received: %c\n", c);
}
}
if (packageReceived) if (packageReceived)
{ {
// Hinweis: receivedSize ist jetzt strlen(packageInput), ohne \n/\r
Parse_LoRa_UartCommand(packageInput, receivedSize); Parse_LoRa_UartCommand(packageInput, receivedSize);
packageReceived = false; packageReceived = false;
} }
@@ -244,41 +264,57 @@ void printParameters(struct Configuration configuration)
Serial.println("----------------------------------------"); Serial.println("----------------------------------------");
} }
#endif #endif
#ifdef FEATURE_ENABLE_UARTLORA #ifdef FEATURE_ENABLE_UARTLORA
#include <ctype.h>
static void rstrip(char *s)
{
size_t n = strlen(s);
while (n && (s[n - 1] == '\r' || s[n - 1] == '\n' || isspace((unsigned char)s[n - 1])))
{
s[--n] = '\0';
}
}
static void lstrip(char *s)
{
size_t i = 0, n = strlen(s);
while (i < n && isspace((unsigned char)s[i]))
i++;
if (i)
memmove(s, s + i, n - i + 1);
}
void Parse_LoRa_UartCommand(char input[], int size) void Parse_LoRa_UartCommand(char input[], int size)
{ {
Debug_pushMessage("Start parsing, size: %d\n", size); Debug_pushMessage("Start parsing, size: %d\n", size);
char delimiter[] = ";";
// Auf mehreren Delimitern splitten: ;, CR, LF, Tabs/Spaces
const char *delims = ";\r\n\t ";
char *ptr; char *ptr;
char command[8];
char value[8];
ptr = strtok(input, delimiter); // erstes Token (Kommando)
ptr = strtok(input, delims);
ptr = strtok(input, delimiter); if (!ptr)
while (ptr != NULL)
{ {
strncpy(command, ptr, sizeof(command) - 1); // Platz für Nullterminator lassen Debug_pushMessage("No command token\n");
command[sizeof(command) - 1] = '\0'; // Nullterminator setzen return;
ptr = strtok(NULL, delimiter);
if (ptr != NULL)
{
strncpy(value, ptr, sizeof(value) - 1); // Platz für Nullterminator lassen
value[sizeof(value) - 1] = '\0'; // Nullterminator setzen
}
else
{
// Wenn ptr NULL ist, setze value auf leeren String
value[0] = '\0';
} }
// Hier kannst du den Wert und das Kommando verarbeiten char command[16];
Debug_pushMessage("Command: %s, Value: %s\n", command, value); strncpy(command, ptr, sizeof(command) - 1);
command[sizeof(command) - 1] = '\0';
lstrip(command);
rstrip(command);
// zweites Token (optional: Wert)
ptr = strtok(NULL, delims);
char value[16] = {0};
if (ptr)
{
strncpy(value, ptr, sizeof(value) - 1);
value[sizeof(value) - 1] = '\0';
lstrip(value);
rstrip(value);
} }
Debug_pushMessage("Parsed LoRa UART Command: %s Value: %s\n", command, value); Debug_pushMessage("Parsed LoRa UART Command: %s Value: %s\n", command, value);
@@ -329,5 +365,9 @@ void Parse_LoRa_UartCommand(char input[], int size)
{ {
PersistenceData.activeFaction = FACTION_3; PersistenceData.activeFaction = FACTION_3;
} }
else
{
Debug_pushMessage("Unknown command: %s\n", command);
}
} }
#endif #endif