The firmware of the Grove Node
Dependencies: BLE_API color_pixels mbed-src-nrf51822 nRF51822
Fork of BLE_LoopbackUART by
node.cpp
- Committer:
- yihui
- Date:
- 2014-11-06
- Revision:
- 9:84cb66d0375d
- Child:
- 10:f34ff4e47741
File content as of revision 9:84cb66d0375d:
#include "unified_driver.h" #include "mbed.h" #include "UARTService.h" #define LOG(...) // { printf(__VA_ARGS__); } extern UARTService *uartServicePtr; extern "C" driver_t analog_sensor_driver; extern "C" driver_t analog_thermometer_driver; extern "C" driver_t time_sensor_driver; driver_t *sensor_list[] = { &analog_sensor_driver, &analog_thermometer_driver, &time_sensor_driver, }; extern "C" driver_t switch_driver; extern "C" driver_t led_driver; extern "C" driver_t color_led_strip_driver; driver_t *actuator_list[] = { &switch_driver, &led_driver, &color_led_strip_driver }; equation_t equation_list[8] = { {0, '>', 0.50}, {0, '<', 0.49}, }; int equation_number = 2; driver_t *sensor; driver_t *actuator; int sensor_id = 0; int actuator_id = 0; void *sensor_object; void *actuator_object; float sensor_data[16] = {0,}; float actuator_data[8] = {0,}; float action_list[8][8] = { {1, }, {0.0, }, {0.5, 1.0}, }; uint8_t action_number = 2; uint32_t sensor_init_data[8] = {0, }; uint32_t actuator_init_data[8] = {0, }; int8_t event_to_action_map[8] = {0, 2, }; void node_init() { sensor_id = 0; sensor = sensor_list[0]; sensor_init_data[0] = p3; sensor_init_data[1] = p4; sensor->init(&sensor_object, sensor_init_data); actuator = actuator_list[0]; actuator_init_data[0] = p1; actuator_init_data[1] = p2; actuator->init(&actuator_object, actuator_init_data); } void node_tick() { sensor->read(&sensor_object, sensor_data); for (int d = 0; d < sensor->d; d++) { float value = sensor_data[d]; uartServicePtr->printf("i %d %f\n", d, value); for (int e = 0; e < equation_number; e++) { equation_t *equation = equation_list + e; bool result; if (equation->d == d) { if ('>' == equation->op) { result = value > equation->value; } else if ('<' == equation->op) { result = value < equation->value; } else if ('=' == equation->op) { result = value == equation->value; } } if (result) { LOG("event [%d] occured\n", e); int a = event_to_action_map[e]; if (a != -1) { actuator->write(&actuator_object, action_list[a]); LOG("execute action [%d]\n", a); } } } } } void node_parse(int argc, char *argv[]) { if (2 == argc) { int param1 = atoi(argv[1]); if (0 == strcmp(argv[0], "s")) { if (param1 != sensor_id) { sensor_id = param1; sensor->fini(&sensor_object); sensor = sensor_list[param1]; sensor->init(&sensor_object, sensor_init_data); equation_number = 0; } LOG("select sensor [%d]\n", sensor_id); } else if (0 == strcmp(argv[0], "a")) { if (param1 != actuator_id) { actuator_id = param1; actuator->fini(&actuator_object); actuator = actuator_list[param1]; actuator->init(&actuator_object, actuator_init_data); action_number = 0; } LOG("select sensor [%d]\n", sensor_id); } memset(event_to_action_map, -1, sizeof(event_to_action_map)); } else if (5 == argc && 0 == strcmp(argv[0], "e")) { uint8_t event_id = atoi(argv[1]); if (event_id > equation_number) { return; } uint8_t dimention = atoi(argv[2]); uint8_t symbol = argv[3][0]; float value = atof(argv[4]); equation_t *equation = equation_list + event_id; equation->d = dimention; equation->op = symbol; equation->value = value; LOG("set event [%d]: %d %c %f\n", event_id, dimention, symbol, value); if (event_id == equation_number) { equation_number++; } } else if (3 == argc && 0 == strcmp(argv[0], "m")) { uint8_t event_id = atoi(argv[1]); uint8_t action_id = atoi(argv[2]); event_to_action_map[event_id] = action_id; LOG("map event [%d] -> action [%d]\n", event_id, action_id); } if (0 == strcmp(argv[0], "f")) { uint8_t action_id = atoi(argv[1]); if (action_id > action_number) { return; } else if (action_id == action_number) { action_number++; } int n = argc - 2; if (n > 8) { n = 8; } LOG("set action [%d]:", action_id); for (int i = 0; i < 8; i++) { if (i < n) { float value = atof(argv[i + 2]); action_list[action_id][i] = value; LOG(" %f", value); } else { action_list[action_id][i] = 0; } } LOG("\n"); // actuator->write(&actuator_object, action_list[action_id]); } else if (0 == strcmp(argv[0], "o")) { int n = argc - 1; if (n > 8) { n = 8; } LOG("set output:"); for (int i = 0; i < 8; i++) { if (i < n) { float value = atof(argv[i + 1]); actuator_data[i] = value; LOG(" %f", value); } else { actuator_data[i] = 0; } } LOG("\n"); actuator->write(&actuator_object, actuator_data); } }