An error occurred while loading the file. Please try again.
sensor_commands.cpp 2.31 KiB
#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 defineCallback(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 &parameter) {
    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(); } }