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 08:55:29 2015 +0000
Revision:
5:1ef168357347
Parent:
4:cc4c5b6d9730
Child:
7:11ff316c37ba
publish?

Who changed what in which revision?

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