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:
- 2015-06-04
- Revision:
- 10:f34ff4e47741
- Parent:
- 9:84cb66d0375d
- Child:
- 11:c0885b74a63a
File content as of revision 10:f34ff4e47741:
#include "udriver.h" #include "mbed.h" #include "BLEDevice.h" #include "UARTService.h" #include "color_pixels.h" #define LOG(...) { printf(__VA_ARGS__); } #define MAX_INIT_DATA 4 #define MAX_SENOSR_DIMENSION 9 #define MAX_ACTUATOR_DATA_BUF 16 #define MAX_EQUATION_NUMBER 2 #define MAX_TASK_NUMBER 8 typedef struct { uint8_t d; // dimension uint8_t op; // operator uint8_t extra; float value; } equation_t; typedef struct { equation_t equation_list[MAX_EQUATION_NUMBER]; uint8_t output[MAX_ACTUATOR_DATA_BUF]; } task_t; extern UARTService *uartServicePtr; extern volatile bool ble_is_connected; extern driver_t analog_sensor_driver; extern driver_t temperature_sensor_driver; extern driver_t time_sensor_driver; extern driver_t relay_driver; extern driver_t led_driver; extern driver_t color_led_strip_driver; driver_t *sensor_list[] = { &analog_sensor_driver, &temperature_sensor_driver, &time_sensor_driver, }; driver_t *actuator_list[] = { &relay_driver, &led_driver, &color_led_strip_driver }; driver_t *sensor; driver_t *actuator; int sensor_index = 0; int actuator_index = 0; void *sensor_object; void *actuator_object; float sensor_data[MAX_SENOSR_DIMENSION] = {0,}; float actuator_data[MAX_ACTUATOR_DATA_BUF] = {0,}; int sensor_init_data[MAX_INIT_DATA] = {0, }; int actuator_init_data[MAX_INIT_DATA] = {0, }; task_t task_list[MAX_TASK_NUMBER]; uint32_t task_mask = 0; bool equation_test(equation_t *equation, float *data) { bool result = false; if (0x01 == equation->op) { // > result = data[equation->d] > equation->value; } else if (0x02 == equation->op) { // < result = data[equation->d] < equation->value; } else if (0x03 == equation->op) { // = result = data[equation->d] == equation->value; } return true; } void node_init() { sensor_index = 0; sensor = sensor_list[sensor_index]; sensor_init_data[0] = p3; sensor_init_data[1] = p4; sensor->init(&sensor_object, sensor_init_data); actuator_index = 2; actuator = actuator_list[actuator_index]; actuator_init_data[0] = p1; actuator_init_data[1] = p2; actuator_init_data[2] = 30; 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]; if (ble_is_connected) { uartServicePtr->printf("i %d %f\n", d, value); } } uint32_t mask = task_mask; int task_index = 0; while (mask) { if (mask & 1) { task_t *task = task_list + task_index; bool result = false; for (int i = 0; i < MAX_EQUATION_NUMBER; i++) { equation_t *equation = task->equation_list + i; if (0 == equation->extra) { break; } bool equation_result = equation_test(equation, sensor_data); if ('&' == equation->extra) { result = result && equation_result; } else { result = result || equation; } } if (result) { actuator->write(&actuator_object, task->output); } } task_index++; mask >>= 1; } } void node_parse(int argc, char *argv[]) { if (2 == argc) { int param1 = atoi(argv[1]); if (0 == strcmp(argv[0], "s")) { if (param1 != sensor_index) { sensor_index = param1; sensor->fini(&sensor_object); sensor = sensor_list[param1]; sensor->init(&sensor_object, sensor_init_data); task_mask = 0; } LOG("select sensor [%d]\n", sensor_index); } else if (0 == strcmp(argv[0], "a")) { if (param1 != actuator_index) { actuator_index = param1; actuator->fini(&actuator_object); actuator = actuator_list[param1]; actuator->init(&actuator_object, actuator_init_data); task_mask = 0; } LOG("select actuator [%d]\n", actuator_index); } } 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); } }