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:
Thu Oct 01 06:47:14 2015 +0000
Revision:
64:2409502c3e32
Parent:
63:5af876b95f10
Edit to fit display for Emma 3D printing casing.

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