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 21 06:56:11 2015 +0000
Revision:
4:cc4c5b6d9730
Parent:
3:11b767300d32
Child:
5:1ef168357347
demo version

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