From 39fe4d114e6ac5f4b8d9e74f04da0bdc1501726c Mon Sep 17 00:00:00 2001
From: Eric Duminil <eric.duminil@gmail.com>
Date: Sat, 17 Apr 2021 23:58:39 +0200
Subject: [PATCH] Don't read serial before enter is pressed

---
 ampel-firmware/ampel-firmware.ino  |  7 +++----
 ampel-firmware/sensor_commands.cpp | 22 +++++++++++++++++++++-
 ampel-firmware/sensor_commands.h   |  1 +
 3 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/ampel-firmware/ampel-firmware.ino b/ampel-firmware/ampel-firmware.ino
index 3fdfbd0..ff83379 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 d9644dd..3b4d56b 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 dd321c2..ac73d06 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);
-- 
GitLab