The firmware of the Grove Node

Dependencies:   BLE_API color_pixels mbed-src-nrf51822 nRF51822

Fork of BLE_LoopbackUART by Bluetooth Low Energy

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?

UserRevisionLine numberNew 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 }