Example node for Yodiwo's Plegma API

Dependencies:   EthernetInterface FXOS8700Q HTTPClient HTTPD MQTTS SDFileSystem YodiwoPlegma mbed-rpc mbed-rtos mbed wolfSSL

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?

UserRevisionLine numberNew contents of line
mitsarionas 7:11ff316c37ba 1 /*
mitsarionas 7:11ff316c37ba 2 * YoPlegma (codename Nodas)
mitsarionas 7:11ff316c37ba 3 * Yodiwo Plegma API example node
mitsarionas 7:11ff316c37ba 4 *
mitsarionas 7:11ff316c37ba 5 * NOTES:
mitsarionas 7:11ff316c37ba 6 * a configuration file, named config.json (sample exists in this project) needs to be placed in the root of the SD card
mitsarionas 7:11ff316c37ba 7 */
mitsarionas 7:11ff316c37ba 8
mitsarionas 0:00797f1ebe04 9 #include "mbed.h"
mitsarionas 0:00797f1ebe04 10 #include "rtos.h"
mitsarionas 0:00797f1ebe04 11 #include "EthernetInterface.h"
mitsarionas 0:00797f1ebe04 12 #include "HTTPD.h"
mitsarionas 5:1ef168357347 13
mitsarionas 0:00797f1ebe04 14 #include "SDFileSystem.h" // SD File System functions
mitsarionas 2:b7489c070d1f 15
mitsarionas 0:00797f1ebe04 16 #include "pairing_backend.h"
mitsarionas 2:b7489c070d1f 17 #include "pairing_http_handler.h"
mitsarionas 2:b7489c070d1f 18 #include "config.h"
mitsarionas 3:11b767300d32 19 #include "yodiwo_functions.h"
mitsarionas 7:11ff316c37ba 20 #include "yoplegma_things.h"
mitsarionas 5:1ef168357347 21 #include "mqtt_helpers.h"
mitsarionas 5:1ef168357347 22 #include "yodiwo_helpers.h"
mitsarionas 0:00797f1ebe04 23
mitsarionas 0:00797f1ebe04 24 #define DAT0 PTE3 // MOSI
mitsarionas 0:00797f1ebe04 25 #define CMD PTE1 // MISO
mitsarionas 0:00797f1ebe04 26 #define CLK PTE2 // SCLK
mitsarionas 0:00797f1ebe04 27 #define CD PTE4 // CS
mitsarionas 0:00797f1ebe04 28
mitsarionas 0:00797f1ebe04 29
mitsarionas 0:00797f1ebe04 30 EthernetInterface eth;
mitsarionas 0:00797f1ebe04 31
mitsarionas 3:11b767300d32 32 DigitalOut blinking(LED4);
mitsarionas 4:cc4c5b6d9730 33
mitsarionas 4:cc4c5b6d9730 34 extern DigitalOut redled;
mitsarionas 4:cc4c5b6d9730 35 extern DigitalOut greenled;
mitsarionas 4:cc4c5b6d9730 36 extern DigitalOut blueled;
mitsarionas 4:cc4c5b6d9730 37
mitsarionas 0:00797f1ebe04 38 InterruptIn sw2(SW2);
mitsarionas 0:00797f1ebe04 39 uint32_t button_pressed;
mitsarionas 0:00797f1ebe04 40 Thread *thread2;
mitsarionas 2:b7489c070d1f 41 extern HTTPD *httpd;
mitsarionas 5:1ef168357347 42
mitsarionas 0:00797f1ebe04 43
mitsarionas 0:00797f1ebe04 44
mitsarionas 0:00797f1ebe04 45 SDFileSystem sd(DAT0, CMD, CLK, CD, "sd"); // MOSI, MISO, SCLK, CS
mitsarionas 0:00797f1ebe04 46 //Serial pc(USBTX, USBRX); // Virtual COM Port
mitsarionas 0:00797f1ebe04 47
mitsarionas 3:11b767300d32 48 Yodiwo_Tools_APIGenerator_CNodeYConfig_t configuration;
mitsarionas 3:11b767300d32 49 Yodiwo_Tools_APIGenerator_CNodeConfig_t *activeConfig;
mitsarionas 2:b7489c070d1f 50
mitsarionas 2:b7489c070d1f 51 extern pairing_context pairing_state;
mitsarionas 0:00797f1ebe04 52
mitsarionas 0:00797f1ebe04 53 void pairing_done(char *nodeKey, char *secretKey);
mitsarionas 0:00797f1ebe04 54
mitsarionas 0:00797f1ebe04 55 void sw2_press(void)
mitsarionas 0:00797f1ebe04 56 {
mitsarionas 0:00797f1ebe04 57 thread2->signal_set(0x1);
mitsarionas 0:00797f1ebe04 58 }
mitsarionas 0:00797f1ebe04 59
mitsarionas 3:11b767300d32 60 void sw2_release(void)
mitsarionas 3:11b767300d32 61 {
mitsarionas 3:11b767300d32 62 thread2->signal_set(0x2);
mitsarionas 3:11b767300d32 63 }
mitsarionas 3:11b767300d32 64
mitsarionas 0:00797f1ebe04 65 void led_thread(void const *argument)
mitsarionas 0:00797f1ebe04 66 {
mitsarionas 0:00797f1ebe04 67 while (true) {
mitsarionas 4:cc4c5b6d9730 68 blinking = !blinking;
mitsarionas 0:00797f1ebe04 69 Thread::wait(1000);
mitsarionas 0:00797f1ebe04 70 }
mitsarionas 0:00797f1ebe04 71 }
mitsarionas 0:00797f1ebe04 72
mitsarionas 0:00797f1ebe04 73 void button_thread(void const *argument)
mitsarionas 0:00797f1ebe04 74 {
mitsarionas 4:cc4c5b6d9730 75 redled = 0;
mitsarionas 4:cc4c5b6d9730 76 greenled = 0;
mitsarionas 4:cc4c5b6d9730 77 blueled = 0;
mitsarionas 0:00797f1ebe04 78 while (true) {
mitsarionas 3:11b767300d32 79 osEvent evt = Thread::signal_wait(0x1 | 0x02);
mitsarionas 3:11b767300d32 80 if (evt.value.signals & 0x01) {
mitsarionas 3:11b767300d32 81 button_event(1, true);
mitsarionas 3:11b767300d32 82 }
mitsarionas 3:11b767300d32 83 if (evt.value.signals & 0x02) {
mitsarionas 3:11b767300d32 84 button_event(1, false);
mitsarionas 3:11b767300d32 85 }
mitsarionas 3:11b767300d32 86
mitsarionas 0:00797f1ebe04 87 button_pressed++;
mitsarionas 0:00797f1ebe04 88 }
mitsarionas 0:00797f1ebe04 89 }
mitsarionas 0:00797f1ebe04 90
mitsarionas 3:11b767300d32 91 int launch_mqtt();
mitsarionas 0:00797f1ebe04 92
mitsarionas 0:00797f1ebe04 93 int main()
mitsarionas 0:00797f1ebe04 94 {
mitsarionas 0:00797f1ebe04 95
mitsarionas 0:00797f1ebe04 96 eth.init();
mitsarionas 0:00797f1ebe04 97 eth.connect();
mitsarionas 0:00797f1ebe04 98 printf("IP Address is %s\n", eth.getIPAddress());
mitsarionas 0:00797f1ebe04 99
mitsarionas 2:b7489c070d1f 100 int r = read_config(&configuration, "/sd/config.json");
mitsarionas 2:b7489c070d1f 101 printf("read config returned: %d\n", r);
mitsarionas 3:11b767300d32 102 activeConfig = &configuration.Configs.elems[configuration.ActiveID];
mitsarionas 0:00797f1ebe04 103
mitsarionas 3:11b767300d32 104 printf("p: %p %p\n", activeConfig->NodeKey, activeConfig->NodeSecret);
mitsarionas 3:11b767300d32 105 printf("...: %d %d\n", activeConfig->NodeKey[0], activeConfig->NodeKey[1]);
mitsarionas 3:11b767300d32 106 if (!activeConfig->NodeKey) {
mitsarionas 2:b7489c070d1f 107 printf("not paired, launching HTTP server for pairing\n");
mitsarionas 2:b7489c070d1f 108 start_pairing_http_server(&eth, 80, pairing_done);
mitsarionas 2:b7489c070d1f 109 } else {
mitsarionas 3:11b767300d32 110 printf("found NodeKey: %s, proceeding to connection\n", activeConfig->NodeKey);
mitsarionas 3:11b767300d32 111 launch_mqtt();
mitsarionas 2:b7489c070d1f 112 }
mitsarionas 0:00797f1ebe04 113
mitsarionas 0:00797f1ebe04 114 // eth.disconnect();
mitsarionas 2:b7489c070d1f 115
mitsarionas 0:00797f1ebe04 116
mitsarionas 0:00797f1ebe04 117 button_pressed = 0;
mitsarionas 0:00797f1ebe04 118 sw2.fall(&sw2_press);
mitsarionas 3:11b767300d32 119 sw2.rise(&sw2_release);
mitsarionas 0:00797f1ebe04 120 while (true) {
mitsarionas 0:00797f1ebe04 121 Thread::wait(5000);
mitsarionas 0:00797f1ebe04 122 fflush(stdout);
mitsarionas 3:11b767300d32 123 button_pressed = 0;
mitsarionas 0:00797f1ebe04 124 }
mitsarionas 0:00797f1ebe04 125 }
mitsarionas 0:00797f1ebe04 126
mitsarionas 3:11b767300d32 127 int launch_mqtt()
mitsarionas 3:11b767300d32 128 {
mitsarionas 4:cc4c5b6d9730 129 int r;
mitsarionas 3:11b767300d32 130 initialize_things(activeConfig->NodeKey);
mitsarionas 3:11b767300d32 131 init_yodiwo(activeConfig->Name, &things, publisher);
mitsarionas 3:11b767300d32 132 register_led_handlers();
mitsarionas 4:cc4c5b6d9730 133 r = mqtt_init(activeConfig->MqttBrokerHostname,
mitsarionas 3:11b767300d32 134 activeConfig->MqttBrokerPort,
mitsarionas 3:11b767300d32 135 activeConfig->MqttBrokerCertFile,
mitsarionas 3:11b767300d32 136 activeConfig->NodeKey,
mitsarionas 3:11b767300d32 137 activeConfig->NodeSecret
mitsarionas 3:11b767300d32 138 );
mitsarionas 4:cc4c5b6d9730 139 if (r >= 0) {
mitsarionas 4:cc4c5b6d9730 140 redled = 1;
mitsarionas 4:cc4c5b6d9730 141 greenled = 1;
mitsarionas 4:cc4c5b6d9730 142 blueled = 1;
mitsarionas 4:cc4c5b6d9730 143
mitsarionas 4:cc4c5b6d9730 144 Thread thread(led_thread);
mitsarionas 4:cc4c5b6d9730 145 thread2 = new Thread(button_thread, NULL, osPriorityNormal, 4000);
mitsarionas 4:cc4c5b6d9730 146 Thread *at = new Thread(axel_thread);
mitsarionas 4:cc4c5b6d9730 147 }
mitsarionas 4:cc4c5b6d9730 148 return r;
mitsarionas 4:cc4c5b6d9730 149
mitsarionas 3:11b767300d32 150 }
mitsarionas 3:11b767300d32 151
mitsarionas 0:00797f1ebe04 152
mitsarionas 0:00797f1ebe04 153 void pairing_done(char *nodeKey, char *secretKey)
mitsarionas 0:00797f1ebe04 154 {
mitsarionas 0:00797f1ebe04 155 printf("pairing done!\n");
mitsarionas 0:00797f1ebe04 156 printf("NokeKey: %s\n", nodeKey);
mitsarionas 0:00797f1ebe04 157 printf("SecretKey: %s\n", secretKey);
mitsarionas 3:11b767300d32 158 activeConfig->NodeKey = nodeKey;
mitsarionas 3:11b767300d32 159 activeConfig->NodeSecret = secretKey;
mitsarionas 2:b7489c070d1f 160 int r = write_config(&configuration, "/sd/config.json");
mitsarionas 2:b7489c070d1f 161 if (r < 0) {
mitsarionas 2:b7489c070d1f 162 printf("error writing config to file\n");
mitsarionas 2:b7489c070d1f 163 } else {
mitsarionas 2:b7489c070d1f 164 printf("successfully written new config to file\n");
mitsarionas 3:11b767300d32 165 printf("launching mqtt now...\n");
mitsarionas 3:11b767300d32 166 launch_mqtt();
mitsarionas 2:b7489c070d1f 167 }
mitsarionas 0:00797f1ebe04 168 }