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:
Mon Sep 21 12:34:10 2015 +0000
Revision:
58:5f953f303551
Parent:
57:4241a1711069
Child:
59:009596ea660d
Update box menu to circle menu.; Add interactive menu for emmaModeWiFiConfig.

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