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:
Tue Sep 01 11:52:52 2015 +0000
Revision:
48:053e92b6dc1e
Parent:
47:97eadcb478b2
Child:
49:d11a1914ee8b
Working emmaModeRegister with GPRS interface.

Who changed what in which revision?

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