Example node for Yodiwo's Plegma API
Dependencies: EthernetInterface FXOS8700Q HTTPClient HTTPD MQTTS SDFileSystem YodiwoPlegma mbed-rpc mbed-rtos mbed wolfSSL
yoplegma_things.cpp
- Committer:
- mitsarionas
- Date:
- 2015-09-28
- Revision:
- 8:66d34592c1ad
- Parent:
- 7:11ff316c37ba
File content as of revision 8:66d34592c1ad:
#include "mbed.h" #include "rtos.h" #include <stdint.h> #include "yoplegma_things.h" #include "yodiwo_functions.h" #include "jsmn.h" #include "yodiwo_api.h" #include "yodiwo_helpers.h" ///////////////////////////////// LEDS DigitalOut redled(LED1); DigitalOut greenled(LED2); DigitalOut blueled(LED3); ///////////////////////////////// THINGS Yodiwo_Plegma_Port_t button_port; Yodiwo_Plegma_Port_t axel_port; Yodiwo_Plegma_Port_t _led_ports[3]; Yodiwo_Plegma_Thing_t *button; Yodiwo_Plegma_Thing_t *axel; Yodiwo_Plegma_Thing_t *led; Yodiwo_Plegma_Thing_t _things[3]; Array_Yodiwo_Plegma_Thing_t things; int shaken_event() { Yodiwo_Plegma_PortEvent_t event; Array_Yodiwo_Plegma_PortEvent_t array_events; event.PortKey = axel->Ports.elems[0].PortKey; event.State = "True"; event.RevNum = 1; array_events.num = 1; array_events.elems = &event; return portevents(&array_events); } int button_event(int buttonId, bool pressed) { printf("button %d: %s\n", buttonId, (pressed) ? "pressed" : "released"); Yodiwo_Plegma_PortEvent_t event; Array_Yodiwo_Plegma_PortEvent_t array_events; event.PortKey = button->Ports.elems[0].PortKey; event.State = (char *)((pressed) ? "True" : "False"); event.RevNum = 1; array_events.num = 1; array_events.elems = &event; return portevents(&array_events); } void led_event(DigitalOut &led, Yodiwo_Plegma_PortEvent_t *event) { if (!strcmp(event->State, "on") || !strcmp(event->State, "1") || !strcmp(event->State, "true") || !strcmp(event->State, "True") || !strcmp(event->State, "On")) { printf("ON\n"); led = 0; } else { printf("OFF\n"); led = 1; } } int handle_red_led(Yodiwo_Plegma_PortEvent_t *event) { printf("event for red led\n"); led_event(redled, event); return 0; } int handle_green_led(Yodiwo_Plegma_PortEvent_t *event) { printf("event for green led\n"); led_event(greenled, event); return 0; } int handle_blue_led(Yodiwo_Plegma_PortEvent_t *event) { printf("event for blue led\n"); led_event(blueled, event); return 0; } void initialize_things(char *nodeKey) { // init thing pointers button = &_things[0]; axel = &_things[1]; led = &_things[2]; //BUTTON button_port.ConfFlags = Yodiwo_ePortConf_None; //why not button_port.Description = "the state of the freedom button"; button_port.Name = "BTN State"; button_port.Type = Yodiwo_ePortType_Boolean; button_port.State = "False"; button_port.RevNum = 1; button_port.ioDirection = Yodiwo_ioPortDirection_Output; button_port.PortKey = ""; button->ThingKey = ""; button->Name = "FRDM Button"; button->Config.num = 0; button->Config.elems = NULL; button->Ports.num = 1; button->Ports.elems = &button_port; button->Type = ""; button->BlockType = ""; button->UIHints.Description = ""; button->UIHints.IconURI = "/Content/VirtualGateway/img/icon-thing-genericbutton.png"; //AXEL axel_port.ConfFlags = Yodiwo_ePortConf_IsTrigger; //why not axel_port.Description = "triggered when the shaker is shaked"; axel_port.Name = "SHAKER SHAKED"; axel_port.Type = Yodiwo_ePortType_Boolean; axel_port.State = ""; axel_port.RevNum = 1; axel_port.ioDirection = Yodiwo_ioPortDirection_Output; axel_port.PortKey = ""; axel->ThingKey = ""; axel->Name = "FRDM SHAKER"; axel->Config.num = 0; axel->Config.elems = NULL; axel->Ports.num = 1; axel->Ports.elems = &axel_port; axel->Type = ""; axel->BlockType = ""; axel->UIHints.Description = ""; axel->UIHints.IconURI = "/Content/VirtualGateway/img/accelerometer.jpg"; //LED _led_ports[0].ConfFlags = Yodiwo_ePortConf_None; //why not _led_ports[0].Description = "RED LED"; _led_ports[0].Name = "RED LED"; _led_ports[0].Type = Yodiwo_ePortType_Boolean; _led_ports[0].State = "False"; _led_ports[0].RevNum = 1; _led_ports[0].ioDirection = Yodiwo_ioPortDirection_Input; _led_ports[0].PortKey = ""; _led_ports[1].ConfFlags = Yodiwo_ePortConf_None; //why not _led_ports[1].Description = "GREEN LED"; _led_ports[1].Name = "GREEN LED"; _led_ports[0].Type = Yodiwo_ePortType_Boolean; _led_ports[1].State = "off"; _led_ports[1].RevNum = 1; _led_ports[1].ioDirection = Yodiwo_ioPortDirection_Input; _led_ports[1].PortKey = ""; _led_ports[2].ConfFlags = Yodiwo_ePortConf_None; //why not _led_ports[2].Description = "BLUE LED"; _led_ports[2].Name = "BLUE LED"; _led_ports[0].Type = Yodiwo_ePortType_Boolean; _led_ports[2].State = "off"; _led_ports[2].RevNum = 1; _led_ports[2].ioDirection = Yodiwo_ioPortDirection_Input; _led_ports[2].PortKey = ""; led->ThingKey = ""; led->Name = "FRDM LED"; led->Config.num = 0; led->Config.elems = NULL; led->Ports.num = 3; led->Ports.elems = _led_ports; led->Type = ""; led->BlockType = ""; led->UIHints.Description = ""; led->UIHints.IconURI = "/Content/VirtualGateway/img/icon-thing-genericlight.png"; things.num = 3; things.elems = _things; if (nodeKey != NULL) { int r; r = fill_Thing_Keys(&things.elems[0], nodeKey, 1); r = fill_Thing_Keys(&things.elems[1], nodeKey, 2); r = fill_Thing_Keys(&things.elems[2], nodeKey, 3); printf("fill keys returned: %d\n", r); } } void register_led_handlers() { redled = 1; greenled = 1; blueled = 1; register_portevent_handler(things.elems[2].Ports.elems[0].PortKey, handle_red_led); register_portevent_handler(things.elems[2].Ports.elems[1].PortKey, handle_green_led); register_portevent_handler(things.elems[2].Ports.elems[2].PortKey, handle_blue_led); } #include "FXOS8700Q.h" //FXOS8700Q acc( A4, A5, FXOS8700CQ_SLAVE_ADDR0); // Proper Ports and I2C address for Freescale Multi Axis shield //FXOS8700Q mag( A4, A5, FXOS8700CQ_SLAVE_ADDR0); // Proper Ports and I2C address for Freescale Multi Axis shield FXOS8700Q_acc acc( PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // Proper Ports and I2C Address for K64F Freedom board FXOS8700Q_mag mag( PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // Proper Ports and I2C Address for K64F Freedom board //MotionSensorDataUnits mag_data; MotionSensorDataUnits acc_data; // //MotionSensorDataCounts mag_raw; //MotionSensorDataCounts acc_raw; #define DOWNSAMPLING 50 void axel_thread(const void *args) { // float faX, faY, faZ; // float fmX, fmY, fmZ; // int16_t raX, raY, raZ; // int16_t rmX, rmY, rmZ; acc.enable(); printf("\r\n\nFXOS8700Q Who Am I= %X\r\n", acc.whoAmI()); int count = 0; int shaken_cd = 0; while (true) { // if (client->isConnected()) { acc.getAxis(acc_data); ++count %= DOWNSAMPLING; if (shaken_cd) shaken_cd--; if ((acc_data.x > 1.5f || acc_data.y > 1.5f || acc_data.z > 1.5f) && !shaken_cd) { printf("shaken, not stirred\n"); shaken_cd = DOWNSAMPLING; shaken_event(); } if (!count) { // mag.getAxis(mag_data); // printf("FXOS8700Q ACC: X=%1.4f Y=%1.4f Z=%1.4f \n", acc_data.x, acc_data.y, acc_data.z); // printf(" MAG: X=%4.1f Y=%4.1f Z=%4.1f\r\n", mag_data.x, mag_data.y, mag_data.z); // acc.getX(&faX); // acc.getY(&faY); // acc.getZ(&faZ); // mag.getX(&fmX); // mag.getY(&fmY); // mag.getZ(&fmZ); // printf("FXOS8700Q ACC: X=%1.4f Y=%1.4f Z=%1.4f ", faX, faY, faZ); // printf(" MAG: X=%4.1f Y=%4.1f Z=%4.1f\r\n", fmX, fmY, fmZ); } } Thread::wait(20); } }