sensor_commands.cpp 1.27 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 = 20;
6
  uint8_t callbacks_count = 0;
7
8
9
10
11
12
13
14
15
16
// A callback contains both a function and a pointer to arbitrary data
// that will be passed as argument to the function.
  struct Callback {
    Callback(void (*f)(void*) = 0, void *d = 0) :
        function(f), data(d) {
    }
    void (*function)(void*);
    void *data;
  };

17
  Callback callbacks[MAX_CALLBACKS];
Eric Duminil's avatar
Eric Duminil committed
18
  char callback_names[MAX_CALLBACKS][MAX_COMMAND_SIZE];
19

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

Eric Duminil's avatar
Eric Duminil committed
30
31
32
33
  void run(const char *command) {
    Serial.print(F("Received command : '"));
    Serial.print(command);
    Serial.println("'");
34
    // Test all the callbacks.
35
    for (uint8_t i = 0; i < callbacks_count; i++) {
Eric Duminil's avatar
Eric Duminil committed
36
37
38
      Serial.print("Trying '");
      Serial.print(callback_names[i]);
      Serial.println("'");
39
40
      callbacks[i].function(callbacks[i].data);
    }
Eric Duminil's avatar
Eric Duminil committed
41
    Serial.println("Done.");
42
43
  }
}