emma controller code in production board v1

Dependencies:   ADE7758_v1 Crypto DHT11 MQTT MbedJSONValueEmma SDFileSystem TFT_ILI9341 SWSPI SetRTC TFT_fonts Touch W5500Interface mbed-rtos mbed-src SoftSerial

Fork of emma_controller_energy by Emma

Committer:
arsenalist
Date:
Fri Aug 28 04:17:31 2015 +0000
Revision:
47:97eadcb478b2
Parent:
46:86a0c2133130
Child:
48:053e92b6dc1e
Update checkVoltagePower requests.; Add ethernet support for checkVoltagePower.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
arsenalist 0:f4e449fa34d7 1 #include "emmaCode.h"
arsenalist 0:f4e449fa34d7 2
arsenalist 0:f4e449fa34d7 3 //init debug port
arsenalist 0:f4e449fa34d7 4 Serial DBG(PA_9, PA_10); //tx, rx
arsenalist 0:f4e449fa34d7 5
arsenalist 0:f4e449fa34d7 6 //init wifi port
arsenalist 0:f4e449fa34d7 7 Serial _ESP(PA_2, PA_3); //tx, rx
arsenalist 8:51a0ca9079ca 8 //init espduino - without ch_pd pin
arsenalist 8:51a0ca9079ca 9 ESP esp(&_ESP, &DBG, ESP_BAUD);
arsenalist 0:f4e449fa34d7 10 //init wifi mqtt
arsenalist 27:562a95c120cc 11 //ESPMQTT mqtt(&esp);
arsenalist 0:f4e449fa34d7 12 //init wifi rest
arsenalist 0:f4e449fa34d7 13 REST rest(&esp);
arsenalist 0:f4e449fa34d7 14
arsenalist 0:f4e449fa34d7 15 //init eth port
arsenalist 0:f4e449fa34d7 16 SPI spi(PB_15, PB_14, PB_13); //mosi, miso, sck
arsenalist 44:c1d11c491237 17 EthernetInterface eth(&spi, PB_12, PC_6); //spi, cs, reset
arsenalist 44:c1d11c491237 18 //MQTTEthernet ipstack(&spi, PB_12, PC_6); //spi, cs, reset
arsenalist 37:93f196daf5cf 19 //MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
arsenalist 45:2406c2b6995a 20 TCPSocketConnection sock;
arsenalist 0:f4e449fa34d7 21
arsenalist 0:f4e449fa34d7 22 //init sd card
arsenalist 8:51a0ca9079ca 23 SDFileSystem sd(PA_7, PA_6, PA_5, PB_3, "sd"); //mosi, miso, sck, cs
arsenalist 0:f4e449fa34d7 24
arsenalist 8:51a0ca9079ca 25 //init ade7758 - without cs pin
arsenalist 14:8287f0f5d987 26 ADE7758 ADE(PB_6, PB_4, PB_5, PB_7); //mosi, miso, sck, irq
arsenalist 0:f4e449fa34d7 27
arsenalist 12:96f637ed37f9 28 //init tft lcd
arsenalist 12:96f637ed37f9 29 SPI_TFT_ILI9341 TFT(PA_7, PA_6, PA_5, PA_4, PC_5, PC_4,"TFT"); //mosi, miso, sclk, cs, reset, dc
arsenalist 12:96f637ed37f9 30 //init touch screen - without cs pin
arsenalist 12:96f637ed37f9 31 TouchScreenADS7843 TP(PB_10, PB_0, PB_1, PB_2, &TFT); //mosi, miso, sclk, irq, tft
arsenalist 12:96f637ed37f9 32
arsenalist 21:33bd8b82560f 33 //init dht sensor
arsenalist 21:33bd8b82560f 34 DHT11 d(PD_2);
arsenalist 21:33bd8b82560f 35
arsenalist 0:f4e449fa34d7 36 //emma settings
arsenalist 0:f4e449fa34d7 37 string emmaUID;
arsenalist 4:76ab12e2f8a3 38 string hmac;
arsenalist 38:e44f35f8129d 39 string appNAME;
arsenalist 38:e44f35f8129d 40 string mqttDOMAIN;
arsenalist 38:e44f35f8129d 41 string mqttKEY;
arsenalist 38:e44f35f8129d 42 string mqttSECRET;
arsenalist 38:e44f35f8129d 43 string mqttSERVER;
arsenalist 38:e44f35f8129d 44 string mqttPORT;
arsenalist 38:e44f35f8129d 45 string restSERVER;
arsenalist 38:e44f35f8129d 46 string restPORT;
arsenalist 0:f4e449fa34d7 47 string wifiSSID;
arsenalist 0:f4e449fa34d7 48 string wifiPASS;
arsenalist 0:f4e449fa34d7 49 string gprsAPN;
arsenalist 0:f4e449fa34d7 50 string proxySERVER;
arsenalist 0:f4e449fa34d7 51 string proxyPORT;
arsenalist 0:f4e449fa34d7 52 string proxyAUTH;
arsenalist 0:f4e449fa34d7 53
arsenalist 4:76ab12e2f8a3 54 //nodes settings
arsenalist 4:76ab12e2f8a3 55 class NODES {
arsenalist 4:76ab12e2f8a3 56 public:
arsenalist 4:76ab12e2f8a3 57 REST *restConn;
arsenalist 4:76ab12e2f8a3 58 NODES(REST *r);
arsenalist 40:77bd44f57ad3 59 int type;
arsenalist 4:76ab12e2f8a3 60 string macAddr;
arsenalist 4:76ab12e2f8a3 61 string ipAddr;
arsenalist 4:76ab12e2f8a3 62 };
arsenalist 4:76ab12e2f8a3 63 NODES::NODES(REST *r) {
arsenalist 4:76ab12e2f8a3 64 restConn = r;
arsenalist 4:76ab12e2f8a3 65 }
arsenalist 4:76ab12e2f8a3 66 REST restObj[NODES_MAX] = {REST(&esp),REST(&esp),REST(&esp),REST(&esp),REST(&esp)};
arsenalist 4:76ab12e2f8a3 67 NODES nodes[NODES_MAX] = {NODES(&restObj[0]),NODES(&restObj[1]),NODES(&restObj[2]),NODES(&restObj[3]),NODES(&restObj[4])};
arsenalist 4:76ab12e2f8a3 68
arsenalist 12:96f637ed37f9 69 //mode box class for main menu
arsenalist 12:96f637ed37f9 70 class modeBox {
arsenalist 12:96f637ed37f9 71 public:
arsenalist 12:96f637ed37f9 72 int xTL; //TopLeft
arsenalist 12:96f637ed37f9 73 int yTL;
arsenalist 12:96f637ed37f9 74 int xBR; //BottomRight
arsenalist 12:96f637ed37f9 75 int yBR;
arsenalist 29:4d94a03d38e0 76 string text;
arsenalist 29:4d94a03d38e0 77 string name;
arsenalist 12:96f637ed37f9 78 };
arsenalist 12:96f637ed37f9 79
arsenalist 0:f4e449fa34d7 80 //ade7758 variables
arsenalist 25:36c6a5db50ed 81 uint32_t AWattHrValue, BWattHrValue, CWattHrValue;
arsenalist 25:36c6a5db50ed 82 uint32_t AVAHrValue, BVAHrValue, CVAHrValue;
arsenalist 19:7e3e9332f719 83 uint32_t AWattHrSum = 0;
arsenalist 19:7e3e9332f719 84 uint32_t BWattHrSum = 0;
arsenalist 19:7e3e9332f719 85 uint32_t CWattHrSum = 0;
arsenalist 0:f4e449fa34d7 86 float AWattHr, BWattHr, CWattHr;
arsenalist 4:76ab12e2f8a3 87 float AVrms, BVrms, CVrms;
arsenalist 4:76ab12e2f8a3 88 float AIrms, BIrms, CIrms;
arsenalist 4:76ab12e2f8a3 89 float AWatt, BWatt, CWatt;
arsenalist 4:76ab12e2f8a3 90 float XWattHr,XVrms,XWatt;
arsenalist 0:f4e449fa34d7 91
arsenalist 47:97eadcb478b2 92 //alert variables
arsenalist 47:97eadcb478b2 93 bool allowAlertAVrms = true;
arsenalist 47:97eadcb478b2 94 bool allowAlertAWatt = true;
arsenalist 47:97eadcb478b2 95 bool allowAlertBVrms = true;
arsenalist 47:97eadcb478b2 96 bool allowAlertBWatt = true;
arsenalist 47:97eadcb478b2 97 bool allowAlertCVrms = true;
arsenalist 47:97eadcb478b2 98 bool allowAlertCWatt = true;
arsenalist 47:97eadcb478b2 99
arsenalist 0:f4e449fa34d7 100 //variables
arsenalist 0:f4e449fa34d7 101 bool ethAvailable = false;
arsenalist 0:f4e449fa34d7 102 bool wifiAvailable = false;
arsenalist 0:f4e449fa34d7 103 bool gprsAvailable = false;
arsenalist 0:f4e449fa34d7 104 bool ethConnected = false;
arsenalist 0:f4e449fa34d7 105 bool wifiConnected = false;
arsenalist 9:a58c04da4476 106 bool gprsConnected = false;
arsenalist 0:f4e449fa34d7 107 bool useProxy = false;
arsenalist 0:f4e449fa34d7 108 bool newCommand = false;
arsenalist 37:93f196daf5cf 109 bool espFreeMemory = true; //for after bootup
arsenalist 27:562a95c120cc 110 bool espDHCPClientStart = false;
arsenalist 22:e18d361bf688 111 bool newEnergyData = false;
arsenalist 0:f4e449fa34d7 112 string globalCommand;
arsenalist 4:76ab12e2f8a3 113 string rxBuf;
arsenalist 27:562a95c120cc 114 string rxLog;
arsenalist 27:562a95c120cc 115 string rxLogA;
arsenalist 0:f4e449fa34d7 116
arsenalist 12:96f637ed37f9 117 /*start lcd and touch*/
arsenalist 12:96f637ed37f9 118 int emmaModeSelection(void) {
arsenalist 12:96f637ed37f9 119 bool modeSelected = false;
arsenalist 12:96f637ed37f9 120 int md=0;
arsenalist 12:96f637ed37f9 121 int TPx;
arsenalist 12:96f637ed37f9 122 int TPy;
arsenalist 31:e2abded4d85f 123 Timer t;
arsenalist 12:96f637ed37f9 124
arsenalist 12:96f637ed37f9 125 TFT.background(Black);
arsenalist 12:96f637ed37f9 126 TFT.foreground(White);
arsenalist 12:96f637ed37f9 127
arsenalist 12:96f637ed37f9 128 TFT.set_font((unsigned char*) Arial12x12);
arsenalist 12:96f637ed37f9 129 TFT.set_orientation(1);
arsenalist 12:96f637ed37f9 130 TFT.cls();
arsenalist 12:96f637ed37f9 131 TFT.locate(0,0);
arsenalist 12:96f637ed37f9 132 TFT.printf("Hello, I'm Emma!");
arsenalist 13:e8adfe305dbc 133 wait(2);
arsenalist 12:96f637ed37f9 134 TFT.cls();
arsenalist 12:96f637ed37f9 135
arsenalist 12:96f637ed37f9 136 Matrix matrix;
arsenalist 12:96f637ed37f9 137 Coordinate ScreenSample[3];
arsenalist 12:96f637ed37f9 138
arsenalist 44:c1d11c491237 139 //lcd type 1
arsenalist 44:c1d11c491237 140 //matrix.An = 580;
arsenalist 44:c1d11c491237 141 //matrix.Bn = 75980;
arsenalist 44:c1d11c491237 142 //matrix.Cn = -3410580;
arsenalist 44:c1d11c491237 143 //matrix.Dn = 57855;
arsenalist 44:c1d11c491237 144 //matrix.En = -2465;
arsenalist 44:c1d11c491237 145 //matrix.Fn = -3483515;
arsenalist 44:c1d11c491237 146 //matrix.Divider = 209144;
arsenalist 44:c1d11c491237 147
arsenalist 44:c1d11c491237 148 //ScreenSample[0].x = 230;
arsenalist 44:c1d11c491237 149 //ScreenSample[0].y = 167;
arsenalist 44:c1d11c491237 150 //ScreenSample[1].x = 754;
arsenalist 44:c1d11c491237 151 //ScreenSample[1].y = 163;
arsenalist 44:c1d11c491237 152 //ScreenSample[2].x = 771;
arsenalist 44:c1d11c491237 153 //ScreenSample[2].y = 562;
arsenalist 12:96f637ed37f9 154
arsenalist 44:c1d11c491237 155 //lcd type 2
arsenalist 44:c1d11c491237 156 matrix.An = 1305;
arsenalist 44:c1d11c491237 157 matrix.Bn = -77430;
arsenalist 44:c1d11c491237 158 matrix.Cn = 75296670;
arsenalist 44:c1d11c491237 159 matrix.Dn = -57275;
arsenalist 44:c1d11c491237 160 matrix.En = -1160;
arsenalist 44:c1d11c491237 161 matrix.Fn = 55285220;
arsenalist 44:c1d11c491237 162 matrix.Divider = 211002;
arsenalist 44:c1d11c491237 163
arsenalist 44:c1d11c491237 164 ScreenSample[0].x = 782;
arsenalist 44:c1d11c491237 165 ScreenSample[0].y = 863;
arsenalist 44:c1d11c491237 166 ScreenSample[1].x = 248;
arsenalist 44:c1d11c491237 167 ScreenSample[1].y = 854;
arsenalist 44:c1d11c491237 168 ScreenSample[2].x = 256;
arsenalist 44:c1d11c491237 169 ScreenSample[2].y = 459;
arsenalist 12:96f637ed37f9 170
arsenalist 12:96f637ed37f9 171 TP.SetCalibration(&matrix, &ScreenSample[0]);
arsenalist 12:96f637ed37f9 172
arsenalist 12:96f637ed37f9 173 //draw border
arsenalist 12:96f637ed37f9 174 TFT.line(15,15,310,15,Orange);
arsenalist 12:96f637ed37f9 175 TFT.line(310,15,310,250,Orange);
arsenalist 12:96f637ed37f9 176 TFT.line(310,250,15,250,Orange);
arsenalist 12:96f637ed37f9 177 TFT.line(15,250,15,15,Orange);
arsenalist 12:96f637ed37f9 178
arsenalist 12:96f637ed37f9 179 //init main menu
arsenalist 12:96f637ed37f9 180 modeBox menu[6];
arsenalist 12:96f637ed37f9 181
arsenalist 12:96f637ed37f9 182 //wifi config mode
arsenalist 12:96f637ed37f9 183 menu[MODE_WIFI_CONFIG].xTL = 25;
arsenalist 12:96f637ed37f9 184 menu[MODE_WIFI_CONFIG].yTL = 25;
arsenalist 12:96f637ed37f9 185 menu[MODE_WIFI_CONFIG].xBR = 110;
arsenalist 12:96f637ed37f9 186 menu[MODE_WIFI_CONFIG].yBR = 90;
arsenalist 29:4d94a03d38e0 187 menu[MODE_WIFI_CONFIG].text = "1.wifi config";
arsenalist 29:4d94a03d38e0 188 menu[MODE_WIFI_CONFIG].name = "wifi config";
arsenalist 12:96f637ed37f9 189
arsenalist 12:96f637ed37f9 190 //setting mode
arsenalist 29:4d94a03d38e0 191 menu[MODE_SETTINGS].xTL = 25;
arsenalist 29:4d94a03d38e0 192 menu[MODE_SETTINGS].yTL = 100;
arsenalist 29:4d94a03d38e0 193 menu[MODE_SETTINGS].xBR = 110;
arsenalist 29:4d94a03d38e0 194 menu[MODE_SETTINGS].yBR = 165;
arsenalist 29:4d94a03d38e0 195 menu[MODE_SETTINGS].text = "2.settings ";
arsenalist 29:4d94a03d38e0 196 menu[MODE_SETTINGS].name = "settings";
arsenalist 12:96f637ed37f9 197
arsenalist 12:96f637ed37f9 198 //register mode
arsenalist 29:4d94a03d38e0 199 menu[MODE_REGISTER].xTL = 120;
arsenalist 29:4d94a03d38e0 200 menu[MODE_REGISTER].yTL = 25;
arsenalist 29:4d94a03d38e0 201 menu[MODE_REGISTER].xBR = 205;
arsenalist 29:4d94a03d38e0 202 menu[MODE_REGISTER].yBR = 90;
arsenalist 29:4d94a03d38e0 203 menu[MODE_REGISTER].text = "3.register ";
arsenalist 29:4d94a03d38e0 204 menu[MODE_REGISTER].name = "register";
arsenalist 12:96f637ed37f9 205
arsenalist 12:96f637ed37f9 206 //operational mode
arsenalist 12:96f637ed37f9 207 menu[MODE_OPERATION].xTL = 120;
arsenalist 12:96f637ed37f9 208 menu[MODE_OPERATION].yTL = 100;
arsenalist 12:96f637ed37f9 209 menu[MODE_OPERATION].xBR = 205;
arsenalist 12:96f637ed37f9 210 menu[MODE_OPERATION].yBR = 165;
arsenalist 29:4d94a03d38e0 211 menu[MODE_OPERATION].text = "4.operation ";
arsenalist 29:4d94a03d38e0 212 menu[MODE_OPERATION].name = "operation";
arsenalist 12:96f637ed37f9 213
arsenalist 12:96f637ed37f9 214 //firmware download mode
arsenalist 12:96f637ed37f9 215 menu[MODE_FIRMWARE_DOWNLOAD].xTL = 215;
arsenalist 12:96f637ed37f9 216 menu[MODE_FIRMWARE_DOWNLOAD].yTL = 25;
arsenalist 12:96f637ed37f9 217 menu[MODE_FIRMWARE_DOWNLOAD].xBR = 300;
arsenalist 12:96f637ed37f9 218 menu[MODE_FIRMWARE_DOWNLOAD].yBR = 90;
arsenalist 29:4d94a03d38e0 219 menu[MODE_FIRMWARE_DOWNLOAD].text = "5.fw dwld ";
arsenalist 29:4d94a03d38e0 220 menu[MODE_FIRMWARE_DOWNLOAD].name = "fw dwld";
arsenalist 12:96f637ed37f9 221
arsenalist 12:96f637ed37f9 222 //reserved mode
arsenalist 44:c1d11c491237 223 menu[MODE_RESERVED].xTL = 215;
arsenalist 44:c1d11c491237 224 menu[MODE_RESERVED].yTL = 100;
arsenalist 44:c1d11c491237 225 menu[MODE_RESERVED].xBR = 300;
arsenalist 44:c1d11c491237 226 menu[MODE_RESERVED].yBR = 165;
arsenalist 44:c1d11c491237 227 menu[MODE_RESERVED].text = "6.reserved ";
arsenalist 44:c1d11c491237 228 menu[MODE_RESERVED].name = "reserved";
arsenalist 12:96f637ed37f9 229
arsenalist 17:b3ced0e67916 230 //draw main menu
arsenalist 12:96f637ed37f9 231 for(int i=0; i<6; i++) {
arsenalist 12:96f637ed37f9 232 TFT.fillrect(menu[i].xTL,menu[i].yTL,menu[i].xBR,menu[i].yBR,Orange);
arsenalist 12:96f637ed37f9 233 }
arsenalist 12:96f637ed37f9 234
arsenalist 17:b3ced0e67916 235 //add text to main menu
arsenalist 17:b3ced0e67916 236 for(int i=0; i<6; i++) {
arsenalist 17:b3ced0e67916 237 TFT.locate(menu[i].xTL,menu[i].yTL);
arsenalist 31:e2abded4d85f 238 TFT.printf("%s",menu[i].text.c_str());
arsenalist 31:e2abded4d85f 239 }
arsenalist 31:e2abded4d85f 240
arsenalist 31:e2abded4d85f 241 //read emma settings
arsenalist 31:e2abded4d85f 242 emmaReadSettings();
arsenalist 31:e2abded4d85f 243
arsenalist 38:e44f35f8129d 244 //mqttDOMAIN is not empty -> has been registered
arsenalist 38:e44f35f8129d 245 if(!mqttDOMAIN.empty()) {
arsenalist 31:e2abded4d85f 246 TFT.locate(25,170);
arsenalist 31:e2abded4d85f 247 TFT.printf(" auto select enabled");
arsenalist 31:e2abded4d85f 248 t.start();
arsenalist 17:b3ced0e67916 249 }
arsenalist 17:b3ced0e67916 250
arsenalist 12:96f637ed37f9 251 while(!modeSelected) {
arsenalist 12:96f637ed37f9 252 if(!TP._tp_irq) {
arsenalist 12:96f637ed37f9 253 if(TP.Read_Ads7843()) {
arsenalist 12:96f637ed37f9 254 TP.getDisplayPoint();
arsenalist 12:96f637ed37f9 255 TPx = TP.display.x;
arsenalist 12:96f637ed37f9 256 TPy = TP.display.y;
arsenalist 12:96f637ed37f9 257 TP.TP_DrawPoint(TPx,TPy, Blue);
arsenalist 12:96f637ed37f9 258
arsenalist 12:96f637ed37f9 259 for(int i=0; i<6; i++) {
arsenalist 12:96f637ed37f9 260 if((menu[i].xTL < TPx && TPx < menu[i].xBR) && (menu[i].yTL < TPy && TPy < menu[i].yBR)) {
arsenalist 12:96f637ed37f9 261 md = i;
arsenalist 12:96f637ed37f9 262 modeSelected = true;
arsenalist 12:96f637ed37f9 263 }
arsenalist 12:96f637ed37f9 264 }
arsenalist 12:96f637ed37f9 265 }
arsenalist 31:e2abded4d85f 266 }
arsenalist 31:e2abded4d85f 267
arsenalist 31:e2abded4d85f 268 //auto select (to emmaModeOperation) after some times
arsenalist 38:e44f35f8129d 269 if(!mqttDOMAIN.empty()) {
arsenalist 31:e2abded4d85f 270 if(t.read()>20) {
arsenalist 31:e2abded4d85f 271 md = MODE_OPERATION;
arsenalist 31:e2abded4d85f 272 modeSelected = true;
arsenalist 31:e2abded4d85f 273 t.stop();
arsenalist 31:e2abded4d85f 274 t.reset();
arsenalist 31:e2abded4d85f 275 }
arsenalist 31:e2abded4d85f 276 }
arsenalist 31:e2abded4d85f 277
arsenalist 12:96f637ed37f9 278 }
arsenalist 12:96f637ed37f9 279
arsenalist 12:96f637ed37f9 280 TFT.locate(25,170);
arsenalist 12:96f637ed37f9 281 TFT.printf(" ");
arsenalist 12:96f637ed37f9 282 TFT.locate(25,170);
arsenalist 29:4d94a03d38e0 283 TFT.printf("mode: %s is selected",menu[md].name.c_str());
arsenalist 13:e8adfe305dbc 284 wait(2);
arsenalist 12:96f637ed37f9 285 TFT.cls();
arsenalist 12:96f637ed37f9 286
arsenalist 12:96f637ed37f9 287 return md;
arsenalist 12:96f637ed37f9 288 }
arsenalist 12:96f637ed37f9 289 /*end lcd and touch*/
arsenalist 12:96f637ed37f9 290
arsenalist 31:e2abded4d85f 291 /*start emma read settings*/
arsenalist 31:e2abded4d85f 292 void emmaReadSettings(void) {
arsenalist 4:76ab12e2f8a3 293 char s[64];
arsenalist 0:f4e449fa34d7 294 DBG.baud(19200);
arsenalist 31:e2abded4d85f 295 DBG.printf("\r\nemmaReadSettings\r\n");
arsenalist 0:f4e449fa34d7 296
arsenalist 0:f4e449fa34d7 297 //read settings
arsenalist 9:a58c04da4476 298 emmaUID = readSetting("emmaUID");
arsenalist 9:a58c04da4476 299 //emmaUID = "066eff575349896767073038";
arsenalist 0:f4e449fa34d7 300 DBG.printf("emmaUID:%s\r\n",emmaUID.c_str());
arsenalist 37:93f196daf5cf 301
arsenalist 4:76ab12e2f8a3 302 //calculate hmac
arsenalist 4:76ab12e2f8a3 303 for(int i=0; i<sizeof(s); i++) {
arsenalist 4:76ab12e2f8a3 304 s[i]=0; }
arsenalist 4:76ab12e2f8a3 305 sprintf(s,"emma-%s",emmaUID.c_str());
arsenalist 4:76ab12e2f8a3 306 hmac = calculateMD5(s);
arsenalist 4:76ab12e2f8a3 307 DBG.printf("hmac:%s\r\n",hmac.c_str());
arsenalist 37:93f196daf5cf 308
arsenalist 38:e44f35f8129d 309 appNAME = readSetting("appNAME");
arsenalist 38:e44f35f8129d 310 DBG.printf("appNAME:%s\r\n",appNAME.c_str());
arsenalist 38:e44f35f8129d 311
arsenalist 38:e44f35f8129d 312 mqttDOMAIN = readSetting("mqttDOMAIN");
arsenalist 38:e44f35f8129d 313 DBG.printf("mqttDOMAIN:%s\r\n",mqttDOMAIN.c_str());
arsenalist 38:e44f35f8129d 314 mqttKEY = readSetting("mqttKEY");
arsenalist 38:e44f35f8129d 315 DBG.printf("mqttKEY:%s\r\n",mqttKEY.c_str());
arsenalist 38:e44f35f8129d 316 mqttSECRET = readSetting("mqttSECRET");
arsenalist 38:e44f35f8129d 317 DBG.printf("mqttSECRET:%s\r\n",mqttSECRET.c_str());
arsenalist 38:e44f35f8129d 318 mqttSERVER = readSetting("mqttSERVER");
arsenalist 38:e44f35f8129d 319 DBG.printf("mqttSERVER:%s\r\n",mqttSERVER.c_str());
arsenalist 38:e44f35f8129d 320 mqttPORT = readSetting("mqttPORT");
arsenalist 38:e44f35f8129d 321 DBG.printf("mqttPORT:%s\r\n",mqttPORT.c_str());
arsenalist 38:e44f35f8129d 322
arsenalist 38:e44f35f8129d 323 restSERVER = readSetting("restSERVER");
arsenalist 38:e44f35f8129d 324 DBG.printf("restSERVER:%s\r\n",restSERVER.c_str());
arsenalist 38:e44f35f8129d 325 restPORT = readSetting("restPORT");
arsenalist 38:e44f35f8129d 326 DBG.printf("restPORT:%s\r\n",restPORT.c_str());
arsenalist 38:e44f35f8129d 327
arsenalist 9:a58c04da4476 328 proxySERVER = readSetting("proxySERVER");
arsenalist 0:f4e449fa34d7 329 DBG.printf("proxySERVER:%s\r\n",proxySERVER.c_str());
arsenalist 9:a58c04da4476 330 proxyPORT = readSetting("proxyPORT");
arsenalist 0:f4e449fa34d7 331 DBG.printf("proxyPORT:%s\r\n",proxyPORT.c_str());
arsenalist 9:a58c04da4476 332 proxyAUTH = readSetting("proxyAUTH");
arsenalist 0:f4e449fa34d7 333 DBG.printf("proxyAUTH:%s\r\n",proxyAUTH.c_str());
arsenalist 28:7561035e3df5 334 wifiSSID = readSetting("wifiSSID");
arsenalist 28:7561035e3df5 335 DBG.printf("wifiSSID:%s\r\n",wifiSSID.c_str());
arsenalist 28:7561035e3df5 336 wifiPASS = readSetting("wifiPASS");
arsenalist 28:7561035e3df5 337 DBG.printf("wifiPASS:%s\r\n",wifiPASS.c_str());
arsenalist 31:e2abded4d85f 338 }
arsenalist 31:e2abded4d85f 339 /*end emma read settings*/
arsenalist 31:e2abded4d85f 340
arsenalist 31:e2abded4d85f 341 /*start emma mode*/
arsenalist 31:e2abded4d85f 342 void emmaInit(int mode) {
arsenalist 31:e2abded4d85f 343 DBG.printf("\r\nemmaInit\r\n");
arsenalist 31:e2abded4d85f 344 DBG.printf("mode:%d\r\n",mode);
arsenalist 0:f4e449fa34d7 345
arsenalist 0:f4e449fa34d7 346 //check proxy
arsenalist 0:f4e449fa34d7 347 if(!proxySERVER.empty() && !proxyPORT.empty() && !proxyAUTH.empty()) {
arsenalist 0:f4e449fa34d7 348 useProxy = true;
arsenalist 0:f4e449fa34d7 349 } else {
arsenalist 0:f4e449fa34d7 350 useProxy = false;
arsenalist 0:f4e449fa34d7 351 }
arsenalist 0:f4e449fa34d7 352 //testing purpose
arsenalist 32:78633fb9b2a1 353 //useProxy = false;
arsenalist 0:f4e449fa34d7 354 DBG.printf("proxy:%d\r\n",useProxy);
arsenalist 0:f4e449fa34d7 355
arsenalist 8:51a0ca9079ca 356 //check available interface
arsenalist 8:51a0ca9079ca 357 isEthAvailable(); //check whether cable is connected
arsenalist 31:e2abded4d85f 358 wifiAvailable = true; //wifi module will always on the board
arsenalist 31:e2abded4d85f 359 gprsAvailable = true; //gprs module will always on the board
arsenalist 8:51a0ca9079ca 360 DBG.printf("eth:%d\r\n",ethAvailable);
arsenalist 8:51a0ca9079ca 361 DBG.printf("wifi:%d\r\n",wifiAvailable);
arsenalist 8:51a0ca9079ca 362 DBG.printf("gprs:%d\r\n",gprsAvailable);
arsenalist 0:f4e449fa34d7 363 }
arsenalist 0:f4e449fa34d7 364 void emmaModeWiFiConfig(void) {
arsenalist 0:f4e449fa34d7 365 string str;
arsenalist 18:87f30ba9ddc5 366 TFT.locate(0,0);
arsenalist 18:87f30ba9ddc5 367 TFT.printf(" please wait");
arsenalist 0:f4e449fa34d7 368
arsenalist 0:f4e449fa34d7 369 if(wifiAvailable) {
arsenalist 0:f4e449fa34d7 370 DBG.printf("emmaModeWiFiConfig\r\n");
arsenalist 0:f4e449fa34d7 371
arsenalist 0:f4e449fa34d7 372 //set wifi module to configuration
arsenalist 0:f4e449fa34d7 373 _ESP.printf("MODE=C");
arsenalist 0:f4e449fa34d7 374 while(1) {
arsenalist 0:f4e449fa34d7 375 char rcv[128] = {};
arsenalist 0:f4e449fa34d7 376 rcvReply(rcv,3000);
arsenalist 0:f4e449fa34d7 377 str = rcv;
arsenalist 0:f4e449fa34d7 378 if(str.find("SC_STATUS_FIND_CHANNEL") != std::string::npos)
arsenalist 0:f4e449fa34d7 379 break;
arsenalist 0:f4e449fa34d7 380 }
arsenalist 18:87f30ba9ddc5 381
arsenalist 18:87f30ba9ddc5 382 TFT.locate(0,0);
arsenalist 18:87f30ba9ddc5 383 TFT.printf(" emmaModeWiFiConfig");
arsenalist 18:87f30ba9ddc5 384 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 385 TFT.printf(" connect with emma app now");
arsenalist 18:87f30ba9ddc5 386
arsenalist 0:f4e449fa34d7 387 DBG.printf("entering wifi configuration mode\r\n");
arsenalist 0:f4e449fa34d7 388 while(1) {
arsenalist 0:f4e449fa34d7 389 char rcv[128] = {};
arsenalist 0:f4e449fa34d7 390 rcvReply(rcv,3000);
arsenalist 0:f4e449fa34d7 391 str = rcv;
arsenalist 0:f4e449fa34d7 392 if(str.find("MODE=C OK") != std::string::npos) {
arsenalist 0:f4e449fa34d7 393 //save wifiSSID and wifiPASS
arsenalist 0:f4e449fa34d7 394 if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) {
arsenalist 0:f4e449fa34d7 395 str.erase(str.begin(),str.begin()+str.find("[")+1);
arsenalist 0:f4e449fa34d7 396 str.erase(str.begin()+str.find("]"),str.end());
arsenalist 0:f4e449fa34d7 397
arsenalist 0:f4e449fa34d7 398 MbedJSONValue jsonValue;
arsenalist 0:f4e449fa34d7 399 parse(jsonValue,str.c_str());
arsenalist 0:f4e449fa34d7 400
arsenalist 0:f4e449fa34d7 401 char *parameter[2] = {"wifiSSID","wifiPASS"};
arsenalist 0:f4e449fa34d7 402
arsenalist 0:f4e449fa34d7 403 for(int i=0; i<2; i++) {
arsenalist 0:f4e449fa34d7 404 if(jsonValue.hasMember(parameter[i])) {
arsenalist 0:f4e449fa34d7 405 string val = jsonValue[parameter[i]].get<std::string>();
arsenalist 11:2311b2d5157d 406 int st = writeSetting(parameter[i],val.c_str());
arsenalist 11:2311b2d5157d 407 if(st) {
arsenalist 11:2311b2d5157d 408 DBG.printf("%s is saved\r\n",parameter[i]);
arsenalist 18:87f30ba9ddc5 409 TFT.locate(0,40);
arsenalist 37:93f196daf5cf 410 TFT.printf(" %s is saved",parameter[i]);
arsenalist 18:87f30ba9ddc5 411 wait(3);
arsenalist 18:87f30ba9ddc5 412 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 413 TFT.printf(" ");
arsenalist 11:2311b2d5157d 414 } else {
arsenalist 11:2311b2d5157d 415 DBG.printf("%s is not saved\r\n",parameter[i]);
arsenalist 18:87f30ba9ddc5 416 TFT.locate(0,40);
arsenalist 37:93f196daf5cf 417 TFT.printf(" %s is not saved",parameter[i]);
arsenalist 18:87f30ba9ddc5 418 wait(3);
arsenalist 18:87f30ba9ddc5 419 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 420 TFT.printf(" ");
arsenalist 11:2311b2d5157d 421 }
arsenalist 0:f4e449fa34d7 422 }
arsenalist 0:f4e449fa34d7 423 }
arsenalist 18:87f30ba9ddc5 424
arsenalist 18:87f30ba9ddc5 425 //wificonfig finish
arsenalist 18:87f30ba9ddc5 426 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 427 TFT.printf(" ");
arsenalist 18:87f30ba9ddc5 428 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 429 TFT.printf(" wificonfig finish. please restart.");
arsenalist 18:87f30ba9ddc5 430
arsenalist 0:f4e449fa34d7 431 }
arsenalist 18:87f30ba9ddc5 432 } else if(str.find("SC_STATUS_GETTING_SSID_PSWD") != std::string::npos){
arsenalist 18:87f30ba9ddc5 433 DBG.printf("app connected\r\n");
arsenalist 18:87f30ba9ddc5 434 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 435 TFT.printf(" ");
arsenalist 18:87f30ba9ddc5 436 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 437 TFT.printf(" app connected");
arsenalist 0:f4e449fa34d7 438 }
arsenalist 0:f4e449fa34d7 439 }
arsenalist 0:f4e449fa34d7 440 } else {
arsenalist 0:f4e449fa34d7 441 DBG.printf("no wifi found\r\n");
arsenalist 18:87f30ba9ddc5 442 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 443 TFT.printf(" no wifi found");
arsenalist 0:f4e449fa34d7 444 }
arsenalist 0:f4e449fa34d7 445 }
arsenalist 0:f4e449fa34d7 446 void emmaModeSettings(void) {
arsenalist 0:f4e449fa34d7 447 bool clientIsConnected = false;
arsenalist 0:f4e449fa34d7 448 bool serverIsListened = false;
arsenalist 0:f4e449fa34d7 449 char s[32];
arsenalist 0:f4e449fa34d7 450 string str;
arsenalist 0:f4e449fa34d7 451
arsenalist 18:87f30ba9ddc5 452 TFT.locate(0,0);
arsenalist 18:87f30ba9ddc5 453 TFT.printf(" please wait");
arsenalist 18:87f30ba9ddc5 454
arsenalist 8:51a0ca9079ca 455 //create settings dir
arsenalist 0:f4e449fa34d7 456 mkdir("/sd/settings",0777);
arsenalist 8:51a0ca9079ca 457
arsenalist 0:f4e449fa34d7 458 //get and write emmaUID
arsenalist 0:f4e449fa34d7 459 string uid = getUID();
arsenalist 0:f4e449fa34d7 460 sprintf(s,"(%s)",uid.c_str());
arsenalist 0:f4e449fa34d7 461 uid = s;
arsenalist 0:f4e449fa34d7 462 writeSetting("emmaUID",uid);
arsenalist 0:f4e449fa34d7 463
arsenalist 8:51a0ca9079ca 464 if(ethAvailable) {
arsenalist 0:f4e449fa34d7 465 DBG.printf("emmaModeSettings - eth\r\n");
arsenalist 47:97eadcb478b2 466 eth.init();
arsenalist 47:97eadcb478b2 467 eth.connect();
arsenalist 37:93f196daf5cf 468 wait(2);
arsenalist 37:93f196daf5cf 469 TFT.locate(0,0);
arsenalist 37:93f196daf5cf 470 TFT.printf(" ");
arsenalist 37:93f196daf5cf 471 TFT.locate(0,0);
arsenalist 37:93f196daf5cf 472 TFT.printf(" emmaModeSettings");
arsenalist 0:f4e449fa34d7 473
arsenalist 0:f4e449fa34d7 474 TCPSocketServer svr;
arsenalist 0:f4e449fa34d7 475 TCPSocketConnection clientSock;
arsenalist 0:f4e449fa34d7 476
arsenalist 0:f4e449fa34d7 477 if(svr.bind(SERVER_PORT) < 0) {
arsenalist 0:f4e449fa34d7 478 DBG.printf("tcp server bind failed\r\n");
arsenalist 0:f4e449fa34d7 479 } else {
arsenalist 0:f4e449fa34d7 480 DBG.printf("tcp server bind success\r\n");
arsenalist 0:f4e449fa34d7 481 serverIsListened = true;
arsenalist 0:f4e449fa34d7 482 }
arsenalist 0:f4e449fa34d7 483
arsenalist 44:c1d11c491237 484 //DBG.printf("please connect to %s\r\n",ipstack.getEth().getIPAddress());
arsenalist 44:c1d11c491237 485 DBG.printf("please connect to %s\r\n",eth.getIPAddress());
arsenalist 0:f4e449fa34d7 486
arsenalist 0:f4e449fa34d7 487 if(svr.listen(1) < 0) {
arsenalist 37:93f196daf5cf 488 DBG.printf("tcp server listen failed\r\n");
arsenalist 37:93f196daf5cf 489 TFT.locate(0,20);
arsenalist 37:93f196daf5cf 490 TFT.printf(" settings error. please restart.");
arsenalist 37:93f196daf5cf 491 while(1);
arsenalist 0:f4e449fa34d7 492 } else {
arsenalist 37:93f196daf5cf 493 DBG.printf("tcp server is listening...\r\n");
arsenalist 37:93f196daf5cf 494 TFT.locate(0,20);
arsenalist 37:93f196daf5cf 495 TFT.printf(" connect with emma app now!");
arsenalist 0:f4e449fa34d7 496 }
arsenalist 0:f4e449fa34d7 497
arsenalist 0:f4e449fa34d7 498 clientSock.set_blocking(false,30000); //timeout after 30sec
arsenalist 0:f4e449fa34d7 499
arsenalist 0:f4e449fa34d7 500 //listening
arsenalist 0:f4e449fa34d7 501 while (serverIsListened) {
arsenalist 0:f4e449fa34d7 502 if(svr.accept(clientSock) < 0) {
arsenalist 37:93f196daf5cf 503 DBG.printf("failed to accept connection\r\n");
arsenalist 37:93f196daf5cf 504 TFT.locate(0,20);
arsenalist 37:93f196daf5cf 505 TFT.printf(" ");
arsenalist 37:93f196daf5cf 506 TFT.locate(0,20);
arsenalist 37:93f196daf5cf 507 TFT.printf("failed to accept connection");
arsenalist 0:f4e449fa34d7 508 } else {
arsenalist 0:f4e449fa34d7 509 DBG.printf("connection success!\r\nIP: %s\r\n",clientSock.get_address());
arsenalist 37:93f196daf5cf 510 TFT.locate(0,20);
arsenalist 37:93f196daf5cf 511 TFT.printf(" ");
arsenalist 37:93f196daf5cf 512 TFT.locate(0,20);
arsenalist 37:93f196daf5cf 513 //TFT.printf(" connection success! IP: %s",clientSock.get_address());
arsenalist 37:93f196daf5cf 514 TFT.printf(" connection success!");
arsenalist 0:f4e449fa34d7 515 clientIsConnected = true;
arsenalist 0:f4e449fa34d7 516
arsenalist 0:f4e449fa34d7 517 while(clientIsConnected) {
arsenalist 0:f4e449fa34d7 518 char buffer[1024] = {};
arsenalist 0:f4e449fa34d7 519 switch(clientSock.receive(buffer,1023)) {
arsenalist 0:f4e449fa34d7 520 case 0:
arsenalist 0:f4e449fa34d7 521 DBG.printf("received buffer is empty\r\n");
arsenalist 0:f4e449fa34d7 522 clientIsConnected = false;
arsenalist 0:f4e449fa34d7 523 break;
arsenalist 0:f4e449fa34d7 524 case -1:
arsenalist 0:f4e449fa34d7 525 DBG.printf("failed to read data from client\r\n");
arsenalist 0:f4e449fa34d7 526 clientIsConnected = false;
arsenalist 0:f4e449fa34d7 527 break;
arsenalist 0:f4e449fa34d7 528 default:
arsenalist 0:f4e449fa34d7 529 //DBG.printf("received data: %d\r\n%s\r\n",strlen(buffer),buffer);
arsenalist 0:f4e449fa34d7 530 DBG.printf("\r\n");
arsenalist 0:f4e449fa34d7 531
arsenalist 0:f4e449fa34d7 532 str = buffer;
arsenalist 0:f4e449fa34d7 533 if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) {
arsenalist 0:f4e449fa34d7 534 str.erase(str.begin(),str.begin()+str.find("[")+1);
arsenalist 0:f4e449fa34d7 535 str.erase(str.begin()+str.find("]"),str.end());
arsenalist 0:f4e449fa34d7 536
arsenalist 0:f4e449fa34d7 537 MbedJSONValue jsonValue;
arsenalist 0:f4e449fa34d7 538 parse(jsonValue,str.c_str());
arsenalist 0:f4e449fa34d7 539
arsenalist 14:8287f0f5d987 540 char *parameter[5] = {"gprsAPN","proxySERVER","proxyPORT","proxyAUTH","epochTime"};
arsenalist 0:f4e449fa34d7 541
arsenalist 0:f4e449fa34d7 542 for(int i=0; i<4; i++) {
arsenalist 0:f4e449fa34d7 543 if(jsonValue.hasMember(parameter[i])) {
arsenalist 0:f4e449fa34d7 544 string val = jsonValue[parameter[i]].get<std::string>();
arsenalist 0:f4e449fa34d7 545 int st = writeSetting(parameter[i],val.c_str());
arsenalist 0:f4e449fa34d7 546 if(st) {
arsenalist 0:f4e449fa34d7 547 DBG.printf("%s: %s is saved\r\n",parameter[i],val.c_str());
arsenalist 37:93f196daf5cf 548 TFT.locate(0,40);
arsenalist 37:93f196daf5cf 549 TFT.printf(" %s: %s is saved",parameter[i],val.c_str());
arsenalist 37:93f196daf5cf 550 wait(1);
arsenalist 37:93f196daf5cf 551 TFT.locate(0,40);
arsenalist 37:93f196daf5cf 552 TFT.printf(" ");
arsenalist 0:f4e449fa34d7 553 } else {
arsenalist 0:f4e449fa34d7 554 DBG.printf("%s is not saved\r\n",parameter[i]);
arsenalist 37:93f196daf5cf 555 TFT.locate(0,40);
arsenalist 37:93f196daf5cf 556 TFT.printf(" %s is not saved",parameter[i]);
arsenalist 37:93f196daf5cf 557 wait(1);
arsenalist 37:93f196daf5cf 558 TFT.locate(0,40);
arsenalist 37:93f196daf5cf 559 TFT.printf(" ");
arsenalist 0:f4e449fa34d7 560 }
arsenalist 0:f4e449fa34d7 561 }
arsenalist 0:f4e449fa34d7 562 }
arsenalist 14:8287f0f5d987 563
arsenalist 14:8287f0f5d987 564 //set time
arsenalist 14:8287f0f5d987 565 if(jsonValue.hasMember(parameter[4])) {
arsenalist 14:8287f0f5d987 566 string epTime = jsonValue[parameter[4]].get<std::string>();
arsenalist 20:ea14f175bbb4 567 time_t seconds;
arsenalist 14:8287f0f5d987 568 sscanf(epTime.c_str(),"%d",&seconds);
arsenalist 14:8287f0f5d987 569 set_time(seconds);
arsenalist 14:8287f0f5d987 570 DBG.printf("time is set\r\n");
arsenalist 37:93f196daf5cf 571 TFT.locate(0,40);
arsenalist 37:93f196daf5cf 572 TFT.printf(" time is set");
arsenalist 37:93f196daf5cf 573 wait(1);
arsenalist 37:93f196daf5cf 574 TFT.locate(0,40);
arsenalist 37:93f196daf5cf 575 TFT.printf(" ");
arsenalist 14:8287f0f5d987 576 }
arsenalist 0:f4e449fa34d7 577 }
arsenalist 0:f4e449fa34d7 578 break;
arsenalist 0:f4e449fa34d7 579 }
arsenalist 0:f4e449fa34d7 580 }
arsenalist 0:f4e449fa34d7 581 DBG.printf("close connection\r\n");
arsenalist 37:93f196daf5cf 582 TFT.locate(0,20);
arsenalist 37:93f196daf5cf 583 TFT.printf(" ");
arsenalist 37:93f196daf5cf 584 TFT.locate(0,20);
arsenalist 37:93f196daf5cf 585 TFT.printf(" settings finish. please restart.");
arsenalist 0:f4e449fa34d7 586 clientSock.close();
arsenalist 0:f4e449fa34d7 587 }
arsenalist 0:f4e449fa34d7 588 }
arsenalist 8:51a0ca9079ca 589 } else if(wifiAvailable) {
arsenalist 8:51a0ca9079ca 590 DBG.printf("emmaModeSettings - wifi\r\n");
arsenalist 8:51a0ca9079ca 591
arsenalist 8:51a0ca9079ca 592 _ESP.printf("MODE=S");
arsenalist 8:51a0ca9079ca 593 while(1) {
arsenalist 8:51a0ca9079ca 594 char rcv[128] = {};
arsenalist 8:51a0ca9079ca 595 rcvReply(rcv,3000);
arsenalist 8:51a0ca9079ca 596 str = rcv;
arsenalist 8:51a0ca9079ca 597 if(str.find("MODE=S_OK") != std::string::npos)
arsenalist 8:51a0ca9079ca 598 break;
arsenalist 8:51a0ca9079ca 599 }
arsenalist 8:51a0ca9079ca 600 DBG.printf("entering settings mode\r\n");
arsenalist 17:b3ced0e67916 601 TFT.locate(0,0);
arsenalist 17:b3ced0e67916 602 TFT.printf(" emmaModeSettings");
arsenalist 17:b3ced0e67916 603 TFT.locate(0,20);
arsenalist 37:93f196daf5cf 604 TFT.printf(" connect with emma app now!");
arsenalist 17:b3ced0e67916 605
arsenalist 8:51a0ca9079ca 606 while(1) {
arsenalist 8:51a0ca9079ca 607 char rcv[512] = {};
arsenalist 8:51a0ca9079ca 608 rcvReply(rcv,3000);
arsenalist 8:51a0ca9079ca 609 //DBG.printf("rcv:%s\r\n",rcv);
arsenalist 8:51a0ca9079ca 610 str = rcv;
arsenalist 8:51a0ca9079ca 611 if(str.find("MODE=S_Config") != std::string::npos) {
arsenalist 8:51a0ca9079ca 612 //save gprs and proxy setting
arsenalist 8:51a0ca9079ca 613 if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) {
arsenalist 8:51a0ca9079ca 614 str.erase(str.begin(),str.begin()+str.find("[")+1);
arsenalist 8:51a0ca9079ca 615 str.erase(str.begin()+str.find("]"),str.end());
arsenalist 8:51a0ca9079ca 616
arsenalist 8:51a0ca9079ca 617 MbedJSONValue jsonValue;
arsenalist 8:51a0ca9079ca 618 parse(jsonValue,str.c_str());
arsenalist 8:51a0ca9079ca 619
arsenalist 14:8287f0f5d987 620 char *parameter[5] = {"gprsAPN","proxySERVER","proxyPORT","proxyAUTH","epochTime"};
arsenalist 8:51a0ca9079ca 621
arsenalist 8:51a0ca9079ca 622 for(int i=0; i<4; i++) {
arsenalist 8:51a0ca9079ca 623 if(jsonValue.hasMember(parameter[i])) {
arsenalist 8:51a0ca9079ca 624 string val = jsonValue[parameter[i]].get<std::string>();
arsenalist 8:51a0ca9079ca 625 int st = writeSetting(parameter[i],val.c_str());
arsenalist 8:51a0ca9079ca 626 if(st) {
arsenalist 8:51a0ca9079ca 627 DBG.printf("%s: %s is saved\r\n",parameter[i],val.c_str());
arsenalist 17:b3ced0e67916 628 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 629 TFT.printf(" %s: %s is saved",parameter[i],val.c_str());
arsenalist 37:93f196daf5cf 630 wait(1);
arsenalist 17:b3ced0e67916 631 TFT.locate(0,40);
arsenalist 17:b3ced0e67916 632 TFT.printf(" ");
arsenalist 8:51a0ca9079ca 633 } else {
arsenalist 8:51a0ca9079ca 634 DBG.printf("%s is not saved\r\n",parameter[i]);
arsenalist 17:b3ced0e67916 635 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 636 TFT.printf(" %s is not saved",parameter[i]);
arsenalist 37:93f196daf5cf 637 wait(1);
arsenalist 17:b3ced0e67916 638 TFT.locate(0,40);
arsenalist 17:b3ced0e67916 639 TFT.printf(" ");
arsenalist 8:51a0ca9079ca 640 }
arsenalist 8:51a0ca9079ca 641 }
arsenalist 8:51a0ca9079ca 642 }
arsenalist 14:8287f0f5d987 643
arsenalist 14:8287f0f5d987 644 //set time
arsenalist 14:8287f0f5d987 645 if(jsonValue.hasMember(parameter[4])) {
arsenalist 14:8287f0f5d987 646 string epTime = jsonValue[parameter[4]].get<std::string>();
arsenalist 14:8287f0f5d987 647 time_t seconds;
arsenalist 14:8287f0f5d987 648 sscanf(epTime.c_str(),"%d",&seconds);
arsenalist 14:8287f0f5d987 649 set_time(seconds);
arsenalist 14:8287f0f5d987 650 DBG.printf("time is set\r\n");
arsenalist 17:b3ced0e67916 651 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 652 TFT.printf(" time is set");
arsenalist 37:93f196daf5cf 653 wait(1);
arsenalist 17:b3ced0e67916 654 TFT.locate(0,40);
arsenalist 17:b3ced0e67916 655 TFT.printf(" ");
arsenalist 14:8287f0f5d987 656 }
arsenalist 18:87f30ba9ddc5 657
arsenalist 18:87f30ba9ddc5 658 //setting finish
arsenalist 18:87f30ba9ddc5 659 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 660 TFT.printf(" ");
arsenalist 18:87f30ba9ddc5 661 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 662 TFT.printf(" settings finish. please restart.");
arsenalist 8:51a0ca9079ca 663 }
arsenalist 8:51a0ca9079ca 664 } else if(str.find("connect") != std::string::npos) {
arsenalist 8:51a0ca9079ca 665 DBG.printf("connection success!\r\n");
arsenalist 17:b3ced0e67916 666 TFT.locate(0,20);
arsenalist 17:b3ced0e67916 667 TFT.printf(" ");
arsenalist 17:b3ced0e67916 668 TFT.locate(0,20);
arsenalist 37:93f196daf5cf 669 TFT.printf(" connection success!");
arsenalist 8:51a0ca9079ca 670 }
arsenalist 8:51a0ca9079ca 671 }
arsenalist 0:f4e449fa34d7 672 } else {
arsenalist 9:a58c04da4476 673 DBG.printf("no eth or wifi is available\r\n");
arsenalist 17:b3ced0e67916 674 TFT.locate(0,0);
arsenalist 18:87f30ba9ddc5 675 TFT.printf(" no iface avail, please restart!");
arsenalist 0:f4e449fa34d7 676 }
arsenalist 0:f4e449fa34d7 677 }
arsenalist 0:f4e449fa34d7 678 void emmaModeRegister(void) {
arsenalist 0:f4e449fa34d7 679 bool emmaGetRegKey = false;
arsenalist 0:f4e449fa34d7 680 bool emmaRegistered = false;
arsenalist 39:f51aa948acee 681 char connBody[256];
arsenalist 0:f4e449fa34d7 682 char s[512];
arsenalist 0:f4e449fa34d7 683 char r[256];
arsenalist 39:f51aa948acee 684 int connBodyLen;
arsenalist 0:f4e449fa34d7 685 int connPort;
arsenalist 0:f4e449fa34d7 686 int loop = 0;
arsenalist 0:f4e449fa34d7 687 string connData;
arsenalist 0:f4e449fa34d7 688 string connHost;
arsenalist 0:f4e449fa34d7 689 string str;
arsenalist 0:f4e449fa34d7 690 string regKey;
arsenalist 0:f4e449fa34d7 691 Timer t;
arsenalist 0:f4e449fa34d7 692
arsenalist 18:87f30ba9ddc5 693 TFT.locate(0,0);
arsenalist 18:87f30ba9ddc5 694 TFT.printf(" please wait");
arsenalist 18:87f30ba9ddc5 695
arsenalist 0:f4e449fa34d7 696 //check connected interface
arsenalist 8:51a0ca9079ca 697 isEthConnected();
arsenalist 8:51a0ca9079ca 698 isWiFiConnected();
arsenalist 8:51a0ca9079ca 699 isGprsConnected();
arsenalist 0:f4e449fa34d7 700 DBG.printf("ethConnected:%d\r\n",ethConnected);
arsenalist 0:f4e449fa34d7 701 DBG.printf("wifiConnected:%d\r\n",wifiConnected);
arsenalist 0:f4e449fa34d7 702
arsenalist 9:a58c04da4476 703 if(ethConnected) {
arsenalist 9:a58c04da4476 704 DBG.printf("emmaModeRegister - eth\r\n");
arsenalist 38:e44f35f8129d 705 wait(2);
arsenalist 38:e44f35f8129d 706 TFT.locate(0,0);
arsenalist 38:e44f35f8129d 707 TFT.printf(" ");
arsenalist 38:e44f35f8129d 708 TFT.locate(0,0);
arsenalist 38:e44f35f8129d 709 TFT.printf(" emmaModeRegister");
arsenalist 9:a58c04da4476 710
arsenalist 39:f51aa948acee 711 //set connBody, connHost, connPort, connData
arsenalist 39:f51aa948acee 712 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"hmac\":\"%s\"}",emmaUID.c_str(),hmac.c_str());
arsenalist 39:f51aa948acee 713
arsenalist 9:a58c04da4476 714 if(useProxy) {
arsenalist 9:a58c04da4476 715 DBG.printf("use proxy\r\n");
arsenalist 9:a58c04da4476 716 connHost = proxySERVER;
arsenalist 9:a58c04da4476 717 sscanf(proxyPORT.c_str(),"%d",&connPort);
arsenalist 9:a58c04da4476 718 for(int i=0; i<sizeof(s); i++) {
arsenalist 9:a58c04da4476 719 s[i]=0; }
arsenalist 39:f51aa948acee 720 //sprintf(s,"GET http://%s:%s/emma/api/controller/register?uid=%s&hmac=%s HTTP/1.0\nHost: %s\r\n\r\n",restSERVER.c_str(),restPORT.c_str(),emmaUID.c_str(),hmac.c_str(),restSERVER.c_str());
arsenalist 39:f51aa948acee 721 //sprintf(s,"POST http://%s:%s/emma/api/controller/register HTTP/1.0\nHost: %s\nContent-Length: 76\n\n{\"uid\":\"%s\",\"hmac\":\"%s\"}\r\n\r\n",restSERVER.c_str(),restPORT.c_str(),restSERVER.c_str(),emmaUID.c_str(),hmac.c_str());
arsenalist 43:612547648ed1 722 sprintf(s,"POST http://%s:%s/%s/api/controller/register HTTP/1.0\nHost: %s\nContent-Length: %d\n\n%s\r\n\r\n",restSERVER.c_str(),restPORT.c_str(),appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 9:a58c04da4476 723 connData = s;
arsenalist 9:a58c04da4476 724 } else {
arsenalist 9:a58c04da4476 725 DBG.printf("no proxy\r\n");
arsenalist 38:e44f35f8129d 726 connHost = restSERVER;
arsenalist 38:e44f35f8129d 727 //connPort = restPORT;
arsenalist 38:e44f35f8129d 728 sscanf(restPORT.c_str(),"%d",&connPort);
arsenalist 9:a58c04da4476 729 for(int i=0; i<sizeof(s); i++) {
arsenalist 9:a58c04da4476 730 s[i]=0; }
arsenalist 39:f51aa948acee 731 //sprintf(s,"GET /emma/api/controller/register?uid=%s&hmac=%s HTTP/1.0\nHost: %s\r\n\r\n",emmaUID.c_str(),hmac.c_str(),restSERVER.c_str());
arsenalist 39:f51aa948acee 732 //sprintf(s,"POST /emma/api/controller/register HTTP/1.0\nHost: %s\nContent-Length: 76\n\n{\"uid\":\"%s\",\"hmac\":\"%s\"}\r\n\r\n",restSERVER.c_str(),emmaUID.c_str(),hmac.c_str());
arsenalist 43:612547648ed1 733 sprintf(s,"POST /%s/api/controller/register HTTP/1.0\nHost: %s\nContent-Length: %d\n\n%s\r\n\r\n",appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 9:a58c04da4476 734 connData = s;
arsenalist 9:a58c04da4476 735 }
arsenalist 9:a58c04da4476 736
arsenalist 9:a58c04da4476 737 //register
arsenalist 9:a58c04da4476 738 while(!emmaGetRegKey) {
arsenalist 38:e44f35f8129d 739 //DBG.printf("post:%s\r\n",s);
arsenalist 38:e44f35f8129d 740 str.clear();
arsenalist 40:77bd44f57ad3 741 str = ethREST(connHost,connPort,connData);
arsenalist 9:a58c04da4476 742 DBG.printf("rsp reg:%s\r\n",str.c_str());
arsenalist 9:a58c04da4476 743
arsenalist 38:e44f35f8129d 744 //check and save mqtt setting
arsenalist 9:a58c04da4476 745 if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) {
arsenalist 9:a58c04da4476 746 str.erase(str.begin(),str.begin()+str.find("[")+1);
arsenalist 9:a58c04da4476 747 str.erase(str.begin()+str.find("]"),str.end());
arsenalist 9:a58c04da4476 748
arsenalist 9:a58c04da4476 749 MbedJSONValue jsonValue;
arsenalist 9:a58c04da4476 750 parse(jsonValue,str.c_str());
arsenalist 9:a58c04da4476 751
arsenalist 38:e44f35f8129d 752 char *parameter[4] = {"mqttDOMAIN","mqttKEY","mqttSECRET","registrationKey"};
arsenalist 9:a58c04da4476 753
arsenalist 38:e44f35f8129d 754 //save mqtt parameter
arsenalist 9:a58c04da4476 755 writeSetting(parameter[0],"()"); //sd card need to be initialized
arsenalist 9:a58c04da4476 756 for(int i=0; i<3; i++) {
arsenalist 9:a58c04da4476 757 if(jsonValue.hasMember(parameter[i])) {
arsenalist 9:a58c04da4476 758 string val = jsonValue[parameter[i]].get<std::string>();
arsenalist 9:a58c04da4476 759 int st = writeSetting(parameter[i],val.c_str());
arsenalist 9:a58c04da4476 760 if(st) {
arsenalist 9:a58c04da4476 761 DBG.printf("%s: %s is saved\r\n",parameter[i],val.c_str());
arsenalist 9:a58c04da4476 762 } else {
arsenalist 9:a58c04da4476 763 DBG.printf("%s is not saved\r\n",parameter[i]);
arsenalist 9:a58c04da4476 764 }
arsenalist 9:a58c04da4476 765 }
arsenalist 9:a58c04da4476 766 }
arsenalist 9:a58c04da4476 767
arsenalist 9:a58c04da4476 768 //get registrationKey
arsenalist 9:a58c04da4476 769 if(jsonValue.hasMember(parameter[3])) {
arsenalist 9:a58c04da4476 770 string val = jsonValue[parameter[3]].get<std::string>();
arsenalist 9:a58c04da4476 771 if(val.find("(") != std::string::npos && val.find(")") != std::string::npos) {
arsenalist 9:a58c04da4476 772 val.erase(val.begin(),val.begin()+val.find("(")+1);
arsenalist 9:a58c04da4476 773 val.erase(val.begin()+val.find(")"),val.end());
arsenalist 9:a58c04da4476 774 regKey = val;
arsenalist 9:a58c04da4476 775 DBG.printf("%s: %s\r\n",parameter[3],regKey.c_str());
arsenalist 38:e44f35f8129d 776
arsenalist 38:e44f35f8129d 777 TFT.locate(0,20);
arsenalist 38:e44f35f8129d 778 TFT.printf(" %s: %s\r\n",parameter[3],regKey.c_str());
arsenalist 38:e44f35f8129d 779
arsenalist 9:a58c04da4476 780 emmaGetRegKey = true;
arsenalist 9:a58c04da4476 781 }
arsenalist 9:a58c04da4476 782 }
arsenalist 9:a58c04da4476 783 }
arsenalist 9:a58c04da4476 784 }
arsenalist 9:a58c04da4476 785
arsenalist 9:a58c04da4476 786 //calculate hmac
arsenalist 9:a58c04da4476 787 for(int i=0; i<sizeof(r); i++) {
arsenalist 9:a58c04da4476 788 r[i]=0; }
arsenalist 9:a58c04da4476 789 sprintf(r,"emma-%s-%s",emmaUID.c_str(),regKey.c_str());
arsenalist 9:a58c04da4476 790 hmac = calculateMD5(r);
arsenalist 9:a58c04da4476 791 DBG.printf("hmac:%s\r\n",hmac.c_str());
arsenalist 9:a58c04da4476 792
arsenalist 39:f51aa948acee 793 //set connBody and connData
arsenalist 39:f51aa948acee 794 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"registrationKey\":\"%s\",\"hmac\":\"%s\"}",emmaUID.c_str(),regKey.c_str(),hmac.c_str());
arsenalist 39:f51aa948acee 795
arsenalist 9:a58c04da4476 796 if(useProxy) {
arsenalist 9:a58c04da4476 797 DBG.printf("use proxy\r\n");
arsenalist 9:a58c04da4476 798 for(int i=0; i<sizeof(s); i++) {
arsenalist 9:a58c04da4476 799 s[i]=0; }
arsenalist 39:f51aa948acee 800 //sprintf(s,"GET http://%s:%s/emma/api/controller/verify?uid=%s&registrationKey=%s&hmac=%s HTTP/1.0\nHost: %s\r\n\r\n",restSERVER.c_str(),restPORT.c_str(),emmaUID.c_str(),regKey.c_str(),hmac.c_str(),restSERVER.c_str());
arsenalist 43:612547648ed1 801 sprintf(s,"POST http://%s:%s/%s/api/controller/verify HTTP/1.0\nHost: %s\nContent-Length: %d\n\n%s\r\n\r\n",restSERVER.c_str(),restPORT.c_str(),appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 9:a58c04da4476 802 connData = s;
arsenalist 9:a58c04da4476 803 } else {
arsenalist 9:a58c04da4476 804 DBG.printf("no proxy\r\n");
arsenalist 9:a58c04da4476 805 for(int i=0; i<sizeof(s); i++) {
arsenalist 9:a58c04da4476 806 s[i]=0; }
arsenalist 39:f51aa948acee 807 //sprintf(s,"GET /emma/api/controller/verify?uid=%s&registrationKey=%s&hmac=%s HTTP/1.0\nHost: %s\r\n\r\n",emmaUID.c_str(),regKey.c_str(),hmac.c_str(),restSERVER.c_str());
arsenalist 43:612547648ed1 808 sprintf(s,"POST /%s/api/controller/verify HTTP/1.0\nHost: %s\nContent-Length: %d\n\n%s\r\n\r\n",appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 9:a58c04da4476 809 connData = s;
arsenalist 9:a58c04da4476 810 }
arsenalist 9:a58c04da4476 811
arsenalist 9:a58c04da4476 812 //verify registration
arsenalist 9:a58c04da4476 813 while(!emmaRegistered && loop < 12){
arsenalist 9:a58c04da4476 814 str.clear();
arsenalist 40:77bd44f57ad3 815 str = ethREST(connHost,connPort,connData);
arsenalist 9:a58c04da4476 816 DBG.printf("rsp vrf:%s\r\n",str.c_str());
arsenalist 38:e44f35f8129d 817
arsenalist 38:e44f35f8129d 818 TFT.locate(0,40);
arsenalist 38:e44f35f8129d 819 TFT.printf(" ");
arsenalist 38:e44f35f8129d 820 TFT.locate(0,40);
arsenalist 38:e44f35f8129d 821 TFT.printf(" wait:%d\r\n",loop);
arsenalist 9:a58c04da4476 822
arsenalist 9:a58c04da4476 823 //check verification
arsenalist 9:a58c04da4476 824 if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) {
arsenalist 9:a58c04da4476 825 str.erase(str.begin(),str.begin()+str.find("[")+1);
arsenalist 9:a58c04da4476 826 str.erase(str.begin()+str.find("]"),str.end());
arsenalist 9:a58c04da4476 827
arsenalist 9:a58c04da4476 828 MbedJSONValue jsonValue;
arsenalist 9:a58c04da4476 829 parse(jsonValue,str.c_str());
arsenalist 9:a58c04da4476 830 if(jsonValue.hasMember("user")) {
arsenalist 9:a58c04da4476 831 string val = jsonValue["user"].get<std::string>();
arsenalist 9:a58c04da4476 832 DBG.printf("%s is registered\r\n",val.c_str());
arsenalist 38:e44f35f8129d 833 TFT.locate(0,40);
arsenalist 38:e44f35f8129d 834 TFT.printf(" ");
arsenalist 38:e44f35f8129d 835 TFT.locate(0,40);
arsenalist 38:e44f35f8129d 836 TFT.printf(" %s is registered\r\n",val.c_str());
arsenalist 9:a58c04da4476 837 emmaRegistered = true;
arsenalist 9:a58c04da4476 838 }
arsenalist 9:a58c04da4476 839 }
arsenalist 9:a58c04da4476 840 wait(5);
arsenalist 9:a58c04da4476 841 loop++;
arsenalist 9:a58c04da4476 842 }
arsenalist 9:a58c04da4476 843
arsenalist 9:a58c04da4476 844 //check whether registration success
arsenalist 9:a58c04da4476 845 if(emmaRegistered) {
arsenalist 9:a58c04da4476 846 DBG.printf("registration successful\r\n");
arsenalist 38:e44f35f8129d 847 TFT.locate(0,60);
arsenalist 38:e44f35f8129d 848 TFT.printf(" registration successful\r\n");
arsenalist 9:a58c04da4476 849 } else {
arsenalist 9:a58c04da4476 850 DBG.printf("registration unsuccessful\r\n");
arsenalist 38:e44f35f8129d 851 TFT.locate(0,60);
arsenalist 38:e44f35f8129d 852 TFT.printf(" registration unsuccessful. please restart.\r\n");
arsenalist 9:a58c04da4476 853 }
arsenalist 9:a58c04da4476 854 while(1);
arsenalist 9:a58c04da4476 855
arsenalist 9:a58c04da4476 856 } else if(wifiConnected) {
arsenalist 0:f4e449fa34d7 857 DBG.printf("emmaModeRegister - wifi\r\n");
arsenalist 0:f4e449fa34d7 858
arsenalist 0:f4e449fa34d7 859 _ESP.printf("MODE=B");
arsenalist 0:f4e449fa34d7 860 wait(1);
arsenalist 0:f4e449fa34d7 861 while(!esp.ready());
arsenalist 0:f4e449fa34d7 862
arsenalist 0:f4e449fa34d7 863 //set connHost, connPort
arsenalist 0:f4e449fa34d7 864 if(useProxy) {
arsenalist 0:f4e449fa34d7 865 connHost = proxySERVER;
arsenalist 0:f4e449fa34d7 866 sscanf(proxyPORT.c_str(),"%d",&connPort);
arsenalist 0:f4e449fa34d7 867 } else {
arsenalist 38:e44f35f8129d 868 connHost = restSERVER;
arsenalist 38:e44f35f8129d 869 //connPort = restPORT;
arsenalist 38:e44f35f8129d 870 sscanf(restPORT.c_str(),"%d",&connPort);
arsenalist 0:f4e449fa34d7 871 }
arsenalist 18:87f30ba9ddc5 872 TFT.locate(0,0);
arsenalist 18:87f30ba9ddc5 873 TFT.printf(" emmaModeRegister");
arsenalist 0:f4e449fa34d7 874
arsenalist 0:f4e449fa34d7 875 //rest begin
arsenalist 0:f4e449fa34d7 876 if(!rest.begin(connHost.c_str(),connPort,false)) {
arsenalist 0:f4e449fa34d7 877 DBG.printf("EMMA: fail to setup rest");
arsenalist 32:78633fb9b2a1 878 TFT.locate(0,20);
arsenalist 32:78633fb9b2a1 879 TFT.printf(" fail setup connection");
arsenalist 32:78633fb9b2a1 880 TFT.locate(0,40);
arsenalist 32:78633fb9b2a1 881 TFT.printf(" check your wifi connection or");
arsenalist 32:78633fb9b2a1 882 TFT.locate(0,60);
arsenalist 32:78633fb9b2a1 883 TFT.printf(" you should setup proxy!");
arsenalist 0:f4e449fa34d7 884 while(1);
arsenalist 0:f4e449fa34d7 885 }
arsenalist 0:f4e449fa34d7 886 //wifiConnected = true; //with custom firmware, wifi module should connect automatically
arsenalist 0:f4e449fa34d7 887
arsenalist 0:f4e449fa34d7 888 esp.process();
arsenalist 0:f4e449fa34d7 889 if(wifiConnected) {
arsenalist 32:78633fb9b2a1 890 //check proxy
arsenalist 0:f4e449fa34d7 891 if(useProxy) {
arsenalist 43:612547648ed1 892 sprintf(r,"http://%s:%s/%s/api/controller/register",restSERVER.c_str(),restPORT.c_str(),appNAME.c_str());
arsenalist 38:e44f35f8129d 893 //sprintf(r,"http://%s:%d/emma/api/controller/register HTTP/1.0\nHost: %s:%d\nProxy-Authorization: Basic %s\nCache-Control: no-cache\nContent-Length: %d\n\n",restSERVER,restPORT,restSERVER,restPORT,proxyAUTH.c_str(),76);
arsenalist 38:e44f35f8129d 894 //sprintf(r,"http://%s:%d/emma/api/controller/register HTTP/1.0\nAccept: */*\nAccept-Encoding: gzip,deflate\nContent-Length: %d\r\n\r\n",restSERVER,restPORT,76);
arsenalist 39:f51aa948acee 895 //sprintf(r,"http://%s:%d/emma/coba",restSERVER,REST_SERVER_PORT);
arsenalist 0:f4e449fa34d7 896 } else {
arsenalist 43:612547648ed1 897 sprintf(r,"/%s/api/controller/register",appNAME.c_str());
arsenalist 0:f4e449fa34d7 898 }
arsenalist 0:f4e449fa34d7 899
arsenalist 0:f4e449fa34d7 900 //register
arsenalist 0:f4e449fa34d7 901 while(!emmaGetRegKey) {
arsenalist 32:78633fb9b2a1 902 sprintf(s,"{\"uid\":\"%s\",\"hmac\":\"%s\"}",emmaUID.c_str(),hmac.c_str());
arsenalist 39:f51aa948acee 903 //DBG.printf("s:%s\r\n",s);
arsenalist 32:78633fb9b2a1 904 //string iniStr = "{\"uid\":\"005300553533510334313732\",\"hmac\":\"45fc6a4447989a9434d1f21087a78061\"}";
arsenalist 32:78633fb9b2a1 905 //DBG.printf("s:%s\r\n",iniStr.c_str());
arsenalist 32:78633fb9b2a1 906
arsenalist 32:78633fb9b2a1 907 //rest.post(r,iniStr.c_str());
arsenalist 32:78633fb9b2a1 908 rest.post(r,s);
arsenalist 0:f4e449fa34d7 909 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 910 s[i]=0; }
arsenalist 0:f4e449fa34d7 911 rest.getResponse(s,sizeof(s));
arsenalist 0:f4e449fa34d7 912 DBG.printf("rsp reg:%s\r\n",s);
arsenalist 0:f4e449fa34d7 913
arsenalist 38:e44f35f8129d 914 //check and save mqtt setting
arsenalist 0:f4e449fa34d7 915 str = s;
arsenalist 0:f4e449fa34d7 916 if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) {
arsenalist 0:f4e449fa34d7 917 str.erase(str.begin(),str.begin()+str.find("[")+1);
arsenalist 0:f4e449fa34d7 918 str.erase(str.begin()+str.find("]"),str.end());
arsenalist 0:f4e449fa34d7 919
arsenalist 0:f4e449fa34d7 920 MbedJSONValue jsonValue;
arsenalist 0:f4e449fa34d7 921 parse(jsonValue,str.c_str());
arsenalist 0:f4e449fa34d7 922
arsenalist 38:e44f35f8129d 923 char *parameter[4] = {"mqttDOMAIN","mqttKEY","mqttSECRET","registrationKey"};
arsenalist 0:f4e449fa34d7 924
arsenalist 38:e44f35f8129d 925 //save mqtt parameter
arsenalist 0:f4e449fa34d7 926 writeSetting(parameter[0],"()"); //sd card need to be initialized
arsenalist 0:f4e449fa34d7 927 for(int i=0; i<3; i++) {
arsenalist 0:f4e449fa34d7 928 if(jsonValue.hasMember(parameter[i])) {
arsenalist 0:f4e449fa34d7 929 string val = jsonValue[parameter[i]].get<std::string>();
arsenalist 0:f4e449fa34d7 930 int st = writeSetting(parameter[i],val.c_str());
arsenalist 0:f4e449fa34d7 931 if(st) {
arsenalist 0:f4e449fa34d7 932 DBG.printf("%s: %s is saved\r\n",parameter[i],val.c_str());
arsenalist 0:f4e449fa34d7 933 } else {
arsenalist 0:f4e449fa34d7 934 DBG.printf("%s is not saved\r\n",parameter[i]);
arsenalist 0:f4e449fa34d7 935 }
arsenalist 0:f4e449fa34d7 936 }
arsenalist 0:f4e449fa34d7 937 }
arsenalist 0:f4e449fa34d7 938
arsenalist 0:f4e449fa34d7 939 //get registrationKey
arsenalist 0:f4e449fa34d7 940 if(jsonValue.hasMember(parameter[3])) {
arsenalist 0:f4e449fa34d7 941 string val = jsonValue[parameter[3]].get<std::string>();
arsenalist 0:f4e449fa34d7 942 if(val.find("(") != std::string::npos && val.find(")") != std::string::npos) {
arsenalist 0:f4e449fa34d7 943 val.erase(val.begin(),val.begin()+val.find("(")+1);
arsenalist 0:f4e449fa34d7 944 val.erase(val.begin()+val.find(")"),val.end());
arsenalist 0:f4e449fa34d7 945 regKey = val;
arsenalist 0:f4e449fa34d7 946 DBG.printf("%s: %s\r\n",parameter[3],regKey.c_str());
arsenalist 18:87f30ba9ddc5 947
arsenalist 18:87f30ba9ddc5 948 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 949 TFT.printf(" %s: %s\r\n",parameter[3],regKey.c_str());
arsenalist 18:87f30ba9ddc5 950
arsenalist 0:f4e449fa34d7 951 emmaGetRegKey = true;
arsenalist 0:f4e449fa34d7 952 }
arsenalist 0:f4e449fa34d7 953 }
arsenalist 0:f4e449fa34d7 954 }
arsenalist 32:78633fb9b2a1 955 wait(1);
arsenalist 0:f4e449fa34d7 956 }
arsenalist 0:f4e449fa34d7 957
arsenalist 0:f4e449fa34d7 958 //calculate hmac
arsenalist 0:f4e449fa34d7 959 for(int i=0; i<sizeof(r); i++) {
arsenalist 0:f4e449fa34d7 960 r[i]=0; }
arsenalist 0:f4e449fa34d7 961 sprintf(r,"emma-%s-%s",emmaUID.c_str(),regKey.c_str());
arsenalist 0:f4e449fa34d7 962 hmac = calculateMD5(r);
arsenalist 0:f4e449fa34d7 963 DBG.printf("hmac:%s\r\n",hmac.c_str());
arsenalist 0:f4e449fa34d7 964
arsenalist 32:78633fb9b2a1 965 //check proxy
arsenalist 0:f4e449fa34d7 966 if(useProxy) {
arsenalist 43:612547648ed1 967 sprintf(r,"http://%s:%s/%s/api/controller/verify",restSERVER.c_str(),restPORT.c_str(),appNAME.c_str());
arsenalist 0:f4e449fa34d7 968 } else {
arsenalist 43:612547648ed1 969 sprintf(r,"/%s/api/controller/verify",appNAME.c_str());
arsenalist 0:f4e449fa34d7 970 }
arsenalist 0:f4e449fa34d7 971
arsenalist 0:f4e449fa34d7 972 //verify registration
arsenalist 0:f4e449fa34d7 973 while(!emmaRegistered && loop < 12){
arsenalist 32:78633fb9b2a1 974 sprintf(s,"{\"uid\":\"%s\",\"registrationKey\":\"%s\",\"hmac\":\"%s\"}",emmaUID.c_str(),regKey.c_str(),hmac.c_str());
arsenalist 32:78633fb9b2a1 975 rest.post(r,s);
arsenalist 0:f4e449fa34d7 976 rest.getResponse(s,sizeof(s));
arsenalist 0:f4e449fa34d7 977 DBG.printf("rsp vrf:%s\r\n",s);
arsenalist 18:87f30ba9ddc5 978 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 979 TFT.printf(" ");
arsenalist 18:87f30ba9ddc5 980 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 981 TFT.printf(" wait:%d\r\n",loop);
arsenalist 0:f4e449fa34d7 982
arsenalist 0:f4e449fa34d7 983 //check verification
arsenalist 0:f4e449fa34d7 984 str = s;
arsenalist 0:f4e449fa34d7 985 if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) {
arsenalist 0:f4e449fa34d7 986 str.erase(str.begin(),str.begin()+str.find("[")+1);
arsenalist 0:f4e449fa34d7 987 str.erase(str.begin()+str.find("]"),str.end());
arsenalist 0:f4e449fa34d7 988
arsenalist 0:f4e449fa34d7 989 MbedJSONValue jsonValue;
arsenalist 0:f4e449fa34d7 990 parse(jsonValue,str.c_str());
arsenalist 0:f4e449fa34d7 991 if(jsonValue.hasMember("user")) {
arsenalist 0:f4e449fa34d7 992 string val = jsonValue["user"].get<std::string>();
arsenalist 18:87f30ba9ddc5 993 DBG.printf(" %s is registered\r\n",val.c_str());
arsenalist 18:87f30ba9ddc5 994 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 995 TFT.printf(" ");
arsenalist 18:87f30ba9ddc5 996 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 997 TFT.printf(" %s is registered\r\n",val.c_str());
arsenalist 0:f4e449fa34d7 998 emmaRegistered = true;
arsenalist 0:f4e449fa34d7 999 }
arsenalist 0:f4e449fa34d7 1000 }
arsenalist 0:f4e449fa34d7 1001 wait(5);
arsenalist 0:f4e449fa34d7 1002 loop++;
arsenalist 0:f4e449fa34d7 1003 }
arsenalist 0:f4e449fa34d7 1004
arsenalist 0:f4e449fa34d7 1005 //check whether registration success
arsenalist 0:f4e449fa34d7 1006 if(emmaRegistered) {
arsenalist 0:f4e449fa34d7 1007 DBG.printf("registration successful\r\n");
arsenalist 18:87f30ba9ddc5 1008 TFT.locate(0,60);
arsenalist 18:87f30ba9ddc5 1009 TFT.printf(" registration successful\r\n");
arsenalist 0:f4e449fa34d7 1010 } else {
arsenalist 0:f4e449fa34d7 1011 DBG.printf("registration unsuccessful\r\n");
arsenalist 18:87f30ba9ddc5 1012 TFT.locate(0,60);
arsenalist 38:e44f35f8129d 1013 TFT.printf(" registration unsuccessful. please restart.\r\n");
arsenalist 0:f4e449fa34d7 1014 }
arsenalist 0:f4e449fa34d7 1015 while(1);
arsenalist 0:f4e449fa34d7 1016 }
arsenalist 0:f4e449fa34d7 1017
arsenalist 9:a58c04da4476 1018 } else if(gprsConnected) {
arsenalist 0:f4e449fa34d7 1019 DBG.printf("emmaModeRegister - gprs\r\n");
arsenalist 0:f4e449fa34d7 1020
arsenalist 0:f4e449fa34d7 1021 } else {
arsenalist 9:a58c04da4476 1022 DBG.printf("no eth, wifi, or gprs is connected\r\n");
arsenalist 18:87f30ba9ddc5 1023 TFT.locate(0,60);
arsenalist 18:87f30ba9ddc5 1024 TFT.printf(" no iface connected. please restart.\r\n");
arsenalist 0:f4e449fa34d7 1025 }
arsenalist 0:f4e449fa34d7 1026 }
arsenalist 0:f4e449fa34d7 1027
arsenalist 0:f4e449fa34d7 1028 void emmaModeOperation(void) {
arsenalist 27:562a95c120cc 1029 //char mqttClientId[32];
arsenalist 40:77bd44f57ad3 1030 char connBody[256];
arsenalist 22:e18d361bf688 1031 char p[64];
arsenalist 14:8287f0f5d987 1032 char q[32];
arsenalist 4:76ab12e2f8a3 1033 char r[32];
arsenalist 45:2406c2b6995a 1034 char s[4096];
arsenalist 40:77bd44f57ad3 1035 int connBodyLen;
arsenalist 38:e44f35f8129d 1036 int connPort;
arsenalist 0:f4e449fa34d7 1037 int loop=0;
arsenalist 21:33bd8b82560f 1038 int trial=0;
arsenalist 22:e18d361bf688 1039 string hmacTime;
arsenalist 23:fb369e171b7d 1040 string hmacCmd;
arsenalist 0:f4e449fa34d7 1041 string str;
arsenalist 14:8287f0f5d987 1042 time_t seconds;
arsenalist 0:f4e449fa34d7 1043 Timer t;
arsenalist 47:97eadcb478b2 1044 Timer tAlert;
arsenalist 24:5d58515ba510 1045 Timer tPanelEnergy;
arsenalist 24:5d58515ba510 1046 Timer tPanel;
arsenalist 4:76ab12e2f8a3 1047 Timer tNodes;
arsenalist 0:f4e449fa34d7 1048
arsenalist 19:7e3e9332f719 1049 TFT.locate(0,0);
arsenalist 19:7e3e9332f719 1050 TFT.printf(" please wait");
arsenalist 19:7e3e9332f719 1051
arsenalist 0:f4e449fa34d7 1052 //check connected interface
arsenalist 8:51a0ca9079ca 1053 isEthConnected();
arsenalist 8:51a0ca9079ca 1054 isWiFiConnected();
arsenalist 8:51a0ca9079ca 1055 isGprsConnected();
arsenalist 0:f4e449fa34d7 1056 DBG.printf("ethConnected:%d\r\n",ethConnected);
arsenalist 0:f4e449fa34d7 1057 DBG.printf("wifiConnected:%d\r\n",wifiConnected);
arsenalist 0:f4e449fa34d7 1058
arsenalist 13:e8adfe305dbc 1059 TFT.locate(0,0);
arsenalist 13:e8adfe305dbc 1060 TFT.printf(" emmaModeOperation");
arsenalist 13:e8adfe305dbc 1061
arsenalist 13:e8adfe305dbc 1062 TFT.locate(0,20);
arsenalist 44:c1d11c491237 1063 TFT.printf(" Interface:");
arsenalist 44:c1d11c491237 1064
arsenalist 44:c1d11c491237 1065 TFT.locate(75,20);
arsenalist 13:e8adfe305dbc 1066 if(ethConnected) {
arsenalist 44:c1d11c491237 1067 TFT.printf("ETH");
arsenalist 44:c1d11c491237 1068 } else if(wifiConnected) {
arsenalist 44:c1d11c491237 1069 TFT.printf("WiFi");
arsenalist 44:c1d11c491237 1070 } else if(gprsConnected) {
arsenalist 44:c1d11c491237 1071 TFT.printf("GPRS");
arsenalist 13:e8adfe305dbc 1072 } else {
arsenalist 44:c1d11c491237 1073 TFT.printf("N/A");
arsenalist 13:e8adfe305dbc 1074 }
arsenalist 13:e8adfe305dbc 1075
arsenalist 44:c1d11c491237 1076 //set ade7758 parameter
arsenalist 44:c1d11c491237 1077 ADE.begin();
arsenalist 44:c1d11c491237 1078 ADE.writeRMSOffset(AIRMSOFFSET, BIRMSOFFSET, CIRMSOFFSET, AVRMSOFFSET, BVRMSOFFSET, CVRMSOFFSET);
arsenalist 44:c1d11c491237 1079 ADE.write16bits(AWG, 0);
arsenalist 44:c1d11c491237 1080 ADE.write16bits(BWG, 0);
arsenalist 44:c1d11c491237 1081 ADE.write16bits(CWG, 0);
arsenalist 44:c1d11c491237 1082 ADE.write16bits(AVAG, 0);
arsenalist 44:c1d11c491237 1083 ADE.write16bits(BVAG, 0);
arsenalist 44:c1d11c491237 1084 ADE.write16bits(CVAG, 0);
arsenalist 13:e8adfe305dbc 1085
arsenalist 10:1dc69e0ce7fd 1086 if(ethConnected) {
arsenalist 10:1dc69e0ce7fd 1087 DBG.printf("emmaModeOperation - eth\r\n");
arsenalist 44:c1d11c491237 1088
arsenalist 44:c1d11c491237 1089 //new log indicator
arsenalist 40:77bd44f57ad3 1090 seconds = time(NULL);
arsenalist 40:77bd44f57ad3 1091 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 40:77bd44f57ad3 1092 DBG.printf("newLog:%d\r\n",writeLog(q,"++++++++++Ethernet++++++++++"));
arsenalist 40:77bd44f57ad3 1093
arsenalist 40:77bd44f57ad3 1094 //check firmware update
arsenalist 40:77bd44f57ad3 1095
arsenalist 40:77bd44f57ad3 1096 //execute last state of switches on board
arsenalist 40:77bd44f57ad3 1097
arsenalist 40:77bd44f57ad3 1098 //get list of nodes from server
arsenalist 40:77bd44f57ad3 1099 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"hmac\":\"%s\"}",emmaUID.c_str(),hmac.c_str());
arsenalist 46:86a0c2133130 1100 sprintf(s,"POST /%s/api/controller/wifinodes HTTP/1.0\nHost: %s\nContent-Length:%d\n\n%s\r\n\r\n",appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 44:c1d11c491237 1101 sscanf(restPORT.c_str(),"%d",&connPort);
arsenalist 40:77bd44f57ad3 1102 str.clear();
arsenalist 40:77bd44f57ad3 1103 str = ethREST(restSERVER,connPort,s);
arsenalist 44:c1d11c491237 1104 //DBG.printf("str:%s\r\n",str.c_str());
arsenalist 46:86a0c2133130 1105
arsenalist 40:77bd44f57ad3 1106 if(str.rfind("[{\"type\"") != std::string::npos) {
arsenalist 40:77bd44f57ad3 1107 DBG.printf("get nodes from server\r\n");
arsenalist 40:77bd44f57ad3 1108 str.erase(str.begin(),str.begin()+str.rfind("[{\"type\""));
arsenalist 40:77bd44f57ad3 1109 str.erase(str.begin()+str.rfind("}]")+2,str.end());
arsenalist 40:77bd44f57ad3 1110
arsenalist 40:77bd44f57ad3 1111 MbedJSONValue jsonValue;
arsenalist 40:77bd44f57ad3 1112 parse(jsonValue,str.c_str());
arsenalist 40:77bd44f57ad3 1113 char *parameter[3] = {"type","mac","ip"};
arsenalist 40:77bd44f57ad3 1114
arsenalist 40:77bd44f57ad3 1115 TFT.locate(0,40);
arsenalist 40:77bd44f57ad3 1116 TFT.printf(" ");
arsenalist 40:77bd44f57ad3 1117 TFT.locate(0,40);
arsenalist 40:77bd44f57ad3 1118 TFT.printf("get %d nodes from server",jsonValue.size());
arsenalist 40:77bd44f57ad3 1119 wait(0.5);
arsenalist 40:77bd44f57ad3 1120 TFT.locate(0,40);
arsenalist 40:77bd44f57ad3 1121 TFT.printf(" ");
arsenalist 40:77bd44f57ad3 1122
arsenalist 40:77bd44f57ad3 1123 //check whether nodes valid
arsenalist 40:77bd44f57ad3 1124 bool validNodes = true;
arsenalist 40:77bd44f57ad3 1125 for(int i=0; i<jsonValue.size(); i++) {
arsenalist 40:77bd44f57ad3 1126 for(int j=0; j<3; j++) {
arsenalist 40:77bd44f57ad3 1127 validNodes = validNodes && jsonValue[i].hasMember(parameter[j]);
arsenalist 40:77bd44f57ad3 1128 }
arsenalist 40:77bd44f57ad3 1129 }
arsenalist 40:77bd44f57ad3 1130 DBG.printf("nodes validity:%d\r\n",validNodes);
arsenalist 40:77bd44f57ad3 1131
arsenalist 40:77bd44f57ad3 1132 if(validNodes) {
arsenalist 40:77bd44f57ad3 1133 for(int i=0; i<jsonValue.size(); i++) {
arsenalist 44:c1d11c491237 1134 int typeValue = jsonValue[i][parameter[0]].get<int>();
arsenalist 40:77bd44f57ad3 1135 string macValue = jsonValue[i][parameter[1]].get<std::string>();
arsenalist 40:77bd44f57ad3 1136 string ipValue = jsonValue[i][parameter[2]].get<std::string>();
arsenalist 40:77bd44f57ad3 1137 nodes[i].type = typeValue;
arsenalist 40:77bd44f57ad3 1138 nodes[i].macAddr = macValue;
arsenalist 40:77bd44f57ad3 1139 nodes[i].ipAddr = ipValue;
arsenalist 44:c1d11c491237 1140 DBG.printf("nodes[%d]type:%d\r\n",i,nodes[i].type);
arsenalist 40:77bd44f57ad3 1141 DBG.printf("nodes[%d]mac:%s\r\n",i,nodes[i].macAddr.c_str());
arsenalist 40:77bd44f57ad3 1142 DBG.printf("nodes[%d]ip:%s\r\n",i,nodes[i].ipAddr.c_str());
arsenalist 40:77bd44f57ad3 1143 }
arsenalist 36:ed696fd1b44e 1144 }
arsenalist 40:77bd44f57ad3 1145
arsenalist 40:77bd44f57ad3 1146 } else {
arsenalist 40:77bd44f57ad3 1147 DBG.printf("no nodes from server\r\n");
arsenalist 40:77bd44f57ad3 1148 }
arsenalist 40:77bd44f57ad3 1149
arsenalist 40:77bd44f57ad3 1150 //define thread
arsenalist 40:77bd44f57ad3 1151 osThreadDef(energyThread, osPriorityBelowNormal, (8*DEFAULT_STACK_SIZE));
arsenalist 40:77bd44f57ad3 1152 //create thread
arsenalist 40:77bd44f57ad3 1153 osThreadCreate(osThread(energyThread),NULL);
arsenalist 40:77bd44f57ad3 1154
arsenalist 47:97eadcb478b2 1155 tAlert.start();
arsenalist 40:77bd44f57ad3 1156 tPanelEnergy.start();
arsenalist 40:77bd44f57ad3 1157 tPanel.start();
arsenalist 40:77bd44f57ad3 1158 tNodes.start();
arsenalist 40:77bd44f57ad3 1159 wait(1);
arsenalist 40:77bd44f57ad3 1160 while(1) {
arsenalist 47:97eadcb478b2 1161 checkVoltagePower(); //need revision to support ethernet
arsenalist 47:97eadcb478b2 1162
arsenalist 47:97eadcb478b2 1163 //set allowAlertXxxx to enable controller send alert
arsenalist 47:97eadcb478b2 1164 if(tAlert.read() > 300.0f) { //300.0f is 5 minutes
arsenalist 47:97eadcb478b2 1165 allowAlertAVrms = true;
arsenalist 47:97eadcb478b2 1166 allowAlertAWatt = true;
arsenalist 47:97eadcb478b2 1167 allowAlertBVrms = true;
arsenalist 47:97eadcb478b2 1168 allowAlertBWatt = true;
arsenalist 47:97eadcb478b2 1169 allowAlertCVrms = true;
arsenalist 47:97eadcb478b2 1170 allowAlertCWatt = true;
arsenalist 47:97eadcb478b2 1171 tAlert.reset();
arsenalist 47:97eadcb478b2 1172 }
arsenalist 40:77bd44f57ad3 1173
arsenalist 40:77bd44f57ad3 1174 //panelEnergy, panelVoltage, and panelPower
arsenalist 40:77bd44f57ad3 1175 if(tPanelEnergy.read() > 30.0f) {
arsenalist 40:77bd44f57ad3 1176 DBG.printf("[%d]WattHR for each phase: %.2f, %.2f, %.2f\r\n", loop, AWattHr, BWattHr, CWattHr);
arsenalist 40:77bd44f57ad3 1177 TFT.locate(0,60);
arsenalist 40:77bd44f57ad3 1178 TFT.printf(" ");
arsenalist 40:77bd44f57ad3 1179 TFT.locate(0,60);
arsenalist 40:77bd44f57ad3 1180 TFT.printf("[%d]WHR: %.1f, %.1f, %.1f", loop, AWattHr, BWattHr, CWattHr);
arsenalist 40:77bd44f57ad3 1181
arsenalist 40:77bd44f57ad3 1182 DBG.printf("VRMS for each phase: %.2f, %.2f, %.2f\r\n", AVrms, BVrms, CVrms);
arsenalist 40:77bd44f57ad3 1183 TFT.locate(0,80);
arsenalist 40:77bd44f57ad3 1184 TFT.printf(" ");
arsenalist 40:77bd44f57ad3 1185 TFT.locate(0,80);
arsenalist 40:77bd44f57ad3 1186 TFT.printf("VRMS: %.1f, %.1f, %.1f", AVrms, BVrms, CVrms);
arsenalist 40:77bd44f57ad3 1187
arsenalist 40:77bd44f57ad3 1188 DBG.printf("Watt for each phase: %.2f, %.2f, %.2f\r\n", AWatt, BWatt, CWatt);
arsenalist 40:77bd44f57ad3 1189 TFT.locate(0,100);
arsenalist 40:77bd44f57ad3 1190 TFT.printf(" ");
arsenalist 40:77bd44f57ad3 1191 TFT.locate(0,100);
arsenalist 40:77bd44f57ad3 1192 TFT.printf("Watt: %.1f, %.1f, %.1f", AWatt, BWatt, CWatt);
arsenalist 40:77bd44f57ad3 1193
arsenalist 40:77bd44f57ad3 1194 if(newEnergyData) {
arsenalist 40:77bd44f57ad3 1195 //for(int i=1; i<4; i++) {
arsenalist 40:77bd44f57ad3 1196 for(int i=1; i<2; i++) {
arsenalist 40:77bd44f57ad3 1197 DBG.printf("sending channel: %d\r\n",i);
arsenalist 40:77bd44f57ad3 1198 if(i==1){
arsenalist 40:77bd44f57ad3 1199 XWattHr = AWattHr;
arsenalist 40:77bd44f57ad3 1200 XVrms = AVrms;
arsenalist 40:77bd44f57ad3 1201 XWatt = AWatt;
arsenalist 40:77bd44f57ad3 1202 } else if(i==2) {
arsenalist 40:77bd44f57ad3 1203 XWattHr = BWattHr;
arsenalist 40:77bd44f57ad3 1204 XVrms = BVrms;
arsenalist 40:77bd44f57ad3 1205 XWatt = BWatt;
arsenalist 40:77bd44f57ad3 1206 } else {
arsenalist 40:77bd44f57ad3 1207 XWattHr = CWattHr;
arsenalist 40:77bd44f57ad3 1208 XVrms = CVrms;
arsenalist 40:77bd44f57ad3 1209 XWatt = CWatt;
arsenalist 40:77bd44f57ad3 1210 }
arsenalist 40:77bd44f57ad3 1211
arsenalist 40:77bd44f57ad3 1212 if(XWattHr != 0.0f) {
arsenalist 40:77bd44f57ad3 1213 seconds = time(NULL);
arsenalist 40:77bd44f57ad3 1214 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 40:77bd44f57ad3 1215
arsenalist 40:77bd44f57ad3 1216 sprintf(p,"emma-%s-%s",emmaUID.c_str(),q);
arsenalist 40:77bd44f57ad3 1217 hmacTime = calculateMD5(p);
arsenalist 40:77bd44f57ad3 1218
arsenalist 40:77bd44f57ad3 1219 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"energy\":%.2f,\"voltage\":%.2f,\"power\":%.2f}",
arsenalist 40:77bd44f57ad3 1220 emmaUID.c_str(),hmacTime.c_str(),q,XWattHr,XVrms,XWatt);
arsenalist 46:86a0c2133130 1221 sprintf(s,"POST /%s/api/controller/energy/%d HTTP/1.0\nHost:%s\nContent-Length:%d\n\n%s\r\n\r\n",appNAME.c_str(),i,restSERVER.c_str(),connBodyLen,connBody);
arsenalist 40:77bd44f57ad3 1222
arsenalist 46:86a0c2133130 1223 //DBG.printf("dataEnergy:\r\n%s\r\n",connBody);
arsenalist 40:77bd44f57ad3 1224
arsenalist 40:77bd44f57ad3 1225 str.clear();
arsenalist 40:77bd44f57ad3 1226 sscanf(restPORT.c_str(),"%d",&connPort);
arsenalist 46:86a0c2133130 1227 str = ethREST(restSERVER,connPort,s);
arsenalist 46:86a0c2133130 1228 //DBG.printf("str:%s\r\n",str.c_str());
arsenalist 46:86a0c2133130 1229
arsenalist 40:77bd44f57ad3 1230 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 40:77bd44f57ad3 1231 //logging purpose
arsenalist 40:77bd44f57ad3 1232 seconds = time(NULL);
arsenalist 40:77bd44f57ad3 1233 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 40:77bd44f57ad3 1234 DBG.printf("logPE:%d\r\n",writeLog(q,"sendEnergyData success"));
arsenalist 40:77bd44f57ad3 1235
arsenalist 40:77bd44f57ad3 1236 DBG.printf("send channel: %d success\r\n",i);
arsenalist 40:77bd44f57ad3 1237 TFT.foreground(Green);
arsenalist 40:77bd44f57ad3 1238 TFT.locate(0,120);
arsenalist 40:77bd44f57ad3 1239 TFT.printf(" ");
arsenalist 40:77bd44f57ad3 1240 TFT.locate(0,120);
arsenalist 40:77bd44f57ad3 1241 TFT.printf("send ch%d success",i);
arsenalist 40:77bd44f57ad3 1242 wait(1);
arsenalist 40:77bd44f57ad3 1243 TFT.locate(0,120);
arsenalist 40:77bd44f57ad3 1244 TFT.printf(" ");
arsenalist 44:c1d11c491237 1245 TFT.foreground(White);
arsenalist 40:77bd44f57ad3 1246 } else {
arsenalist 40:77bd44f57ad3 1247 //logging purpose
arsenalist 40:77bd44f57ad3 1248 seconds = time(NULL);
arsenalist 40:77bd44f57ad3 1249 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 40:77bd44f57ad3 1250 DBG.printf("logPE:%d\r\n",writeLog(q,"sendEnergyData failed"));
arsenalist 40:77bd44f57ad3 1251
arsenalist 40:77bd44f57ad3 1252 DBG.printf("send channel: %d failed\r\n",i);
arsenalist 40:77bd44f57ad3 1253 TFT.foreground(Red);
arsenalist 40:77bd44f57ad3 1254 TFT.locate(0,120);
arsenalist 40:77bd44f57ad3 1255 TFT.printf(" ");
arsenalist 40:77bd44f57ad3 1256 TFT.locate(0,120);
arsenalist 40:77bd44f57ad3 1257 TFT.printf("send ch%d failed",i);
arsenalist 40:77bd44f57ad3 1258 wait(1);
arsenalist 40:77bd44f57ad3 1259 TFT.locate(0,120);
arsenalist 40:77bd44f57ad3 1260 TFT.printf(" ");
arsenalist 40:77bd44f57ad3 1261 TFT.foreground(White);
arsenalist 40:77bd44f57ad3 1262 }
arsenalist 40:77bd44f57ad3 1263 }
arsenalist 40:77bd44f57ad3 1264 }
arsenalist 40:77bd44f57ad3 1265 newEnergyData = false;
arsenalist 40:77bd44f57ad3 1266 }
arsenalist 40:77bd44f57ad3 1267
arsenalist 40:77bd44f57ad3 1268 tPanelEnergy.reset();
arsenalist 40:77bd44f57ad3 1269 loop++;
arsenalist 36:ed696fd1b44e 1270 }
arsenalist 40:77bd44f57ad3 1271
arsenalist 40:77bd44f57ad3 1272 //panel environment
arsenalist 46:86a0c2133130 1273 if(tPanel.read() > 900.0f) { //900.0f is 15 minutes
arsenalist 46:86a0c2133130 1274 int dTemp=0;
arsenalist 46:86a0c2133130 1275 int dHum=0;
arsenalist 46:86a0c2133130 1276 int dGas=0;
arsenalist 46:86a0c2133130 1277
arsenalist 46:86a0c2133130 1278 DBG.printf("getPanelEnvironment\r\n");
arsenalist 46:86a0c2133130 1279
arsenalist 46:86a0c2133130 1280 //get environment sensor
arsenalist 46:86a0c2133130 1281 trial=0;
arsenalist 46:86a0c2133130 1282 while(1) {
arsenalist 46:86a0c2133130 1283 if(trial>=2) { //two times trial
arsenalist 46:86a0c2133130 1284 break;
arsenalist 46:86a0c2133130 1285 }
arsenalist 46:86a0c2133130 1286 if(d.readData() == DHT11::OK) {
arsenalist 46:86a0c2133130 1287 dTemp = d.readTemperature();
arsenalist 46:86a0c2133130 1288 dHum = d.readHumidity();
arsenalist 46:86a0c2133130 1289 break;
arsenalist 46:86a0c2133130 1290 }
arsenalist 46:86a0c2133130 1291 trial++;
arsenalist 46:86a0c2133130 1292 wait(3);
arsenalist 46:86a0c2133130 1293 }
arsenalist 46:86a0c2133130 1294
arsenalist 46:86a0c2133130 1295 //send environment sensor
arsenalist 46:86a0c2133130 1296 if(dTemp!=0 && dHum!=0) {
arsenalist 46:86a0c2133130 1297 seconds = time(NULL);
arsenalist 46:86a0c2133130 1298 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 46:86a0c2133130 1299
arsenalist 46:86a0c2133130 1300 //calculate hmacTime
arsenalist 46:86a0c2133130 1301 sprintf(p,"emma-%s-%s",emmaUID.c_str(),q);
arsenalist 46:86a0c2133130 1302 hmacTime = calculateMD5(p);
arsenalist 46:86a0c2133130 1303
arsenalist 46:86a0c2133130 1304 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"temp\":%d,\"hum\":%d,\"gas\":%d}",
arsenalist 46:86a0c2133130 1305 emmaUID.c_str(),hmacTime.c_str(),q,dTemp,dHum,dGas);
arsenalist 46:86a0c2133130 1306 sprintf(s,"POST /%s/api/controller/environment HTTP/1.0\nHost:%s\nContent-Length:%d\n\n%s\r\n\r\n",appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 46:86a0c2133130 1307
arsenalist 46:86a0c2133130 1308 //DBG.printf("dataEnvironment:\r\n%s\r\n",s);
arsenalist 46:86a0c2133130 1309
arsenalist 46:86a0c2133130 1310 str.clear();
arsenalist 46:86a0c2133130 1311 sscanf(restPORT.c_str(),"%d",&connPort);
arsenalist 46:86a0c2133130 1312 str = ethREST(restSERVER,connPort,s);
arsenalist 46:86a0c2133130 1313 //DBG.printf("str:%s\r\n",str.c_str());
arsenalist 46:86a0c2133130 1314
arsenalist 46:86a0c2133130 1315 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 46:86a0c2133130 1316 //logging purpose
arsenalist 46:86a0c2133130 1317 seconds = time(NULL);
arsenalist 46:86a0c2133130 1318 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 46:86a0c2133130 1319 DBG.printf("logPEnv:%d\r\n",writeLog(q,"sendPanelEnv success"));
arsenalist 46:86a0c2133130 1320 DBG.printf("send panel environment success\r\n");
arsenalist 46:86a0c2133130 1321 } else {
arsenalist 46:86a0c2133130 1322 //logging purpose
arsenalist 46:86a0c2133130 1323 seconds = time(NULL);
arsenalist 46:86a0c2133130 1324 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 46:86a0c2133130 1325 DBG.printf("logPEnv:%d\r\n",writeLog(q,"sendPanelEnv failed"));
arsenalist 46:86a0c2133130 1326 DBG.printf("send panel environment failed\r\n");
arsenalist 46:86a0c2133130 1327 }
arsenalist 46:86a0c2133130 1328 }
arsenalist 46:86a0c2133130 1329 tPanel.reset();
arsenalist 46:86a0c2133130 1330 }
arsenalist 46:86a0c2133130 1331
arsenalist 46:86a0c2133130 1332 //node temp
arsenalist 46:86a0c2133130 1333 if(tNodes.read() > 60.0f) { //900 is 15 minutes
arsenalist 46:86a0c2133130 1334 DBG.printf("getNodesTemperature\r\n");
arsenalist 46:86a0c2133130 1335
arsenalist 46:86a0c2133130 1336 for(int i=0; i<NODES_MAX; i++) {
arsenalist 46:86a0c2133130 1337 if(!nodes[i].ipAddr.empty() && nodes[i].type == 1) {
arsenalist 46:86a0c2133130 1338 //get node's temp
arsenalist 46:86a0c2133130 1339 string temp;
arsenalist 46:86a0c2133130 1340 str.clear();
arsenalist 46:86a0c2133130 1341 str = ethREST(nodes[i].ipAddr,REMOTE_TCP_PORT,"<?xml version=\"1.0\" encoding=\"utf-8\"?><app_cmd cmd=\"2\"/>\r\n");
arsenalist 46:86a0c2133130 1342 //DBG.printf("str:%s\r\n",str.c_str());
arsenalist 46:86a0c2133130 1343
arsenalist 46:86a0c2133130 1344 if(str.find("200 OK")) {
arsenalist 46:86a0c2133130 1345 if(str.rfind("temp=") != std::string::npos) {
arsenalist 46:86a0c2133130 1346 str.erase(str.begin(),str.begin()+str.rfind("temp=")+6);
arsenalist 46:86a0c2133130 1347 str.erase(str.begin()+str.find("\""),str.end());
arsenalist 46:86a0c2133130 1348 temp = str;
arsenalist 46:86a0c2133130 1349 } else {
arsenalist 46:86a0c2133130 1350 temp = "0"; //connect to node, but receive none
arsenalist 46:86a0c2133130 1351 }
arsenalist 46:86a0c2133130 1352 } else {
arsenalist 46:86a0c2133130 1353 temp = "0"; //not connected to node
arsenalist 46:86a0c2133130 1354 }
arsenalist 46:86a0c2133130 1355 DBG.printf("nodeTemp[%d]:%s\r\n",i,temp.c_str());
arsenalist 46:86a0c2133130 1356
arsenalist 46:86a0c2133130 1357 //send node's temp
arsenalist 46:86a0c2133130 1358 if(temp != "0") {
arsenalist 46:86a0c2133130 1359 seconds = time(NULL);
arsenalist 46:86a0c2133130 1360 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 46:86a0c2133130 1361
arsenalist 46:86a0c2133130 1362 //calculate hmacTime
arsenalist 46:86a0c2133130 1363 sprintf(p,"emma-%s-%s",emmaUID.c_str(),q);
arsenalist 46:86a0c2133130 1364 hmacTime = calculateMD5(p);
arsenalist 46:86a0c2133130 1365
arsenalist 46:86a0c2133130 1366 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"mac\":%s,\"value\":%s}",
arsenalist 46:86a0c2133130 1367 emmaUID.c_str(),hmacTime.c_str(),q,nodes[i].macAddr.c_str(),temp.c_str());
arsenalist 46:86a0c2133130 1368 sprintf(s,"POST /%s/api/controller/nodetemp HTTP/1.0\nHost:%s\nContent-Length:%d\n\n%s\r\n\r\n",appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 46:86a0c2133130 1369
arsenalist 46:86a0c2133130 1370 //DBG.printf("dataNodeTemp:\r\n%s\r\n",s);
arsenalist 46:86a0c2133130 1371
arsenalist 46:86a0c2133130 1372 str.clear();
arsenalist 46:86a0c2133130 1373 sscanf(restPORT.c_str(),"%d",&connPort);
arsenalist 46:86a0c2133130 1374 str = ethREST(restSERVER,connPort,s);
arsenalist 46:86a0c2133130 1375 //DBG.printf("str:%s\r\n",str.c_str());
arsenalist 46:86a0c2133130 1376
arsenalist 46:86a0c2133130 1377 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 46:86a0c2133130 1378 DBG.printf("send nodeTemp success\r\n");
arsenalist 46:86a0c2133130 1379 } else {
arsenalist 46:86a0c2133130 1380 DBG.printf("send nodeTemp failed\r\n");
arsenalist 46:86a0c2133130 1381 }
arsenalist 46:86a0c2133130 1382 }
arsenalist 46:86a0c2133130 1383 }
arsenalist 46:86a0c2133130 1384 }
arsenalist 46:86a0c2133130 1385 tNodes.reset();
arsenalist 46:86a0c2133130 1386 }
arsenalist 40:77bd44f57ad3 1387
arsenalist 44:c1d11c491237 1388 //command
arsenalist 45:2406c2b6995a 1389 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"hmac\":\"%s\"}",emmaUID.c_str(),hmac.c_str());
arsenalist 45:2406c2b6995a 1390 sprintf(s,"POST /%s/api/controller/command HTTP/1.0\nHost: %s\nContent-Length:%d\n\n%s\r\n\r\n",appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 45:2406c2b6995a 1391 sscanf(restPORT.c_str(),"%d",&connPort);
arsenalist 45:2406c2b6995a 1392 str = ethREST(restSERVER,connPort,s);
arsenalist 45:2406c2b6995a 1393 //DBG.printf("str:%s\r\n",str.c_str());
arsenalist 45:2406c2b6995a 1394
arsenalist 45:2406c2b6995a 1395 if(str.rfind("[{\"from\"") != std::string::npos) {
arsenalist 45:2406c2b6995a 1396 str.erase(str.begin(),str.begin()+str.rfind("[{\"from\""));
arsenalist 45:2406c2b6995a 1397 if(str.find("[{") != std::string::npos && str.rfind("}]") != std::string::npos) {
arsenalist 45:2406c2b6995a 1398 str.erase(str.begin(),str.begin()+str.find("[{"));
arsenalist 45:2406c2b6995a 1399 str.erase(str.begin()+str.rfind("}]")+2,str.end());
arsenalist 45:2406c2b6995a 1400 }
arsenalist 45:2406c2b6995a 1401 //DBG.printf("newCommand:\r\n%s\r\n",str.c_str());
arsenalist 45:2406c2b6995a 1402 TFT.locate(0,160);
arsenalist 45:2406c2b6995a 1403 TFT.printf(" ");
arsenalist 45:2406c2b6995a 1404 TFT.locate(0,160);
arsenalist 45:2406c2b6995a 1405 TFT.printf("newCommand");
arsenalist 45:2406c2b6995a 1406
arsenalist 45:2406c2b6995a 1407 MbedJSONValue jsonValue;
arsenalist 45:2406c2b6995a 1408 parse(jsonValue,str.c_str());
arsenalist 45:2406c2b6995a 1409 char *parameter[5] = {"from","nType","nAddr","dType","cmd"};
arsenalist 45:2406c2b6995a 1410
arsenalist 45:2406c2b6995a 1411 DBG.printf("get %d command\r\n",jsonValue.size());
arsenalist 45:2406c2b6995a 1412
arsenalist 45:2406c2b6995a 1413 //processing each command
arsenalist 45:2406c2b6995a 1414 bool validCommand;
arsenalist 45:2406c2b6995a 1415 for(int i=0; i<jsonValue.size(); i++) {
arsenalist 45:2406c2b6995a 1416 //check whether command is valid
arsenalist 45:2406c2b6995a 1417 DBG.printf("\r\nprocessing cmd[%d]\r\n",i);
arsenalist 45:2406c2b6995a 1418 validCommand = true;
arsenalist 45:2406c2b6995a 1419 for(int j=0; j<5; j++) {
arsenalist 45:2406c2b6995a 1420 validCommand = validCommand && jsonValue[i].hasMember(parameter[j]);
arsenalist 45:2406c2b6995a 1421 }
arsenalist 45:2406c2b6995a 1422 DBG.printf("command validity:%d\r\n",validCommand);
arsenalist 45:2406c2b6995a 1423
arsenalist 45:2406c2b6995a 1424 if(validCommand) {
arsenalist 45:2406c2b6995a 1425 string commandFrom = jsonValue[i][parameter[0]].get<std::string>();
arsenalist 45:2406c2b6995a 1426 string commandNType = jsonValue[i][parameter[1]].get<std::string>();
arsenalist 45:2406c2b6995a 1427 string commandNAddr = jsonValue[i][parameter[2]].get<std::string>();
arsenalist 45:2406c2b6995a 1428 string commandDType = jsonValue[i][parameter[3]].get<std::string>();
arsenalist 45:2406c2b6995a 1429 string commandCmd = jsonValue[i][parameter[4]].get<std::string>();
arsenalist 45:2406c2b6995a 1430
arsenalist 45:2406c2b6995a 1431 if(commandNType == "0") { //switch on panel controller
arsenalist 45:2406c2b6995a 1432 DBG.printf("command for switch\r\n");
arsenalist 45:2406c2b6995a 1433 }
arsenalist 46:86a0c2133130 1434 else if(commandNType == "1" || commandNType == "2") { //ir&rf remote control or wifi smart plug
arsenalist 45:2406c2b6995a 1435 DBG.printf("command for remote control\r\n");
arsenalist 45:2406c2b6995a 1436
arsenalist 45:2406c2b6995a 1437 //get index of node list based on mac address
arsenalist 45:2406c2b6995a 1438 int idx = NODES_INVALID;
arsenalist 45:2406c2b6995a 1439 for(int i=0; i<NODES_MAX; i++) {
arsenalist 45:2406c2b6995a 1440 if(!nodes[i].macAddr.compare(commandNAddr)) {
arsenalist 45:2406c2b6995a 1441 idx = i;
arsenalist 45:2406c2b6995a 1442 }
arsenalist 45:2406c2b6995a 1443 }
arsenalist 45:2406c2b6995a 1444
arsenalist 45:2406c2b6995a 1445 //execution process
arsenalist 45:2406c2b6995a 1446 string execResult = "failed";
arsenalist 45:2406c2b6995a 1447 if(idx != NODES_INVALID) {
arsenalist 45:2406c2b6995a 1448 DBG.printf("index found at %d\r\n",idx);
arsenalist 45:2406c2b6995a 1449
arsenalist 46:86a0c2133130 1450 if(commandNType == "1"){
arsenalist 46:86a0c2133130 1451 //get cmd string based on device type and command number
arsenalist 46:86a0c2133130 1452 string nodeCmd;
arsenalist 46:86a0c2133130 1453 nodeCmd = readNodeCmd(commandDType,commandCmd);
arsenalist 46:86a0c2133130 1454 sprintf(s,"<?xml version=\"1.0\" encoding=\"utf-8\"?><app_cmd cmd=\"5\" /><app_data code=\"%s\"/>\r\n",nodeCmd.c_str());
arsenalist 46:86a0c2133130 1455 } else if(commandNType == "2") {
arsenalist 46:86a0c2133130 1456 sprintf(s,"<?xml version=\"1.0\" encoding=\"utf-8\"?><app_cmd cmd=\"13\"/><app_data on-off=\"%s\"/>\r\n",commandCmd.c_str());
arsenalist 46:86a0c2133130 1457 }
arsenalist 46:86a0c2133130 1458
arsenalist 45:2406c2b6995a 1459 //execute command
arsenalist 45:2406c2b6995a 1460 DBG.printf("executing command\r\n");
arsenalist 46:86a0c2133130 1461
arsenalist 45:2406c2b6995a 1462 trial=0;
arsenalist 45:2406c2b6995a 1463 while(1) {
arsenalist 45:2406c2b6995a 1464 if(trial>=2) { //two times trial
arsenalist 45:2406c2b6995a 1465 DBG.printf("cmd is not executed\r\n");
arsenalist 45:2406c2b6995a 1466 TFT.foreground(Red);
arsenalist 45:2406c2b6995a 1467 TFT.locate(0,180);
arsenalist 45:2406c2b6995a 1468 TFT.printf(" ");
arsenalist 45:2406c2b6995a 1469 TFT.locate(0,180);
arsenalist 45:2406c2b6995a 1470 TFT.printf("cmd is not executed");
arsenalist 45:2406c2b6995a 1471 wait(1);
arsenalist 45:2406c2b6995a 1472 TFT.locate(0,180);
arsenalist 45:2406c2b6995a 1473 TFT.printf(" ");
arsenalist 45:2406c2b6995a 1474 TFT.foreground(White);
arsenalist 45:2406c2b6995a 1475 break;
arsenalist 45:2406c2b6995a 1476 }
arsenalist 45:2406c2b6995a 1477 str = ethREST(nodes[idx].ipAddr,REMOTE_TCP_PORT,s);
arsenalist 45:2406c2b6995a 1478 wait(2);
arsenalist 45:2406c2b6995a 1479 if(str.find("200 OK") != std::string::npos) {
arsenalist 45:2406c2b6995a 1480 DBG.printf("cmd is executed\r\n");
arsenalist 45:2406c2b6995a 1481 TFT.foreground(Green);
arsenalist 45:2406c2b6995a 1482 TFT.locate(0,180);
arsenalist 45:2406c2b6995a 1483 TFT.printf(" ");
arsenalist 45:2406c2b6995a 1484 TFT.locate(0,180);
arsenalist 45:2406c2b6995a 1485 TFT.printf("cmd is executed");
arsenalist 45:2406c2b6995a 1486 wait(1);
arsenalist 45:2406c2b6995a 1487 TFT.locate(0,180);
arsenalist 45:2406c2b6995a 1488 TFT.printf(" ");
arsenalist 45:2406c2b6995a 1489 TFT.foreground(White);
arsenalist 45:2406c2b6995a 1490 execResult = "success";
arsenalist 45:2406c2b6995a 1491 break;
arsenalist 45:2406c2b6995a 1492 }
arsenalist 45:2406c2b6995a 1493 str.clear();
arsenalist 45:2406c2b6995a 1494 trial++;
arsenalist 45:2406c2b6995a 1495 }
arsenalist 45:2406c2b6995a 1496 } else {
arsenalist 45:2406c2b6995a 1497 TFT.foreground(Red);
arsenalist 45:2406c2b6995a 1498 TFT.locate(0,180);
arsenalist 45:2406c2b6995a 1499 TFT.printf(" ");
arsenalist 45:2406c2b6995a 1500 TFT.locate(0,180);
arsenalist 45:2406c2b6995a 1501 TFT.printf("node is invalid");
arsenalist 45:2406c2b6995a 1502 wait(1);
arsenalist 45:2406c2b6995a 1503 TFT.locate(0,180);
arsenalist 45:2406c2b6995a 1504 TFT.printf(" ");
arsenalist 45:2406c2b6995a 1505 TFT.foreground(White);
arsenalist 45:2406c2b6995a 1506 }
arsenalist 45:2406c2b6995a 1507 wait(2);
arsenalist 45:2406c2b6995a 1508
arsenalist 45:2406c2b6995a 1509 //send execution result
arsenalist 45:2406c2b6995a 1510 sprintf(p,"emma-%s-%s",emmaUID.c_str(),commandCmd.c_str());
arsenalist 45:2406c2b6995a 1511 hmacCmd = calculateMD5(p);
arsenalist 45:2406c2b6995a 1512
arsenalist 45:2406c2b6995a 1513 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"nType\":\"%s\",\"nAddr\":\"%s\",\"dType\":\"%s\",\"cmd\":\"%s\",\"from\":\"%s\",\"result\":\"%s\",\"hmac\":\"%s\"}",
arsenalist 45:2406c2b6995a 1514 emmaUID.c_str(), commandNType.c_str(),commandNAddr.c_str(),commandDType.c_str(),commandCmd.c_str(),commandFrom.c_str(),execResult.c_str(),hmacCmd.c_str());
arsenalist 45:2406c2b6995a 1515
arsenalist 45:2406c2b6995a 1516 sprintf(s,"POST /%s/api/controller/result HTTP/1.0\nHost: %s\nContent-Length:%d\n\n%s\r\n\r\n",appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 45:2406c2b6995a 1517 sscanf(restPORT.c_str(),"%d",&connPort);
arsenalist 45:2406c2b6995a 1518
arsenalist 45:2406c2b6995a 1519 trial=0;
arsenalist 45:2406c2b6995a 1520 while(1) {
arsenalist 45:2406c2b6995a 1521 if(trial>=2) { //two times trial
arsenalist 45:2406c2b6995a 1522 DBG.printf("failed to send execution result\r\n");
arsenalist 45:2406c2b6995a 1523 break;
arsenalist 45:2406c2b6995a 1524 }
arsenalist 45:2406c2b6995a 1525 str = ethREST(restSERVER,connPort,s);
arsenalist 45:2406c2b6995a 1526 wait(2);
arsenalist 45:2406c2b6995a 1527 if(str.rfind("[{\"status\"") != std::string::npos) {
arsenalist 45:2406c2b6995a 1528 str.erase(str.begin(),str.begin()+str.rfind("[{\"status\""));
arsenalist 45:2406c2b6995a 1529 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 45:2406c2b6995a 1530 DBG.printf("success to send execution result\r\n");
arsenalist 45:2406c2b6995a 1531 break;
arsenalist 45:2406c2b6995a 1532 }
arsenalist 45:2406c2b6995a 1533 }
arsenalist 45:2406c2b6995a 1534 str.clear();
arsenalist 45:2406c2b6995a 1535 trial++;
arsenalist 45:2406c2b6995a 1536 }
arsenalist 45:2406c2b6995a 1537 }
arsenalist 45:2406c2b6995a 1538 }
arsenalist 45:2406c2b6995a 1539 }
arsenalist 45:2406c2b6995a 1540 //clear text on lcd
arsenalist 45:2406c2b6995a 1541 TFT.locate(0,160);
arsenalist 45:2406c2b6995a 1542 TFT.printf(" ");
arsenalist 45:2406c2b6995a 1543 }
arsenalist 40:77bd44f57ad3 1544 osDelay(5000);
arsenalist 10:1dc69e0ce7fd 1545 }
arsenalist 10:1dc69e0ce7fd 1546 } else if(wifiConnected) {
arsenalist 0:f4e449fa34d7 1547 DBG.printf("emmaModeOperation - wifi\r\n");
arsenalist 29:4d94a03d38e0 1548
arsenalist 44:c1d11c491237 1549 //new log and dbg indicator
arsenalist 29:4d94a03d38e0 1550 seconds = time(NULL);
arsenalist 29:4d94a03d38e0 1551 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 40:77bd44f57ad3 1552 DBG.printf("newLog:%d\r\n",writeLog(q,"++++++++++WiFi++++++++++"));
arsenalist 36:ed696fd1b44e 1553 //DBG.printf("newDbg:%d\r\n",writeDbg(q,"++++++++++++++++++++"));
arsenalist 0:f4e449fa34d7 1554
arsenalist 0:f4e449fa34d7 1555 //do not delete code below - indicator that esp need to MODE=B and esp.ready() to work
arsenalist 0:f4e449fa34d7 1556 //_ESP.printf("MODE=B");
arsenalist 0:f4e449fa34d7 1557 //wait(1);
arsenalist 0:f4e449fa34d7 1558 //while(!esp.ready());
arsenalist 0:f4e449fa34d7 1559
arsenalist 24:5d58515ba510 1560 /*
arsenalist 0:f4e449fa34d7 1561 DBG.printf("emma: setup mqtt client\r\n");
arsenalist 0:f4e449fa34d7 1562 sprintf(mqttClientId,"emma/%s",emmaUID.c_str());
arsenalist 0:f4e449fa34d7 1563
arsenalist 38:e44f35f8129d 1564 if(mqtt.begin(mqttClientId, mqttKEY.c_str(), mqttSECRET.c_str(), 120, 1)) {
arsenalist 0:f4e449fa34d7 1565 mqtt.connectedCb.attach(&mqttConnected);
arsenalist 0:f4e449fa34d7 1566 mqtt.disconnectedCb.attach(&mqttDisconnected);
arsenalist 38:e44f35f8129d 1567 mqtt.connect(mqttSERVER,mqttPORT,false);
arsenalist 13:e8adfe305dbc 1568 DBG.printf("emma: success to setup mqtt\r\n");
arsenalist 13:e8adfe305dbc 1569 TFT.locate(0,40);
arsenalist 13:e8adfe305dbc 1570 TFT.printf("emma: success to setup mqtt");
arsenalist 0:f4e449fa34d7 1571 }
arsenalist 0:f4e449fa34d7 1572 DBG.printf("emma: system started\r\n");
arsenalist 24:5d58515ba510 1573 */
arsenalist 0:f4e449fa34d7 1574
arsenalist 24:5d58515ba510 1575 //t.start();
arsenalist 24:5d58515ba510 1576 //while(t.read_ms() < 5000) {
arsenalist 24:5d58515ba510 1577 // esp.process();
arsenalist 24:5d58515ba510 1578 //}
arsenalist 24:5d58515ba510 1579 //t.stop();
arsenalist 24:5d58515ba510 1580 //t.reset();
arsenalist 0:f4e449fa34d7 1581
arsenalist 0:f4e449fa34d7 1582 //set ade7758 parameter
arsenalist 44:c1d11c491237 1583 //start set beforehand
arsenalist 44:c1d11c491237 1584 /*
arsenalist 0:f4e449fa34d7 1585 ADE.begin();
arsenalist 0:f4e449fa34d7 1586
arsenalist 0:f4e449fa34d7 1587 ADE.writeRMSOffset(AIRMSOFFSET, BIRMSOFFSET, CIRMSOFFSET, AVRMSOFFSET, BVRMSOFFSET, CVRMSOFFSET);
arsenalist 0:f4e449fa34d7 1588
arsenalist 0:f4e449fa34d7 1589 ADE.write16bits(AWG, 0);
arsenalist 0:f4e449fa34d7 1590 ADE.write16bits(BWG, 0);
arsenalist 0:f4e449fa34d7 1591 ADE.write16bits(CWG, 0);
arsenalist 0:f4e449fa34d7 1592 ADE.write16bits(AVAG, 0);
arsenalist 0:f4e449fa34d7 1593 ADE.write16bits(BVAG, 0);
arsenalist 0:f4e449fa34d7 1594 ADE.write16bits(CVAG, 0);
arsenalist 44:c1d11c491237 1595 */
arsenalist 44:c1d11c491237 1596 //end start beforehand
arsenalist 0:f4e449fa34d7 1597
arsenalist 4:76ab12e2f8a3 1598 //init rest to server
arsenalist 38:e44f35f8129d 1599 sscanf(restPORT.c_str(),"%d",&connPort);
arsenalist 38:e44f35f8129d 1600 if(rest.begin(restSERVER.c_str(),connPort,false)) {
arsenalist 4:76ab12e2f8a3 1601 DBG.printf("rest to server is created\r\n");
arsenalist 13:e8adfe305dbc 1602 TFT.locate(0,40);
arsenalist 13:e8adfe305dbc 1603 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1604 TFT.locate(0,40);
arsenalist 13:e8adfe305dbc 1605 TFT.printf("rest to server is created");
arsenalist 4:76ab12e2f8a3 1606 } else {
arsenalist 4:76ab12e2f8a3 1607 DBG.printf("rest to server is NOT created\r\n");
arsenalist 13:e8adfe305dbc 1608 TFT.locate(0,40);
arsenalist 13:e8adfe305dbc 1609 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1610 TFT.locate(0,40);
arsenalist 13:e8adfe305dbc 1611 TFT.printf("rest to server is NOT created");
arsenalist 4:76ab12e2f8a3 1612 }
arsenalist 4:76ab12e2f8a3 1613
arsenalist 7:7e8c6ad3fd64 1614 //check firmware update
arsenalist 7:7e8c6ad3fd64 1615
arsenalist 7:7e8c6ad3fd64 1616 //execute last state of switches on board
arsenalist 7:7e8c6ad3fd64 1617
arsenalist 7:7e8c6ad3fd64 1618 //get list of nodes from server
arsenalist 40:77bd44f57ad3 1619 /*
arsenalist 40:77bd44f57ad3 1620 //working
arsenalist 7:7e8c6ad3fd64 1621 sprintf(s,"/emma/api/controller/remotes?uid=%s&hmac=%s",emmaUID.c_str(),hmac.c_str());
arsenalist 7:7e8c6ad3fd64 1622 rest.get(s);
arsenalist 7:7e8c6ad3fd64 1623 for(int i=0; i<sizeof(s); i++) {
arsenalist 7:7e8c6ad3fd64 1624 s[i]=0; }
arsenalist 7:7e8c6ad3fd64 1625 rest.getResponse(s,sizeof(s));
arsenalist 7:7e8c6ad3fd64 1626 str = s;
arsenalist 7:7e8c6ad3fd64 1627 if(str.rfind("[{\"mac\"") != std::string::npos) {
arsenalist 7:7e8c6ad3fd64 1628 DBG.printf("get nodes from server\r\n");
arsenalist 7:7e8c6ad3fd64 1629 str.erase(str.begin(),str.begin()+str.rfind("[{\"mac\""));
arsenalist 7:7e8c6ad3fd64 1630 str.erase(str.begin()+str.rfind("}]")+2,str.end());
arsenalist 7:7e8c6ad3fd64 1631
arsenalist 7:7e8c6ad3fd64 1632 MbedJSONValue jsonValue;
arsenalist 7:7e8c6ad3fd64 1633 parse(jsonValue,str.c_str());
arsenalist 7:7e8c6ad3fd64 1634 char *parameter[2] = {"mac","ip"};
arsenalist 7:7e8c6ad3fd64 1635
arsenalist 13:e8adfe305dbc 1636 TFT.locate(0,40);
arsenalist 13:e8adfe305dbc 1637 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1638 TFT.locate(0,40);
arsenalist 13:e8adfe305dbc 1639 TFT.printf("get %d nodes from server",jsonValue.size());
arsenalist 13:e8adfe305dbc 1640 wait(0.5);
arsenalist 13:e8adfe305dbc 1641 TFT.locate(0,40);
arsenalist 13:e8adfe305dbc 1642 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1643
arsenalist 7:7e8c6ad3fd64 1644 //check whether nodes valid
arsenalist 7:7e8c6ad3fd64 1645 bool validNodes = true;
arsenalist 7:7e8c6ad3fd64 1646 for(int i=0; i<jsonValue.size(); i++) {
arsenalist 7:7e8c6ad3fd64 1647 for(int j=0; j<2; j++) {
arsenalist 7:7e8c6ad3fd64 1648 validNodes = validNodes && jsonValue[i].hasMember(parameter[j]);
arsenalist 7:7e8c6ad3fd64 1649 }
arsenalist 7:7e8c6ad3fd64 1650 }
arsenalist 7:7e8c6ad3fd64 1651 DBG.printf("nodes validity:%d\r\n",validNodes);
arsenalist 7:7e8c6ad3fd64 1652
arsenalist 7:7e8c6ad3fd64 1653 if(validNodes) {
arsenalist 7:7e8c6ad3fd64 1654 for(int i=0; i<jsonValue.size(); i++) {
arsenalist 7:7e8c6ad3fd64 1655 string macValue = jsonValue[i][parameter[0]].get<std::string>();
arsenalist 7:7e8c6ad3fd64 1656 string ipValue = jsonValue[i][parameter[1]].get<std::string>();
arsenalist 7:7e8c6ad3fd64 1657 nodes[i].macAddr = macValue;
arsenalist 7:7e8c6ad3fd64 1658 nodes[i].ipAddr = ipValue;
arsenalist 13:e8adfe305dbc 1659 DBG.printf("nodes[%d]mac:%s\r\n",i,nodes[i].macAddr.c_str());
arsenalist 13:e8adfe305dbc 1660 DBG.printf("nodes[%d]ip:%s\r\n",i,nodes[i].ipAddr.c_str());
arsenalist 7:7e8c6ad3fd64 1661 }
arsenalist 7:7e8c6ad3fd64 1662 }
arsenalist 7:7e8c6ad3fd64 1663
arsenalist 7:7e8c6ad3fd64 1664 } else {
arsenalist 7:7e8c6ad3fd64 1665 DBG.printf("no nodes from server\r\n");
arsenalist 7:7e8c6ad3fd64 1666 }
arsenalist 40:77bd44f57ad3 1667 */
arsenalist 40:77bd44f57ad3 1668
arsenalist 40:77bd44f57ad3 1669 _ESP.attach(&rxInterrupt,Serial::RxIrq);
arsenalist 40:77bd44f57ad3 1670
arsenalist 40:77bd44f57ad3 1671 //get list of nodes from server (post)
arsenalist 43:612547648ed1 1672 sprintf(p,"/%s/api/controller/wifinodes",appNAME.c_str());
arsenalist 40:77bd44f57ad3 1673 sprintf(s,"{\"uid\":\"%s\",\"hmac\":\"%s\"}",emmaUID.c_str(),hmacTime.c_str());
arsenalist 40:77bd44f57ad3 1674 rest.post(p,s);
arsenalist 40:77bd44f57ad3 1675 wait(2);
arsenalist 40:77bd44f57ad3 1676 str = rxBuf;
arsenalist 40:77bd44f57ad3 1677 if(str.rfind("[{\"type\"") != std::string::npos) {
arsenalist 40:77bd44f57ad3 1678 DBG.printf("get nodes from server\r\n");
arsenalist 40:77bd44f57ad3 1679 str.erase(str.begin(),str.begin()+str.rfind("[{\"type\""));
arsenalist 40:77bd44f57ad3 1680 str.erase(str.begin()+str.rfind("}]")+2,str.end());
arsenalist 40:77bd44f57ad3 1681 //DBG.printf("strCrop:%s\r\n",str.c_str());
arsenalist 40:77bd44f57ad3 1682
arsenalist 40:77bd44f57ad3 1683 //start special handler
arsenalist 40:77bd44f57ad3 1684 while(1){
arsenalist 40:77bd44f57ad3 1685 if(str.find("}],") != std::string::npos) {
arsenalist 40:77bd44f57ad3 1686 str.erase(str.begin()+str.find("}],")+1,str.begin()+str.find("}],")+2);
arsenalist 40:77bd44f57ad3 1687 } else {
arsenalist 40:77bd44f57ad3 1688 break;
arsenalist 40:77bd44f57ad3 1689 }
arsenalist 40:77bd44f57ad3 1690 }
arsenalist 40:77bd44f57ad3 1691 //end special handler
arsenalist 40:77bd44f57ad3 1692
arsenalist 40:77bd44f57ad3 1693 DBG.printf("strCrop:%s\r\n",str.c_str());
arsenalist 40:77bd44f57ad3 1694
arsenalist 40:77bd44f57ad3 1695 MbedJSONValue jsonValue;
arsenalist 40:77bd44f57ad3 1696 parse(jsonValue,str.c_str());
arsenalist 40:77bd44f57ad3 1697 char *parameter[3] = {"type","mac","ip"};
arsenalist 40:77bd44f57ad3 1698
arsenalist 40:77bd44f57ad3 1699 TFT.locate(0,40);
arsenalist 40:77bd44f57ad3 1700 TFT.printf(" ");
arsenalist 40:77bd44f57ad3 1701 TFT.locate(0,40);
arsenalist 40:77bd44f57ad3 1702 TFT.printf("get %d nodes from server",jsonValue.size());
arsenalist 40:77bd44f57ad3 1703 wait(0.5);
arsenalist 40:77bd44f57ad3 1704 TFT.locate(0,40);
arsenalist 40:77bd44f57ad3 1705 TFT.printf(" ");
arsenalist 40:77bd44f57ad3 1706
arsenalist 40:77bd44f57ad3 1707 //check whether nodes valid
arsenalist 40:77bd44f57ad3 1708 bool validNodes = true;
arsenalist 40:77bd44f57ad3 1709 for(int i=0; i<jsonValue.size(); i++) {
arsenalist 40:77bd44f57ad3 1710 for(int j=0; j<3; j++) {
arsenalist 40:77bd44f57ad3 1711 validNodes = validNodes && jsonValue[i].hasMember(parameter[j]);
arsenalist 40:77bd44f57ad3 1712 }
arsenalist 40:77bd44f57ad3 1713 }
arsenalist 40:77bd44f57ad3 1714 DBG.printf("nodes validity:%d\r\n",validNodes);
arsenalist 40:77bd44f57ad3 1715
arsenalist 40:77bd44f57ad3 1716 if(validNodes) {
arsenalist 40:77bd44f57ad3 1717 for(int i=0; i<jsonValue.size(); i++) {
arsenalist 40:77bd44f57ad3 1718 int typeValue = jsonValue[i][parameter[0]].get<int>();
arsenalist 40:77bd44f57ad3 1719 string macValue = jsonValue[i][parameter[1]].get<std::string>();
arsenalist 40:77bd44f57ad3 1720 string ipValue = jsonValue[i][parameter[2]].get<std::string>();
arsenalist 40:77bd44f57ad3 1721 nodes[i].type = typeValue;
arsenalist 40:77bd44f57ad3 1722 nodes[i].macAddr = macValue;
arsenalist 40:77bd44f57ad3 1723 nodes[i].ipAddr = ipValue;
arsenalist 40:77bd44f57ad3 1724 DBG.printf("nodes[%d]type:%d\r\n",i,nodes[i].type);
arsenalist 40:77bd44f57ad3 1725 DBG.printf("nodes[%d]mac:%s\r\n",i,nodes[i].macAddr.c_str());
arsenalist 40:77bd44f57ad3 1726 DBG.printf("nodes[%d]ip:%s\r\n",i,nodes[i].ipAddr.c_str());
arsenalist 40:77bd44f57ad3 1727 }
arsenalist 40:77bd44f57ad3 1728 }
arsenalist 40:77bd44f57ad3 1729
arsenalist 40:77bd44f57ad3 1730 } else {
arsenalist 40:77bd44f57ad3 1731 DBG.printf("no nodes from server\r\n");
arsenalist 40:77bd44f57ad3 1732 }
arsenalist 7:7e8c6ad3fd64 1733
arsenalist 24:5d58515ba510 1734 /*
arsenalist 36:ed696fd1b44e 1735 //working
arsenalist 24:5d58515ba510 1736 DBG.printf("emma: setup mqtt client\r\n");
arsenalist 24:5d58515ba510 1737 sprintf(mqttClientId,"emma/%s",emmaUID.c_str());
arsenalist 38:e44f35f8129d 1738 if(mqtt.begin(mqttClientId, mqttKEY.c_str(), mqttSECRET.c_str(), 120, 1)) {
arsenalist 24:5d58515ba510 1739 mqtt.connectedCb.attach(&mqttConnected);
arsenalist 24:5d58515ba510 1740 mqtt.disconnectedCb.attach(&mqttDisconnected);
arsenalist 38:e44f35f8129d 1741 mqtt.connect(mqttSERVER,mqttPORT,false);
arsenalist 24:5d58515ba510 1742 DBG.printf("emma: success to setup mqtt\r\n");
arsenalist 24:5d58515ba510 1743 TFT.locate(0,40);
arsenalist 24:5d58515ba510 1744 TFT.printf("emma: success to setup mqtt");
arsenalist 24:5d58515ba510 1745 }
arsenalist 24:5d58515ba510 1746 DBG.printf("emma: system started\r\n");
arsenalist 24:5d58515ba510 1747
arsenalist 24:5d58515ba510 1748 t.start();
arsenalist 24:5d58515ba510 1749 while(t.read_ms() < 5000) {
arsenalist 24:5d58515ba510 1750 esp.process();
arsenalist 24:5d58515ba510 1751 }
arsenalist 24:5d58515ba510 1752 t.stop();
arsenalist 24:5d58515ba510 1753 t.reset();
arsenalist 24:5d58515ba510 1754 */
arsenalist 7:7e8c6ad3fd64 1755
arsenalist 40:77bd44f57ad3 1756 //disable UART2
arsenalist 40:77bd44f57ad3 1757 NVIC_DisableIRQ(USART2_IRQn);
arsenalist 40:77bd44f57ad3 1758
arsenalist 4:76ab12e2f8a3 1759 //init rest to remotes
arsenalist 4:76ab12e2f8a3 1760 for(int i=0; i<NODES_MAX; i++) {
arsenalist 4:76ab12e2f8a3 1761 if(!nodes[i].ipAddr.empty()) {
arsenalist 4:76ab12e2f8a3 1762 DBG.printf("restConn nodes[%d] is created\r\n",i);
arsenalist 45:2406c2b6995a 1763 nodes[i].restConn->begin(nodes[i].ipAddr.c_str(),REMOTE_TCP_PORT,false);
arsenalist 4:76ab12e2f8a3 1764 wait(1);
arsenalist 4:76ab12e2f8a3 1765 } else {
arsenalist 4:76ab12e2f8a3 1766 DBG.printf("restConn nodes[%d] is NOT created\r\n",i);
arsenalist 4:76ab12e2f8a3 1767 wait(1);
arsenalist 4:76ab12e2f8a3 1768 }
arsenalist 4:76ab12e2f8a3 1769 }
arsenalist 4:76ab12e2f8a3 1770
arsenalist 40:77bd44f57ad3 1771 //enable UART2
arsenalist 40:77bd44f57ad3 1772 NVIC_EnableIRQ(USART2_IRQn);
arsenalist 40:77bd44f57ad3 1773
arsenalist 40:77bd44f57ad3 1774 //_ESP.attach(&rxInterrupt,Serial::RxIrq);
arsenalist 4:76ab12e2f8a3 1775
arsenalist 4:76ab12e2f8a3 1776 //define thread
arsenalist 17:b3ced0e67916 1777 osThreadDef(energyThread, osPriorityBelowNormal, (8*DEFAULT_STACK_SIZE));
arsenalist 0:f4e449fa34d7 1778 //create thread
arsenalist 2:fdfdeb5fd6fd 1779 osThreadCreate(osThread(energyThread),NULL);
arsenalist 0:f4e449fa34d7 1780
arsenalist 47:97eadcb478b2 1781 tAlert.start();
arsenalist 24:5d58515ba510 1782 tPanelEnergy.start();
arsenalist 24:5d58515ba510 1783 tPanel.start();
arsenalist 4:76ab12e2f8a3 1784 tNodes.start();
arsenalist 4:76ab12e2f8a3 1785 wait(1);
arsenalist 0:f4e449fa34d7 1786 while(1) {
arsenalist 4:76ab12e2f8a3 1787 checkRxBuffer();
arsenalist 20:ea14f175bbb4 1788 checkVoltagePower();
arsenalist 20:ea14f175bbb4 1789
arsenalist 24:5d58515ba510 1790 //whether espFreeMemory occurs
arsenalist 24:5d58515ba510 1791 if(espFreeMemory) {
arsenalist 30:08d290158fa7 1792 //logging
arsenalist 27:562a95c120cc 1793 seconds = time(NULL);
arsenalist 27:562a95c120cc 1794 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 27:562a95c120cc 1795 DBG.printf("logFreeMemory:%d\r\n",writeLog(q,rxLog.c_str()));
arsenalist 24:5d58515ba510 1796
arsenalist 27:562a95c120cc 1797 espFreeMemory = false;
arsenalist 27:562a95c120cc 1798 }
arsenalist 27:562a95c120cc 1799
arsenalist 27:562a95c120cc 1800 //whether espDHCPClientStart occurs
arsenalist 27:562a95c120cc 1801 if(espDHCPClientStart) {
arsenalist 30:08d290158fa7 1802 //logging
arsenalist 27:562a95c120cc 1803 seconds = time(NULL);
arsenalist 27:562a95c120cc 1804 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 27:562a95c120cc 1805 DBG.printf("logDHCPClientStart:%d\r\n",writeLog(q,rxLogA.c_str()));
arsenalist 27:562a95c120cc 1806
arsenalist 27:562a95c120cc 1807 _ESP.printf("MODE=B");
arsenalist 27:562a95c120cc 1808 wait(2);
arsenalist 27:562a95c120cc 1809 espDHCPClientStart = false;
arsenalist 24:5d58515ba510 1810 }
arsenalist 24:5d58515ba510 1811
arsenalist 47:97eadcb478b2 1812 //set allowAlertXxxx to enable controller send alert
arsenalist 47:97eadcb478b2 1813 if(tAlert.read() > 300.0f) { //300.0f is 5 minutes
arsenalist 47:97eadcb478b2 1814 allowAlertAVrms = true;
arsenalist 47:97eadcb478b2 1815 allowAlertAWatt = true;
arsenalist 47:97eadcb478b2 1816 allowAlertBVrms = true;
arsenalist 47:97eadcb478b2 1817 allowAlertBWatt = true;
arsenalist 47:97eadcb478b2 1818 allowAlertCVrms = true;
arsenalist 47:97eadcb478b2 1819 allowAlertCWatt = true;
arsenalist 47:97eadcb478b2 1820 tAlert.reset();
arsenalist 47:97eadcb478b2 1821 }
arsenalist 47:97eadcb478b2 1822
arsenalist 4:76ab12e2f8a3 1823 //panelEnergy, panelVoltage, and panelPower
arsenalist 24:5d58515ba510 1824 if(tPanelEnergy.read() > 30.0f) {
arsenalist 4:76ab12e2f8a3 1825 DBG.printf("[%d]WattHR for each phase: %.2f, %.2f, %.2f\r\n", loop, AWattHr, BWattHr, CWattHr);
arsenalist 13:e8adfe305dbc 1826 TFT.locate(0,60);
arsenalist 13:e8adfe305dbc 1827 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1828 TFT.locate(0,60);
arsenalist 13:e8adfe305dbc 1829 TFT.printf("[%d]WHR: %.1f, %.1f, %.1f", loop, AWattHr, BWattHr, CWattHr);
arsenalist 13:e8adfe305dbc 1830
arsenalist 4:76ab12e2f8a3 1831 DBG.printf("VRMS for each phase: %.2f, %.2f, %.2f\r\n", AVrms, BVrms, CVrms);
arsenalist 13:e8adfe305dbc 1832 TFT.locate(0,80);
arsenalist 13:e8adfe305dbc 1833 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1834 TFT.locate(0,80);
arsenalist 13:e8adfe305dbc 1835 TFT.printf("VRMS: %.1f, %.1f, %.1f", AVrms, BVrms, CVrms);
arsenalist 13:e8adfe305dbc 1836
arsenalist 4:76ab12e2f8a3 1837 DBG.printf("Watt for each phase: %.2f, %.2f, %.2f\r\n", AWatt, BWatt, CWatt);
arsenalist 13:e8adfe305dbc 1838 TFT.locate(0,100);
arsenalist 13:e8adfe305dbc 1839 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1840 TFT.locate(0,100);
arsenalist 13:e8adfe305dbc 1841 TFT.printf("Watt: %.1f, %.1f, %.1f", AWatt, BWatt, CWatt);
arsenalist 4:76ab12e2f8a3 1842
arsenalist 22:e18d361bf688 1843 if(newEnergyData) {
arsenalist 22:e18d361bf688 1844 //for(int i=1; i<4; i++) {
arsenalist 22:e18d361bf688 1845 for(int i=1; i<2; i++) {
arsenalist 22:e18d361bf688 1846 DBG.printf("sending channel: %d\r\n",i);
arsenalist 22:e18d361bf688 1847 if(i==1){
arsenalist 22:e18d361bf688 1848 XWattHr = AWattHr;
arsenalist 22:e18d361bf688 1849 XVrms = AVrms;
arsenalist 22:e18d361bf688 1850 XWatt = AWatt;
arsenalist 22:e18d361bf688 1851 } else if(i==2) {
arsenalist 22:e18d361bf688 1852 XWattHr = BWattHr;
arsenalist 22:e18d361bf688 1853 XVrms = BVrms;
arsenalist 22:e18d361bf688 1854 XWatt = BWatt;
arsenalist 22:e18d361bf688 1855 } else {
arsenalist 22:e18d361bf688 1856 XWattHr = CWattHr;
arsenalist 22:e18d361bf688 1857 XVrms = CVrms;
arsenalist 22:e18d361bf688 1858 XWatt = CWatt;
arsenalist 22:e18d361bf688 1859 }
arsenalist 24:5d58515ba510 1860
arsenalist 24:5d58515ba510 1861 if(XWattHr != 0.0f) {
arsenalist 22:e18d361bf688 1862
arsenalist 43:612547648ed1 1863 sprintf(r,"/%s/api/controller/energy/%d",appNAME.c_str(),i);
arsenalist 24:5d58515ba510 1864 seconds = time(NULL);
arsenalist 24:5d58515ba510 1865 //for(int j=0; j<sizeof(q); j++) {
arsenalist 24:5d58515ba510 1866 // q[j]=0; }
arsenalist 24:5d58515ba510 1867 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 24:5d58515ba510 1868
arsenalist 24:5d58515ba510 1869 //calculate hmacTime
arsenalist 24:5d58515ba510 1870 for(int j=0; j<sizeof(p); j++) {
arsenalist 24:5d58515ba510 1871 p[j]=0; }
arsenalist 24:5d58515ba510 1872 sprintf(p,"emma-%s-%s",emmaUID.c_str(),q);
arsenalist 24:5d58515ba510 1873 hmacTime = calculateMD5(p);
arsenalist 22:e18d361bf688 1874
arsenalist 24:5d58515ba510 1875 sprintf(s,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"energy\":%.2f,\"voltage\":%.2f,\"power\":%.2f}",
arsenalist 24:5d58515ba510 1876 emmaUID.c_str(),hmacTime.c_str(),q,XWattHr,XVrms,XWatt);
arsenalist 24:5d58515ba510 1877 //DBG.printf("dataEnergy:\r\n%s\r\n",s);
arsenalist 24:5d58515ba510 1878 rest.post(r,s);
arsenalist 24:5d58515ba510 1879 wait(2);
arsenalist 24:5d58515ba510 1880 if(rxBuf.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 27:562a95c120cc 1881 //logging purpose
arsenalist 27:562a95c120cc 1882 seconds = time(NULL);
arsenalist 27:562a95c120cc 1883 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 27:562a95c120cc 1884 DBG.printf("logPE:%d\r\n",writeLog(q,"sendEnergyData success"));
arsenalist 27:562a95c120cc 1885
arsenalist 24:5d58515ba510 1886 DBG.printf("send channel: %d success\r\n",i);
arsenalist 24:5d58515ba510 1887 TFT.foreground(Green);
arsenalist 24:5d58515ba510 1888 TFT.locate(0,120);
arsenalist 24:5d58515ba510 1889 TFT.printf(" ");
arsenalist 24:5d58515ba510 1890 TFT.locate(0,120);
arsenalist 24:5d58515ba510 1891 TFT.printf("send ch%d success",i);
arsenalist 24:5d58515ba510 1892 wait(1);
arsenalist 24:5d58515ba510 1893 TFT.locate(0,120);
arsenalist 24:5d58515ba510 1894 TFT.printf(" ");
arsenalist 24:5d58515ba510 1895 TFT.foreground(White);
arsenalist 24:5d58515ba510 1896 } else {
arsenalist 27:562a95c120cc 1897 //logging purpose
arsenalist 27:562a95c120cc 1898 seconds = time(NULL);
arsenalist 27:562a95c120cc 1899 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 27:562a95c120cc 1900 DBG.printf("logPE:%d\r\n",writeLog(q,"sendEnergyData failed"));
arsenalist 27:562a95c120cc 1901
arsenalist 24:5d58515ba510 1902 DBG.printf("send channel: %d failed\r\n",i);
arsenalist 24:5d58515ba510 1903 TFT.foreground(Red);
arsenalist 24:5d58515ba510 1904 TFT.locate(0,120);
arsenalist 24:5d58515ba510 1905 TFT.printf(" ");
arsenalist 24:5d58515ba510 1906 TFT.locate(0,120);
arsenalist 24:5d58515ba510 1907 TFT.printf("send ch%d failed",i);
arsenalist 24:5d58515ba510 1908 wait(1);
arsenalist 24:5d58515ba510 1909 TFT.locate(0,120);
arsenalist 24:5d58515ba510 1910 TFT.printf(" ");
arsenalist 24:5d58515ba510 1911 TFT.foreground(White);
arsenalist 24:5d58515ba510 1912 }
arsenalist 22:e18d361bf688 1913 }
arsenalist 4:76ab12e2f8a3 1914 }
arsenalist 22:e18d361bf688 1915
arsenalist 22:e18d361bf688 1916 newEnergyData = false;
arsenalist 0:f4e449fa34d7 1917 }
arsenalist 22:e18d361bf688 1918
arsenalist 24:5d58515ba510 1919 tPanelEnergy.reset();
arsenalist 4:76ab12e2f8a3 1920 loop++;
arsenalist 0:f4e449fa34d7 1921 }
arsenalist 0:f4e449fa34d7 1922
arsenalist 21:33bd8b82560f 1923 //panel environment
arsenalist 5:d00233dd36f5 1924 checkRxBuffer();
arsenalist 47:97eadcb478b2 1925 if(tPanel.read() > 900.0f) { //900.0f is 15 minutes
arsenalist 21:33bd8b82560f 1926 int dTemp=0;
arsenalist 21:33bd8b82560f 1927 int dHum=0;
arsenalist 21:33bd8b82560f 1928 int dGas=0;
arsenalist 21:33bd8b82560f 1929
arsenalist 21:33bd8b82560f 1930 DBG.printf("getPanelEnvironment\r\n");
arsenalist 21:33bd8b82560f 1931
arsenalist 21:33bd8b82560f 1932 //get environment sensor
arsenalist 21:33bd8b82560f 1933 trial=0;
arsenalist 21:33bd8b82560f 1934 while(1) {
arsenalist 21:33bd8b82560f 1935 if(trial>=2) { //two times trial
arsenalist 21:33bd8b82560f 1936 break;
arsenalist 21:33bd8b82560f 1937 }
arsenalist 21:33bd8b82560f 1938 if(d.readData() == DHT11::OK) {
arsenalist 21:33bd8b82560f 1939 dTemp = d.readTemperature();
arsenalist 21:33bd8b82560f 1940 dHum = d.readHumidity();
arsenalist 21:33bd8b82560f 1941 break;
arsenalist 21:33bd8b82560f 1942 }
arsenalist 21:33bd8b82560f 1943 trial++;
arsenalist 21:33bd8b82560f 1944 wait(3);
arsenalist 21:33bd8b82560f 1945 }
arsenalist 21:33bd8b82560f 1946
arsenalist 21:33bd8b82560f 1947 //send environment sensor
arsenalist 24:5d58515ba510 1948 if(dTemp!=0 && dHum!=0) {
arsenalist 24:5d58515ba510 1949 seconds = time(NULL);
arsenalist 24:5d58515ba510 1950 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 22:e18d361bf688 1951
arsenalist 24:5d58515ba510 1952 //calculate hmacTime
arsenalist 24:5d58515ba510 1953 for(int j=0; j<sizeof(p); j++) {
arsenalist 24:5d58515ba510 1954 p[j]=0; }
arsenalist 24:5d58515ba510 1955 sprintf(p,"emma-%s-%s",emmaUID.c_str(),q);
arsenalist 24:5d58515ba510 1956 hmacTime = calculateMD5(p);
arsenalist 22:e18d361bf688 1957
arsenalist 24:5d58515ba510 1958 sprintf(s,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"temp\":%d,\"hum\":%d,\"gas\":%d}",
arsenalist 24:5d58515ba510 1959 emmaUID.c_str(),hmacTime.c_str(),q,dTemp,dHum,dGas);
arsenalist 24:5d58515ba510 1960 //DBG.printf("dataEnvironment:\r\n%s\r\n",s);
arsenalist 43:612547648ed1 1961 sprintf(p,"/%s/api/controller/environment",appNAME.c_str());
arsenalist 43:612547648ed1 1962 rest.post(p,s);
arsenalist 43:612547648ed1 1963 //rest.post("/emma/api/controller/environment",s); //working
arsenalist 24:5d58515ba510 1964 wait(2);
arsenalist 24:5d58515ba510 1965 str = rxBuf;
arsenalist 24:5d58515ba510 1966 if(str.rfind("/environment") != std::string::npos) {
arsenalist 24:5d58515ba510 1967 str.erase(str.begin(),str.begin()+str.rfind("/environment"));
arsenalist 24:5d58515ba510 1968 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 27:562a95c120cc 1969 //logging purpose
arsenalist 27:562a95c120cc 1970 seconds = time(NULL);
arsenalist 27:562a95c120cc 1971 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 27:562a95c120cc 1972 DBG.printf("logPEnv:%d\r\n",writeLog(q,"sendPanelEnv success"));
arsenalist 24:5d58515ba510 1973 DBG.printf("send panel environment success\r\n");
arsenalist 24:5d58515ba510 1974 } else {
arsenalist 27:562a95c120cc 1975 //logging purpose
arsenalist 27:562a95c120cc 1976 seconds = time(NULL);
arsenalist 27:562a95c120cc 1977 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 27:562a95c120cc 1978 DBG.printf("logPEnv:%d\r\n",writeLog(q,"sendPanelEnv failed"));
arsenalist 24:5d58515ba510 1979 DBG.printf("send panel environment failed\r\n");
arsenalist 24:5d58515ba510 1980 }
arsenalist 21:33bd8b82560f 1981 }
arsenalist 24:5d58515ba510 1982 checkRxBuffer();
arsenalist 21:33bd8b82560f 1983 }
arsenalist 21:33bd8b82560f 1984 tPanel.reset();
arsenalist 21:33bd8b82560f 1985 }
arsenalist 21:33bd8b82560f 1986
arsenalist 0:f4e449fa34d7 1987 //nodeTemp
arsenalist 21:33bd8b82560f 1988 checkRxBuffer();
arsenalist 25:36c6a5db50ed 1989 if(tNodes.read() > 900.0f) { //900 is 15 minutes
arsenalist 5:d00233dd36f5 1990 DBG.printf("getNodesTemperature\r\n");
arsenalist 5:d00233dd36f5 1991
arsenalist 5:d00233dd36f5 1992 for(int i=0; i<NODES_MAX; i++) {
arsenalist 5:d00233dd36f5 1993 if(!nodes[i].ipAddr.empty()) {
arsenalist 5:d00233dd36f5 1994 //get node's temp
arsenalist 5:d00233dd36f5 1995 string temp;
arsenalist 5:d00233dd36f5 1996 nodes[i].restConn->get("/","<?xml version=\"1.0\" encoding=\"utf-8\"?><app_cmd cmd=\"2\"/>\r\n");
arsenalist 5:d00233dd36f5 1997 wait(2);
arsenalist 5:d00233dd36f5 1998 temp = rxBuf;
arsenalist 5:d00233dd36f5 1999 if(temp.rfind(nodes[i].ipAddr) != std::string::npos) {
arsenalist 5:d00233dd36f5 2000 temp.erase(temp.begin(),temp.begin()+temp.rfind(nodes[i].ipAddr));
arsenalist 5:d00233dd36f5 2001 if(temp.rfind("temp=") != std::string::npos) {
arsenalist 5:d00233dd36f5 2002 temp.erase(temp.begin(),temp.begin()+temp.rfind("temp=")+6);
arsenalist 5:d00233dd36f5 2003 temp.erase(temp.begin()+temp.find("\""),temp.end());
arsenalist 5:d00233dd36f5 2004 } else {
arsenalist 5:d00233dd36f5 2005 temp = "0"; //connect to node, but receive none
arsenalist 5:d00233dd36f5 2006 }
arsenalist 5:d00233dd36f5 2007 } else {
arsenalist 5:d00233dd36f5 2008 temp = "0"; //not connected to node
arsenalist 5:d00233dd36f5 2009 }
arsenalist 0:f4e449fa34d7 2010
arsenalist 5:d00233dd36f5 2011 DBG.printf("nodeTemp[%d]:%s\r\n",i,temp.c_str());
arsenalist 5:d00233dd36f5 2012
arsenalist 5:d00233dd36f5 2013 //send node's temp
arsenalist 25:36c6a5db50ed 2014 if(temp != "0") {
arsenalist 25:36c6a5db50ed 2015 seconds = time(NULL);
arsenalist 25:36c6a5db50ed 2016 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 22:e18d361bf688 2017
arsenalist 25:36c6a5db50ed 2018 //calculate hmacTime
arsenalist 25:36c6a5db50ed 2019 for(int j=0; j<sizeof(p); j++) {
arsenalist 25:36c6a5db50ed 2020 p[j]=0; }
arsenalist 25:36c6a5db50ed 2021 sprintf(p,"emma-%s-%s",emmaUID.c_str(),q);
arsenalist 25:36c6a5db50ed 2022 hmacTime = calculateMD5(p);
arsenalist 22:e18d361bf688 2023
arsenalist 25:36c6a5db50ed 2024 sprintf(s,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"mac\":\"%s\",\"value\":%s}",
arsenalist 25:36c6a5db50ed 2025 emmaUID.c_str(),hmacTime.c_str(),q,nodes[i].macAddr.c_str(),temp.c_str());
arsenalist 25:36c6a5db50ed 2026 //DBG.printf("dataNodeTemp:\r\n%s\r\n",s);
arsenalist 43:612547648ed1 2027 sprintf(p,"/%s/api/controller/nodetemp",appNAME.c_str());
arsenalist 43:612547648ed1 2028 rest.post(p,s);
arsenalist 43:612547648ed1 2029 //rest.post("/emma/api/controller/nodetemp",s); //working
arsenalist 25:36c6a5db50ed 2030 wait(2);
arsenalist 25:36c6a5db50ed 2031 str = rxBuf;
arsenalist 25:36c6a5db50ed 2032 if(str.rfind("/nodetemp") != std::string::npos) {
arsenalist 25:36c6a5db50ed 2033 str.erase(str.begin(),str.begin()+str.rfind("/nodetemp"));
arsenalist 25:36c6a5db50ed 2034 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 25:36c6a5db50ed 2035 DBG.printf("send nodeTemp success\r\n");
arsenalist 25:36c6a5db50ed 2036 } else {
arsenalist 25:36c6a5db50ed 2037 DBG.printf("send nodeTemp failed\r\n");
arsenalist 25:36c6a5db50ed 2038 }
arsenalist 5:d00233dd36f5 2039 }
arsenalist 25:36c6a5db50ed 2040 checkRxBuffer();
arsenalist 5:d00233dd36f5 2041 }
arsenalist 5:d00233dd36f5 2042 }
arsenalist 0:f4e449fa34d7 2043 }
arsenalist 19:7e3e9332f719 2044 tNodes.reset();
arsenalist 19:7e3e9332f719 2045 }
arsenalist 21:33bd8b82560f 2046
arsenalist 21:33bd8b82560f 2047 //command
arsenalist 43:612547648ed1 2048 sprintf(r,"/%s/api/controller/command",appNAME.c_str());
arsenalist 40:77bd44f57ad3 2049 sprintf(s,"{\"uid\":\"%s\",\"hmac\":\"%s\"}",
arsenalist 44:c1d11c491237 2050 emmaUID.c_str(),hmacTime.c_str()); //INI HARUSNYA HMAC BUKAN?
arsenalist 40:77bd44f57ad3 2051 //rest.get("/emma/api/controller/command");
arsenalist 40:77bd44f57ad3 2052 rest.post(r,s);
arsenalist 40:77bd44f57ad3 2053
arsenalist 5:d00233dd36f5 2054 checkRxBuffer();
arsenalist 0:f4e449fa34d7 2055 if(newCommand) {
arsenalist 42:b32e51a374c7 2056 //DBG.printf("newCommand:\r\n%s\r\n",globalCommand.c_str());
arsenalist 13:e8adfe305dbc 2057 TFT.locate(0,160);
arsenalist 13:e8adfe305dbc 2058 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 2059 TFT.locate(0,160);
arsenalist 13:e8adfe305dbc 2060 TFT.printf("newCommand");
arsenalist 13:e8adfe305dbc 2061
arsenalist 0:f4e449fa34d7 2062 MbedJSONValue jsonValue;
arsenalist 0:f4e449fa34d7 2063 parse(jsonValue,globalCommand.c_str());
arsenalist 40:77bd44f57ad3 2064 char *parameter[5] = {"from","nType","nAddr","dType","cmd"};
arsenalist 0:f4e449fa34d7 2065
arsenalist 41:2d023bd80a9c 2066 DBG.printf("get %d command\r\n",jsonValue.size());
arsenalist 41:2d023bd80a9c 2067
arsenalist 41:2d023bd80a9c 2068 //processing each command
arsenalist 41:2d023bd80a9c 2069 bool validCommand;
arsenalist 41:2d023bd80a9c 2070 for(int i=0; i<jsonValue.size(); i++) {
arsenalist 41:2d023bd80a9c 2071 //check whether command is valid
arsenalist 41:2d023bd80a9c 2072 DBG.printf("\r\nprocessing cmd[%d]\r\n",i);
arsenalist 41:2d023bd80a9c 2073 validCommand = true;
arsenalist 41:2d023bd80a9c 2074 for(int j=0; j<5; j++) {
arsenalist 41:2d023bd80a9c 2075 validCommand = validCommand && jsonValue[i].hasMember(parameter[j]);
arsenalist 41:2d023bd80a9c 2076 }
arsenalist 41:2d023bd80a9c 2077 DBG.printf("command validity:%d\r\n",validCommand);
arsenalist 41:2d023bd80a9c 2078
arsenalist 41:2d023bd80a9c 2079 if(validCommand) {
arsenalist 41:2d023bd80a9c 2080 string commandFrom = jsonValue[i][parameter[0]].get<std::string>();
arsenalist 41:2d023bd80a9c 2081 string commandNType = jsonValue[i][parameter[1]].get<std::string>();
arsenalist 41:2d023bd80a9c 2082 string commandNAddr = jsonValue[i][parameter[2]].get<std::string>();
arsenalist 41:2d023bd80a9c 2083 string commandDType = jsonValue[i][parameter[3]].get<std::string>();
arsenalist 41:2d023bd80a9c 2084 string commandCmd = jsonValue[i][parameter[4]].get<std::string>();
arsenalist 41:2d023bd80a9c 2085
arsenalist 41:2d023bd80a9c 2086 if(commandNType == "0") { //switch on panel controller
arsenalist 41:2d023bd80a9c 2087 DBG.printf("command for switch\r\n");
arsenalist 41:2d023bd80a9c 2088 }
arsenalist 42:b32e51a374c7 2089 else if(commandNType == "1") { //ir&rf remote control
arsenalist 42:b32e51a374c7 2090 DBG.printf("command for remote control\r\n");
arsenalist 41:2d023bd80a9c 2091 //get node ip address based on node mac address
arsenalist 41:2d023bd80a9c 2092 //string nodeIP;
arsenalist 41:2d023bd80a9c 2093 //nodeIp = readNodeIP(commandNAddr);
arsenalist 41:2d023bd80a9c 2094 //nodeIP = "192.168.2.15";
arsenalist 41:2d023bd80a9c 2095 //DBG.printf("nodeIP: %s\r\n",nodeIP.c_str());
arsenalist 41:2d023bd80a9c 2096
arsenalist 41:2d023bd80a9c 2097 //get index of node list based on mac address
arsenalist 41:2d023bd80a9c 2098 int idx = NODES_INVALID;
arsenalist 41:2d023bd80a9c 2099 for(int i=0; i<NODES_MAX; i++) {
arsenalist 41:2d023bd80a9c 2100 if(!nodes[i].macAddr.compare(commandNAddr)) {
arsenalist 41:2d023bd80a9c 2101 idx = i;
arsenalist 41:2d023bd80a9c 2102 }
arsenalist 41:2d023bd80a9c 2103 }
arsenalist 41:2d023bd80a9c 2104
arsenalist 41:2d023bd80a9c 2105 //execution process
arsenalist 41:2d023bd80a9c 2106 string execResult = "failed";
arsenalist 41:2d023bd80a9c 2107 if(idx != NODES_INVALID) {
arsenalist 41:2d023bd80a9c 2108 DBG.printf("index found at %d\r\n",idx);
arsenalist 41:2d023bd80a9c 2109
arsenalist 41:2d023bd80a9c 2110 //get cmd string based on device type and command number
arsenalist 41:2d023bd80a9c 2111 string nodeCmd;
arsenalist 41:2d023bd80a9c 2112 nodeCmd = readNodeCmd(commandDType,commandCmd);
arsenalist 41:2d023bd80a9c 2113
arsenalist 41:2d023bd80a9c 2114 //execute command
arsenalist 41:2d023bd80a9c 2115 DBG.printf("executing command\r\n");
arsenalist 41:2d023bd80a9c 2116 sprintf(s,"<?xml version=\"1.0\" encoding=\"utf-8\"?><app_cmd cmd=\"5\" /><app_data code=\"%s\"/>\r\n",nodeCmd.c_str());
arsenalist 41:2d023bd80a9c 2117
arsenalist 41:2d023bd80a9c 2118 trial=0;
arsenalist 41:2d023bd80a9c 2119 while(1) {
arsenalist 41:2d023bd80a9c 2120 rxBuf.clear();
arsenalist 41:2d023bd80a9c 2121 if(trial>=2) { //two times trial
arsenalist 41:2d023bd80a9c 2122 DBG.printf("cmd is not executed\r\n");
arsenalist 41:2d023bd80a9c 2123 TFT.foreground(Red);
arsenalist 41:2d023bd80a9c 2124 TFT.locate(0,180);
arsenalist 41:2d023bd80a9c 2125 TFT.printf(" ");
arsenalist 41:2d023bd80a9c 2126 TFT.locate(0,180);
arsenalist 41:2d023bd80a9c 2127 TFT.printf("cmd is not executed");
arsenalist 41:2d023bd80a9c 2128 wait(1);
arsenalist 41:2d023bd80a9c 2129 TFT.locate(0,180);
arsenalist 41:2d023bd80a9c 2130 TFT.printf(" ");
arsenalist 41:2d023bd80a9c 2131 TFT.foreground(White);
arsenalist 41:2d023bd80a9c 2132 break;
arsenalist 41:2d023bd80a9c 2133 }
arsenalist 41:2d023bd80a9c 2134 nodes[idx].restConn->get("/",s);
arsenalist 41:2d023bd80a9c 2135 wait(2);
arsenalist 41:2d023bd80a9c 2136 if(rxBuf.find("REST: status = 200") != std::string::npos) {
arsenalist 41:2d023bd80a9c 2137 DBG.printf("cmd is executed\r\n");
arsenalist 41:2d023bd80a9c 2138 TFT.foreground(Green);
arsenalist 41:2d023bd80a9c 2139 TFT.locate(0,180);
arsenalist 41:2d023bd80a9c 2140 TFT.printf(" ");
arsenalist 41:2d023bd80a9c 2141 TFT.locate(0,180);
arsenalist 41:2d023bd80a9c 2142 TFT.printf("cmd is executed");
arsenalist 41:2d023bd80a9c 2143 wait(1);
arsenalist 41:2d023bd80a9c 2144 TFT.locate(0,180);
arsenalist 41:2d023bd80a9c 2145 TFT.printf(" ");
arsenalist 41:2d023bd80a9c 2146 TFT.foreground(White);
arsenalist 41:2d023bd80a9c 2147 execResult = "success";
arsenalist 41:2d023bd80a9c 2148 break;
arsenalist 41:2d023bd80a9c 2149 }
arsenalist 41:2d023bd80a9c 2150 trial++;
arsenalist 41:2d023bd80a9c 2151 }
arsenalist 41:2d023bd80a9c 2152 } else {
arsenalist 41:2d023bd80a9c 2153 TFT.foreground(Red);
arsenalist 41:2d023bd80a9c 2154 TFT.locate(0,180);
arsenalist 41:2d023bd80a9c 2155 TFT.printf(" ");
arsenalist 41:2d023bd80a9c 2156 TFT.locate(0,180);
arsenalist 41:2d023bd80a9c 2157 TFT.printf("node is invalid");
arsenalist 41:2d023bd80a9c 2158 wait(1);
arsenalist 41:2d023bd80a9c 2159 TFT.locate(0,180);
arsenalist 41:2d023bd80a9c 2160 TFT.printf(" ");
arsenalist 41:2d023bd80a9c 2161 TFT.foreground(White);
arsenalist 41:2d023bd80a9c 2162 }
arsenalist 41:2d023bd80a9c 2163
arsenalist 41:2d023bd80a9c 2164 wait(2);
arsenalist 41:2d023bd80a9c 2165 //send execution result
arsenalist 41:2d023bd80a9c 2166 //DBG.printf("send execution result\r\n");
arsenalist 41:2d023bd80a9c 2167
arsenalist 41:2d023bd80a9c 2168 //calculate hmacCmd
arsenalist 41:2d023bd80a9c 2169 //for(int j=0; j<sizeof(p); j++) {
arsenalist 41:2d023bd80a9c 2170 // p[j]=0; }
arsenalist 41:2d023bd80a9c 2171 sprintf(p,"emma-%s-%s",emmaUID.c_str(),commandCmd.c_str());
arsenalist 41:2d023bd80a9c 2172 hmacCmd = calculateMD5(p);
arsenalist 41:2d023bd80a9c 2173
arsenalist 41:2d023bd80a9c 2174 sprintf(s,"{\"uid\":\"%s\",\"nType\":\"%s\",\"nAddr\":\"%s\",\"dType\":\"%s\",\"cmd\":\"%s\",\"from\":\"%s\",\"result\":\"%s\",\"hmac\":\"%s\"}",
arsenalist 41:2d023bd80a9c 2175 emmaUID.c_str(), commandNType.c_str(),commandNAddr.c_str(),commandDType.c_str(),commandCmd.c_str(),commandFrom.c_str(),execResult.c_str(),hmacCmd.c_str());
arsenalist 41:2d023bd80a9c 2176
arsenalist 41:2d023bd80a9c 2177 trial=0;
arsenalist 41:2d023bd80a9c 2178 while(1) {
arsenalist 41:2d023bd80a9c 2179 if(trial>=2) { //two times trial
arsenalist 41:2d023bd80a9c 2180 DBG.printf("failed to send execution result\r\n");
arsenalist 41:2d023bd80a9c 2181 break;
arsenalist 41:2d023bd80a9c 2182 }
arsenalist 43:612547648ed1 2183 sprintf(p,"/%s/api/controller/result",appNAME.c_str());
arsenalist 43:612547648ed1 2184 rest.post(p,s);
arsenalist 43:612547648ed1 2185 //rest.post("/emma/api/controller/result",s); //working
arsenalist 41:2d023bd80a9c 2186 wait(2);
arsenalist 41:2d023bd80a9c 2187 str = rxBuf;
arsenalist 41:2d023bd80a9c 2188 if(str.rfind("/result") != std::string::npos) {
arsenalist 41:2d023bd80a9c 2189 str.erase(str.begin(),str.begin()+str.rfind("/result"));
arsenalist 41:2d023bd80a9c 2190 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 41:2d023bd80a9c 2191 DBG.printf("success to send execution result\r\n");
arsenalist 41:2d023bd80a9c 2192 break;
arsenalist 41:2d023bd80a9c 2193 }
arsenalist 41:2d023bd80a9c 2194 }
arsenalist 42:b32e51a374c7 2195 //checkRxBuffer();
arsenalist 42:b32e51a374c7 2196 trial++;
arsenalist 42:b32e51a374c7 2197 }
arsenalist 42:b32e51a374c7 2198 } else if(commandNType == "2") { //wifi smart plug
arsenalist 42:b32e51a374c7 2199 DBG.printf("command for smart plug\r\n");
arsenalist 42:b32e51a374c7 2200
arsenalist 42:b32e51a374c7 2201 //get index of node list based on mac address
arsenalist 42:b32e51a374c7 2202 int idx = NODES_INVALID;
arsenalist 42:b32e51a374c7 2203 for(int i=0; i<NODES_MAX; i++) {
arsenalist 42:b32e51a374c7 2204 if(!nodes[i].macAddr.compare(commandNAddr)) {
arsenalist 42:b32e51a374c7 2205 idx = i;
arsenalist 42:b32e51a374c7 2206 }
arsenalist 42:b32e51a374c7 2207 }
arsenalist 42:b32e51a374c7 2208
arsenalist 42:b32e51a374c7 2209 //execution process
arsenalist 42:b32e51a374c7 2210 string execResult = "failed";
arsenalist 42:b32e51a374c7 2211 if(idx != NODES_INVALID) {
arsenalist 42:b32e51a374c7 2212 DBG.printf("index found at %d\r\n",idx);
arsenalist 42:b32e51a374c7 2213
arsenalist 42:b32e51a374c7 2214 //execute command
arsenalist 42:b32e51a374c7 2215 DBG.printf("executing command\r\n");
arsenalist 42:b32e51a374c7 2216 sprintf(s,"<?xml version=\"1.0\" encoding=\"utf-8\"?><app_cmd cmd=\"13\"/><app_data on-off=\"%s\"/>\r\n",commandCmd.c_str());
arsenalist 42:b32e51a374c7 2217
arsenalist 42:b32e51a374c7 2218 trial=0;
arsenalist 42:b32e51a374c7 2219 while(1) {
arsenalist 42:b32e51a374c7 2220 rxBuf.clear();
arsenalist 42:b32e51a374c7 2221 if(trial>=2) { //two times trial
arsenalist 42:b32e51a374c7 2222 DBG.printf("cmd is not executed\r\n");
arsenalist 42:b32e51a374c7 2223 TFT.foreground(Red);
arsenalist 42:b32e51a374c7 2224 TFT.locate(0,180);
arsenalist 42:b32e51a374c7 2225 TFT.printf(" ");
arsenalist 42:b32e51a374c7 2226 TFT.locate(0,180);
arsenalist 42:b32e51a374c7 2227 TFT.printf("cmd is not executed");
arsenalist 42:b32e51a374c7 2228 wait(1);
arsenalist 42:b32e51a374c7 2229 TFT.locate(0,180);
arsenalist 42:b32e51a374c7 2230 TFT.printf(" ");
arsenalist 42:b32e51a374c7 2231 TFT.foreground(White);
arsenalist 42:b32e51a374c7 2232 break;
arsenalist 42:b32e51a374c7 2233 }
arsenalist 42:b32e51a374c7 2234 nodes[idx].restConn->get("/",s);
arsenalist 42:b32e51a374c7 2235 wait(2);
arsenalist 42:b32e51a374c7 2236 if(rxBuf.find("REST: status = 200") != std::string::npos) {
arsenalist 42:b32e51a374c7 2237 DBG.printf("cmd is executed\r\n");
arsenalist 42:b32e51a374c7 2238 TFT.foreground(Green);
arsenalist 42:b32e51a374c7 2239 TFT.locate(0,180);
arsenalist 42:b32e51a374c7 2240 TFT.printf(" ");
arsenalist 42:b32e51a374c7 2241 TFT.locate(0,180);
arsenalist 42:b32e51a374c7 2242 TFT.printf("cmd is executed");
arsenalist 42:b32e51a374c7 2243 wait(1);
arsenalist 42:b32e51a374c7 2244 TFT.locate(0,180);
arsenalist 42:b32e51a374c7 2245 TFT.printf(" ");
arsenalist 42:b32e51a374c7 2246 TFT.foreground(White);
arsenalist 42:b32e51a374c7 2247 execResult = "success";
arsenalist 42:b32e51a374c7 2248 break;
arsenalist 42:b32e51a374c7 2249 }
arsenalist 42:b32e51a374c7 2250 trial++;
arsenalist 42:b32e51a374c7 2251 }
arsenalist 42:b32e51a374c7 2252 } else {
arsenalist 42:b32e51a374c7 2253 TFT.foreground(Red);
arsenalist 42:b32e51a374c7 2254 TFT.locate(0,180);
arsenalist 42:b32e51a374c7 2255 TFT.printf(" ");
arsenalist 42:b32e51a374c7 2256 TFT.locate(0,180);
arsenalist 42:b32e51a374c7 2257 TFT.printf("node is invalid");
arsenalist 42:b32e51a374c7 2258 wait(1);
arsenalist 42:b32e51a374c7 2259 TFT.locate(0,180);
arsenalist 42:b32e51a374c7 2260 TFT.printf(" ");
arsenalist 42:b32e51a374c7 2261 TFT.foreground(White);
arsenalist 42:b32e51a374c7 2262 }
arsenalist 42:b32e51a374c7 2263
arsenalist 42:b32e51a374c7 2264 wait(2);
arsenalist 42:b32e51a374c7 2265 //send execution result
arsenalist 42:b32e51a374c7 2266 //DBG.printf("send execution result\r\n");
arsenalist 42:b32e51a374c7 2267
arsenalist 42:b32e51a374c7 2268 //calculate hmacCmd
arsenalist 42:b32e51a374c7 2269 sprintf(p,"emma-%s-%s",emmaUID.c_str(),commandCmd.c_str());
arsenalist 42:b32e51a374c7 2270 hmacCmd = calculateMD5(p);
arsenalist 42:b32e51a374c7 2271
arsenalist 42:b32e51a374c7 2272 sprintf(s,"{\"uid\":\"%s\",\"nType\":\"%s\",\"nAddr\":\"%s\",\"dType\":\"%s\",\"cmd\":\"%s\",\"from\":\"%s\",\"result\":\"%s\",\"hmac\":\"%s\"}",
arsenalist 42:b32e51a374c7 2273 emmaUID.c_str(), commandNType.c_str(),commandNAddr.c_str(),commandDType.c_str(),commandCmd.c_str(),commandFrom.c_str(),execResult.c_str(),hmacCmd.c_str());
arsenalist 42:b32e51a374c7 2274
arsenalist 42:b32e51a374c7 2275 trial=0;
arsenalist 42:b32e51a374c7 2276 while(1) {
arsenalist 42:b32e51a374c7 2277 if(trial>=2) { //two times trial
arsenalist 42:b32e51a374c7 2278 DBG.printf("failed to send execution result\r\n");
arsenalist 42:b32e51a374c7 2279 break;
arsenalist 42:b32e51a374c7 2280 }
arsenalist 43:612547648ed1 2281 sprintf(p,"/%s/api/controller/result",appNAME.c_str());
arsenalist 43:612547648ed1 2282 rest.post(p,s);
arsenalist 43:612547648ed1 2283 //rest.post("/emma/api/controller/result",s); //working
arsenalist 42:b32e51a374c7 2284 wait(2);
arsenalist 42:b32e51a374c7 2285 str = rxBuf;
arsenalist 42:b32e51a374c7 2286 if(str.rfind("/result") != std::string::npos) {
arsenalist 42:b32e51a374c7 2287 str.erase(str.begin(),str.begin()+str.rfind("/result"));
arsenalist 42:b32e51a374c7 2288 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 42:b32e51a374c7 2289 DBG.printf("success to send execution result\r\n");
arsenalist 42:b32e51a374c7 2290 break;
arsenalist 42:b32e51a374c7 2291 }
arsenalist 42:b32e51a374c7 2292 }
arsenalist 42:b32e51a374c7 2293 //checkRxBuffer();
arsenalist 41:2d023bd80a9c 2294 trial++;
arsenalist 41:2d023bd80a9c 2295 }
arsenalist 41:2d023bd80a9c 2296 }
arsenalist 41:2d023bd80a9c 2297 }
arsenalist 41:2d023bd80a9c 2298 }
arsenalist 41:2d023bd80a9c 2299 //clear text on lcd
arsenalist 41:2d023bd80a9c 2300 TFT.locate(0,160);
arsenalist 41:2d023bd80a9c 2301 TFT.printf(" ");
arsenalist 41:2d023bd80a9c 2302
arsenalist 41:2d023bd80a9c 2303 newCommand = false;
arsenalist 41:2d023bd80a9c 2304
arsenalist 41:2d023bd80a9c 2305 /*
arsenalist 7:7e8c6ad3fd64 2306 //check whether command is valid
arsenalist 0:f4e449fa34d7 2307 bool validCommand = true;
arsenalist 15:136526c28afb 2308 for(int i=0; i<5; i++) {
arsenalist 0:f4e449fa34d7 2309 validCommand = validCommand && jsonValue.hasMember(parameter[i]);
arsenalist 0:f4e449fa34d7 2310 }
arsenalist 0:f4e449fa34d7 2311 DBG.printf("command validity:%d\r\n",validCommand);
arsenalist 0:f4e449fa34d7 2312
arsenalist 0:f4e449fa34d7 2313 if(validCommand) {
arsenalist 40:77bd44f57ad3 2314 string commandFrom = jsonValue[parameter[0]].get<std::string>();
arsenalist 15:136526c28afb 2315 string commandNType = jsonValue[parameter[1]].get<std::string>();
arsenalist 15:136526c28afb 2316 string commandNAddr = jsonValue[parameter[2]].get<std::string>();
arsenalist 15:136526c28afb 2317 string commandDType = jsonValue[parameter[3]].get<std::string>();
arsenalist 15:136526c28afb 2318 string commandCmd = jsonValue[parameter[4]].get<std::string>();
arsenalist 0:f4e449fa34d7 2319
arsenalist 0:f4e449fa34d7 2320 if(commandNType == "0") { //switch on panel controller
arsenalist 0:f4e449fa34d7 2321 DBG.printf("command for switch\r\n");
arsenalist 0:f4e449fa34d7 2322 }
arsenalist 0:f4e449fa34d7 2323 else if(commandNType == "1") { //node with mac address
arsenalist 0:f4e449fa34d7 2324 DBG.printf("command for node\r\n");
arsenalist 0:f4e449fa34d7 2325 //get node ip address based on node mac address
arsenalist 5:d00233dd36f5 2326 //string nodeIP;
arsenalist 1:d314a43ae6f7 2327 //nodeIp = readNodeIP(commandNAddr);
arsenalist 5:d00233dd36f5 2328 //nodeIP = "192.168.2.15";
arsenalist 0:f4e449fa34d7 2329 //DBG.printf("nodeIP: %s\r\n",nodeIP.c_str());
arsenalist 5:d00233dd36f5 2330
arsenalist 5:d00233dd36f5 2331 //get index of node list based on mac address
arsenalist 5:d00233dd36f5 2332 int idx = NODES_INVALID;
arsenalist 5:d00233dd36f5 2333 for(int i=0; i<NODES_MAX; i++) {
arsenalist 5:d00233dd36f5 2334 if(!nodes[i].macAddr.compare(commandNAddr)) {
arsenalist 5:d00233dd36f5 2335 idx = i;
arsenalist 5:d00233dd36f5 2336 }
arsenalist 5:d00233dd36f5 2337 }
arsenalist 5:d00233dd36f5 2338
arsenalist 5:d00233dd36f5 2339 //execution process
arsenalist 21:33bd8b82560f 2340 //int trial;
arsenalist 15:136526c28afb 2341 string execResult = "failed";
arsenalist 5:d00233dd36f5 2342 if(idx != NODES_INVALID) {
arsenalist 5:d00233dd36f5 2343 DBG.printf("index found at %d\r\n",idx);
arsenalist 0:f4e449fa34d7 2344
arsenalist 5:d00233dd36f5 2345 //get cmd string based on device type and command number
arsenalist 5:d00233dd36f5 2346 string nodeCmd;
arsenalist 14:8287f0f5d987 2347 nodeCmd = readNodeCmd(commandDType,commandCmd);
arsenalist 14:8287f0f5d987 2348 //nodeCmd = "020129A0163B161315131613153C151316131514143C153C16141414141415151315141414141514141415141414143D1514143D141415141414143D14000D"; //turn off
arsenalist 5:d00233dd36f5 2349 //DBG.printf("nodeCmd: %s\r\n",nodeCmd.c_str());
arsenalist 0:f4e449fa34d7 2350
arsenalist 5:d00233dd36f5 2351 //execute command
arsenalist 5:d00233dd36f5 2352 DBG.printf("executing command\r\n");
arsenalist 0:f4e449fa34d7 2353 sprintf(s,"<?xml version=\"1.0\" encoding=\"utf-8\"?><app_cmd cmd=\"5\" /><app_data code=\"%s\"/>\r\n",nodeCmd.c_str());
arsenalist 0:f4e449fa34d7 2354
arsenalist 5:d00233dd36f5 2355 trial=0;
arsenalist 0:f4e449fa34d7 2356 while(1) {
arsenalist 35:b8ba2b73201b 2357 rxBuf.clear();
arsenalist 5:d00233dd36f5 2358 //cmdExecuted = false;
arsenalist 5:d00233dd36f5 2359 if(trial>=2) { //two times trial
arsenalist 0:f4e449fa34d7 2360 DBG.printf("cmd is not executed\r\n");
arsenalist 13:e8adfe305dbc 2361 TFT.foreground(Red);
arsenalist 13:e8adfe305dbc 2362 TFT.locate(0,180);
arsenalist 13:e8adfe305dbc 2363 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 2364 TFT.locate(0,180);
arsenalist 13:e8adfe305dbc 2365 TFT.printf("cmd is not executed");
arsenalist 14:8287f0f5d987 2366 wait(1);
arsenalist 13:e8adfe305dbc 2367 TFT.locate(0,180);
arsenalist 13:e8adfe305dbc 2368 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 2369 TFT.foreground(White);
arsenalist 0:f4e449fa34d7 2370 break;
arsenalist 0:f4e449fa34d7 2371 }
arsenalist 5:d00233dd36f5 2372 nodes[idx].restConn->get("/",s);
arsenalist 5:d00233dd36f5 2373 wait(2);
arsenalist 35:b8ba2b73201b 2374 if(rxBuf.find("REST: status = 200") != std::string::npos) {
arsenalist 13:e8adfe305dbc 2375 DBG.printf("cmd is executed\r\n");
arsenalist 13:e8adfe305dbc 2376 TFT.foreground(Green);
arsenalist 13:e8adfe305dbc 2377 TFT.locate(0,180);
arsenalist 13:e8adfe305dbc 2378 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 2379 TFT.locate(0,180);
arsenalist 13:e8adfe305dbc 2380 TFT.printf("cmd is executed");
arsenalist 14:8287f0f5d987 2381 wait(1);
arsenalist 13:e8adfe305dbc 2382 TFT.locate(0,180);
arsenalist 13:e8adfe305dbc 2383 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 2384 TFT.foreground(White);
arsenalist 15:136526c28afb 2385 execResult = "success";
arsenalist 5:d00233dd36f5 2386 break;
arsenalist 5:d00233dd36f5 2387 }
arsenalist 0:f4e449fa34d7 2388 trial++;
arsenalist 5:d00233dd36f5 2389 }
arsenalist 14:8287f0f5d987 2390 } else {
arsenalist 14:8287f0f5d987 2391 TFT.foreground(Red);
arsenalist 14:8287f0f5d987 2392 TFT.locate(0,180);
arsenalist 14:8287f0f5d987 2393 TFT.printf(" ");
arsenalist 14:8287f0f5d987 2394 TFT.locate(0,180);
arsenalist 14:8287f0f5d987 2395 TFT.printf("node is invalid");
arsenalist 14:8287f0f5d987 2396 wait(1);
arsenalist 14:8287f0f5d987 2397 TFT.locate(0,180);
arsenalist 14:8287f0f5d987 2398 TFT.printf(" ");
arsenalist 14:8287f0f5d987 2399 TFT.foreground(White);
arsenalist 5:d00233dd36f5 2400 }
arsenalist 5:d00233dd36f5 2401
arsenalist 5:d00233dd36f5 2402 wait(2);
arsenalist 5:d00233dd36f5 2403 //send execution result
arsenalist 21:33bd8b82560f 2404 //DBG.printf("send execution result\r\n");
arsenalist 23:fb369e171b7d 2405
arsenalist 23:fb369e171b7d 2406 //calculate hmacCmd
arsenalist 23:fb369e171b7d 2407 for(int j=0; j<sizeof(p); j++) {
arsenalist 23:fb369e171b7d 2408 p[j]=0; }
arsenalist 23:fb369e171b7d 2409 sprintf(p,"emma-%s-%s",emmaUID.c_str(),commandCmd.c_str());
arsenalist 23:fb369e171b7d 2410 hmacCmd = calculateMD5(p);
arsenalist 23:fb369e171b7d 2411
arsenalist 40:77bd44f57ad3 2412 sprintf(s,"{\"uid\":\"%s\",\"nType\":\"%s\",\"nAddr\":\"%s\",\"dType\":\"%s\",\"cmd\":\"%s\",\"from\":\"%s\",\"result\":\"%s\",\"hmac\":\"%s\"}",
arsenalist 40:77bd44f57ad3 2413 emmaUID.c_str(), commandNType.c_str(),commandNAddr.c_str(),commandDType.c_str(),commandCmd.c_str(),commandFrom.c_str(),execResult.c_str(),hmacCmd.c_str());
arsenalist 5:d00233dd36f5 2414
arsenalist 5:d00233dd36f5 2415 trial=0;
arsenalist 5:d00233dd36f5 2416 while(1) {
arsenalist 5:d00233dd36f5 2417 if(trial>=2) { //two times trial
arsenalist 23:fb369e171b7d 2418 DBG.printf("failed to send execution result\r\n");
arsenalist 5:d00233dd36f5 2419 break;
arsenalist 0:f4e449fa34d7 2420 }
arsenalist 23:fb369e171b7d 2421 rest.post("/emma/api/controller/result",s);
arsenalist 5:d00233dd36f5 2422 wait(2);
arsenalist 23:fb369e171b7d 2423 str = rxBuf;
arsenalist 23:fb369e171b7d 2424 if(str.rfind("/result") != std::string::npos) {
arsenalist 23:fb369e171b7d 2425 str.erase(str.begin(),str.begin()+str.rfind("/result"));
arsenalist 23:fb369e171b7d 2426 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 23:fb369e171b7d 2427 DBG.printf("success to send execution result\r\n");
arsenalist 23:fb369e171b7d 2428 break;
arsenalist 23:fb369e171b7d 2429 }
arsenalist 0:f4e449fa34d7 2430 }
arsenalist 23:fb369e171b7d 2431 checkRxBuffer();
arsenalist 5:d00233dd36f5 2432 trial++;
arsenalist 0:f4e449fa34d7 2433 }
arsenalist 0:f4e449fa34d7 2434 }
arsenalist 0:f4e449fa34d7 2435 }
arsenalist 13:e8adfe305dbc 2436
arsenalist 13:e8adfe305dbc 2437 //clear text on lcd
arsenalist 13:e8adfe305dbc 2438 TFT.locate(0,160);
arsenalist 13:e8adfe305dbc 2439 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 2440
arsenalist 0:f4e449fa34d7 2441 newCommand = false;
arsenalist 41:2d023bd80a9c 2442 */
arsenalist 2:fdfdeb5fd6fd 2443 }
arsenalist 30:08d290158fa7 2444
arsenalist 4:76ab12e2f8a3 2445 osDelay(5000);
arsenalist 0:f4e449fa34d7 2446 }
arsenalist 0:f4e449fa34d7 2447 }
arsenalist 0:f4e449fa34d7 2448 }
arsenalist 0:f4e449fa34d7 2449 void emmaModeFirmwareDownload(void) {
arsenalist 0:f4e449fa34d7 2450 bool emmaGetFirmwareParam = false;
arsenalist 0:f4e449fa34d7 2451
arsenalist 0:f4e449fa34d7 2452 DBG.printf("emmaModeFirmwareDownload\r\n");
arsenalist 0:f4e449fa34d7 2453
arsenalist 0:f4e449fa34d7 2454 char s[384];
arsenalist 0:f4e449fa34d7 2455 string str;
arsenalist 0:f4e449fa34d7 2456 string connData;
arsenalist 0:f4e449fa34d7 2457 string chunk;
arsenalist 0:f4e449fa34d7 2458
arsenalist 0:f4e449fa34d7 2459 //firmware parameter
arsenalist 0:f4e449fa34d7 2460 string firmwareVer;
arsenalist 0:f4e449fa34d7 2461 string firmwareName;
arsenalist 0:f4e449fa34d7 2462 int numPart;
arsenalist 0:f4e449fa34d7 2463
arsenalist 0:f4e449fa34d7 2464 //downloading
arsenalist 0:f4e449fa34d7 2465 string firmwarePart;
arsenalist 0:f4e449fa34d7 2466 string calcMD5;
arsenalist 0:f4e449fa34d7 2467 string srvrMD5;
arsenalist 0:f4e449fa34d7 2468 bool nextPart;
arsenalist 0:f4e449fa34d7 2469
arsenalist 0:f4e449fa34d7 2470 //set wifi to mode bridge
arsenalist 0:f4e449fa34d7 2471 _ESP.printf("MODE=B");
arsenalist 0:f4e449fa34d7 2472 DBG.printf("set mode bridge\r\n");
arsenalist 0:f4e449fa34d7 2473 while(1) {
arsenalist 0:f4e449fa34d7 2474 char rcv[128] = {};
arsenalist 0:f4e449fa34d7 2475 rcvReply(rcv,3000);
arsenalist 0:f4e449fa34d7 2476 str = rcv;
arsenalist 0:f4e449fa34d7 2477 if(str.find("MODE=B_OK") != std::string::npos)
arsenalist 0:f4e449fa34d7 2478 break;
arsenalist 0:f4e449fa34d7 2479 }
arsenalist 0:f4e449fa34d7 2480 DBG.printf("MODE=B\r\n");
arsenalist 0:f4e449fa34d7 2481
arsenalist 0:f4e449fa34d7 2482 esp.enable();
arsenalist 0:f4e449fa34d7 2483 wait(1);
arsenalist 0:f4e449fa34d7 2484 while(!esp.ready());
arsenalist 0:f4e449fa34d7 2485
arsenalist 0:f4e449fa34d7 2486 if(!rest.begin("candra.tritronik.com",3128,false)) {
arsenalist 0:f4e449fa34d7 2487 DBG.printf("EMMA: fail to setup rest");
arsenalist 0:f4e449fa34d7 2488 while(1);
arsenalist 0:f4e449fa34d7 2489 }
arsenalist 0:f4e449fa34d7 2490
arsenalist 0:f4e449fa34d7 2491 //wifiConnected = true; //with custom firmware, panel should connect wifi automatically
arsenalist 0:f4e449fa34d7 2492 useProxy = true;
arsenalist 0:f4e449fa34d7 2493
arsenalist 0:f4e449fa34d7 2494 esp.process();
arsenalist 0:f4e449fa34d7 2495 //set connData
arsenalist 0:f4e449fa34d7 2496 if(useProxy) {
arsenalist 0:f4e449fa34d7 2497 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 2498 s[i]=0; }
arsenalist 38:e44f35f8129d 2499 //sprintf(s,"http://%s:%d/emma/api/controller/register?uid=%s&hmac=%s",restSERVER,restPORT,emmaUID.c_str(),hmac.c_str());
arsenalist 0:f4e449fa34d7 2500 sprintf(s,"http://192.168.128.69/emmaController/firmware/firmwareParameter");
arsenalist 0:f4e449fa34d7 2501 connData = s;
arsenalist 0:f4e449fa34d7 2502 } else {
arsenalist 0:f4e449fa34d7 2503 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 2504 s[i]=0; }
arsenalist 0:f4e449fa34d7 2505 //sprintf(s,"/emma/api/controller/register?uid=%s&hmac=%s",emmaUID.c_str(),hmac.c_str());
arsenalist 0:f4e449fa34d7 2506 sprintf(s,"/emmaController/firmware/firmwareParameter");
arsenalist 0:f4e449fa34d7 2507 connData = s;
arsenalist 0:f4e449fa34d7 2508 }
arsenalist 0:f4e449fa34d7 2509
arsenalist 0:f4e449fa34d7 2510 //get parameter of firmware to be downloaded
arsenalist 0:f4e449fa34d7 2511 while(!emmaGetFirmwareParam) {
arsenalist 0:f4e449fa34d7 2512 rest.get(connData.c_str());
arsenalist 0:f4e449fa34d7 2513 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 2514 s[i]=0; }
arsenalist 0:f4e449fa34d7 2515 rest.getResponse(s,sizeof(s));
arsenalist 0:f4e449fa34d7 2516 //DBG.printf("rsp param:%s\r\n",s);
arsenalist 0:f4e449fa34d7 2517
arsenalist 0:f4e449fa34d7 2518 str = s;
arsenalist 0:f4e449fa34d7 2519 if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) {
arsenalist 0:f4e449fa34d7 2520 str.erase(str.begin(),str.begin()+str.find("[")+1);
arsenalist 0:f4e449fa34d7 2521 str.erase(str.begin()+str.find("]"),str.end());
arsenalist 0:f4e449fa34d7 2522
arsenalist 0:f4e449fa34d7 2523 MbedJSONValue jsonValue;
arsenalist 0:f4e449fa34d7 2524 parse(jsonValue,str.c_str());
arsenalist 0:f4e449fa34d7 2525
arsenalist 0:f4e449fa34d7 2526 char *parameter[2] = {"firmwareVer","numPart"};
arsenalist 0:f4e449fa34d7 2527
arsenalist 0:f4e449fa34d7 2528 for(int i=0; i<2; i++) {
arsenalist 0:f4e449fa34d7 2529 if(jsonValue.hasMember(parameter[i])) {
arsenalist 0:f4e449fa34d7 2530 string val = jsonValue[parameter[i]].get<std::string>();
arsenalist 0:f4e449fa34d7 2531 if(i==0) {
arsenalist 0:f4e449fa34d7 2532 firmwareVer = val;
arsenalist 0:f4e449fa34d7 2533 } else if(i==1) {
arsenalist 0:f4e449fa34d7 2534 sscanf(val.c_str(),"%d",&numPart);
arsenalist 0:f4e449fa34d7 2535 }
arsenalist 0:f4e449fa34d7 2536 }
arsenalist 0:f4e449fa34d7 2537 }
arsenalist 0:f4e449fa34d7 2538
arsenalist 0:f4e449fa34d7 2539 if(!firmwareVer.empty() && numPart!=0) {
arsenalist 0:f4e449fa34d7 2540 emmaGetFirmwareParam = true;
arsenalist 0:f4e449fa34d7 2541 }
arsenalist 0:f4e449fa34d7 2542 }
arsenalist 0:f4e449fa34d7 2543 }
arsenalist 0:f4e449fa34d7 2544 DBG.printf("firmwareVer:%s\r\n",firmwareVer.c_str());
arsenalist 0:f4e449fa34d7 2545 DBG.printf("numPart:%d\r\n",numPart);
arsenalist 0:f4e449fa34d7 2546
arsenalist 0:f4e449fa34d7 2547 //clear firmware file
arsenalist 0:f4e449fa34d7 2548 while(1) {
arsenalist 0:f4e449fa34d7 2549 if(clearFirmware()){
arsenalist 0:f4e449fa34d7 2550 DBG.printf("clear firmware on sd card\r\n\r\n");
arsenalist 0:f4e449fa34d7 2551 break;
arsenalist 0:f4e449fa34d7 2552 }
arsenalist 0:f4e449fa34d7 2553 wait(1);
arsenalist 0:f4e449fa34d7 2554 }
arsenalist 0:f4e449fa34d7 2555
arsenalist 0:f4e449fa34d7 2556 //set connData
arsenalist 0:f4e449fa34d7 2557 if(useProxy) {
arsenalist 0:f4e449fa34d7 2558 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 2559 s[i]=0; }
arsenalist 0:f4e449fa34d7 2560 sprintf(s,"http://192.168.128.69/emmaController/firmware/%s",firmwareVer.c_str());
arsenalist 0:f4e449fa34d7 2561 connData = s;
arsenalist 0:f4e449fa34d7 2562 } else {
arsenalist 0:f4e449fa34d7 2563 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 2564 s[i]=0; }
arsenalist 0:f4e449fa34d7 2565 sprintf(s,"/emmaController/firmware/%s",firmwareVer.c_str());
arsenalist 0:f4e449fa34d7 2566 connData = s;
arsenalist 0:f4e449fa34d7 2567 }
arsenalist 0:f4e449fa34d7 2568
arsenalist 0:f4e449fa34d7 2569 //download firmware
arsenalist 0:f4e449fa34d7 2570 for(int n=0; n<numPart; n++) {
arsenalist 0:f4e449fa34d7 2571 nextPart = false;
arsenalist 0:f4e449fa34d7 2572 while(!nextPart) {
arsenalist 0:f4e449fa34d7 2573 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 2574 s[i]=0; }
arsenalist 0:f4e449fa34d7 2575 sprintf(s,"%s/firmware_Hex_%s_%d",connData.c_str(),firmwareVer.c_str(),n);
arsenalist 0:f4e449fa34d7 2576 rest.get(s);
arsenalist 0:f4e449fa34d7 2577 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 2578 s[i]=0; }
arsenalist 0:f4e449fa34d7 2579 rest.getResponse(s,sizeof(s));
arsenalist 0:f4e449fa34d7 2580 //DBG.printf("rsp[%d]:%s\r\n",n,s);
arsenalist 0:f4e449fa34d7 2581
arsenalist 0:f4e449fa34d7 2582 str = s;
arsenalist 0:f4e449fa34d7 2583 if(str.find("{") != std::string::npos && str.find("}") != std::string::npos) {
arsenalist 0:f4e449fa34d7 2584 str.erase(str.begin(),str.begin()+str.find("{")+1);
arsenalist 0:f4e449fa34d7 2585 str.erase(str.begin()+str.find("}"),str.end());
arsenalist 0:f4e449fa34d7 2586 //DBG.printf("firmwarePart[%d]:%s\r\n",n,str.c_str());
arsenalist 0:f4e449fa34d7 2587 firmwarePart = str;
arsenalist 0:f4e449fa34d7 2588
arsenalist 0:f4e449fa34d7 2589 //calculated MD5
arsenalist 0:f4e449fa34d7 2590 calcMD5 = calculateMD5(firmwarePart);
arsenalist 0:f4e449fa34d7 2591 //DBG.printf("calcMD5[%d]:%s\r\n",n,calcMD5.c_str());
arsenalist 0:f4e449fa34d7 2592
arsenalist 0:f4e449fa34d7 2593 //MD5 from server
arsenalist 0:f4e449fa34d7 2594 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 2595 s[i]=0; }
arsenalist 0:f4e449fa34d7 2596 sprintf(s,"%s/MD5/firmware_MD5_%s_%d",connData.c_str(),firmwareVer.c_str(),n);
arsenalist 0:f4e449fa34d7 2597 rest.get(s);
arsenalist 0:f4e449fa34d7 2598 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 2599 s[i]=0; }
arsenalist 0:f4e449fa34d7 2600 rest.getResponse(s,sizeof(s));
arsenalist 0:f4e449fa34d7 2601
arsenalist 0:f4e449fa34d7 2602 str = s;
arsenalist 0:f4e449fa34d7 2603 if(str.find("{") != std::string::npos && str.find("}") != std::string::npos) {
arsenalist 0:f4e449fa34d7 2604 str.erase(str.begin(),str.begin()+str.find("{")+1);
arsenalist 0:f4e449fa34d7 2605 str.erase(str.begin()+str.find("}"),str.end());
arsenalist 0:f4e449fa34d7 2606 srvrMD5 = str;
arsenalist 0:f4e449fa34d7 2607 //DBG.printf("srvrMD5[%d]:%s\r\n",n,srvrMD5.c_str());
arsenalist 0:f4e449fa34d7 2608
arsenalist 0:f4e449fa34d7 2609 //compare original MD5 vs MD5 from server
arsenalist 0:f4e449fa34d7 2610 if(strcmp(calcMD5.c_str(),srvrMD5.c_str()) == 0) {
arsenalist 0:f4e449fa34d7 2611 //DBG.printf("MD5 correct\r\n");
arsenalist 0:f4e449fa34d7 2612
arsenalist 0:f4e449fa34d7 2613 //save to sd card
arsenalist 0:f4e449fa34d7 2614 int st = writeFirmwareHexToChar(firmwarePart);
arsenalist 0:f4e449fa34d7 2615 if(st) {
arsenalist 0:f4e449fa34d7 2616 DBG.printf("firmwarePart[%d/%d] written\r\n",n,numPart-1);
arsenalist 0:f4e449fa34d7 2617 nextPart = true;
arsenalist 0:f4e449fa34d7 2618 }
arsenalist 0:f4e449fa34d7 2619
arsenalist 0:f4e449fa34d7 2620 } else {
arsenalist 0:f4e449fa34d7 2621 DBG.printf("MD5 incorrect\r\n");
arsenalist 0:f4e449fa34d7 2622 }
arsenalist 0:f4e449fa34d7 2623 }
arsenalist 0:f4e449fa34d7 2624 } else {
arsenalist 0:f4e449fa34d7 2625 DBG.printf("retry to fetch firmwarePart[%d]\r\n",n);
arsenalist 0:f4e449fa34d7 2626 }
arsenalist 0:f4e449fa34d7 2627 wait(0.5);
arsenalist 0:f4e449fa34d7 2628 }
arsenalist 0:f4e449fa34d7 2629 }
arsenalist 0:f4e449fa34d7 2630 DBG.printf("download finished\r\n");
arsenalist 0:f4e449fa34d7 2631 }
arsenalist 44:c1d11c491237 2632
arsenalist 44:c1d11c491237 2633 void emmaModeReserved(void) {
arsenalist 44:c1d11c491237 2634 char connBody[128];
arsenalist 44:c1d11c491237 2635 char s[256];
arsenalist 46:86a0c2133130 2636 //char buf[1024];
arsenalist 44:c1d11c491237 2637 int connBodyLen;
arsenalist 44:c1d11c491237 2638 int i=0;
arsenalist 46:86a0c2133130 2639 //int ret=99;
arsenalist 44:c1d11c491237 2640 string str;
arsenalist 44:c1d11c491237 2641 Timer t;
arsenalist 45:2406c2b6995a 2642 //TCPSocketConnection sock;
arsenalist 44:c1d11c491237 2643
arsenalist 44:c1d11c491237 2644 eth.init();
arsenalist 45:2406c2b6995a 2645 eth.connect();
arsenalist 45:2406c2b6995a 2646 connBodyLen = sprintf(connBody,"{\"uid\":\"005e00553533510334313732\",\"hmac\":\"9424c60e708d8e3d3dff6d23fb104339\"}");
arsenalist 45:2406c2b6995a 2647 sprintf(s,"POST /emma/api/controller/command HTTP/1.0\nHost: 36.80.35.8\nContent-Length:%d\n\n%s\r\n\r\n",connBodyLen,connBody);
arsenalist 44:c1d11c491237 2648 while(1) {
arsenalist 44:c1d11c491237 2649 //command
arsenalist 44:c1d11c491237 2650 str.clear();
arsenalist 44:c1d11c491237 2651 str = ethREST("36.80.35.8",8080,s);
arsenalist 44:c1d11c491237 2652 DBG.printf("[%d]str:%s\r\n",i,str.c_str());
arsenalist 44:c1d11c491237 2653 i++;
arsenalist 44:c1d11c491237 2654 wait(5);
arsenalist 44:c1d11c491237 2655 }
arsenalist 44:c1d11c491237 2656
arsenalist 45:2406c2b6995a 2657 /*
arsenalist 44:c1d11c491237 2658 //start working as expected
arsenalist 44:c1d11c491237 2659 eth.init();
arsenalist 44:c1d11c491237 2660 eth.connect();
arsenalist 44:c1d11c491237 2661 connBodyLen = sprintf(connBody,"{\"uid\":\"005e00553533510334313732\",\"hmac\":\"9424c60e708d8e3d3dff6d23fb104339\"}");
arsenalist 44:c1d11c491237 2662 sprintf(s,"POST /emma/api/controller/command HTTP/1.0\nHost: 36.80.35.8\nContent-Length:%d\n\n%s\r\n\r\n",connBodyLen,connBody);
arsenalist 44:c1d11c491237 2663
arsenalist 44:c1d11c491237 2664 while(1) {
arsenalist 44:c1d11c491237 2665 //eth.connect();
arsenalist 44:c1d11c491237 2666 t.start();
arsenalist 44:c1d11c491237 2667 while(eth.linkstatus() && t.read() < 5 && ret !=0) {
arsenalist 44:c1d11c491237 2668 ret = sock.connect("36.80.35.8",8080);
arsenalist 44:c1d11c491237 2669 }
arsenalist 44:c1d11c491237 2670 t.stop();
arsenalist 44:c1d11c491237 2671 t.reset();
arsenalist 44:c1d11c491237 2672
arsenalist 44:c1d11c491237 2673 memset(buf,0,sizeof(buf));
arsenalist 44:c1d11c491237 2674 if(sock.is_connected()) {
arsenalist 44:c1d11c491237 2675 DBG.printf("connect\r\n");
arsenalist 44:c1d11c491237 2676 sock.send_all(s,sizeof(s)-1);
arsenalist 44:c1d11c491237 2677 wait(2);
arsenalist 44:c1d11c491237 2678 //receive return
arsenalist 44:c1d11c491237 2679 t.start();
arsenalist 44:c1d11c491237 2680 while(1) {
arsenalist 44:c1d11c491237 2681 ret = sock.receive(buf, sizeof(buf));
arsenalist 44:c1d11c491237 2682 if(ret<=0 || t.read() > 5) {
arsenalist 44:c1d11c491237 2683 t.stop();
arsenalist 44:c1d11c491237 2684 t.reset();
arsenalist 44:c1d11c491237 2685 break;
arsenalist 44:c1d11c491237 2686 }
arsenalist 44:c1d11c491237 2687 }
arsenalist 44:c1d11c491237 2688 sock.close();
arsenalist 44:c1d11c491237 2689 } else {
arsenalist 44:c1d11c491237 2690 DBG.printf("not connected\r\n");
arsenalist 44:c1d11c491237 2691 }
arsenalist 44:c1d11c491237 2692 //eth.disconnect();
arsenalist 44:c1d11c491237 2693 DBG.printf("[%d]BUF:%s\r\n\r\n",i,buf);
arsenalist 44:c1d11c491237 2694 i++;
arsenalist 44:c1d11c491237 2695 wait(5);
arsenalist 44:c1d11c491237 2696 }
arsenalist 44:c1d11c491237 2697 //end working as expected
arsenalist 45:2406c2b6995a 2698 */
arsenalist 44:c1d11c491237 2699 }
arsenalist 12:96f637ed37f9 2700 /*end emma mode*/
arsenalist 0:f4e449fa34d7 2701
arsenalist 4:76ab12e2f8a3 2702 /*start energy related*/
arsenalist 0:f4e449fa34d7 2703 void energyThread(void const*) {
arsenalist 19:7e3e9332f719 2704 Timer tEnergy;
arsenalist 19:7e3e9332f719 2705
arsenalist 19:7e3e9332f719 2706 while(1) {
arsenalist 19:7e3e9332f719 2707 tEnergy.start();
arsenalist 19:7e3e9332f719 2708 DBG.printf("energyThread-start\r\n");
arsenalist 19:7e3e9332f719 2709
arsenalist 19:7e3e9332f719 2710 AWattHrSum = 0;
arsenalist 19:7e3e9332f719 2711 BWattHrSum = 0;
arsenalist 19:7e3e9332f719 2712 CWattHrSum = 0;
arsenalist 19:7e3e9332f719 2713
arsenalist 20:ea14f175bbb4 2714 while(tEnergy.read() < 1*60.0) {
arsenalist 19:7e3e9332f719 2715 AWattHrValue = ADE.getWattHR(PHASE_A);
arsenalist 19:7e3e9332f719 2716 BWattHrValue = ADE.getWattHR(PHASE_B);
arsenalist 19:7e3e9332f719 2717 CWattHrValue = ADE.getWattHR(PHASE_C);
arsenalist 19:7e3e9332f719 2718
arsenalist 19:7e3e9332f719 2719 AWattHrSum += AWattHrValue;
arsenalist 19:7e3e9332f719 2720 BWattHrSum += BWattHrValue;
arsenalist 20:ea14f175bbb4 2721 CWattHrSum += CWattHrValue;
arsenalist 20:ea14f175bbb4 2722
arsenalist 20:ea14f175bbb4 2723
arsenalist 20:ea14f175bbb4 2724 //start check voltage and power
arsenalist 21:33bd8b82560f 2725 AVrms = ADE.VRMS(PHASE_A) * 0.000124f; //0.000158; //constants are from calculateVRMS function
arsenalist 21:33bd8b82560f 2726 BVrms = ADE.VRMS(PHASE_B) * 0.000123f;
arsenalist 21:33bd8b82560f 2727 CVrms = ADE.VRMS(PHASE_C) * 0.000122f;
arsenalist 20:ea14f175bbb4 2728
arsenalist 21:33bd8b82560f 2729 AIrms = ADE.IRMS(PHASE_A) * 0.00001006f; //0.0000125f; //constants are from calculateIRMS function
arsenalist 21:33bd8b82560f 2730 BIrms = ADE.IRMS(PHASE_B) * 0.00001005f;
arsenalist 21:33bd8b82560f 2731 CIrms = ADE.IRMS(PHASE_C) * 0.00001004f;
arsenalist 20:ea14f175bbb4 2732
arsenalist 20:ea14f175bbb4 2733 AWatt = AVrms * AIrms;
arsenalist 20:ea14f175bbb4 2734 BWatt = BVrms * BIrms;
arsenalist 20:ea14f175bbb4 2735 CWatt = CVrms * CIrms;
arsenalist 20:ea14f175bbb4 2736 //end check voltage and power
arsenalist 20:ea14f175bbb4 2737
arsenalist 19:7e3e9332f719 2738 }
arsenalist 19:7e3e9332f719 2739
arsenalist 25:36c6a5db50ed 2740 AWattHr = AWattHrSum * 0.000044169f; //0.0000198f;
arsenalist 25:36c6a5db50ed 2741 BWattHr = BWattHrSum * 0.000044168f; //0.0000197f;
arsenalist 25:36c6a5db50ed 2742 CWattHr = CWattHrSum * 0.000044167f; //0.0000196f;
arsenalist 19:7e3e9332f719 2743
arsenalist 22:e18d361bf688 2744 newEnergyData = true;
arsenalist 22:e18d361bf688 2745
arsenalist 19:7e3e9332f719 2746 tEnergy.stop();
arsenalist 19:7e3e9332f719 2747 tEnergy.reset();
arsenalist 19:7e3e9332f719 2748 DBG.printf("energyThread-finish\r\n");
arsenalist 19:7e3e9332f719 2749 }
arsenalist 0:f4e449fa34d7 2750 }
arsenalist 47:97eadcb478b2 2751
arsenalist 21:33bd8b82560f 2752 void checkVoltagePower(void) {
arsenalist 4:76ab12e2f8a3 2753 //check if voltage or power violates threshold
arsenalist 47:97eadcb478b2 2754 char connBody[256];
arsenalist 22:e18d361bf688 2755 char p[64];
arsenalist 20:ea14f175bbb4 2756 char q[32];
arsenalist 4:76ab12e2f8a3 2757 char s[256];
arsenalist 47:97eadcb478b2 2758 int connBodyLen=0;
arsenalist 47:97eadcb478b2 2759 int connPort=0;
arsenalist 47:97eadcb478b2 2760 int alertType=0;
arsenalist 22:e18d361bf688 2761 string hmacTime;
arsenalist 4:76ab12e2f8a3 2762 string str;
arsenalist 20:ea14f175bbb4 2763 time_t seconds;
arsenalist 4:76ab12e2f8a3 2764
arsenalist 4:76ab12e2f8a3 2765 //DBG.printf("checkVoltagePower-start\r\n");
arsenalist 4:76ab12e2f8a3 2766
arsenalist 47:97eadcb478b2 2767 //vrms and irms should be placed inside energy calculation routine
arsenalist 19:7e3e9332f719 2768
arsenalist 20:ea14f175bbb4 2769 //get time
arsenalist 20:ea14f175bbb4 2770 seconds = time(NULL);
arsenalist 20:ea14f175bbb4 2771 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 20:ea14f175bbb4 2772
arsenalist 22:e18d361bf688 2773 //calculate hmacTime
arsenalist 22:e18d361bf688 2774 sprintf(p,"emma-%s-%s",emmaUID.c_str(),q);
arsenalist 22:e18d361bf688 2775 hmacTime = calculateMD5(p);
arsenalist 22:e18d361bf688 2776
arsenalist 47:97eadcb478b2 2777 //read connPort
arsenalist 47:97eadcb478b2 2778 sscanf(restPORT.c_str(),"%d",&connPort);
arsenalist 47:97eadcb478b2 2779
arsenalist 47:97eadcb478b2 2780 if(vrmsTHL > AVrms) {
arsenalist 47:97eadcb478b2 2781 alertType = 1;
arsenalist 47:97eadcb478b2 2782 } else if (AVrms > vrmsTHH) {
arsenalist 47:97eadcb478b2 2783 alertType = 2;
arsenalist 47:97eadcb478b2 2784 }
arsenalist 47:97eadcb478b2 2785
arsenalist 47:97eadcb478b2 2786 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"value\":%.2f,\"type\":%d}",
arsenalist 47:97eadcb478b2 2787 emmaUID.c_str(),hmacTime.c_str(),q,AVrms,alertType);
arsenalist 47:97eadcb478b2 2788
arsenalist 47:97eadcb478b2 2789 if(alertType != 0 && ethConnected && allowAlertAVrms) {
arsenalist 47:97eadcb478b2 2790 sprintf(s,"POST /%s/api/controller/alert/1 HTTP/1.0\nHost: %s\nContent-Length:%d\n\n%s\r\n\r\n",appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 47:97eadcb478b2 2791 str.clear();
arsenalist 47:97eadcb478b2 2792 str = ethREST(restSERVER,connPort,s);
arsenalist 47:97eadcb478b2 2793 allowAlertAVrms = false;
arsenalist 47:97eadcb478b2 2794 DBG.printf("[ph1]vrms:%s\r\n",str.c_str());
arsenalist 47:97eadcb478b2 2795 } else if(alertType != 0 && wifiConnected && allowAlertAVrms) {
arsenalist 47:97eadcb478b2 2796 sprintf(p,"/%s/api/controller/alert/1",appNAME.c_str());
arsenalist 47:97eadcb478b2 2797 //DBG.printf("[ph1]:%s\r\n",connBody);
arsenalist 43:612547648ed1 2798
arsenalist 47:97eadcb478b2 2799 rxBuf.clear();
arsenalist 47:97eadcb478b2 2800 rest.post(p,connBody);
arsenalist 47:97eadcb478b2 2801 wait(2);
arsenalist 47:97eadcb478b2 2802 str = rxBuf;
arsenalist 47:97eadcb478b2 2803 if(str.rfind("/alert/1") != std::string::npos) {
arsenalist 47:97eadcb478b2 2804 str.erase(str.begin(),str.begin()+str.rfind("/alert/1"));
arsenalist 47:97eadcb478b2 2805 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 47:97eadcb478b2 2806 DBG.printf("[ph1]vrms success\r\n");
arsenalist 47:97eadcb478b2 2807 } else {
arsenalist 47:97eadcb478b2 2808 DBG.printf("[ph1]vrms failed\r\n");
arsenalist 47:97eadcb478b2 2809 }
arsenalist 47:97eadcb478b2 2810 }
arsenalist 47:97eadcb478b2 2811 allowAlertAVrms = false;
arsenalist 47:97eadcb478b2 2812 }
arsenalist 47:97eadcb478b2 2813
arsenalist 47:97eadcb478b2 2814 alertType = 0;
arsenalist 47:97eadcb478b2 2815 if(wattTHL > AWatt) {
arsenalist 47:97eadcb478b2 2816 alertType = 3;
arsenalist 47:97eadcb478b2 2817 } else if (AWatt > wattTHH) {
arsenalist 47:97eadcb478b2 2818 alertType = 4;
arsenalist 47:97eadcb478b2 2819 }
arsenalist 47:97eadcb478b2 2820 if(alertType != 0 && ethConnected && allowAlertAWatt) {
arsenalist 47:97eadcb478b2 2821 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"value\":%.2f,\"type\":%d}",
arsenalist 47:97eadcb478b2 2822 emmaUID.c_str(),hmacTime.c_str(),q,AWatt,alertType);
arsenalist 47:97eadcb478b2 2823 sprintf(s,"POST /%s/api/controller/alert/1 HTTP/1.0\nHost: %s\nContent-Length:%d\n\n%s\r\n\r\n",appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 47:97eadcb478b2 2824 str.clear();
arsenalist 47:97eadcb478b2 2825 str = ethREST(restSERVER,connPort,s);
arsenalist 47:97eadcb478b2 2826 allowAlertAWatt = false;
arsenalist 47:97eadcb478b2 2827 DBG.printf("[ph1]watt:%s\r\n",str.c_str());
arsenalist 47:97eadcb478b2 2828 } else if(alertType != 0 && wifiConnected && allowAlertAWatt) {
arsenalist 43:612547648ed1 2829 sprintf(p,"/%s/api/controller/alert/1",appNAME.c_str());
arsenalist 47:97eadcb478b2 2830 //DBG.printf("[ph1]:%s\r\n",connBody);
arsenalist 47:97eadcb478b2 2831
arsenalist 47:97eadcb478b2 2832 rxBuf.clear();
arsenalist 47:97eadcb478b2 2833 rest.post(p,connBody);
arsenalist 4:76ab12e2f8a3 2834 wait(2);
arsenalist 4:76ab12e2f8a3 2835 str = rxBuf;
arsenalist 4:76ab12e2f8a3 2836 if(str.rfind("/alert/1") != std::string::npos) {
arsenalist 4:76ab12e2f8a3 2837 str.erase(str.begin(),str.begin()+str.rfind("/alert/1"));
arsenalist 4:76ab12e2f8a3 2838 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 47:97eadcb478b2 2839 DBG.printf("[ph1]watt success\r\n");
arsenalist 4:76ab12e2f8a3 2840 } else {
arsenalist 47:97eadcb478b2 2841 DBG.printf("[ph1]watt failed\r\n");
arsenalist 4:76ab12e2f8a3 2842 }
arsenalist 4:76ab12e2f8a3 2843 }
arsenalist 47:97eadcb478b2 2844 allowAlertAWatt = false;
arsenalist 4:76ab12e2f8a3 2845 }
arsenalist 4:76ab12e2f8a3 2846
arsenalist 47:97eadcb478b2 2847 alertType = 0;
arsenalist 47:97eadcb478b2 2848 if(vrmsTHL > BVrms) {
arsenalist 47:97eadcb478b2 2849 alertType = 1;
arsenalist 47:97eadcb478b2 2850 } else if (BVrms > vrmsTHH) {
arsenalist 47:97eadcb478b2 2851 alertType = 2;
arsenalist 47:97eadcb478b2 2852 }
arsenalist 47:97eadcb478b2 2853 if(alertType != 0 && ethConnected && allowAlertBVrms) {
arsenalist 47:97eadcb478b2 2854 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"value\":%.2f,\"type\":%d}",
arsenalist 47:97eadcb478b2 2855 emmaUID.c_str(),hmacTime.c_str(),q,BVrms,alertType);
arsenalist 47:97eadcb478b2 2856 sprintf(s,"POST /%s/api/controller/alert/2 HTTP/1.0\nHost: %s\nContent-Length:%d\n\n%s\r\n\r\n",appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 47:97eadcb478b2 2857 str.clear();
arsenalist 47:97eadcb478b2 2858 str = ethREST(restSERVER,connPort,s);
arsenalist 47:97eadcb478b2 2859 allowAlertBVrms = false;
arsenalist 47:97eadcb478b2 2860 DBG.printf("[ph2]vrms:%s\r\n",str.c_str());
arsenalist 47:97eadcb478b2 2861 } else if(alertType != 0 && wifiConnected && allowAlertBVrms) {
arsenalist 43:612547648ed1 2862 sprintf(p,"/%s/api/controller/alert/2",appNAME.c_str());
arsenalist 47:97eadcb478b2 2863 //DBG.printf("[ph2]:%s\r\n",connBody);
arsenalist 47:97eadcb478b2 2864
arsenalist 47:97eadcb478b2 2865 rxBuf.clear();
arsenalist 47:97eadcb478b2 2866 rest.post(p,connBody);
arsenalist 47:97eadcb478b2 2867 wait(2);
arsenalist 47:97eadcb478b2 2868 str = rxBuf;
arsenalist 47:97eadcb478b2 2869 if(str.rfind("/alert/2") != std::string::npos) {
arsenalist 47:97eadcb478b2 2870 str.erase(str.begin(),str.begin()+str.rfind("/alert/2"));
arsenalist 47:97eadcb478b2 2871 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 47:97eadcb478b2 2872 DBG.printf("[ph2]vrms success\r\n");
arsenalist 47:97eadcb478b2 2873 } else {
arsenalist 47:97eadcb478b2 2874 DBG.printf("[ph2]vrms failed\r\n");
arsenalist 47:97eadcb478b2 2875 }
arsenalist 47:97eadcb478b2 2876 }
arsenalist 47:97eadcb478b2 2877 allowAlertBVrms = false;
arsenalist 47:97eadcb478b2 2878 }
arsenalist 47:97eadcb478b2 2879
arsenalist 47:97eadcb478b2 2880 alertType = 0;
arsenalist 47:97eadcb478b2 2881 if(wattTHL > BWatt) {
arsenalist 47:97eadcb478b2 2882 alertType = 3;
arsenalist 47:97eadcb478b2 2883 } else if (BWatt > wattTHH) {
arsenalist 47:97eadcb478b2 2884 alertType = 4;
arsenalist 47:97eadcb478b2 2885 }
arsenalist 47:97eadcb478b2 2886 if(alertType != 0 && ethConnected && allowAlertBWatt) {
arsenalist 47:97eadcb478b2 2887 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"value\":%.2f,\"type\":%d}",
arsenalist 47:97eadcb478b2 2888 emmaUID.c_str(),hmacTime.c_str(),q,BWatt,alertType);
arsenalist 47:97eadcb478b2 2889 sprintf(s,"POST /%s/api/controller/alert/2 HTTP/1.0\nHost: %s\nContent-Length:%d\n\n%s\r\n\r\n",appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 47:97eadcb478b2 2890 str.clear();
arsenalist 47:97eadcb478b2 2891 str = ethREST(restSERVER,connPort,s);
arsenalist 47:97eadcb478b2 2892 allowAlertBWatt = false;
arsenalist 47:97eadcb478b2 2893 DBG.printf("[ph2]watt:%s\r\n",str.c_str());
arsenalist 47:97eadcb478b2 2894 } else if(alertType != 0 && wifiConnected && allowAlertBWatt) {
arsenalist 47:97eadcb478b2 2895 sprintf(p,"/%s/api/controller/alert/2",appNAME.c_str());
arsenalist 47:97eadcb478b2 2896 //DBG.printf("[ph2]:%s\r\n",connBody);
arsenalist 47:97eadcb478b2 2897
arsenalist 47:97eadcb478b2 2898 rxBuf.clear();
arsenalist 47:97eadcb478b2 2899 rest.post(p,connBody);
arsenalist 4:76ab12e2f8a3 2900 wait(2);
arsenalist 4:76ab12e2f8a3 2901 str = rxBuf;
arsenalist 4:76ab12e2f8a3 2902 if(str.rfind("/alert/2") != std::string::npos) {
arsenalist 4:76ab12e2f8a3 2903 str.erase(str.begin(),str.begin()+str.rfind("/alert/2"));
arsenalist 4:76ab12e2f8a3 2904 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 47:97eadcb478b2 2905 DBG.printf("[ph2]watt success\r\n");
arsenalist 4:76ab12e2f8a3 2906 } else {
arsenalist 47:97eadcb478b2 2907 DBG.printf("[ph2]watt failed\r\n");
arsenalist 4:76ab12e2f8a3 2908 }
arsenalist 4:76ab12e2f8a3 2909 }
arsenalist 47:97eadcb478b2 2910 allowAlertBWatt = false;
arsenalist 4:76ab12e2f8a3 2911 }
arsenalist 4:76ab12e2f8a3 2912
arsenalist 47:97eadcb478b2 2913 alertType = 0;
arsenalist 47:97eadcb478b2 2914 if(vrmsTHL > CVrms) {
arsenalist 47:97eadcb478b2 2915 alertType = 1;
arsenalist 47:97eadcb478b2 2916 } else if (CVrms > vrmsTHH) {
arsenalist 47:97eadcb478b2 2917 alertType = 2;
arsenalist 47:97eadcb478b2 2918 }
arsenalist 47:97eadcb478b2 2919 if(alertType != 0 && ethConnected && allowAlertCVrms) {
arsenalist 47:97eadcb478b2 2920 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"value\":%.2f,\"type\":%d}",
arsenalist 47:97eadcb478b2 2921 emmaUID.c_str(),hmacTime.c_str(),q,CVrms,alertType);
arsenalist 47:97eadcb478b2 2922 sprintf(s,"POST /%s/api/controller/alert/3 HTTP/1.0\nHost: %s\nContent-Length:%d\n\n%s\r\n\r\n",appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 47:97eadcb478b2 2923 str.clear();
arsenalist 47:97eadcb478b2 2924 str = ethREST(restSERVER,connPort,s);
arsenalist 47:97eadcb478b2 2925 allowAlertCVrms = false;
arsenalist 47:97eadcb478b2 2926 DBG.printf("[ph3]vrms:%s\r\n",str.c_str());
arsenalist 47:97eadcb478b2 2927 } else if(alertType != 0 && wifiConnected && allowAlertCVrms) {
arsenalist 43:612547648ed1 2928 sprintf(p,"/%s/api/controller/alert/3",appNAME.c_str());
arsenalist 47:97eadcb478b2 2929 //DBG.printf("[ph3]:%s\r\n",connBody);
arsenalist 47:97eadcb478b2 2930
arsenalist 47:97eadcb478b2 2931 rxBuf.clear();
arsenalist 47:97eadcb478b2 2932 rest.post(p,connBody);
arsenalist 47:97eadcb478b2 2933 wait(2);
arsenalist 47:97eadcb478b2 2934 str = rxBuf;
arsenalist 47:97eadcb478b2 2935 if(str.rfind("/alert/3") != std::string::npos) {
arsenalist 47:97eadcb478b2 2936 str.erase(str.begin(),str.begin()+str.rfind("/alert/3"));
arsenalist 47:97eadcb478b2 2937 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 47:97eadcb478b2 2938 DBG.printf("[ph3]vrms success\r\n");
arsenalist 47:97eadcb478b2 2939 } else {
arsenalist 47:97eadcb478b2 2940 DBG.printf("[ph3]vrms failed\r\n");
arsenalist 47:97eadcb478b2 2941 }
arsenalist 47:97eadcb478b2 2942 }
arsenalist 47:97eadcb478b2 2943 allowAlertCVrms = false;
arsenalist 47:97eadcb478b2 2944 }
arsenalist 47:97eadcb478b2 2945
arsenalist 47:97eadcb478b2 2946 alertType = 0;
arsenalist 47:97eadcb478b2 2947 if(wattTHL > CWatt) {
arsenalist 47:97eadcb478b2 2948 alertType = 3;
arsenalist 47:97eadcb478b2 2949 } else if (CWatt > wattTHH) {
arsenalist 47:97eadcb478b2 2950 alertType = 4;
arsenalist 47:97eadcb478b2 2951 }
arsenalist 47:97eadcb478b2 2952 if(alertType != 0 && ethConnected && allowAlertCWatt) {
arsenalist 47:97eadcb478b2 2953 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"value\":%.2f,\"type\":%d}",
arsenalist 47:97eadcb478b2 2954 emmaUID.c_str(),hmacTime.c_str(),q,CWatt,alertType);
arsenalist 47:97eadcb478b2 2955 sprintf(s,"POST /%s/api/controller/alert/3 HTTP/1.0\nHost: %s\nContent-Length:%d\n\n%s\r\n\r\n",appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 47:97eadcb478b2 2956 str.clear();
arsenalist 47:97eadcb478b2 2957 str = ethREST(restSERVER,connPort,s);
arsenalist 47:97eadcb478b2 2958 allowAlertCWatt = false;
arsenalist 47:97eadcb478b2 2959 DBG.printf("[ph3]watt:%s\r\n",str.c_str());
arsenalist 47:97eadcb478b2 2960 } else if(alertType != 0 && wifiConnected && allowAlertCWatt) {
arsenalist 47:97eadcb478b2 2961 sprintf(p,"/%s/api/controller/alert/3",appNAME.c_str());
arsenalist 47:97eadcb478b2 2962 //DBG.printf("[ph3]:%s\r\n",connBody);
arsenalist 47:97eadcb478b2 2963
arsenalist 47:97eadcb478b2 2964 rxBuf.clear();
arsenalist 47:97eadcb478b2 2965 rest.post(p,connBody);
arsenalist 4:76ab12e2f8a3 2966 wait(2);
arsenalist 4:76ab12e2f8a3 2967 str = rxBuf;
arsenalist 4:76ab12e2f8a3 2968 if(str.rfind("/alert/3") != std::string::npos) {
arsenalist 4:76ab12e2f8a3 2969 str.erase(str.begin(),str.begin()+str.rfind("/alert/3"));
arsenalist 4:76ab12e2f8a3 2970 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 47:97eadcb478b2 2971 DBG.printf("[ph3]watt success\r\n");
arsenalist 4:76ab12e2f8a3 2972 } else {
arsenalist 47:97eadcb478b2 2973 DBG.printf("[ph3]watt failed\r\n");
arsenalist 4:76ab12e2f8a3 2974 }
arsenalist 4:76ab12e2f8a3 2975 }
arsenalist 47:97eadcb478b2 2976 allowAlertCWatt = false;
arsenalist 4:76ab12e2f8a3 2977 }
arsenalist 4:76ab12e2f8a3 2978 //DBG.printf("checkVoltagePower-finish\r\n");
arsenalist 4:76ab12e2f8a3 2979 }
arsenalist 47:97eadcb478b2 2980
arsenalist 47:97eadcb478b2 2981 /*
arsenalist 47:97eadcb478b2 2982 void checkVoltagePower(void) {
arsenalist 47:97eadcb478b2 2983 //check if voltage or power violates threshold
arsenalist 47:97eadcb478b2 2984 char connBody[256];
arsenalist 47:97eadcb478b2 2985 char p[64];
arsenalist 47:97eadcb478b2 2986 char q[32];
arsenalist 47:97eadcb478b2 2987 char s[256];
arsenalist 47:97eadcb478b2 2988 int connBodyLen=0;
arsenalist 47:97eadcb478b2 2989 int connPort=0;
arsenalist 47:97eadcb478b2 2990 string hmacTime;
arsenalist 47:97eadcb478b2 2991 string str;
arsenalist 47:97eadcb478b2 2992 time_t seconds;
arsenalist 47:97eadcb478b2 2993
arsenalist 47:97eadcb478b2 2994 //DBG.printf("checkVoltagePower-start\r\n");
arsenalist 47:97eadcb478b2 2995
arsenalist 47:97eadcb478b2 2996 //vrms and irms should be placed inside energy calculation routine
arsenalist 47:97eadcb478b2 2997
arsenalist 47:97eadcb478b2 2998 //get time
arsenalist 47:97eadcb478b2 2999 seconds = time(NULL);
arsenalist 47:97eadcb478b2 3000 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 47:97eadcb478b2 3001
arsenalist 47:97eadcb478b2 3002 //calculate hmacTime
arsenalist 47:97eadcb478b2 3003 sprintf(p,"emma-%s-%s",emmaUID.c_str(),q);
arsenalist 47:97eadcb478b2 3004 hmacTime = calculateMD5(p);
arsenalist 47:97eadcb478b2 3005
arsenalist 47:97eadcb478b2 3006 if(AVrms > vrmsTHH || AWatt > wattTHH) {
arsenalist 47:97eadcb478b2 3007 DBG.printf("alert on ch1\r\n");
arsenalist 47:97eadcb478b2 3008
arsenalist 47:97eadcb478b2 3009 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"voltage\":%.2f,\"power\":%.2f}",
arsenalist 47:97eadcb478b2 3010 emmaUID.c_str(),hmacTime.c_str(),q,AVrms,AWatt);
arsenalist 47:97eadcb478b2 3011 sprintf(s,"POST /%s/api/controller/alert/1 HTTP/1.0\nHost: %s\nContent-Length:%d\n\n%s\r\n\r\n",appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 47:97eadcb478b2 3012 DBG.printf("ch1req:%s\r\n",s);
arsenalist 47:97eadcb478b2 3013 sscanf(restPORT.c_str(),"%d",&connPort);
arsenalist 47:97eadcb478b2 3014 str.clear();
arsenalist 47:97eadcb478b2 3015 str = ethREST(restSERVER,connPort,s);
arsenalist 47:97eadcb478b2 3016 DBG.printf("ch1:%s\r\n",str.c_str());
arsenalist 47:97eadcb478b2 3017
arsenalist 47:97eadcb478b2 3018
arsenalist 47:97eadcb478b2 3019 //sprintf(s,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"voltage\":%.2f,\"power\":%.2f}",
arsenalist 47:97eadcb478b2 3020 //emmaUID.c_str(),hmacTime.c_str(),q,AVrms,AWatt);
arsenalist 47:97eadcb478b2 3021
arsenalist 47:97eadcb478b2 3022 //sprintf(p,"/%s/api/controller/alert/1",appNAME.c_str());
arsenalist 47:97eadcb478b2 3023 //DBG.printf("ch1:%s\r\n",s);
arsenalist 47:97eadcb478b2 3024
arsenalist 47:97eadcb478b2 3025 //rest.post(p,s);
arsenalist 47:97eadcb478b2 3026 //wait(2);
arsenalist 47:97eadcb478b2 3027 //str = rxBuf;
arsenalist 47:97eadcb478b2 3028 //if(str.rfind("/alert/1") != std::string::npos) {
arsenalist 47:97eadcb478b2 3029 // str.erase(str.begin(),str.begin()+str.rfind("/alert/1"));
arsenalist 47:97eadcb478b2 3030 // if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 47:97eadcb478b2 3031 // DBG.printf("send alert ch1 success\r\n");
arsenalist 47:97eadcb478b2 3032 // } else {
arsenalist 47:97eadcb478b2 3033 // DBG.printf("send alert ch1 failed\r\n");
arsenalist 47:97eadcb478b2 3034 // }
arsenalist 47:97eadcb478b2 3035 //}
arsenalist 47:97eadcb478b2 3036
arsenalist 47:97eadcb478b2 3037
arsenalist 47:97eadcb478b2 3038 }
arsenalist 47:97eadcb478b2 3039
arsenalist 47:97eadcb478b2 3040 if(BVrms > vrmsTHH || BWatt > wattTHH) {
arsenalist 47:97eadcb478b2 3041 DBG.printf("alert on ch2\r\n");
arsenalist 47:97eadcb478b2 3042
arsenalist 47:97eadcb478b2 3043 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"voltage\":%.2f,\"power\":%.2f}",
arsenalist 47:97eadcb478b2 3044 emmaUID.c_str(),hmacTime.c_str(),q,BVrms,BWatt);
arsenalist 47:97eadcb478b2 3045 sprintf(s,"POST /%s/api/controller/alert/2 HTTP/1.0\nHost: %s\nContent-Length:%d\n\n%s\r\n\r\n",appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 47:97eadcb478b2 3046 DBG.printf("ch2req:%s\r\n",s);
arsenalist 47:97eadcb478b2 3047 sscanf(restPORT.c_str(),"%d",&connPort);
arsenalist 47:97eadcb478b2 3048 str.clear();
arsenalist 47:97eadcb478b2 3049 str = ethREST(restSERVER,connPort,s);
arsenalist 47:97eadcb478b2 3050 DBG.printf("ch2:%s\r\n",str.c_str());
arsenalist 47:97eadcb478b2 3051
arsenalist 47:97eadcb478b2 3052
arsenalist 47:97eadcb478b2 3053 //sprintf(s,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"voltage\":%.2f,\"power\":%.2f}",
arsenalist 47:97eadcb478b2 3054 //emmaUID.c_str(),hmacTime.c_str(),q,BVrms,BWatt);
arsenalist 47:97eadcb478b2 3055
arsenalist 47:97eadcb478b2 3056 //sprintf(p,"/%s/api/controller/alert/2",appNAME.c_str());
arsenalist 47:97eadcb478b2 3057 //DBG.printf("ch2:%s\r\n",s);
arsenalist 47:97eadcb478b2 3058
arsenalist 47:97eadcb478b2 3059 //rest.post(p,s);
arsenalist 47:97eadcb478b2 3060 //wait(2);
arsenalist 47:97eadcb478b2 3061 //str = rxBuf;
arsenalist 47:97eadcb478b2 3062 //if(str.rfind("/alert/2") != std::string::npos) {
arsenalist 47:97eadcb478b2 3063 // str.erase(str.begin(),str.begin()+str.rfind("/alert/2"));
arsenalist 47:97eadcb478b2 3064 // if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 47:97eadcb478b2 3065 // DBG.printf("send alert ch2 success\r\n");
arsenalist 47:97eadcb478b2 3066 // } else {
arsenalist 47:97eadcb478b2 3067 // DBG.printf("send alert ch2 failed\r\n");
arsenalist 47:97eadcb478b2 3068 // }
arsenalist 47:97eadcb478b2 3069 //}
arsenalist 47:97eadcb478b2 3070
arsenalist 47:97eadcb478b2 3071
arsenalist 47:97eadcb478b2 3072 }
arsenalist 47:97eadcb478b2 3073
arsenalist 47:97eadcb478b2 3074 if(CVrms > vrmsTHH || CWatt > wattTHH) {
arsenalist 47:97eadcb478b2 3075 DBG.printf("alert on ch3\r\n");
arsenalist 47:97eadcb478b2 3076
arsenalist 47:97eadcb478b2 3077 connBodyLen = sprintf(connBody,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"voltage\":%.2f,\"power\":%.2f}",
arsenalist 47:97eadcb478b2 3078 emmaUID.c_str(),hmacTime.c_str(),q,CVrms,CWatt);
arsenalist 47:97eadcb478b2 3079 sprintf(s,"POST /%s/api/controller/alert/3 HTTP/1.0\nHost: %s\nContent-Length:%d\n\n%s\r\n\r\n",appNAME.c_str(),restSERVER.c_str(),connBodyLen,connBody);
arsenalist 47:97eadcb478b2 3080 DBG.printf("ch3req:%s\r\n",s);
arsenalist 47:97eadcb478b2 3081 sscanf(restPORT.c_str(),"%d",&connPort);
arsenalist 47:97eadcb478b2 3082 str.clear();
arsenalist 47:97eadcb478b2 3083 str = ethREST(restSERVER,connPort,s);
arsenalist 47:97eadcb478b2 3084 DBG.printf("ch3:%s\r\n",str.c_str());
arsenalist 47:97eadcb478b2 3085
arsenalist 47:97eadcb478b2 3086
arsenalist 47:97eadcb478b2 3087 //sprintf(s,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"voltage\":%.2f,\"power\":%.2f}",
arsenalist 47:97eadcb478b2 3088 //emmaUID.c_str(),hmacTime.c_str(),q,CVrms,CWatt);
arsenalist 47:97eadcb478b2 3089
arsenalist 47:97eadcb478b2 3090 //sprintf(p,"/%s/api/controller/alert/3",appNAME.c_str());
arsenalist 47:97eadcb478b2 3091 //DBG.printf("ch3:%s\r\n",s);
arsenalist 47:97eadcb478b2 3092
arsenalist 47:97eadcb478b2 3093 //rest.post(p,s);
arsenalist 47:97eadcb478b2 3094 //wait(2);
arsenalist 47:97eadcb478b2 3095 //str = rxBuf;
arsenalist 47:97eadcb478b2 3096 //if(str.rfind("/alert/3") != std::string::npos) {
arsenalist 47:97eadcb478b2 3097 // str.erase(str.begin(),str.begin()+str.rfind("/alert/3"));
arsenalist 47:97eadcb478b2 3098 // if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 47:97eadcb478b2 3099 // DBG.printf("send alert ch3 success\r\n");
arsenalist 47:97eadcb478b2 3100 // } else {
arsenalist 47:97eadcb478b2 3101 // DBG.printf("send alert ch3 failed\r\n");
arsenalist 47:97eadcb478b2 3102 // }
arsenalist 47:97eadcb478b2 3103 //}
arsenalist 47:97eadcb478b2 3104
arsenalist 47:97eadcb478b2 3105
arsenalist 47:97eadcb478b2 3106 }
arsenalist 47:97eadcb478b2 3107 //DBG.printf("checkVoltagePower-finish\r\n");
arsenalist 47:97eadcb478b2 3108 }
arsenalist 47:97eadcb478b2 3109 */
arsenalist 4:76ab12e2f8a3 3110 /*end energy related*/
arsenalist 0:f4e449fa34d7 3111
arsenalist 0:f4e449fa34d7 3112 /*start wifi mqtt*/
arsenalist 0:f4e449fa34d7 3113 void mqttConnected(void* response) {
arsenalist 1:d314a43ae6f7 3114 DBG.printf("MQTT Connected\r\n");
arsenalist 0:f4e449fa34d7 3115 char mqttTopic[64];
arsenalist 38:e44f35f8129d 3116 sprintf(mqttTopic,"%s/%s/command",mqttDOMAIN.c_str(),emmaUID.c_str());
arsenalist 27:562a95c120cc 3117 //mqtt.subscribe(mqttTopic);
arsenalist 0:f4e449fa34d7 3118 }
arsenalist 0:f4e449fa34d7 3119 void mqttDisconnected(void* response) {
arsenalist 1:d314a43ae6f7 3120 DBG.printf("MQTT Disconnected\r\n");
arsenalist 0:f4e449fa34d7 3121 }
arsenalist 0:f4e449fa34d7 3122 /*end wifi mqtt*/
arsenalist 0:f4e449fa34d7 3123
arsenalist 0:f4e449fa34d7 3124 /*start wifi rest*/
arsenalist 27:562a95c120cc 3125 void wifiCb(void* response) {
arsenalist 27:562a95c120cc 3126 uint32_t status;
arsenalist 27:562a95c120cc 3127 RESPONSE res(response);
arsenalist 27:562a95c120cc 3128
arsenalist 27:562a95c120cc 3129 if(res.getArgc() == 1) {
arsenalist 27:562a95c120cc 3130 res.popArgs((uint8_t*)&status,4);
arsenalist 27:562a95c120cc 3131 if(status == STATION_GOT_IP) {
arsenalist 27:562a95c120cc 3132 DBG.printf("WIFI Connected\r\n");
arsenalist 27:562a95c120cc 3133 //wifiConnected = true;
arsenalist 27:562a95c120cc 3134 }
arsenalist 27:562a95c120cc 3135 else {
arsenalist 27:562a95c120cc 3136 //wifiConnected = false;
arsenalist 27:562a95c120cc 3137 }
arsenalist 27:562a95c120cc 3138 }
arsenalist 27:562a95c120cc 3139 }
arsenalist 27:562a95c120cc 3140
arsenalist 4:76ab12e2f8a3 3141 void rxInterrupt(void) {
arsenalist 4:76ab12e2f8a3 3142 char c;
arsenalist 4:76ab12e2f8a3 3143
arsenalist 4:76ab12e2f8a3 3144 while(_ESP.readable()) {
arsenalist 4:76ab12e2f8a3 3145 c = _ESP.getc();
arsenalist 4:76ab12e2f8a3 3146 if(c != 0) { //char is not null
arsenalist 4:76ab12e2f8a3 3147 rxBuf += c;
arsenalist 4:76ab12e2f8a3 3148 }
arsenalist 4:76ab12e2f8a3 3149 }
arsenalist 4:76ab12e2f8a3 3150 }
arsenalist 4:76ab12e2f8a3 3151 void checkRxBuffer(void) {
arsenalist 4:76ab12e2f8a3 3152 //check new command
arsenalist 4:76ab12e2f8a3 3153 if(rxBuf.rfind("/command") != std::string::npos) {
arsenalist 4:76ab12e2f8a3 3154 rxBuf.erase(rxBuf.begin(),rxBuf.begin()+rxBuf.rfind("/command"));
arsenalist 41:2d023bd80a9c 3155 if(rxBuf.find("[{") != std::string::npos && rxBuf.rfind("}]") != std::string::npos) {
arsenalist 41:2d023bd80a9c 3156 rxBuf.erase(rxBuf.begin(),rxBuf.begin()+rxBuf.find("[{"));
arsenalist 41:2d023bd80a9c 3157 rxBuf.erase(rxBuf.begin()+rxBuf.rfind("}]")+2,rxBuf.end());
arsenalist 41:2d023bd80a9c 3158
arsenalist 41:2d023bd80a9c 3159 //start special handler
arsenalist 41:2d023bd80a9c 3160 while(1){
arsenalist 41:2d023bd80a9c 3161 if(rxBuf.find("}],") != std::string::npos) {
arsenalist 41:2d023bd80a9c 3162 rxBuf.erase(rxBuf.begin()+rxBuf.find("}],")+1,rxBuf.begin()+rxBuf.find("}],")+2);
arsenalist 41:2d023bd80a9c 3163 } else {
arsenalist 41:2d023bd80a9c 3164 break;
arsenalist 41:2d023bd80a9c 3165 }
arsenalist 41:2d023bd80a9c 3166 }
arsenalist 41:2d023bd80a9c 3167 //end special handler
arsenalist 41:2d023bd80a9c 3168
arsenalist 4:76ab12e2f8a3 3169 globalCommand = rxBuf;
arsenalist 4:76ab12e2f8a3 3170 newCommand = true;
arsenalist 4:76ab12e2f8a3 3171 }
arsenalist 4:76ab12e2f8a3 3172 }
arsenalist 4:76ab12e2f8a3 3173
arsenalist 24:5d58515ba510 3174 //check free memory -> reinitialize mqtt connection
arsenalist 27:562a95c120cc 3175 if(rxBuf.rfind("Free memory") != std::string::npos) {
arsenalist 27:562a95c120cc 3176 rxLog = "Free memory-" + rxBuf;
arsenalist 24:5d58515ba510 3177 espFreeMemory = true;
arsenalist 24:5d58515ba510 3178 }
arsenalist 24:5d58515ba510 3179
arsenalist 27:562a95c120cc 3180 //check dhcp client start -> initialize all connection
arsenalist 27:562a95c120cc 3181 if(rxBuf.rfind("dhcp client start") != std::string::npos) {
arsenalist 27:562a95c120cc 3182 rxLogA = "dhcp client start-" + rxBuf;
arsenalist 27:562a95c120cc 3183 espDHCPClientStart = true;
arsenalist 27:562a95c120cc 3184 }
arsenalist 27:562a95c120cc 3185
arsenalist 4:76ab12e2f8a3 3186 //clear rxBuf
arsenalist 4:76ab12e2f8a3 3187 rxBuf.clear();
arsenalist 4:76ab12e2f8a3 3188 }
arsenalist 0:f4e449fa34d7 3189 /*end wifi rest*/
arsenalist 0:f4e449fa34d7 3190
arsenalist 0:f4e449fa34d7 3191 /*start emma settings*/
arsenalist 0:f4e449fa34d7 3192 string getUID(void) {
arsenalist 0:f4e449fa34d7 3193 char s[32];
arsenalist 0:f4e449fa34d7 3194 unsigned long *unique = (unsigned long *)BASE_ADDR;
arsenalist 0:f4e449fa34d7 3195 sprintf(s,"%08x%08x%08x",unique[0], unique[1], unique[2]);
arsenalist 0:f4e449fa34d7 3196 return s;
arsenalist 0:f4e449fa34d7 3197 }
arsenalist 0:f4e449fa34d7 3198
arsenalist 0:f4e449fa34d7 3199 string readSetting(string parameter) {
arsenalist 0:f4e449fa34d7 3200 FILE *fp;
arsenalist 0:f4e449fa34d7 3201 signed char c;
arsenalist 0:f4e449fa34d7 3202 int i=0;
arsenalist 0:f4e449fa34d7 3203 char s[64];
arsenalist 0:f4e449fa34d7 3204 string strS;
arsenalist 0:f4e449fa34d7 3205
arsenalist 0:f4e449fa34d7 3206 sprintf(s,"/sd/settings/%s.txt",parameter.c_str());
arsenalist 0:f4e449fa34d7 3207
arsenalist 0:f4e449fa34d7 3208 fp = fopen(s,"r");
arsenalist 0:f4e449fa34d7 3209 memset(s,0,sizeof(s));
arsenalist 0:f4e449fa34d7 3210 if(fp != NULL) {
arsenalist 0:f4e449fa34d7 3211 while(1) {
arsenalist 0:f4e449fa34d7 3212 c = fgetc(fp);
arsenalist 0:f4e449fa34d7 3213 if(c == EOF){
arsenalist 0:f4e449fa34d7 3214 break;
arsenalist 0:f4e449fa34d7 3215 }
arsenalist 0:f4e449fa34d7 3216 s[i] = c;
arsenalist 0:f4e449fa34d7 3217 i++;
arsenalist 0:f4e449fa34d7 3218 }
arsenalist 0:f4e449fa34d7 3219 strS = s;
arsenalist 0:f4e449fa34d7 3220 if(strS.find("(") != std::string::npos && strS.find(")") != std::string::npos) {
arsenalist 0:f4e449fa34d7 3221 strS.erase(strS.begin(),strS.begin()+strS.find("(")+1);
arsenalist 0:f4e449fa34d7 3222 strS.erase(strS.begin()+strS.find(")"),strS.end());
arsenalist 0:f4e449fa34d7 3223 } else {
arsenalist 0:f4e449fa34d7 3224 strS = "";
arsenalist 0:f4e449fa34d7 3225 }
arsenalist 0:f4e449fa34d7 3226 }
arsenalist 0:f4e449fa34d7 3227 fclose(fp);
arsenalist 30:08d290158fa7 3228 free(fp);
arsenalist 0:f4e449fa34d7 3229 return strS;
arsenalist 0:f4e449fa34d7 3230 }
arsenalist 0:f4e449fa34d7 3231
arsenalist 0:f4e449fa34d7 3232 bool writeSetting(string parameter, string value) {
arsenalist 0:f4e449fa34d7 3233 FILE *fp;
arsenalist 0:f4e449fa34d7 3234 char s[255];
arsenalist 0:f4e449fa34d7 3235
arsenalist 0:f4e449fa34d7 3236 sprintf(s,"/sd/settings/%s.txt",parameter.c_str());
arsenalist 0:f4e449fa34d7 3237 fp = fopen(s,"w");
arsenalist 0:f4e449fa34d7 3238 if(fp != NULL) {
arsenalist 0:f4e449fa34d7 3239 fprintf(fp,value.c_str());
arsenalist 0:f4e449fa34d7 3240 fclose(fp);
arsenalist 30:08d290158fa7 3241 free(fp);
arsenalist 0:f4e449fa34d7 3242 return true;
arsenalist 0:f4e449fa34d7 3243 }
arsenalist 30:08d290158fa7 3244 fclose(fp);
arsenalist 30:08d290158fa7 3245 free(fp);
arsenalist 0:f4e449fa34d7 3246 return false;
arsenalist 0:f4e449fa34d7 3247 }
arsenalist 0:f4e449fa34d7 3248 /*end emma settings*/
arsenalist 0:f4e449fa34d7 3249
arsenalist 0:f4e449fa34d7 3250 /*start emma node*/
arsenalist 0:f4e449fa34d7 3251 string readNodeIP(string macAddr) {
arsenalist 0:f4e449fa34d7 3252 FILE *fp;
arsenalist 0:f4e449fa34d7 3253 signed char c;
arsenalist 0:f4e449fa34d7 3254 int i=0;
arsenalist 0:f4e449fa34d7 3255 char s[64];
arsenalist 0:f4e449fa34d7 3256 string strS;
arsenalist 0:f4e449fa34d7 3257
arsenalist 0:f4e449fa34d7 3258 sprintf(s,"/sd/nodeList/%s/nodeIP.txt",macAddr.c_str());
arsenalist 0:f4e449fa34d7 3259
arsenalist 0:f4e449fa34d7 3260 fp = fopen(s,"r");
arsenalist 0:f4e449fa34d7 3261 memset(s,0,sizeof(s));
arsenalist 0:f4e449fa34d7 3262 if(fp != NULL) {
arsenalist 0:f4e449fa34d7 3263 while(1) {
arsenalist 0:f4e449fa34d7 3264 c = fgetc(fp);
arsenalist 0:f4e449fa34d7 3265 if(c == EOF){
arsenalist 0:f4e449fa34d7 3266 break;
arsenalist 0:f4e449fa34d7 3267 }
arsenalist 0:f4e449fa34d7 3268 s[i] = c;
arsenalist 0:f4e449fa34d7 3269 i++;
arsenalist 0:f4e449fa34d7 3270 }
arsenalist 0:f4e449fa34d7 3271 strS = s;
arsenalist 0:f4e449fa34d7 3272 if(strS.find("(") != std::string::npos && strS.find(")") != std::string::npos) {
arsenalist 0:f4e449fa34d7 3273 strS.erase(strS.begin(),strS.begin()+strS.find("(")+1);
arsenalist 0:f4e449fa34d7 3274 strS.erase(strS.begin()+strS.find(")"),strS.end());
arsenalist 0:f4e449fa34d7 3275 } else {
arsenalist 0:f4e449fa34d7 3276 strS = "";
arsenalist 0:f4e449fa34d7 3277 }
arsenalist 0:f4e449fa34d7 3278 }
arsenalist 0:f4e449fa34d7 3279 fclose(fp);
arsenalist 30:08d290158fa7 3280 free(fp);
arsenalist 0:f4e449fa34d7 3281 return strS;
arsenalist 0:f4e449fa34d7 3282 }
arsenalist 0:f4e449fa34d7 3283
arsenalist 0:f4e449fa34d7 3284 string readNodeCmd(string dType, string cmd) {
arsenalist 0:f4e449fa34d7 3285 FILE *fp;
arsenalist 0:f4e449fa34d7 3286 signed char c;
arsenalist 0:f4e449fa34d7 3287 int i=0;
arsenalist 34:8555d471b880 3288 char s[2048];
arsenalist 0:f4e449fa34d7 3289 string strS;
arsenalist 0:f4e449fa34d7 3290
arsenalist 0:f4e449fa34d7 3291 sprintf(s,"/sd/nodeCode/%s/%s.txt",dType.c_str(),cmd.c_str());
arsenalist 0:f4e449fa34d7 3292
arsenalist 0:f4e449fa34d7 3293 fp = fopen(s,"r");
arsenalist 0:f4e449fa34d7 3294 memset(s,0,sizeof(s));
arsenalist 0:f4e449fa34d7 3295 if(fp != NULL) {
arsenalist 0:f4e449fa34d7 3296 while(1) {
arsenalist 0:f4e449fa34d7 3297 c = fgetc(fp);
arsenalist 0:f4e449fa34d7 3298 if(c == EOF){
arsenalist 0:f4e449fa34d7 3299 break;
arsenalist 0:f4e449fa34d7 3300 }
arsenalist 0:f4e449fa34d7 3301 s[i] = c;
arsenalist 0:f4e449fa34d7 3302 i++;
arsenalist 0:f4e449fa34d7 3303 }
arsenalist 0:f4e449fa34d7 3304 strS = s;
arsenalist 0:f4e449fa34d7 3305 if(strS.find("(") != std::string::npos && strS.find(")") != std::string::npos) {
arsenalist 0:f4e449fa34d7 3306 strS.erase(strS.begin(),strS.begin()+strS.find("(")+1);
arsenalist 0:f4e449fa34d7 3307 strS.erase(strS.begin()+strS.find(")"),strS.end());
arsenalist 0:f4e449fa34d7 3308 } else {
arsenalist 0:f4e449fa34d7 3309 strS = "";
arsenalist 0:f4e449fa34d7 3310 }
arsenalist 0:f4e449fa34d7 3311 }
arsenalist 0:f4e449fa34d7 3312 fclose(fp);
arsenalist 30:08d290158fa7 3313 free(fp);
arsenalist 0:f4e449fa34d7 3314 return strS;
arsenalist 0:f4e449fa34d7 3315 }
arsenalist 0:f4e449fa34d7 3316
arsenalist 0:f4e449fa34d7 3317 string *readNodeList(void) {
arsenalist 0:f4e449fa34d7 3318 static string nd[10]; //max node
arsenalist 0:f4e449fa34d7 3319 DIR *d;
arsenalist 0:f4e449fa34d7 3320 struct dirent *p;
arsenalist 0:f4e449fa34d7 3321 string q;
arsenalist 0:f4e449fa34d7 3322 int i=0;
arsenalist 0:f4e449fa34d7 3323
arsenalist 0:f4e449fa34d7 3324 d = opendir("/sd/nodeList");
arsenalist 0:f4e449fa34d7 3325 if(d != NULL) {
arsenalist 0:f4e449fa34d7 3326 while((p = readdir(d)) != NULL) {
arsenalist 0:f4e449fa34d7 3327 q = p->d_name;
arsenalist 0:f4e449fa34d7 3328 nd[i] = q;
arsenalist 0:f4e449fa34d7 3329 i++;
arsenalist 0:f4e449fa34d7 3330 }
arsenalist 0:f4e449fa34d7 3331 }
arsenalist 0:f4e449fa34d7 3332 closedir(d);
arsenalist 30:08d290158fa7 3333 free(d);
arsenalist 0:f4e449fa34d7 3334 return nd;
arsenalist 0:f4e449fa34d7 3335 }
arsenalist 0:f4e449fa34d7 3336
arsenalist 0:f4e449fa34d7 3337 string wifiGetNodeTemp(string macAddr) {
arsenalist 0:f4e449fa34d7 3338 int trial=0;
arsenalist 0:f4e449fa34d7 3339 string nodeIP = readNodeIP(macAddr);
arsenalist 0:f4e449fa34d7 3340 string str;
arsenalist 0:f4e449fa34d7 3341 string temp = "0";
arsenalist 0:f4e449fa34d7 3342
arsenalist 0:f4e449fa34d7 3343 if(rest.begin(nodeIP.c_str(),REMOTE_TCP_PORT,false)) {
arsenalist 0:f4e449fa34d7 3344 while(1) {
arsenalist 0:f4e449fa34d7 3345 char rcv[256] = {};
arsenalist 0:f4e449fa34d7 3346 rest.get("/","<?xml version=\"1.0\" encoding=\"utf-8\"?><app_cmd cmd=\"2\"/>\r\n");
arsenalist 0:f4e449fa34d7 3347 rest.getResponse(rcv,sizeof(rcv));
arsenalist 0:f4e449fa34d7 3348 str = rcv;
arsenalist 0:f4e449fa34d7 3349 if(str.find("temp=") != std::string::npos) {
arsenalist 0:f4e449fa34d7 3350 str.erase(str.begin(),str.begin()+str.find("temp=")+6);
arsenalist 0:f4e449fa34d7 3351 str.erase(str.begin()+str.find("\""),str.end());
arsenalist 0:f4e449fa34d7 3352 temp = str;
arsenalist 0:f4e449fa34d7 3353 break;
arsenalist 0:f4e449fa34d7 3354 }
arsenalist 0:f4e449fa34d7 3355 if(trial>1) { //three times trial
arsenalist 0:f4e449fa34d7 3356 break;
arsenalist 0:f4e449fa34d7 3357 }
arsenalist 0:f4e449fa34d7 3358 trial++;
arsenalist 0:f4e449fa34d7 3359 wait(2);
arsenalist 0:f4e449fa34d7 3360 }
arsenalist 0:f4e449fa34d7 3361 }
arsenalist 0:f4e449fa34d7 3362 return temp;
arsenalist 0:f4e449fa34d7 3363 }
arsenalist 0:f4e449fa34d7 3364 /*end emma node*/
arsenalist 0:f4e449fa34d7 3365
arsenalist 0:f4e449fa34d7 3366 /*start emma connection function*/
arsenalist 40:77bd44f57ad3 3367 string ethREST(string host, int port, string data) {
arsenalist 0:f4e449fa34d7 3368 char buf[1024];
arsenalist 0:f4e449fa34d7 3369 char s[256];
arsenalist 45:2406c2b6995a 3370 int ret=99;
arsenalist 45:2406c2b6995a 3371 Timer t;
arsenalist 45:2406c2b6995a 3372
arsenalist 45:2406c2b6995a 3373 t.start();
arsenalist 45:2406c2b6995a 3374 while(eth.linkstatus() && t.read() < 5 && ret !=0) {
arsenalist 45:2406c2b6995a 3375 ret = sock.connect(host.c_str(),port);
arsenalist 45:2406c2b6995a 3376 }
arsenalist 45:2406c2b6995a 3377 t.stop();
arsenalist 45:2406c2b6995a 3378 t.reset();
arsenalist 44:c1d11c491237 3379
arsenalist 45:2406c2b6995a 3380 memset(buf,0,sizeof(buf));
arsenalist 45:2406c2b6995a 3381 if(sock.is_connected()) {
arsenalist 45:2406c2b6995a 3382 DBG.printf("sockConnect\r\n");
arsenalist 45:2406c2b6995a 3383 sprintf(s,"%s",data.c_str());
arsenalist 45:2406c2b6995a 3384 sock.send_all(s,sizeof(s)-1);
arsenalist 45:2406c2b6995a 3385 //wait(2);
arsenalist 45:2406c2b6995a 3386 wait(0.5);
arsenalist 45:2406c2b6995a 3387
arsenalist 45:2406c2b6995a 3388 //receive return
arsenalist 45:2406c2b6995a 3389 t.start();
arsenalist 45:2406c2b6995a 3390 while(1) {
arsenalist 45:2406c2b6995a 3391 ret = sock.receive(buf, sizeof(buf));
arsenalist 45:2406c2b6995a 3392 if(ret<=0 || t.read() > 5) {
arsenalist 45:2406c2b6995a 3393 t.stop();
arsenalist 45:2406c2b6995a 3394 t.reset();
arsenalist 45:2406c2b6995a 3395 break;
arsenalist 45:2406c2b6995a 3396 }
arsenalist 45:2406c2b6995a 3397 }
arsenalist 45:2406c2b6995a 3398 sock.close();
arsenalist 45:2406c2b6995a 3399 } else {
arsenalist 45:2406c2b6995a 3400 DBG.printf("sockNotConnect\r\n");
arsenalist 45:2406c2b6995a 3401 }
arsenalist 45:2406c2b6995a 3402 return buf;
arsenalist 45:2406c2b6995a 3403
arsenalist 45:2406c2b6995a 3404 /*
arsenalist 44:c1d11c491237 3405 //eth.init(); //use DHCP
arsenalist 44:c1d11c491237 3406 eth.connect();
arsenalist 44:c1d11c491237 3407
arsenalist 45:2406c2b6995a 3408 //TCPSocketConnection sock;
arsenalist 0:f4e449fa34d7 3409 Timer t;
arsenalist 0:f4e449fa34d7 3410
arsenalist 40:77bd44f57ad3 3411 sprintf(s,"%s",data.c_str());
arsenalist 0:f4e449fa34d7 3412 sock.connect(host.c_str(),port);
arsenalist 0:f4e449fa34d7 3413 sock.send_all(s,sizeof(s)-1);
arsenalist 0:f4e449fa34d7 3414 wait(2);
arsenalist 0:f4e449fa34d7 3415
arsenalist 0:f4e449fa34d7 3416 //receive return
arsenalist 0:f4e449fa34d7 3417 t.start();
arsenalist 0:f4e449fa34d7 3418 while(1) {
arsenalist 0:f4e449fa34d7 3419 ret = sock.receive(buf, sizeof(buf));
arsenalist 0:f4e449fa34d7 3420 if(ret<=0 || t.read_ms() > 10000) {
arsenalist 0:f4e449fa34d7 3421 t.stop();
arsenalist 0:f4e449fa34d7 3422 break;
arsenalist 0:f4e449fa34d7 3423 }
arsenalist 0:f4e449fa34d7 3424 }
arsenalist 0:f4e449fa34d7 3425 sock.close();
arsenalist 44:c1d11c491237 3426 eth.disconnect();
arsenalist 0:f4e449fa34d7 3427 return buf;
arsenalist 45:2406c2b6995a 3428 */
arsenalist 0:f4e449fa34d7 3429 }
arsenalist 0:f4e449fa34d7 3430 /*end emma connection function*/
arsenalist 0:f4e449fa34d7 3431
arsenalist 0:f4e449fa34d7 3432 /*start emma private function*/
arsenalist 8:51a0ca9079ca 3433 void isEthAvailable(void) {
arsenalist 44:c1d11c491237 3434 //if(ipstack.getEth().linkstatus()) {
arsenalist 44:c1d11c491237 3435 if(eth.linkstatus()) {
arsenalist 8:51a0ca9079ca 3436 ethAvailable = true;
arsenalist 8:51a0ca9079ca 3437 } else {
arsenalist 8:51a0ca9079ca 3438 ethAvailable = false;
arsenalist 8:51a0ca9079ca 3439 }
arsenalist 8:51a0ca9079ca 3440 }
arsenalist 8:51a0ca9079ca 3441
arsenalist 8:51a0ca9079ca 3442 void isEthConnected(void) {
arsenalist 8:51a0ca9079ca 3443 char s[512];
arsenalist 8:51a0ca9079ca 3444 int connPort;
arsenalist 8:51a0ca9079ca 3445 string connHost;
arsenalist 8:51a0ca9079ca 3446 string str;
arsenalist 8:51a0ca9079ca 3447 Timer t;
arsenalist 8:51a0ca9079ca 3448
arsenalist 45:2406c2b6995a 3449 eth.init(); //init ethernet
arsenalist 45:2406c2b6995a 3450 eth.connect();
arsenalist 45:2406c2b6995a 3451
arsenalist 8:51a0ca9079ca 3452 if(ethAvailable) {
arsenalist 8:51a0ca9079ca 3453 if(useProxy) {
arsenalist 8:51a0ca9079ca 3454 connHost = proxySERVER;
arsenalist 8:51a0ca9079ca 3455 sscanf(proxyPORT.c_str(),"%d",&connPort);
arsenalist 44:c1d11c491237 3456 //for(int i=0; i<sizeof(s); i++) {
arsenalist 44:c1d11c491237 3457 // s[i]=0; }
arsenalist 43:612547648ed1 3458 sprintf(s,"GET http://%s:%s/%s/api/controller/test HTTP/1.0\nHost: %s\r\n\r\n",restSERVER.c_str(),restPORT.c_str(),appNAME.c_str(),restSERVER.c_str());
arsenalist 8:51a0ca9079ca 3459 } else {
arsenalist 38:e44f35f8129d 3460 connHost = restSERVER;
arsenalist 38:e44f35f8129d 3461 sscanf(restPORT.c_str(),"%d",&connPort);
arsenalist 44:c1d11c491237 3462 //for(int i=0; i<sizeof(s); i++) {
arsenalist 44:c1d11c491237 3463 // s[i]=0; }
arsenalist 43:612547648ed1 3464 sprintf(s,"GET /%s/api/controller/test HTTP/1.0\nHost: %s\r\n\r\n",appNAME.c_str(),restSERVER.c_str());
arsenalist 8:51a0ca9079ca 3465 }
arsenalist 8:51a0ca9079ca 3466
arsenalist 8:51a0ca9079ca 3467 t.start();
arsenalist 8:51a0ca9079ca 3468 while(1) {
arsenalist 40:77bd44f57ad3 3469 str = ethREST(connHost,connPort,s);
arsenalist 44:c1d11c491237 3470 if(str.find("\"status\":\"OK\"") != std::string::npos) {
arsenalist 8:51a0ca9079ca 3471 t.stop();
arsenalist 8:51a0ca9079ca 3472 ethConnected = true;
arsenalist 8:51a0ca9079ca 3473 break;
arsenalist 8:51a0ca9079ca 3474 }
arsenalist 8:51a0ca9079ca 3475 if(t.read_ms() > 5000) {
arsenalist 8:51a0ca9079ca 3476 t.stop();
arsenalist 8:51a0ca9079ca 3477 ethConnected = false;
arsenalist 8:51a0ca9079ca 3478 break;
arsenalist 8:51a0ca9079ca 3479 }
arsenalist 8:51a0ca9079ca 3480 }
arsenalist 8:51a0ca9079ca 3481 } else {
arsenalist 8:51a0ca9079ca 3482 ethConnected = false;
arsenalist 8:51a0ca9079ca 3483 }
arsenalist 8:51a0ca9079ca 3484 }
arsenalist 8:51a0ca9079ca 3485
arsenalist 8:51a0ca9079ca 3486 void isWiFiConnected(void) { //WARNING: should be run in emmaModeRegister and emmaModeOperation only - limitation with esp, after MODE=B, cannot go to MODE=S
arsenalist 8:51a0ca9079ca 3487 char s[512];
arsenalist 8:51a0ca9079ca 3488 int connPort;
arsenalist 8:51a0ca9079ca 3489 string connHost;
arsenalist 8:51a0ca9079ca 3490 string str;
arsenalist 8:51a0ca9079ca 3491 Timer t;
arsenalist 8:51a0ca9079ca 3492
arsenalist 29:4d94a03d38e0 3493 /*
arsenalist 27:562a95c120cc 3494 esp.enable();
arsenalist 27:562a95c120cc 3495 wait(1);
arsenalist 27:562a95c120cc 3496 esp.reset();
arsenalist 27:562a95c120cc 3497 wait(1);
arsenalist 27:562a95c120cc 3498 while(!esp.ready());
arsenalist 27:562a95c120cc 3499
arsenalist 27:562a95c120cc 3500 //rest begin
arsenalist 38:e44f35f8129d 3501 if(!rest.begin(restSERVER,restPORT,false)) {
arsenalist 27:562a95c120cc 3502 DBG.printf("EMMA: fail to setup rest\r\n");
arsenalist 27:562a95c120cc 3503 TFT.locate(0,20);
arsenalist 27:562a95c120cc 3504 TFT.printf("EMMA: fail to setup rest");
arsenalist 27:562a95c120cc 3505 while(1);
arsenalist 27:562a95c120cc 3506 }
arsenalist 27:562a95c120cc 3507
arsenalist 27:562a95c120cc 3508 //setup wifi
arsenalist 27:562a95c120cc 3509 DBG.printf("EMMA: setup wifi\r\n");
arsenalist 27:562a95c120cc 3510 TFT.locate(0,20);
arsenalist 27:562a95c120cc 3511 TFT.printf("EMMA: setup wifi");
arsenalist 27:562a95c120cc 3512 wait(1);
arsenalist 27:562a95c120cc 3513 esp.wifiCb.attach(&wifiCb);
arsenalist 28:7561035e3df5 3514 //esp.wifiConnect("Tritronik Mobile","Tri12@11");
arsenalist 28:7561035e3df5 3515 esp.wifiConnect(wifiSSID.c_str(),wifiPASS.c_str());
arsenalist 27:562a95c120cc 3516 DBG.printf("EMMA: system started\r\n");
arsenalist 27:562a95c120cc 3517 TFT.locate(0,20);
arsenalist 27:562a95c120cc 3518 TFT.printf("EMMA: system started");
arsenalist 27:562a95c120cc 3519 t.start();
arsenalist 28:7561035e3df5 3520 while(t.read() < 20);
arsenalist 27:562a95c120cc 3521 t.stop();
arsenalist 27:562a95c120cc 3522 t.reset();
arsenalist 28:7561035e3df5 3523 TFT.locate(0,20);
arsenalist 28:7561035e3df5 3524 TFT.printf(" ");
arsenalist 29:4d94a03d38e0 3525 */
arsenalist 27:562a95c120cc 3526
arsenalist 8:51a0ca9079ca 3527 if(wifiAvailable) {
arsenalist 8:51a0ca9079ca 3528 _ESP.printf("MODE=B");
arsenalist 8:51a0ca9079ca 3529 if(useProxy) {
arsenalist 8:51a0ca9079ca 3530 connHost = proxySERVER;
arsenalist 8:51a0ca9079ca 3531 sscanf(proxyPORT.c_str(),"%d",&connPort);
arsenalist 44:c1d11c491237 3532 //for(int i=0; i<sizeof(s); i++) {
arsenalist 44:c1d11c491237 3533 // s[i]=0; }
arsenalist 43:612547648ed1 3534 sprintf(s,"http://%s:%s/%s/api/controller/test HTTP/1.0\nHost: %s\r\n\r\n",restSERVER.c_str(),restPORT.c_str(),appNAME.c_str(),restSERVER.c_str());
arsenalist 8:51a0ca9079ca 3535 } else {
arsenalist 38:e44f35f8129d 3536 connHost = restSERVER;
arsenalist 38:e44f35f8129d 3537 sscanf(restPORT.c_str(),"%d",&connPort);
arsenalist 44:c1d11c491237 3538 //for(int i=0; i<sizeof(s); i++) {
arsenalist 44:c1d11c491237 3539 // s[i]=0; }
arsenalist 43:612547648ed1 3540 sprintf(s,"/%s/api/controller/test",appNAME.c_str());
arsenalist 8:51a0ca9079ca 3541 }
arsenalist 27:562a95c120cc 3542 wait(2);
arsenalist 8:51a0ca9079ca 3543 t.start();
arsenalist 28:7561035e3df5 3544 while(!esp.ready() && t.read() < 20);
arsenalist 8:51a0ca9079ca 3545 t.stop();
arsenalist 27:562a95c120cc 3546 t.reset();
arsenalist 8:51a0ca9079ca 3547 if(rest.begin(connHost.c_str(),connPort,false)) {
arsenalist 44:c1d11c491237 3548 //DBG.printf("rest begin\r\n");
arsenalist 8:51a0ca9079ca 3549 esp.process();
arsenalist 8:51a0ca9079ca 3550 rest.get(s);
arsenalist 44:c1d11c491237 3551 //for(int i=0; i<sizeof(s); i++) {
arsenalist 44:c1d11c491237 3552 // s[i]=0; }
arsenalist 8:51a0ca9079ca 3553 rest.getResponse(s,sizeof(s));
arsenalist 8:51a0ca9079ca 3554 str = s;
arsenalist 27:562a95c120cc 3555 DBG.printf("response:%s\r\n",s);
arsenalist 44:c1d11c491237 3556 if(str.find("\"status\":\"OK\"") != std::string::npos) {
arsenalist 8:51a0ca9079ca 3557 wifiConnected = true;
arsenalist 8:51a0ca9079ca 3558 }
arsenalist 8:51a0ca9079ca 3559 } else {
arsenalist 8:51a0ca9079ca 3560 wifiConnected = false;
arsenalist 8:51a0ca9079ca 3561 }
arsenalist 8:51a0ca9079ca 3562 } else {
arsenalist 8:51a0ca9079ca 3563 wifiConnected = false;
arsenalist 8:51a0ca9079ca 3564 }
arsenalist 8:51a0ca9079ca 3565 }
arsenalist 8:51a0ca9079ca 3566
arsenalist 8:51a0ca9079ca 3567 void isGprsConnected(void) {
arsenalist 8:51a0ca9079ca 3568
arsenalist 8:51a0ca9079ca 3569 }
arsenalist 0:f4e449fa34d7 3570
arsenalist 0:f4e449fa34d7 3571 void addChar(char *s, char c) {
arsenalist 0:f4e449fa34d7 3572 uint16_t k; //customized for EMS
arsenalist 0:f4e449fa34d7 3573 k = strlen(s);
arsenalist 0:f4e449fa34d7 3574 s[k] = c;
arsenalist 0:f4e449fa34d7 3575 s[k + 1] = 0;
arsenalist 0:f4e449fa34d7 3576 }
arsenalist 0:f4e449fa34d7 3577
arsenalist 0:f4e449fa34d7 3578 void rcvReply(char *r, int to) {
arsenalist 0:f4e449fa34d7 3579 Timer t;
arsenalist 0:f4e449fa34d7 3580 bool ended = false;
arsenalist 0:f4e449fa34d7 3581 char c;
arsenalist 0:f4e449fa34d7 3582
arsenalist 0:f4e449fa34d7 3583 strcpy(r,"");
arsenalist 0:f4e449fa34d7 3584 t.start();
arsenalist 0:f4e449fa34d7 3585 while(!ended) {
arsenalist 0:f4e449fa34d7 3586 if(_ESP.readable()) {
arsenalist 0:f4e449fa34d7 3587 c = _ESP.getc();
arsenalist 0:f4e449fa34d7 3588 addChar(r,c);
arsenalist 0:f4e449fa34d7 3589 t.start();
arsenalist 0:f4e449fa34d7 3590 }
arsenalist 0:f4e449fa34d7 3591 if(t.read_ms() > to) {
arsenalist 0:f4e449fa34d7 3592 ended = true;
arsenalist 0:f4e449fa34d7 3593 }
arsenalist 0:f4e449fa34d7 3594 }
arsenalist 0:f4e449fa34d7 3595 addChar(r, 0x00);
arsenalist 0:f4e449fa34d7 3596 }
arsenalist 0:f4e449fa34d7 3597
arsenalist 0:f4e449fa34d7 3598 string calculateMD5(string text) {
arsenalist 0:f4e449fa34d7 3599 char s[64];
arsenalist 0:f4e449fa34d7 3600 memset(s,0,sizeof(s)); //for unknown reason, after reading UID, the 's' will contaion UID data
arsenalist 0:f4e449fa34d7 3601 uint8_t hash[16];
arsenalist 0:f4e449fa34d7 3602 MD5::computeHash(hash, (uint8_t*)text.c_str(), strlen(text.c_str()));
arsenalist 0:f4e449fa34d7 3603 for(int i=0; i<16; ++i) {
arsenalist 0:f4e449fa34d7 3604 sprintf(s,"%s%02x",s,hash[i]);
arsenalist 0:f4e449fa34d7 3605 }
arsenalist 0:f4e449fa34d7 3606 return s;
arsenalist 0:f4e449fa34d7 3607 }
arsenalist 0:f4e449fa34d7 3608
arsenalist 0:f4e449fa34d7 3609 bool writeFirmwareHexToChar(string value) {
arsenalist 0:f4e449fa34d7 3610 FILE *fp;
arsenalist 0:f4e449fa34d7 3611 char s[32];
arsenalist 0:f4e449fa34d7 3612 int number;
arsenalist 0:f4e449fa34d7 3613 string chunk;
arsenalist 0:f4e449fa34d7 3614
arsenalist 0:f4e449fa34d7 3615 sprintf(s,"/sd/newFirmware/firmware.bin");
arsenalist 0:f4e449fa34d7 3616 fp = fopen(s,"a");
arsenalist 0:f4e449fa34d7 3617 if(fp != NULL) {
arsenalist 0:f4e449fa34d7 3618 for(int ch=0; ch<value.size(); ch+=2) {
arsenalist 0:f4e449fa34d7 3619 chunk = value.substr(ch,2);
arsenalist 0:f4e449fa34d7 3620 sscanf(chunk.c_str(),"%x",&number);
arsenalist 0:f4e449fa34d7 3621 fprintf(fp,"%c",number);
arsenalist 0:f4e449fa34d7 3622 }
arsenalist 0:f4e449fa34d7 3623 fclose(fp);
arsenalist 30:08d290158fa7 3624 free(fp);
arsenalist 0:f4e449fa34d7 3625 return true;
arsenalist 0:f4e449fa34d7 3626 }
arsenalist 30:08d290158fa7 3627 fclose(fp);
arsenalist 30:08d290158fa7 3628 free(fp);
arsenalist 0:f4e449fa34d7 3629 return false;
arsenalist 0:f4e449fa34d7 3630 }
arsenalist 0:f4e449fa34d7 3631
arsenalist 0:f4e449fa34d7 3632 bool clearFirmware(void) {
arsenalist 0:f4e449fa34d7 3633 FILE *fp;
arsenalist 0:f4e449fa34d7 3634 char s[32];
arsenalist 0:f4e449fa34d7 3635
arsenalist 0:f4e449fa34d7 3636 sprintf(s,"/sd/newFirmware/firmware.bin");
arsenalist 0:f4e449fa34d7 3637 fp = fopen(s,"w");
arsenalist 0:f4e449fa34d7 3638 if(fp != NULL) {
arsenalist 0:f4e449fa34d7 3639 fprintf(fp,"");
arsenalist 0:f4e449fa34d7 3640 fclose(fp);
arsenalist 30:08d290158fa7 3641 free(fp);
arsenalist 0:f4e449fa34d7 3642 return true;
arsenalist 0:f4e449fa34d7 3643 }
arsenalist 30:08d290158fa7 3644 fclose(fp);
arsenalist 30:08d290158fa7 3645 free(fp);
arsenalist 0:f4e449fa34d7 3646 return false;
arsenalist 0:f4e449fa34d7 3647 }
arsenalist 27:562a95c120cc 3648
arsenalist 27:562a95c120cc 3649 bool writeLog(string logTime, string logData) {
arsenalist 27:562a95c120cc 3650 FILE *fp;
arsenalist 27:562a95c120cc 3651 char s[255];
arsenalist 27:562a95c120cc 3652 string logAll;
arsenalist 27:562a95c120cc 3653 logAll = logTime + "\t" + logData + "\r\n";
arsenalist 27:562a95c120cc 3654
arsenalist 27:562a95c120cc 3655 sprintf(s,"/sd/log.txt");
arsenalist 27:562a95c120cc 3656 fp = fopen(s,"a");
arsenalist 27:562a95c120cc 3657 if(fp != NULL) {
arsenalist 27:562a95c120cc 3658 fprintf(fp,logAll.c_str());
arsenalist 27:562a95c120cc 3659 fclose(fp);
arsenalist 30:08d290158fa7 3660 free(fp);
arsenalist 27:562a95c120cc 3661 return true;
arsenalist 27:562a95c120cc 3662 }
arsenalist 30:08d290158fa7 3663 fclose(fp);
arsenalist 30:08d290158fa7 3664 free(fp);
arsenalist 30:08d290158fa7 3665 return false;
arsenalist 30:08d290158fa7 3666 }
arsenalist 30:08d290158fa7 3667
arsenalist 30:08d290158fa7 3668 bool writeDbg(string dbgTime, string dbgData) {
arsenalist 30:08d290158fa7 3669 FILE *fp;
arsenalist 30:08d290158fa7 3670 char s[255];
arsenalist 30:08d290158fa7 3671 string dbgAll;
arsenalist 30:08d290158fa7 3672 dbgAll = dbgTime + "\t" + dbgData + "\r\n";
arsenalist 30:08d290158fa7 3673
arsenalist 30:08d290158fa7 3674 sprintf(s,"/sd/dbg.txt");
arsenalist 30:08d290158fa7 3675 fp = fopen(s,"a");
arsenalist 30:08d290158fa7 3676 if(fp != NULL) {
arsenalist 30:08d290158fa7 3677 fprintf(fp,dbgAll.c_str());
arsenalist 30:08d290158fa7 3678 fclose(fp);
arsenalist 30:08d290158fa7 3679 free(fp);
arsenalist 30:08d290158fa7 3680 return true;
arsenalist 30:08d290158fa7 3681 }
arsenalist 30:08d290158fa7 3682 fclose(fp);
arsenalist 30:08d290158fa7 3683 free(fp);
arsenalist 27:562a95c120cc 3684 return false;
arsenalist 27:562a95c120cc 3685 }
arsenalist 0:f4e449fa34d7 3686 /*end emma private function*/