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:
Sat Sep 26 09:43:09 2015 +0000
Revision:
61:4eda981730ae
Parent:
60:1d4232f5f9c9
Child:
62:03ba6e82c290
Add interactive menu for emmaModeRegister with WiFi.; Not finish with GPRS.

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