sensor_commands.cpp 2.29 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;
Eric Duminil's avatar
Eric Duminil committed
8
  //TODO: Add example? Add description?
9
  struct Callback {
Eric Duminil's avatar
Eric Duminil committed
10
11
    Callback(const char *s = 0, void (*f)(int32_t) = 0) :
        name(s), function(f) {
12
    }
Eric Duminil's avatar
Eric Duminil committed
13
    const char *name;
Eric Duminil's avatar
Eric Duminil committed
14
    void (*function)(int32_t);
15
16
  };

17
  Callback callbacks[MAX_CALLBACKS];
18

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

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

Eric Duminil's avatar
Eric Duminil committed
32
  bool parseCommand(const char *command, char *function_name, int32_t &parameter) {
Eric Duminil's avatar
Eric Duminil committed
33
34
    char split_command[MAX_COMMAND_SIZE];
    strlcpy(split_command, command, MAX_COMMAND_SIZE);
Eric Duminil's avatar
Eric Duminil committed
35
    Serial.print(F("Received : '"));
Eric Duminil's avatar
Eric Duminil committed
36
37
    Serial.print(command);
    Serial.println("'");
Eric Duminil's avatar
Eric Duminil committed
38
    char *arg;
Eric Duminil's avatar
Eric Duminil committed
39
40
41
    char *part1;
    part1 = strtok(split_command, " ");
    if (!part1) {
Eric Duminil's avatar
Eric Duminil committed
42
      // Empty string
Eric Duminil's avatar
Eric Duminil committed
43
      return 1;
Eric Duminil's avatar
Eric Duminil committed
44
    }
Eric Duminil's avatar
Eric Duminil committed
45
    strlcpy(function_name, part1, MAX_COMMAND_SIZE);
Eric Duminil's avatar
Eric Duminil committed
46
47
48
49
50
51
52
53
54
55
56
    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
57
58
59
    return 0;
  }

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

Eric Duminil's avatar
Eric Duminil committed
70
71
  void run(const char *command) {
    char function_name[MAX_COMMAND_SIZE];
Eric Duminil's avatar
Eric Duminil committed
72
    int32_t parameter;
Eric Duminil's avatar
Eric Duminil committed
73
    parseCommand(command, function_name, parameter);
Eric Duminil's avatar
Eric Duminil committed
74

75
    for (uint8_t i = 0; i < callbacks_count; i++) {
Eric Duminil's avatar
Eric Duminil committed
76
      if (!strcmp(function_name, callbacks[i].name)) {
Eric Duminil's avatar
Eric Duminil committed
77
78
79
80
81
        Serial.print("Calling : ");
        Serial.print(function_name);
        Serial.print("(");
        Serial.print(parameter);
        Serial.println(")");
Eric Duminil's avatar
Eric Duminil committed
82
        callbacks[i].function(parameter);
Eric Duminil's avatar
Eric Duminil committed
83
        return;
Eric Duminil's avatar
Eric Duminil committed
84
      }
85
    }
Eric Duminil's avatar
Eric Duminil committed
86
    listAvailableCallbacks();
87
88
  }
}