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 Sep 03 07:10:35 2015 +0000
Revision:
49:d11a1914ee8b
Parent:
48:053e92b6dc1e
Child:
50:50d98fe6cc15
Working send data and get command using GPRS.

Who changed what in which revision?

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