sensor_commands.cpp 2.03 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

6
  uint8_t callbacks_count = 0;
7
8
9
// A callback contains both a function and a pointer to arbitrary data
// that will be passed as argument to the function.
  struct Callback {
Eric Duminil's avatar
Eric Duminil committed
10
11
    Callback(const char *s = 0, void (*f)(void*) = 0, void *d = 0) :
        name(s), function(f), data(d) {
12
    }
Eric Duminil's avatar
Eric Duminil committed
13
    const char *name;
14
15
16
17
    void (*function)(void*);
    void *data;
  };

18
  Callback callbacks[MAX_CALLBACKS];
19

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

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

  bool parseCommand(const char *c, char *fname, long *param) {
Eric Duminil's avatar
Eric Duminil committed
34
35
36
    return 0;
  }

Eric Duminil's avatar
Eric Duminil committed
37
38
39
40
41
42
43
  void run(const char *c) {
    char command[30];
    char *function_name;
    long parameter;
    parseCommand(c, function_name, &parameter);
    strlcpy(command, c, 30);
    Serial.print(F("Received : '"));
Eric Duminil's avatar
Eric Duminil committed
44
45
    Serial.print(command);
    Serial.println("'");
Eric Duminil's avatar
Eric Duminil committed
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
    char *arg;
    function_name = strtok(command, " ");
    if (!function_name) {
      // Empty string
      return;
    }
    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;
    }
    Serial.print("Command : '");
    Serial.print(function_name);
    Serial.print("'. Parameter : ");
    Serial.println(parameter);

68
    // Test all the callbacks.
69
    for (uint8_t i = 0; i < callbacks_count; i++) {
Eric Duminil's avatar
Eric Duminil committed
70
71
72
      if (startsWith(command, callbacks[i].name)) {
        Serial.print("OHHHH YES!!!");
      }
Eric Duminil's avatar
Eric Duminil committed
73
      Serial.print("Trying '");
Eric Duminil's avatar
Eric Duminil committed
74
      Serial.print(callbacks[i].name);
Eric Duminil's avatar
Eric Duminil committed
75
      Serial.println("'");
76
77
      callbacks[i].function(callbacks[i].data);
    }
Eric Duminil's avatar
Eric Duminil committed
78
    Serial.println("Done.");
79
80
  }
}