made LoRa-UART Command handler more robust
This commit is contained in:
		@@ -102,37 +102,57 @@ void LoRa_Process()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    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
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            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;
 | 
					                packageInput[bufferPtr++] = c;
 | 
				
			||||||
                receivedSize = bufferPtr;
 | 
					                packageInput[bufferPtr] = '\0'; // immer NUL-terminiert halten
 | 
				
			||||||
                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++;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Debug_pushMessage("Invalid character received: %c\n", c);
 | 
					                Debug_pushMessage("Buffer overflow. Resetting buffer.\n");
 | 
				
			||||||
 | 
					                bufferPtr = 0;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Debug_pushMessage("Buffer overflow. Resetting buffer.\n");
 | 
					            Debug_pushMessage("Invalid character received: %c\n", c);
 | 
				
			||||||
            bufferPtr = 0;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    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,44 +264,60 @@ 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
 | 
					 | 
				
			||||||
        Debug_pushMessage("Command: %s, Value: %s\n", command, value);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    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"))
 | 
					    if (!strcmp(command, "ENABLE"))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user