#include "sensor_commands.h" namespace sensor_commands { const uint8_t MAX_CALLBACKS = 20; const uint8_t MAX_COMMAND_SIZE = 30; uint8_t callbacks_count = 0; struct Callback { Callback(const char *s = 0, void (*f)(int32_t) = 0, const char *d = 0) : name(s), function(f), doc(d) { } const char *name; void (*function)(int32_t); const char *doc; }; Callback callbacks[MAX_CALLBACKS]; void defineIntCallback(const char *name, void (*function)(int32_t), const char *doc) { if (callbacks_count < MAX_CALLBACKS) { callbacks[callbacks_count] = Callback(name, function, doc); callbacks_count++; } else { Serial.println(F("Too many callbacks have been defined.")); } } uint8_t parseCommand(const char *command, char *function_name, int32_t ¶meter) { char split_command[MAX_COMMAND_SIZE]; strlcpy(split_command, command, MAX_COMMAND_SIZE); Serial.print(F("Received : '")); Serial.print(command); Serial.println("'"); char *arg; char *part1; part1 = strtok(split_command, " "); if (!part1) { // Empty string return 1; } strlcpy(function_name, part1, MAX_COMMAND_SIZE); arg = strtok(NULL, " "); uint8_t code = 0; if (arg) { char *end; parameter = strtol(arg, &end, 10); if (*end) { // Second argument isn't a number code = 2; } } else { // No parameter code = 2; } return code; } void listAvailableCallbacks() { for (uint8_t i = 0; i < callbacks_count; i++) { Serial.print(" "); Serial.print(callbacks[i].name); Serial.print(callbacks[i].doc); Serial.println("."); } led_effects::showKITTWheel(color::red, 1); } void run(const char *command) { char function_name[MAX_COMMAND_SIZE]; int32_t parameter = 0; parseCommand(command, function_name, parameter); for (uint8_t i = 0; i < callbacks_count; i++) { if (!strcmp(function_name, callbacks[i].name)) { Serial.print("Calling : "); Serial.print(function_name); Serial.print("("); Serial.print(parameter); Serial.println(")"); callbacks[i].function(parameter); return; } } Serial.println(F("Message not supported. Available commands :")); listAvailableCallbacks(); } }