diff --git a/ampel-firmware/ampel-firmware.ino b/ampel-firmware/ampel-firmware.ino index 3fdfbd0af2fa535961b2b0efa0d9e986db3dfa45..ff83379cffac9d74810dde453a86f26dc34b9f5c 100644 --- a/ampel-firmware/ampel-firmware.ino +++ b/ampel-firmware/ampel-firmware.ino @@ -147,9 +147,8 @@ void loop() { // Short press for night mode, Long press for calibration. checkFlashButton(); - if (Serial.available() > 0) { - commandString = Serial.readStringUntil('\n'); - sensor_commands::run(commandString.c_str()); + while (Serial.available() > 0) { + sensor_commands::processIncomingByte(Serial.read()); } if (sensor::processData()) { @@ -171,7 +170,7 @@ void loop() { max_loop_duration = duration; Serial.print(F("Debug - Max loop duration : ")); Serial.print(max_loop_duration); - Serial.println(" ms."); + Serial.println(F(" ms.")); } } diff --git a/ampel-firmware/sensor_commands.cpp b/ampel-firmware/sensor_commands.cpp index d9644dd9e8cadd5202e3f6010087329101776056..3b4d56b82d8ae89b87218cd8951a6afc62323a05 100644 --- a/ampel-firmware/sensor_commands.cpp +++ b/ampel-firmware/sensor_commands.cpp @@ -77,6 +77,26 @@ namespace sensor_commands { return code; } + // http://www.gammon.com.au/serial + void processIncomingByte(const byte input_byte) { + static char input_line[MAX_COMMAND_SIZE]; + static unsigned int input_pos = 0; + switch (input_byte) { + case '\n': // end of text + input_line[input_pos] = 0; + run(input_line); + input_pos = 0; + break; + case '\r': // discard carriage return + break; + default: + // keep adding if not full ... allow for terminating null byte + if (input_pos < (MAX_COMMAND_SIZE - 1)) + input_line[input_pos++] = input_byte; + break; + } + } + void listAvailableCallbacks() { for (uint8_t i = 0; i < callbacks_count; i++) { Serial.print(" "); @@ -106,7 +126,7 @@ namespace sensor_commands { Serial.println(")"); callbacks[i].intFunction(argument); } else { - Serial.println(); + Serial.println("()"); callbacks[i].voidFunction(); } return; diff --git a/ampel-firmware/sensor_commands.h b/ampel-firmware/sensor_commands.h index dd321c29016e399e8a0ccd8e3e54cdc4d4b306d7..ac73d066d02c55d55c13208051f148dbd7a88df9 100644 --- a/ampel-firmware/sensor_commands.h +++ b/ampel-firmware/sensor_commands.h @@ -7,6 +7,7 @@ */ namespace sensor_commands { + void processIncomingByte(const byte in_byte); void run(const char *command); void defineIntCallback(const char *command, void (*function)(int32_t), const char *doc); void defineCallback(const char *command, void (*function)(void), const char *doc);