made LoRa-UART Command handler more robust
This commit is contained in:
		@@ -102,37 +102,57 @@ void LoRa_Process()
 | 
			
		||||
 | 
			
		||||
    while (SerialLoRa.available() && !packageReceived)
 | 
			
		||||
    {
 | 
			
		||||
        if (bufferPtr < sizeof(packageInput) - 1)
 | 
			
		||||
        {
 | 
			
		||||
            char c = SerialLoRa.read();
 | 
			
		||||
            packageInput[bufferPtr] = c;
 | 
			
		||||
            packageInput[bufferPtr + 1] = '\0'; // always terminate string
 | 
			
		||||
        char c = SerialLoRa.read();
 | 
			
		||||
 | 
			
		||||
            if (c == '\n')
 | 
			
		||||
        // CR ignorieren (falls CRLF)
 | 
			
		||||
        if (c == '\r')
 | 
			
		||||
        {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (c == '\n')
 | 
			
		||||
        {
 | 
			
		||||
            // Zeilenende: String sauber terminieren, Größe setzen
 | 
			
		||||
            packageInput[bufferPtr] = '\0';
 | 
			
		||||
            receivedSize = bufferPtr;
 | 
			
		||||
            bufferPtr = 0;
 | 
			
		||||
            packageReceived = true;
 | 
			
		||||
            Debug_pushMessage("Got LoRa UART: %s\n", packageInput);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 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)
 | 
			
		||||
        {
 | 
			
		||||
            if (bufferPtr < sizeof(packageInput) - 1)
 | 
			
		||||
            {
 | 
			
		||||
                packageReceived = true;
 | 
			
		||||
                receivedSize = bufferPtr;
 | 
			
		||||
                bufferPtr = 0;
 | 
			
		||||
                Debug_pushMessage("Got LoRa UART: %s\n", packageInput);
 | 
			
		||||
            }
 | 
			
		||||
            else if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c == ' ' || c == ',' || c == '.')) // Accept numbers, uppercase letters, and some special chars
 | 
			
		||||
            {
 | 
			
		||||
                bufferPtr++;
 | 
			
		||||
                packageInput[bufferPtr++] = c;
 | 
			
		||||
                packageInput[bufferPtr] = '\0'; // immer NUL-terminiert halten
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                Debug_pushMessage("Invalid character received: %c\n", c);
 | 
			
		||||
                Debug_pushMessage("Buffer overflow. Resetting buffer.\n");
 | 
			
		||||
                bufferPtr = 0;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            Debug_pushMessage("Buffer overflow. Resetting buffer.\n");
 | 
			
		||||
            bufferPtr = 0;
 | 
			
		||||
            Debug_pushMessage("Invalid character received: %c\n", c);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (packageReceived)
 | 
			
		||||
    {
 | 
			
		||||
        // Hinweis: receivedSize ist jetzt strlen(packageInput), ohne \n/\r
 | 
			
		||||
        Parse_LoRa_UartCommand(packageInput, receivedSize);
 | 
			
		||||
        packageReceived = false;
 | 
			
		||||
    }
 | 
			
		||||
@@ -244,44 +264,60 @@ void printParameters(struct Configuration configuration)
 | 
			
		||||
    Serial.println("----------------------------------------");
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#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)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    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 command[8];
 | 
			
		||||
    char value[8];
 | 
			
		||||
 | 
			
		||||
    ptr = strtok(input, delimiter);
 | 
			
		||||
 | 
			
		||||
    ptr = strtok(input, delimiter);
 | 
			
		||||
 | 
			
		||||
    while (ptr != NULL)
 | 
			
		||||
    // erstes Token (Kommando)
 | 
			
		||||
    ptr = strtok(input, delims);
 | 
			
		||||
    if (!ptr)
 | 
			
		||||
    {
 | 
			
		||||
        strncpy(command, ptr, sizeof(command) - 1); // Platz für Nullterminator lassen
 | 
			
		||||
        command[sizeof(command) - 1] = '\0';        // Nullterminator setzen
 | 
			
		||||
 | 
			
		||||
        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
 | 
			
		||||
        Debug_pushMessage("Command: %s, Value: %s\n", command, value);
 | 
			
		||||
        Debug_pushMessage("No command token\n");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Debug_pushMessage("Parsed LoRa UART Command:  %s Value: %s\n", command, value);
 | 
			
		||||
    char command[16];
 | 
			
		||||
    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);
 | 
			
		||||
 | 
			
		||||
    if (!strcmp(command, "ENABLE"))
 | 
			
		||||
    {
 | 
			
		||||
@@ -329,5 +365,9 @@ void Parse_LoRa_UartCommand(char input[], int size)
 | 
			
		||||
    {
 | 
			
		||||
        PersistenceData.activeFaction = FACTION_3;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        Debug_pushMessage("Unknown command: %s\n", command);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
		Reference in New Issue
	
	Block a user