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 13:06:47 2015 +0000
Revision:
62:03ba6e82c290
Parent:
61:4eda981730ae
Child:
63:5af876b95f10
Add interactive menu for emmaModeRegister with GPRS and ETH.; Not fully tested because bad internet connection.

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