emma controller code in production board v1

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

Fork of emma_controller_energy by Emma

Committer:
arsenalist
Date:
Fri Sep 25 08:44:03 2015 +0000
Revision:
60:1d4232f5f9c9
Parent:
59:009596ea660d
Child:
61:4eda981730ae
Add interactive waiting for emmaModeWiFiConfig and emmaModeSettings with WiFi interface.

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