Example node for Yodiwo's Plegma API
Dependencies: EthernetInterface FXOS8700Q HTTPClient HTTPD MQTTS SDFileSystem YodiwoPlegma mbed-rpc mbed-rtos mbed wolfSSL
yoplegma_things.cpp@8:66d34592c1ad, 2015-09-28 (annotated)
- Committer:
- mitsarionas
- Date:
- Mon Sep 28 09:13:43 2015 +0000
- Revision:
- 8:66d34592c1ad
- Parent:
- 7:11ff316c37ba
using published HTTPClient
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mitsarionas | 5:1ef168357347 | 1 | #include "mbed.h" |
mitsarionas | 5:1ef168357347 | 2 | #include "rtos.h" |
mitsarionas | 5:1ef168357347 | 3 | |
mitsarionas | 5:1ef168357347 | 4 | #include <stdint.h> |
mitsarionas | 5:1ef168357347 | 5 | |
mitsarionas | 7:11ff316c37ba | 6 | #include "yoplegma_things.h" |
mitsarionas | 5:1ef168357347 | 7 | #include "yodiwo_functions.h" |
mitsarionas | 5:1ef168357347 | 8 | #include "jsmn.h" |
mitsarionas | 5:1ef168357347 | 9 | #include "yodiwo_api.h" |
mitsarionas | 5:1ef168357347 | 10 | #include "yodiwo_helpers.h" |
mitsarionas | 5:1ef168357347 | 11 | |
mitsarionas | 5:1ef168357347 | 12 | ///////////////////////////////// LEDS |
mitsarionas | 5:1ef168357347 | 13 | DigitalOut redled(LED1); |
mitsarionas | 5:1ef168357347 | 14 | DigitalOut greenled(LED2); |
mitsarionas | 5:1ef168357347 | 15 | DigitalOut blueled(LED3); |
mitsarionas | 5:1ef168357347 | 16 | |
mitsarionas | 5:1ef168357347 | 17 | ///////////////////////////////// THINGS |
mitsarionas | 5:1ef168357347 | 18 | Yodiwo_Plegma_Port_t button_port; |
mitsarionas | 5:1ef168357347 | 19 | Yodiwo_Plegma_Port_t axel_port; |
mitsarionas | 5:1ef168357347 | 20 | Yodiwo_Plegma_Port_t _led_ports[3]; |
mitsarionas | 5:1ef168357347 | 21 | |
mitsarionas | 5:1ef168357347 | 22 | Yodiwo_Plegma_Thing_t *button; |
mitsarionas | 5:1ef168357347 | 23 | Yodiwo_Plegma_Thing_t *axel; |
mitsarionas | 5:1ef168357347 | 24 | Yodiwo_Plegma_Thing_t *led; |
mitsarionas | 5:1ef168357347 | 25 | |
mitsarionas | 5:1ef168357347 | 26 | Yodiwo_Plegma_Thing_t _things[3]; |
mitsarionas | 5:1ef168357347 | 27 | Array_Yodiwo_Plegma_Thing_t things; |
mitsarionas | 5:1ef168357347 | 28 | |
mitsarionas | 5:1ef168357347 | 29 | |
mitsarionas | 5:1ef168357347 | 30 | int shaken_event() |
mitsarionas | 5:1ef168357347 | 31 | { |
mitsarionas | 5:1ef168357347 | 32 | Yodiwo_Plegma_PortEvent_t event; |
mitsarionas | 5:1ef168357347 | 33 | Array_Yodiwo_Plegma_PortEvent_t array_events; |
mitsarionas | 5:1ef168357347 | 34 | |
mitsarionas | 5:1ef168357347 | 35 | event.PortKey = axel->Ports.elems[0].PortKey; |
mitsarionas | 5:1ef168357347 | 36 | event.State = "True"; |
mitsarionas | 5:1ef168357347 | 37 | event.RevNum = 1; |
mitsarionas | 5:1ef168357347 | 38 | |
mitsarionas | 5:1ef168357347 | 39 | array_events.num = 1; |
mitsarionas | 5:1ef168357347 | 40 | array_events.elems = &event; |
mitsarionas | 5:1ef168357347 | 41 | |
mitsarionas | 5:1ef168357347 | 42 | return portevents(&array_events); |
mitsarionas | 5:1ef168357347 | 43 | } |
mitsarionas | 5:1ef168357347 | 44 | |
mitsarionas | 5:1ef168357347 | 45 | int button_event(int buttonId, bool pressed) |
mitsarionas | 5:1ef168357347 | 46 | { |
mitsarionas | 5:1ef168357347 | 47 | printf("button %d: %s\n", buttonId, (pressed) ? "pressed" : "released"); |
mitsarionas | 5:1ef168357347 | 48 | |
mitsarionas | 5:1ef168357347 | 49 | Yodiwo_Plegma_PortEvent_t event; |
mitsarionas | 5:1ef168357347 | 50 | Array_Yodiwo_Plegma_PortEvent_t array_events; |
mitsarionas | 5:1ef168357347 | 51 | |
mitsarionas | 5:1ef168357347 | 52 | event.PortKey = button->Ports.elems[0].PortKey; |
mitsarionas | 5:1ef168357347 | 53 | event.State = (char *)((pressed) ? "True" : "False"); |
mitsarionas | 5:1ef168357347 | 54 | event.RevNum = 1; |
mitsarionas | 5:1ef168357347 | 55 | |
mitsarionas | 5:1ef168357347 | 56 | array_events.num = 1; |
mitsarionas | 5:1ef168357347 | 57 | array_events.elems = &event; |
mitsarionas | 5:1ef168357347 | 58 | |
mitsarionas | 5:1ef168357347 | 59 | return portevents(&array_events); |
mitsarionas | 5:1ef168357347 | 60 | } |
mitsarionas | 5:1ef168357347 | 61 | |
mitsarionas | 5:1ef168357347 | 62 | void led_event(DigitalOut &led, Yodiwo_Plegma_PortEvent_t *event) |
mitsarionas | 5:1ef168357347 | 63 | { |
mitsarionas | 5:1ef168357347 | 64 | if (!strcmp(event->State, "on") || !strcmp(event->State, "1") || !strcmp(event->State, "true") |
mitsarionas | 5:1ef168357347 | 65 | || !strcmp(event->State, "True") || !strcmp(event->State, "On")) { |
mitsarionas | 5:1ef168357347 | 66 | printf("ON\n"); |
mitsarionas | 5:1ef168357347 | 67 | led = 0; |
mitsarionas | 5:1ef168357347 | 68 | } else { |
mitsarionas | 5:1ef168357347 | 69 | printf("OFF\n"); |
mitsarionas | 5:1ef168357347 | 70 | led = 1; |
mitsarionas | 5:1ef168357347 | 71 | } |
mitsarionas | 5:1ef168357347 | 72 | } |
mitsarionas | 5:1ef168357347 | 73 | |
mitsarionas | 5:1ef168357347 | 74 | int handle_red_led(Yodiwo_Plegma_PortEvent_t *event) |
mitsarionas | 5:1ef168357347 | 75 | { |
mitsarionas | 5:1ef168357347 | 76 | printf("event for red led\n"); |
mitsarionas | 5:1ef168357347 | 77 | led_event(redled, event); |
mitsarionas | 5:1ef168357347 | 78 | return 0; |
mitsarionas | 5:1ef168357347 | 79 | } |
mitsarionas | 5:1ef168357347 | 80 | |
mitsarionas | 5:1ef168357347 | 81 | int handle_green_led(Yodiwo_Plegma_PortEvent_t *event) |
mitsarionas | 5:1ef168357347 | 82 | { |
mitsarionas | 5:1ef168357347 | 83 | printf("event for green led\n"); |
mitsarionas | 5:1ef168357347 | 84 | led_event(greenled, event); |
mitsarionas | 5:1ef168357347 | 85 | return 0; |
mitsarionas | 5:1ef168357347 | 86 | } |
mitsarionas | 5:1ef168357347 | 87 | |
mitsarionas | 5:1ef168357347 | 88 | int handle_blue_led(Yodiwo_Plegma_PortEvent_t *event) |
mitsarionas | 5:1ef168357347 | 89 | { |
mitsarionas | 5:1ef168357347 | 90 | printf("event for blue led\n"); |
mitsarionas | 5:1ef168357347 | 91 | led_event(blueled, event); |
mitsarionas | 5:1ef168357347 | 92 | return 0; |
mitsarionas | 5:1ef168357347 | 93 | } |
mitsarionas | 5:1ef168357347 | 94 | |
mitsarionas | 5:1ef168357347 | 95 | void initialize_things(char *nodeKey) |
mitsarionas | 5:1ef168357347 | 96 | { |
mitsarionas | 5:1ef168357347 | 97 | // init thing pointers |
mitsarionas | 5:1ef168357347 | 98 | button = &_things[0]; |
mitsarionas | 5:1ef168357347 | 99 | axel = &_things[1]; |
mitsarionas | 5:1ef168357347 | 100 | led = &_things[2]; |
mitsarionas | 5:1ef168357347 | 101 | |
mitsarionas | 5:1ef168357347 | 102 | //BUTTON |
mitsarionas | 5:1ef168357347 | 103 | button_port.ConfFlags = Yodiwo_ePortConf_None; //why not |
mitsarionas | 5:1ef168357347 | 104 | button_port.Description = "the state of the freedom button"; |
mitsarionas | 5:1ef168357347 | 105 | button_port.Name = "BTN State"; |
mitsarionas | 5:1ef168357347 | 106 | button_port.Type = Yodiwo_ePortType_Boolean; |
mitsarionas | 5:1ef168357347 | 107 | button_port.State = "False"; |
mitsarionas | 5:1ef168357347 | 108 | button_port.RevNum = 1; |
mitsarionas | 5:1ef168357347 | 109 | button_port.ioDirection = Yodiwo_ioPortDirection_Output; |
mitsarionas | 5:1ef168357347 | 110 | button_port.PortKey = ""; |
mitsarionas | 5:1ef168357347 | 111 | |
mitsarionas | 5:1ef168357347 | 112 | button->ThingKey = ""; |
mitsarionas | 5:1ef168357347 | 113 | button->Name = "FRDM Button"; |
mitsarionas | 5:1ef168357347 | 114 | button->Config.num = 0; |
mitsarionas | 5:1ef168357347 | 115 | button->Config.elems = NULL; |
mitsarionas | 5:1ef168357347 | 116 | button->Ports.num = 1; |
mitsarionas | 5:1ef168357347 | 117 | button->Ports.elems = &button_port; |
mitsarionas | 5:1ef168357347 | 118 | button->Type = ""; |
mitsarionas | 5:1ef168357347 | 119 | button->BlockType = ""; |
mitsarionas | 5:1ef168357347 | 120 | button->UIHints.Description = ""; |
mitsarionas | 5:1ef168357347 | 121 | button->UIHints.IconURI = "/Content/VirtualGateway/img/icon-thing-genericbutton.png"; |
mitsarionas | 5:1ef168357347 | 122 | |
mitsarionas | 5:1ef168357347 | 123 | //AXEL |
mitsarionas | 5:1ef168357347 | 124 | axel_port.ConfFlags = Yodiwo_ePortConf_IsTrigger; //why not |
mitsarionas | 5:1ef168357347 | 125 | axel_port.Description = "triggered when the shaker is shaked"; |
mitsarionas | 5:1ef168357347 | 126 | axel_port.Name = "SHAKER SHAKED"; |
mitsarionas | 5:1ef168357347 | 127 | axel_port.Type = Yodiwo_ePortType_Boolean; |
mitsarionas | 5:1ef168357347 | 128 | axel_port.State = ""; |
mitsarionas | 5:1ef168357347 | 129 | axel_port.RevNum = 1; |
mitsarionas | 5:1ef168357347 | 130 | axel_port.ioDirection = Yodiwo_ioPortDirection_Output; |
mitsarionas | 5:1ef168357347 | 131 | axel_port.PortKey = ""; |
mitsarionas | 5:1ef168357347 | 132 | |
mitsarionas | 5:1ef168357347 | 133 | axel->ThingKey = ""; |
mitsarionas | 5:1ef168357347 | 134 | axel->Name = "FRDM SHAKER"; |
mitsarionas | 5:1ef168357347 | 135 | axel->Config.num = 0; |
mitsarionas | 5:1ef168357347 | 136 | axel->Config.elems = NULL; |
mitsarionas | 5:1ef168357347 | 137 | axel->Ports.num = 1; |
mitsarionas | 5:1ef168357347 | 138 | axel->Ports.elems = &axel_port; |
mitsarionas | 5:1ef168357347 | 139 | axel->Type = ""; |
mitsarionas | 5:1ef168357347 | 140 | axel->BlockType = ""; |
mitsarionas | 5:1ef168357347 | 141 | axel->UIHints.Description = ""; |
mitsarionas | 5:1ef168357347 | 142 | axel->UIHints.IconURI = "/Content/VirtualGateway/img/accelerometer.jpg"; |
mitsarionas | 5:1ef168357347 | 143 | |
mitsarionas | 5:1ef168357347 | 144 | //LED |
mitsarionas | 5:1ef168357347 | 145 | _led_ports[0].ConfFlags = Yodiwo_ePortConf_None; //why not |
mitsarionas | 5:1ef168357347 | 146 | _led_ports[0].Description = "RED LED"; |
mitsarionas | 5:1ef168357347 | 147 | _led_ports[0].Name = "RED LED"; |
mitsarionas | 5:1ef168357347 | 148 | _led_ports[0].Type = Yodiwo_ePortType_Boolean; |
mitsarionas | 5:1ef168357347 | 149 | _led_ports[0].State = "False"; |
mitsarionas | 5:1ef168357347 | 150 | _led_ports[0].RevNum = 1; |
mitsarionas | 5:1ef168357347 | 151 | _led_ports[0].ioDirection = Yodiwo_ioPortDirection_Input; |
mitsarionas | 5:1ef168357347 | 152 | _led_ports[0].PortKey = ""; |
mitsarionas | 5:1ef168357347 | 153 | |
mitsarionas | 5:1ef168357347 | 154 | _led_ports[1].ConfFlags = Yodiwo_ePortConf_None; //why not |
mitsarionas | 5:1ef168357347 | 155 | _led_ports[1].Description = "GREEN LED"; |
mitsarionas | 5:1ef168357347 | 156 | _led_ports[1].Name = "GREEN LED"; |
mitsarionas | 5:1ef168357347 | 157 | _led_ports[0].Type = Yodiwo_ePortType_Boolean; |
mitsarionas | 5:1ef168357347 | 158 | _led_ports[1].State = "off"; |
mitsarionas | 5:1ef168357347 | 159 | _led_ports[1].RevNum = 1; |
mitsarionas | 5:1ef168357347 | 160 | _led_ports[1].ioDirection = Yodiwo_ioPortDirection_Input; |
mitsarionas | 5:1ef168357347 | 161 | _led_ports[1].PortKey = ""; |
mitsarionas | 5:1ef168357347 | 162 | |
mitsarionas | 5:1ef168357347 | 163 | _led_ports[2].ConfFlags = Yodiwo_ePortConf_None; //why not |
mitsarionas | 5:1ef168357347 | 164 | _led_ports[2].Description = "BLUE LED"; |
mitsarionas | 5:1ef168357347 | 165 | _led_ports[2].Name = "BLUE LED"; |
mitsarionas | 5:1ef168357347 | 166 | _led_ports[0].Type = Yodiwo_ePortType_Boolean; |
mitsarionas | 5:1ef168357347 | 167 | _led_ports[2].State = "off"; |
mitsarionas | 5:1ef168357347 | 168 | _led_ports[2].RevNum = 1; |
mitsarionas | 5:1ef168357347 | 169 | _led_ports[2].ioDirection = Yodiwo_ioPortDirection_Input; |
mitsarionas | 5:1ef168357347 | 170 | _led_ports[2].PortKey = ""; |
mitsarionas | 5:1ef168357347 | 171 | |
mitsarionas | 5:1ef168357347 | 172 | led->ThingKey = ""; |
mitsarionas | 5:1ef168357347 | 173 | led->Name = "FRDM LED"; |
mitsarionas | 5:1ef168357347 | 174 | led->Config.num = 0; |
mitsarionas | 5:1ef168357347 | 175 | led->Config.elems = NULL; |
mitsarionas | 5:1ef168357347 | 176 | led->Ports.num = 3; |
mitsarionas | 5:1ef168357347 | 177 | led->Ports.elems = _led_ports; |
mitsarionas | 5:1ef168357347 | 178 | led->Type = ""; |
mitsarionas | 5:1ef168357347 | 179 | led->BlockType = ""; |
mitsarionas | 5:1ef168357347 | 180 | led->UIHints.Description = ""; |
mitsarionas | 5:1ef168357347 | 181 | led->UIHints.IconURI = "/Content/VirtualGateway/img/icon-thing-genericlight.png"; |
mitsarionas | 5:1ef168357347 | 182 | |
mitsarionas | 5:1ef168357347 | 183 | things.num = 3; |
mitsarionas | 5:1ef168357347 | 184 | things.elems = _things; |
mitsarionas | 5:1ef168357347 | 185 | |
mitsarionas | 5:1ef168357347 | 186 | if (nodeKey != NULL) { |
mitsarionas | 5:1ef168357347 | 187 | int r; |
mitsarionas | 5:1ef168357347 | 188 | r = fill_Thing_Keys(&things.elems[0], nodeKey, 1); |
mitsarionas | 5:1ef168357347 | 189 | r = fill_Thing_Keys(&things.elems[1], nodeKey, 2); |
mitsarionas | 5:1ef168357347 | 190 | r = fill_Thing_Keys(&things.elems[2], nodeKey, 3); |
mitsarionas | 5:1ef168357347 | 191 | |
mitsarionas | 5:1ef168357347 | 192 | printf("fill keys returned: %d\n", r); |
mitsarionas | 5:1ef168357347 | 193 | } |
mitsarionas | 5:1ef168357347 | 194 | } |
mitsarionas | 5:1ef168357347 | 195 | |
mitsarionas | 5:1ef168357347 | 196 | void register_led_handlers() |
mitsarionas | 5:1ef168357347 | 197 | { |
mitsarionas | 5:1ef168357347 | 198 | redled = 1; |
mitsarionas | 5:1ef168357347 | 199 | greenled = 1; |
mitsarionas | 5:1ef168357347 | 200 | blueled = 1; |
mitsarionas | 5:1ef168357347 | 201 | register_portevent_handler(things.elems[2].Ports.elems[0].PortKey, handle_red_led); |
mitsarionas | 5:1ef168357347 | 202 | register_portevent_handler(things.elems[2].Ports.elems[1].PortKey, handle_green_led); |
mitsarionas | 5:1ef168357347 | 203 | register_portevent_handler(things.elems[2].Ports.elems[2].PortKey, handle_blue_led); |
mitsarionas | 5:1ef168357347 | 204 | } |
mitsarionas | 5:1ef168357347 | 205 | |
mitsarionas | 5:1ef168357347 | 206 | |
mitsarionas | 5:1ef168357347 | 207 | #include "FXOS8700Q.h" |
mitsarionas | 5:1ef168357347 | 208 | //FXOS8700Q acc( A4, A5, FXOS8700CQ_SLAVE_ADDR0); // Proper Ports and I2C address for Freescale Multi Axis shield |
mitsarionas | 5:1ef168357347 | 209 | //FXOS8700Q mag( A4, A5, FXOS8700CQ_SLAVE_ADDR0); // Proper Ports and I2C address for Freescale Multi Axis shield |
mitsarionas | 5:1ef168357347 | 210 | FXOS8700Q_acc acc( PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // Proper Ports and I2C Address for K64F Freedom board |
mitsarionas | 5:1ef168357347 | 211 | FXOS8700Q_mag mag( PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // Proper Ports and I2C Address for K64F Freedom board |
mitsarionas | 5:1ef168357347 | 212 | |
mitsarionas | 5:1ef168357347 | 213 | //MotionSensorDataUnits mag_data; |
mitsarionas | 5:1ef168357347 | 214 | MotionSensorDataUnits acc_data; |
mitsarionas | 5:1ef168357347 | 215 | // |
mitsarionas | 5:1ef168357347 | 216 | //MotionSensorDataCounts mag_raw; |
mitsarionas | 5:1ef168357347 | 217 | //MotionSensorDataCounts acc_raw; |
mitsarionas | 5:1ef168357347 | 218 | |
mitsarionas | 5:1ef168357347 | 219 | #define DOWNSAMPLING 50 |
mitsarionas | 5:1ef168357347 | 220 | |
mitsarionas | 5:1ef168357347 | 221 | void axel_thread(const void *args) |
mitsarionas | 5:1ef168357347 | 222 | { |
mitsarionas | 5:1ef168357347 | 223 | // float faX, faY, faZ; |
mitsarionas | 5:1ef168357347 | 224 | // float fmX, fmY, fmZ; |
mitsarionas | 5:1ef168357347 | 225 | // int16_t raX, raY, raZ; |
mitsarionas | 5:1ef168357347 | 226 | // int16_t rmX, rmY, rmZ; |
mitsarionas | 5:1ef168357347 | 227 | acc.enable(); |
mitsarionas | 5:1ef168357347 | 228 | printf("\r\n\nFXOS8700Q Who Am I= %X\r\n", acc.whoAmI()); |
mitsarionas | 5:1ef168357347 | 229 | int count = 0; |
mitsarionas | 5:1ef168357347 | 230 | int shaken_cd = 0; |
mitsarionas | 5:1ef168357347 | 231 | while (true) { |
mitsarionas | 5:1ef168357347 | 232 | // if (client->isConnected()) |
mitsarionas | 5:1ef168357347 | 233 | { |
mitsarionas | 5:1ef168357347 | 234 | acc.getAxis(acc_data); |
mitsarionas | 5:1ef168357347 | 235 | ++count %= DOWNSAMPLING; |
mitsarionas | 5:1ef168357347 | 236 | if (shaken_cd) shaken_cd--; |
mitsarionas | 5:1ef168357347 | 237 | if ((acc_data.x > 1.5f || acc_data.y > 1.5f || acc_data.z > 1.5f) && !shaken_cd) { |
mitsarionas | 5:1ef168357347 | 238 | printf("shaken, not stirred\n"); |
mitsarionas | 5:1ef168357347 | 239 | shaken_cd = DOWNSAMPLING; |
mitsarionas | 5:1ef168357347 | 240 | shaken_event(); |
mitsarionas | 5:1ef168357347 | 241 | } |
mitsarionas | 5:1ef168357347 | 242 | if (!count) { |
mitsarionas | 5:1ef168357347 | 243 | // mag.getAxis(mag_data); |
mitsarionas | 5:1ef168357347 | 244 | |
mitsarionas | 5:1ef168357347 | 245 | |
mitsarionas | 5:1ef168357347 | 246 | // printf("FXOS8700Q ACC: X=%1.4f Y=%1.4f Z=%1.4f \n", acc_data.x, acc_data.y, acc_data.z); |
mitsarionas | 5:1ef168357347 | 247 | |
mitsarionas | 5:1ef168357347 | 248 | |
mitsarionas | 5:1ef168357347 | 249 | // printf(" MAG: X=%4.1f Y=%4.1f Z=%4.1f\r\n", mag_data.x, mag_data.y, mag_data.z); |
mitsarionas | 5:1ef168357347 | 250 | // acc.getX(&faX); |
mitsarionas | 5:1ef168357347 | 251 | // acc.getY(&faY); |
mitsarionas | 5:1ef168357347 | 252 | // acc.getZ(&faZ); |
mitsarionas | 5:1ef168357347 | 253 | // mag.getX(&fmX); |
mitsarionas | 5:1ef168357347 | 254 | // mag.getY(&fmY); |
mitsarionas | 5:1ef168357347 | 255 | // mag.getZ(&fmZ); |
mitsarionas | 5:1ef168357347 | 256 | // printf("FXOS8700Q ACC: X=%1.4f Y=%1.4f Z=%1.4f ", faX, faY, faZ); |
mitsarionas | 5:1ef168357347 | 257 | // printf(" MAG: X=%4.1f Y=%4.1f Z=%4.1f\r\n", fmX, fmY, fmZ); |
mitsarionas | 5:1ef168357347 | 258 | } |
mitsarionas | 5:1ef168357347 | 259 | } |
mitsarionas | 5:1ef168357347 | 260 | Thread::wait(20); |
mitsarionas | 5:1ef168357347 | 261 | } |
mitsarionas | 5:1ef168357347 | 262 | } |