The firmware of the Grove Node
Dependencies: BLE_API color_pixels mbed-src-nrf51822 nRF51822
Fork of BLE_LoopbackUART by
node.cpp@9:84cb66d0375d, 2014-11-06 (annotated)
- Committer:
- yihui
- Date:
- Thu Nov 06 02:22:01 2014 +0000
- Revision:
- 9:84cb66d0375d
- Child:
- 10:f34ff4e47741
Grove Node initial
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yihui | 9:84cb66d0375d | 1 | |
yihui | 9:84cb66d0375d | 2 | |
yihui | 9:84cb66d0375d | 3 | #include "unified_driver.h" |
yihui | 9:84cb66d0375d | 4 | #include "mbed.h" |
yihui | 9:84cb66d0375d | 5 | #include "UARTService.h" |
yihui | 9:84cb66d0375d | 6 | |
yihui | 9:84cb66d0375d | 7 | #define LOG(...) // { printf(__VA_ARGS__); } |
yihui | 9:84cb66d0375d | 8 | |
yihui | 9:84cb66d0375d | 9 | extern UARTService *uartServicePtr; |
yihui | 9:84cb66d0375d | 10 | |
yihui | 9:84cb66d0375d | 11 | |
yihui | 9:84cb66d0375d | 12 | extern "C" driver_t analog_sensor_driver; |
yihui | 9:84cb66d0375d | 13 | extern "C" driver_t analog_thermometer_driver; |
yihui | 9:84cb66d0375d | 14 | extern "C" driver_t time_sensor_driver; |
yihui | 9:84cb66d0375d | 15 | |
yihui | 9:84cb66d0375d | 16 | driver_t *sensor_list[] = |
yihui | 9:84cb66d0375d | 17 | { |
yihui | 9:84cb66d0375d | 18 | &analog_sensor_driver, |
yihui | 9:84cb66d0375d | 19 | &analog_thermometer_driver, |
yihui | 9:84cb66d0375d | 20 | &time_sensor_driver, |
yihui | 9:84cb66d0375d | 21 | }; |
yihui | 9:84cb66d0375d | 22 | |
yihui | 9:84cb66d0375d | 23 | |
yihui | 9:84cb66d0375d | 24 | extern "C" driver_t switch_driver; |
yihui | 9:84cb66d0375d | 25 | extern "C" driver_t led_driver; |
yihui | 9:84cb66d0375d | 26 | extern "C" driver_t color_led_strip_driver; |
yihui | 9:84cb66d0375d | 27 | |
yihui | 9:84cb66d0375d | 28 | driver_t *actuator_list[] = |
yihui | 9:84cb66d0375d | 29 | { |
yihui | 9:84cb66d0375d | 30 | &switch_driver, |
yihui | 9:84cb66d0375d | 31 | &led_driver, |
yihui | 9:84cb66d0375d | 32 | &color_led_strip_driver |
yihui | 9:84cb66d0375d | 33 | }; |
yihui | 9:84cb66d0375d | 34 | |
yihui | 9:84cb66d0375d | 35 | |
yihui | 9:84cb66d0375d | 36 | equation_t equation_list[8] = |
yihui | 9:84cb66d0375d | 37 | { |
yihui | 9:84cb66d0375d | 38 | {0, '>', 0.50}, |
yihui | 9:84cb66d0375d | 39 | {0, '<', 0.49}, |
yihui | 9:84cb66d0375d | 40 | }; |
yihui | 9:84cb66d0375d | 41 | |
yihui | 9:84cb66d0375d | 42 | int equation_number = 2; |
yihui | 9:84cb66d0375d | 43 | |
yihui | 9:84cb66d0375d | 44 | driver_t *sensor; |
yihui | 9:84cb66d0375d | 45 | driver_t *actuator; |
yihui | 9:84cb66d0375d | 46 | int sensor_id = 0; |
yihui | 9:84cb66d0375d | 47 | int actuator_id = 0; |
yihui | 9:84cb66d0375d | 48 | void *sensor_object; |
yihui | 9:84cb66d0375d | 49 | void *actuator_object; |
yihui | 9:84cb66d0375d | 50 | float sensor_data[16] = {0,}; |
yihui | 9:84cb66d0375d | 51 | float actuator_data[8] = {0,}; |
yihui | 9:84cb66d0375d | 52 | |
yihui | 9:84cb66d0375d | 53 | float action_list[8][8] = |
yihui | 9:84cb66d0375d | 54 | { |
yihui | 9:84cb66d0375d | 55 | {1, }, |
yihui | 9:84cb66d0375d | 56 | {0.0, }, |
yihui | 9:84cb66d0375d | 57 | {0.5, 1.0}, |
yihui | 9:84cb66d0375d | 58 | }; |
yihui | 9:84cb66d0375d | 59 | |
yihui | 9:84cb66d0375d | 60 | uint8_t action_number = 2; |
yihui | 9:84cb66d0375d | 61 | |
yihui | 9:84cb66d0375d | 62 | uint32_t sensor_init_data[8] = {0, }; |
yihui | 9:84cb66d0375d | 63 | uint32_t actuator_init_data[8] = {0, }; |
yihui | 9:84cb66d0375d | 64 | |
yihui | 9:84cb66d0375d | 65 | int8_t event_to_action_map[8] = {0, 2, }; |
yihui | 9:84cb66d0375d | 66 | |
yihui | 9:84cb66d0375d | 67 | |
yihui | 9:84cb66d0375d | 68 | void node_init() |
yihui | 9:84cb66d0375d | 69 | { |
yihui | 9:84cb66d0375d | 70 | sensor_id = 0; |
yihui | 9:84cb66d0375d | 71 | sensor = sensor_list[0]; |
yihui | 9:84cb66d0375d | 72 | sensor_init_data[0] = p3; |
yihui | 9:84cb66d0375d | 73 | sensor_init_data[1] = p4; |
yihui | 9:84cb66d0375d | 74 | sensor->init(&sensor_object, sensor_init_data); |
yihui | 9:84cb66d0375d | 75 | |
yihui | 9:84cb66d0375d | 76 | actuator = actuator_list[0]; |
yihui | 9:84cb66d0375d | 77 | actuator_init_data[0] = p1; |
yihui | 9:84cb66d0375d | 78 | actuator_init_data[1] = p2; |
yihui | 9:84cb66d0375d | 79 | actuator->init(&actuator_object, actuator_init_data); |
yihui | 9:84cb66d0375d | 80 | } |
yihui | 9:84cb66d0375d | 81 | |
yihui | 9:84cb66d0375d | 82 | void node_tick() |
yihui | 9:84cb66d0375d | 83 | { |
yihui | 9:84cb66d0375d | 84 | sensor->read(&sensor_object, sensor_data); |
yihui | 9:84cb66d0375d | 85 | |
yihui | 9:84cb66d0375d | 86 | for (int d = 0; d < sensor->d; d++) { |
yihui | 9:84cb66d0375d | 87 | float value = sensor_data[d]; |
yihui | 9:84cb66d0375d | 88 | |
yihui | 9:84cb66d0375d | 89 | uartServicePtr->printf("i %d %f\n", d, value); |
yihui | 9:84cb66d0375d | 90 | |
yihui | 9:84cb66d0375d | 91 | for (int e = 0; e < equation_number; e++) { |
yihui | 9:84cb66d0375d | 92 | equation_t *equation = equation_list + e; |
yihui | 9:84cb66d0375d | 93 | |
yihui | 9:84cb66d0375d | 94 | bool result; |
yihui | 9:84cb66d0375d | 95 | if (equation->d == d) { |
yihui | 9:84cb66d0375d | 96 | if ('>' == equation->op) { |
yihui | 9:84cb66d0375d | 97 | result = value > equation->value; |
yihui | 9:84cb66d0375d | 98 | } else if ('<' == equation->op) { |
yihui | 9:84cb66d0375d | 99 | result = value < equation->value; |
yihui | 9:84cb66d0375d | 100 | } else if ('=' == equation->op) { |
yihui | 9:84cb66d0375d | 101 | result = value == equation->value; |
yihui | 9:84cb66d0375d | 102 | } |
yihui | 9:84cb66d0375d | 103 | } |
yihui | 9:84cb66d0375d | 104 | |
yihui | 9:84cb66d0375d | 105 | if (result) { |
yihui | 9:84cb66d0375d | 106 | LOG("event [%d] occured\n", e); |
yihui | 9:84cb66d0375d | 107 | |
yihui | 9:84cb66d0375d | 108 | int a = event_to_action_map[e]; |
yihui | 9:84cb66d0375d | 109 | if (a != -1) { |
yihui | 9:84cb66d0375d | 110 | actuator->write(&actuator_object, action_list[a]); |
yihui | 9:84cb66d0375d | 111 | |
yihui | 9:84cb66d0375d | 112 | LOG("execute action [%d]\n", a); |
yihui | 9:84cb66d0375d | 113 | } |
yihui | 9:84cb66d0375d | 114 | } |
yihui | 9:84cb66d0375d | 115 | |
yihui | 9:84cb66d0375d | 116 | } |
yihui | 9:84cb66d0375d | 117 | } |
yihui | 9:84cb66d0375d | 118 | } |
yihui | 9:84cb66d0375d | 119 | |
yihui | 9:84cb66d0375d | 120 | void node_parse(int argc, char *argv[]) |
yihui | 9:84cb66d0375d | 121 | { |
yihui | 9:84cb66d0375d | 122 | if (2 == argc) { |
yihui | 9:84cb66d0375d | 123 | int param1 = atoi(argv[1]); |
yihui | 9:84cb66d0375d | 124 | if (0 == strcmp(argv[0], "s")) { |
yihui | 9:84cb66d0375d | 125 | if (param1 != sensor_id) { |
yihui | 9:84cb66d0375d | 126 | sensor_id = param1; |
yihui | 9:84cb66d0375d | 127 | sensor->fini(&sensor_object); |
yihui | 9:84cb66d0375d | 128 | sensor = sensor_list[param1]; |
yihui | 9:84cb66d0375d | 129 | sensor->init(&sensor_object, sensor_init_data); |
yihui | 9:84cb66d0375d | 130 | |
yihui | 9:84cb66d0375d | 131 | equation_number = 0; |
yihui | 9:84cb66d0375d | 132 | } |
yihui | 9:84cb66d0375d | 133 | |
yihui | 9:84cb66d0375d | 134 | LOG("select sensor [%d]\n", sensor_id); |
yihui | 9:84cb66d0375d | 135 | } else if (0 == strcmp(argv[0], "a")) { |
yihui | 9:84cb66d0375d | 136 | if (param1 != actuator_id) { |
yihui | 9:84cb66d0375d | 137 | actuator_id = param1; |
yihui | 9:84cb66d0375d | 138 | actuator->fini(&actuator_object); |
yihui | 9:84cb66d0375d | 139 | actuator = actuator_list[param1]; |
yihui | 9:84cb66d0375d | 140 | actuator->init(&actuator_object, actuator_init_data); |
yihui | 9:84cb66d0375d | 141 | |
yihui | 9:84cb66d0375d | 142 | action_number = 0; |
yihui | 9:84cb66d0375d | 143 | } |
yihui | 9:84cb66d0375d | 144 | |
yihui | 9:84cb66d0375d | 145 | LOG("select sensor [%d]\n", sensor_id); |
yihui | 9:84cb66d0375d | 146 | } |
yihui | 9:84cb66d0375d | 147 | |
yihui | 9:84cb66d0375d | 148 | memset(event_to_action_map, -1, sizeof(event_to_action_map)); |
yihui | 9:84cb66d0375d | 149 | } else if (5 == argc && 0 == strcmp(argv[0], "e")) { |
yihui | 9:84cb66d0375d | 150 | uint8_t event_id = atoi(argv[1]); |
yihui | 9:84cb66d0375d | 151 | if (event_id > equation_number) { |
yihui | 9:84cb66d0375d | 152 | return; |
yihui | 9:84cb66d0375d | 153 | } |
yihui | 9:84cb66d0375d | 154 | uint8_t dimention = atoi(argv[2]); |
yihui | 9:84cb66d0375d | 155 | uint8_t symbol = argv[3][0]; |
yihui | 9:84cb66d0375d | 156 | float value = atof(argv[4]); |
yihui | 9:84cb66d0375d | 157 | |
yihui | 9:84cb66d0375d | 158 | equation_t *equation = equation_list + event_id; |
yihui | 9:84cb66d0375d | 159 | equation->d = dimention; |
yihui | 9:84cb66d0375d | 160 | equation->op = symbol; |
yihui | 9:84cb66d0375d | 161 | equation->value = value; |
yihui | 9:84cb66d0375d | 162 | |
yihui | 9:84cb66d0375d | 163 | LOG("set event [%d]: %d %c %f\n", event_id, dimention, symbol, value); |
yihui | 9:84cb66d0375d | 164 | |
yihui | 9:84cb66d0375d | 165 | |
yihui | 9:84cb66d0375d | 166 | if (event_id == equation_number) { |
yihui | 9:84cb66d0375d | 167 | equation_number++; |
yihui | 9:84cb66d0375d | 168 | } |
yihui | 9:84cb66d0375d | 169 | } else if (3 == argc && 0 == strcmp(argv[0], "m")) { |
yihui | 9:84cb66d0375d | 170 | uint8_t event_id = atoi(argv[1]); |
yihui | 9:84cb66d0375d | 171 | uint8_t action_id = atoi(argv[2]); |
yihui | 9:84cb66d0375d | 172 | |
yihui | 9:84cb66d0375d | 173 | event_to_action_map[event_id] = action_id; |
yihui | 9:84cb66d0375d | 174 | |
yihui | 9:84cb66d0375d | 175 | LOG("map event [%d] -> action [%d]\n", event_id, action_id); |
yihui | 9:84cb66d0375d | 176 | } |
yihui | 9:84cb66d0375d | 177 | |
yihui | 9:84cb66d0375d | 178 | if (0 == strcmp(argv[0], "f")) { |
yihui | 9:84cb66d0375d | 179 | uint8_t action_id = atoi(argv[1]); |
yihui | 9:84cb66d0375d | 180 | if (action_id > action_number) { |
yihui | 9:84cb66d0375d | 181 | return; |
yihui | 9:84cb66d0375d | 182 | } else if (action_id == action_number) { |
yihui | 9:84cb66d0375d | 183 | action_number++; |
yihui | 9:84cb66d0375d | 184 | } |
yihui | 9:84cb66d0375d | 185 | |
yihui | 9:84cb66d0375d | 186 | int n = argc - 2; |
yihui | 9:84cb66d0375d | 187 | if (n > 8) { |
yihui | 9:84cb66d0375d | 188 | n = 8; |
yihui | 9:84cb66d0375d | 189 | } |
yihui | 9:84cb66d0375d | 190 | |
yihui | 9:84cb66d0375d | 191 | LOG("set action [%d]:", action_id); |
yihui | 9:84cb66d0375d | 192 | for (int i = 0; i < 8; i++) { |
yihui | 9:84cb66d0375d | 193 | if (i < n) { |
yihui | 9:84cb66d0375d | 194 | float value = atof(argv[i + 2]); |
yihui | 9:84cb66d0375d | 195 | action_list[action_id][i] = value; |
yihui | 9:84cb66d0375d | 196 | LOG(" %f", value); |
yihui | 9:84cb66d0375d | 197 | } else { |
yihui | 9:84cb66d0375d | 198 | action_list[action_id][i] = 0; |
yihui | 9:84cb66d0375d | 199 | } |
yihui | 9:84cb66d0375d | 200 | } |
yihui | 9:84cb66d0375d | 201 | |
yihui | 9:84cb66d0375d | 202 | LOG("\n"); |
yihui | 9:84cb66d0375d | 203 | |
yihui | 9:84cb66d0375d | 204 | // actuator->write(&actuator_object, action_list[action_id]); |
yihui | 9:84cb66d0375d | 205 | } else if (0 == strcmp(argv[0], "o")) { |
yihui | 9:84cb66d0375d | 206 | |
yihui | 9:84cb66d0375d | 207 | int n = argc - 1; |
yihui | 9:84cb66d0375d | 208 | if (n > 8) { |
yihui | 9:84cb66d0375d | 209 | n = 8; |
yihui | 9:84cb66d0375d | 210 | } |
yihui | 9:84cb66d0375d | 211 | |
yihui | 9:84cb66d0375d | 212 | |
yihui | 9:84cb66d0375d | 213 | LOG("set output:"); |
yihui | 9:84cb66d0375d | 214 | for (int i = 0; i < 8; i++) { |
yihui | 9:84cb66d0375d | 215 | if (i < n) { |
yihui | 9:84cb66d0375d | 216 | float value = atof(argv[i + 1]); |
yihui | 9:84cb66d0375d | 217 | actuator_data[i] = value; |
yihui | 9:84cb66d0375d | 218 | LOG(" %f", value); |
yihui | 9:84cb66d0375d | 219 | } else { |
yihui | 9:84cb66d0375d | 220 | actuator_data[i] = 0; |
yihui | 9:84cb66d0375d | 221 | } |
yihui | 9:84cb66d0375d | 222 | } |
yihui | 9:84cb66d0375d | 223 | |
yihui | 9:84cb66d0375d | 224 | LOG("\n"); |
yihui | 9:84cb66d0375d | 225 | |
yihui | 9:84cb66d0375d | 226 | actuator->write(&actuator_object, actuator_data); |
yihui | 9:84cb66d0375d | 227 | } |
yihui | 9:84cb66d0375d | 228 | |
yihui | 9:84cb66d0375d | 229 | } |