sensor_commands.cpp 2.43 KB
Newer Older
1
2
3
#include "sensor_commands.h"

namespace sensor_commands {
4
  const uint8_t MAX_CALLBACKS = 20;
Eric Duminil's avatar
Eric Duminil committed
5
  const uint8_t MAX_COMMAND_SIZE = 30;
Eric Duminil's avatar
Eric Duminil committed
6

7
  uint8_t callbacks_count = 0;
8
  struct Callback {
Eric Duminil's avatar
Eric Duminil committed
9
10
    Callback(const char *s = 0, void (*f)(int32_t) = 0) :
        name(s), function(f) {
11
    }
Eric Duminil's avatar
Eric Duminil committed
12
    const char *name;
Eric Duminil's avatar
Eric Duminil committed
13
    void (*function)(int32_t);
14
15
  };

16
  Callback callbacks[MAX_CALLBACKS];
17

Eric Duminil's avatar
Eric Duminil committed
18
  void defineCallback(const char *n, void (*f)(int32_t)) {
19
    if (callbacks_count < MAX_CALLBACKS) {
Eric Duminil's avatar
Eric Duminil committed
20
      callbacks[callbacks_count] = Callback(n, f);
Eric Duminil's avatar
Eric Duminil committed
21
      callbacks_count++;
22
    } else {
Eric Duminil's avatar
Eric Duminil committed
23
      Serial.println(F("Too many callbacks have been defined."));
24
    }
25
26
  }

Eric Duminil's avatar
Eric Duminil committed
27
  bool startsWith(const char *a, const char *b) {
Eric Duminil's avatar
Eric Duminil committed
28
29
30
    return !strncmp(a, b, strlen(b));
  }

Eric Duminil's avatar
Eric Duminil committed
31
  bool parseCommand(const char *command, char *function_name, int32_t &parameter) {
Eric Duminil's avatar
Eric Duminil committed
32
33
    char split_command[MAX_COMMAND_SIZE];
    strlcpy(split_command, command, MAX_COMMAND_SIZE);
Eric Duminil's avatar
Eric Duminil committed
34
    Serial.print(F("Received : '"));
Eric Duminil's avatar
Eric Duminil committed
35
36
    Serial.print(command);
    Serial.println("'");
Eric Duminil's avatar
Eric Duminil committed
37
    char *arg;
Eric Duminil's avatar
Eric Duminil committed
38
39
40
    char *part1;
    part1 = strtok(split_command, " ");
    if (!part1) {
Eric Duminil's avatar
Eric Duminil committed
41
      // Empty string
Eric Duminil's avatar
Eric Duminil committed
42
      return 1;
Eric Duminil's avatar
Eric Duminil committed
43
    }
Eric Duminil's avatar
Eric Duminil committed
44
    strlcpy(function_name, part1, MAX_COMMAND_SIZE);
Eric Duminil's avatar
Eric Duminil committed
45
46
47
48
49
50
51
52
53
54
55
    arg = strtok(NULL, " ");
    if (arg) {
      char *end;
      parameter = strtol(arg, &end, 10);
      if (*end) {
        // Second argument isn't a number
        parameter = -9999;
      }
    } else {
      parameter = -9999;
    }
Eric Duminil's avatar
Eric Duminil committed
56
57
58
    return 0;
  }

Eric Duminil's avatar
Eric Duminil committed
59
60
61
62
63
64
  void listAvailableCallbacks() {
    Serial.println("DEBUG - Available commands :");
    for (uint8_t i = 0; i < callbacks_count; i++) {
      Serial.print("  ");
      Serial.println(callbacks[i].name);
    }
Eric Duminil's avatar
Eric Duminil committed
65
66
    led_effects::showKITTWheel(color::red, 1);
    Serial.println(F("Message not supported. Doing nothing."));
Eric Duminil's avatar
Eric Duminil committed
67
68
  }

Eric Duminil's avatar
Eric Duminil committed
69
70
  void run(const char *command) {
    char function_name[MAX_COMMAND_SIZE];
Eric Duminil's avatar
Eric Duminil committed
71
    int32_t parameter;
Eric Duminil's avatar
Eric Duminil committed
72
    if (parseCommand(command, function_name, parameter)) {
Eric Duminil's avatar
Eric Duminil committed
73
      listAvailableCallbacks();
Eric Duminil's avatar
Eric Duminil committed
74
75
      return;
    }
Eric Duminil's avatar
Eric Duminil committed
76
77
78
79
80
    Serial.print("Command : '");
    Serial.print(function_name);
    Serial.print("'. Parameter : ");
    Serial.println(parameter);

81
    for (uint8_t i = 0; i < callbacks_count; i++) {
Eric Duminil's avatar
Eric Duminil committed
82
83
84
85
86
      if (!strcmp(function_name, callbacks[i].name)) {
        Serial.print("Function found!!!");
        Serial.print("Trying '");
        Serial.print(callbacks[i].name);
        Serial.println("'");
Eric Duminil's avatar
Eric Duminil committed
87
        callbacks[i].function(parameter);
Eric Duminil's avatar
Eric Duminil committed
88
        return;
Eric Duminil's avatar
Eric Duminil committed
89
      }
90
    }
Eric Duminil's avatar
Eric Duminil committed
91
    listAvailableCallbacks();
92
93
  }
}