diff --git a/ampel-firmware/ampel-firmware.ino b/ampel-firmware/ampel-firmware.ino index c9eeb1e5dc2d0fd1ea2b669b38ce286d468fe540..3fdfbd0af2fa535961b2b0efa0d9e986db3dfa45 100644 --- a/ampel-firmware/ampel-firmware.ino +++ b/ampel-firmware/ampel-firmware.ino @@ -149,10 +149,7 @@ void loop() { if (Serial.available() > 0) { commandString = Serial.readStringUntil('\n'); - Serial.print(F("OHHHH. It would be cool to do something with : '")); - Serial.print(commandString); - Serial.println("'"); - sensor_commands::run(); + sensor_commands::run(commandString.c_str()); } if (sensor::processData()) { diff --git a/ampel-firmware/co2_sensor.cpp b/ampel-firmware/co2_sensor.cpp index f341c95ef84152731a5d005dbf7278387c0c50cb..6707d5543c7a9aa332666aed2f02d7aa12373bcc 100644 --- a/ampel-firmware/co2_sensor.cpp +++ b/ampel-firmware/co2_sensor.cpp @@ -76,7 +76,7 @@ namespace sensor { Serial.print(F("Auto-calibration is ")); Serial.println(config::auto_calibrate_sensor ? "ON." : "OFF."); - sensor_commands::defineCallback(printCO2, &co2); + sensor_commands::defineCallback("co2", printCO2, &co2); } //NOTE: should timer deviation be used to adjust measurement_timestep? diff --git a/ampel-firmware/led_effects.cpp b/ampel-firmware/led_effects.cpp index 6845adc74b65677c6dc7f9c2544ce597a85d4431..5aa2d01f6b136543e4c978dacd4777f3cf74f283 100644 --- a/ampel-firmware/led_effects.cpp +++ b/ampel-firmware/led_effects.cpp @@ -83,7 +83,7 @@ namespace led_effects { pixels.setBrightness(config::max_brightness); LEDsOff(); - sensor_commands::defineCallback(helloRing, 0); + sensor_commands::defineCallback("led", helloRing, 0); } void toggleNightMode() { diff --git a/ampel-firmware/mqtt.cpp b/ampel-firmware/mqtt.cpp index 143ed736ced5b9d94999147922973d4e919a0484..62c597ea82c577179c0814b70d00620df6d04de6 100644 --- a/ampel-firmware/mqtt.cpp +++ b/ampel-firmware/mqtt.cpp @@ -141,6 +141,8 @@ namespace mqtt { messageString += (char) message[i]; } Serial.println("'."); + sensor_commands::run(messageString.c_str()); + return; //TODO: Move this logic to a separate class, which could be used by Serial/MQTT/WebServer diff --git a/ampel-firmware/mqtt.h b/ampel-firmware/mqtt.h index 2899a9996bbf8d2a484f5fc79b619d9647ee70a7..76c8b9b9461f6eea8e71cc1a739fef5beb706aa6 100644 --- a/ampel-firmware/mqtt.h +++ b/ampel-firmware/mqtt.h @@ -4,6 +4,7 @@ #include <Arduino.h> #include "config.h" #include "led_effects.h" +#include "sensor_commands.h" #ifdef AMPEL_CSV # include "csv_writer.h" #endif diff --git a/ampel-firmware/sensor_commands.cpp b/ampel-firmware/sensor_commands.cpp index 90e64f16f8fee69e52d414e2c6d9ce8acf0ab6e2..8ef85ba0472b4010f091e9d63f3249090a7e6d27 100644 --- a/ampel-firmware/sensor_commands.cpp +++ b/ampel-firmware/sensor_commands.cpp @@ -2,6 +2,7 @@ namespace sensor_commands { const uint8_t MAX_CALLBACKS = 20; + const uint8_t MAX_COMMAND_SIZE = 20; uint8_t callbacks_count = 0; // A callback contains both a function and a pointer to arbitrary data // that will be passed as argument to the function. @@ -14,19 +15,29 @@ namespace sensor_commands { }; Callback callbacks[MAX_CALLBACKS]; + char callback_names[MAX_CALLBACKS][MAX_COMMAND_SIZE]; - void defineCallback(void (*f)(void*), void *d) { + void defineCallback(const char *command, void (*f)(void*), void *d) { if (callbacks_count < MAX_CALLBACKS) { - callbacks[callbacks_count++] = Callback(f, d); + callbacks[callbacks_count] = Callback(f, d); + strlcpy(callback_names[callbacks_count], command, MAX_COMMAND_SIZE); + callbacks_count++; } else { - Serial.println("OH NOOEEEESSS!!!! TOO MANY CALLBACKS"); + Serial.println(F("Too many callbacks have been defined.")); } } - void run() { + void run(const char *command) { + Serial.print(F("Received command : '")); + Serial.print(command); + Serial.println("'"); // Test all the callbacks. for (uint8_t i = 0; i < callbacks_count; i++) { + Serial.print("Trying '"); + Serial.print(callback_names[i]); + Serial.println("'"); callbacks[i].function(callbacks[i].data); } + Serial.println("Done."); } } diff --git a/ampel-firmware/sensor_commands.h b/ampel-firmware/sensor_commands.h index 81783f8e8be19ef9b7145a826fae582b1bc1efd8..e94ec31bba611db2791af8cf9e5a0c1814b62c7a 100644 --- a/ampel-firmware/sensor_commands.h +++ b/ampel-firmware/sensor_commands.h @@ -6,6 +6,6 @@ */ namespace sensor_commands { - void run(); - void defineCallback(void (*f)(void*), void *d); + void run(const char *command); + void defineCallback(const char *command, void (*f)(void*), void *d); }