able to subscribe for >10hrs and still running

Dependencies:   ADE7758_v1 Crypto DHT11 MQTT MbedJSONValue SDFileSystem SPI_TFT_ILI9341 SWSPI SetRTC TFT_fonts Touch W5500Interface mbed-rtos mbed-src tuanpm

Fork of PB_emma_controller_mbed_src by Emma

Committer:
arsenalist
Date:
Fri Jul 24 05:16:00 2015 +0000
Revision:
24:5d58515ba510
Parent:
23:fb369e171b7d
Child:
25:36c6a5db50ed
Add handler for free memory event in esp.; Working after emma boot up.; However not tested yet for free memory event.;

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 0:f4e449fa34d7 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 0:f4e449fa34d7 17 MQTTEthernet ipstack(&spi, PB_12, PC_6); //spi, cs, reset
arsenalist 0:f4e449fa34d7 18 MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
arsenalist 0:f4e449fa34d7 19
arsenalist 0:f4e449fa34d7 20 //init sd card
arsenalist 8:51a0ca9079ca 21 SDFileSystem sd(PA_7, PA_6, PA_5, PB_3, "sd"); //mosi, miso, sck, cs
arsenalist 0:f4e449fa34d7 22
arsenalist 8:51a0ca9079ca 23 //init ade7758 - without cs pin
arsenalist 14:8287f0f5d987 24 ADE7758 ADE(PB_6, PB_4, PB_5, PB_7); //mosi, miso, sck, irq
arsenalist 0:f4e449fa34d7 25
arsenalist 12:96f637ed37f9 26 //init tft lcd
arsenalist 12:96f637ed37f9 27 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 28 //init touch screen - without cs pin
arsenalist 12:96f637ed37f9 29 TouchScreenADS7843 TP(PB_10, PB_0, PB_1, PB_2, &TFT); //mosi, miso, sclk, irq, tft
arsenalist 12:96f637ed37f9 30 //InterruptIn tpIRQ(PB_2);
arsenalist 12:96f637ed37f9 31
arsenalist 21:33bd8b82560f 32 //init dht sensor
arsenalist 21:33bd8b82560f 33 DHT11 d(PD_2);
arsenalist 21:33bd8b82560f 34
arsenalist 0:f4e449fa34d7 35 //emma settings
arsenalist 0:f4e449fa34d7 36 string emmaUID;
arsenalist 4:76ab12e2f8a3 37 string hmac;
arsenalist 0:f4e449fa34d7 38 string platformDOMAIN;
arsenalist 0:f4e449fa34d7 39 string platformKEY;
arsenalist 0:f4e449fa34d7 40 string platformSECRET;
arsenalist 0:f4e449fa34d7 41 string wifiSSID;
arsenalist 0:f4e449fa34d7 42 string wifiPASS;
arsenalist 0:f4e449fa34d7 43 string gprsAPN;
arsenalist 0:f4e449fa34d7 44 string proxySERVER;
arsenalist 0:f4e449fa34d7 45 string proxyPORT;
arsenalist 0:f4e449fa34d7 46 string proxyAUTH;
arsenalist 0:f4e449fa34d7 47
arsenalist 4:76ab12e2f8a3 48 //nodes settings
arsenalist 4:76ab12e2f8a3 49 class NODES {
arsenalist 4:76ab12e2f8a3 50 public:
arsenalist 4:76ab12e2f8a3 51 REST *restConn;
arsenalist 4:76ab12e2f8a3 52 NODES(REST *r);
arsenalist 4:76ab12e2f8a3 53 string macAddr;
arsenalist 4:76ab12e2f8a3 54 string ipAddr;
arsenalist 4:76ab12e2f8a3 55 };
arsenalist 4:76ab12e2f8a3 56 NODES::NODES(REST *r) {
arsenalist 4:76ab12e2f8a3 57 restConn = r;
arsenalist 4:76ab12e2f8a3 58 }
arsenalist 4:76ab12e2f8a3 59 REST restObj[NODES_MAX] = {REST(&esp),REST(&esp),REST(&esp),REST(&esp),REST(&esp)};
arsenalist 4:76ab12e2f8a3 60 NODES nodes[NODES_MAX] = {NODES(&restObj[0]),NODES(&restObj[1]),NODES(&restObj[2]),NODES(&restObj[3]),NODES(&restObj[4])};
arsenalist 4:76ab12e2f8a3 61
arsenalist 12:96f637ed37f9 62 //mode box class for main menu
arsenalist 12:96f637ed37f9 63 class modeBox {
arsenalist 12:96f637ed37f9 64 public:
arsenalist 12:96f637ed37f9 65 int xTL; //TopLeft
arsenalist 12:96f637ed37f9 66 int yTL;
arsenalist 12:96f637ed37f9 67 int xBR; //BottomRight
arsenalist 12:96f637ed37f9 68 int yBR;
arsenalist 12:96f637ed37f9 69 string text;
arsenalist 12:96f637ed37f9 70 };
arsenalist 12:96f637ed37f9 71
arsenalist 0:f4e449fa34d7 72 //ade7758 variables
arsenalist 0:f4e449fa34d7 73 uint16_t AWattHrValue, BWattHrValue, CWattHrValue;
arsenalist 0:f4e449fa34d7 74 uint16_t AVAHrValue, BVAHrValue, CVAHrValue;
arsenalist 19:7e3e9332f719 75 //long AWattHrSum = 0;
arsenalist 19:7e3e9332f719 76 //long BWattHrSum = 0;
arsenalist 19:7e3e9332f719 77 //long CWattHrSum = 0;
arsenalist 19:7e3e9332f719 78 uint32_t AWattHrSum = 0;
arsenalist 19:7e3e9332f719 79 uint32_t BWattHrSum = 0;
arsenalist 19:7e3e9332f719 80 uint32_t CWattHrSum = 0;
arsenalist 0:f4e449fa34d7 81 float AWattHr, BWattHr, CWattHr;
arsenalist 4:76ab12e2f8a3 82 float AVrms, BVrms, CVrms;
arsenalist 4:76ab12e2f8a3 83 float AIrms, BIrms, CIrms;
arsenalist 4:76ab12e2f8a3 84 float AWatt, BWatt, CWatt;
arsenalist 4:76ab12e2f8a3 85 float XWattHr,XVrms,XWatt;
arsenalist 0:f4e449fa34d7 86
arsenalist 0:f4e449fa34d7 87 //variables
arsenalist 0:f4e449fa34d7 88 bool ethAvailable = false;
arsenalist 0:f4e449fa34d7 89 bool wifiAvailable = false;
arsenalist 0:f4e449fa34d7 90 bool gprsAvailable = false;
arsenalist 0:f4e449fa34d7 91 bool ethConnected = false;
arsenalist 0:f4e449fa34d7 92 bool wifiConnected = false;
arsenalist 9:a58c04da4476 93 bool gprsConnected = false;
arsenalist 0:f4e449fa34d7 94 bool useProxy = false;
arsenalist 0:f4e449fa34d7 95 bool newCommand = false;
arsenalist 24:5d58515ba510 96 bool espFreeMemory = true; //for after bootup initialization
arsenalist 22:e18d361bf688 97 bool newEnergyData = false;
arsenalist 0:f4e449fa34d7 98 string globalCommand;
arsenalist 4:76ab12e2f8a3 99 string rxBuf;
arsenalist 0:f4e449fa34d7 100
arsenalist 12:96f637ed37f9 101 /*start lcd and touch*/
arsenalist 12:96f637ed37f9 102 int emmaModeSelection(void) {
arsenalist 12:96f637ed37f9 103 bool modeSelected = false;
arsenalist 12:96f637ed37f9 104 int md=0;
arsenalist 12:96f637ed37f9 105 int TPx;
arsenalist 12:96f637ed37f9 106 int TPy;
arsenalist 12:96f637ed37f9 107
arsenalist 12:96f637ed37f9 108 TFT.background(Black);
arsenalist 12:96f637ed37f9 109 TFT.foreground(White);
arsenalist 12:96f637ed37f9 110
arsenalist 12:96f637ed37f9 111 TFT.set_font((unsigned char*) Arial12x12);
arsenalist 12:96f637ed37f9 112 TFT.set_orientation(1);
arsenalist 12:96f637ed37f9 113 TFT.cls();
arsenalist 12:96f637ed37f9 114 TFT.locate(0,0);
arsenalist 12:96f637ed37f9 115 TFT.printf("Hello, I'm Emma!");
arsenalist 13:e8adfe305dbc 116 wait(2);
arsenalist 12:96f637ed37f9 117 TFT.cls();
arsenalist 12:96f637ed37f9 118
arsenalist 12:96f637ed37f9 119 Matrix matrix;
arsenalist 12:96f637ed37f9 120 Coordinate ScreenSample[3];
arsenalist 12:96f637ed37f9 121
arsenalist 12:96f637ed37f9 122 matrix.An = 580;
arsenalist 12:96f637ed37f9 123 matrix.Bn = 75980;
arsenalist 12:96f637ed37f9 124 matrix.Cn = -3410580;
arsenalist 12:96f637ed37f9 125 matrix.Dn = 57855;
arsenalist 12:96f637ed37f9 126 matrix.En = -2465;
arsenalist 12:96f637ed37f9 127 matrix.Fn = -3483515;
arsenalist 12:96f637ed37f9 128 matrix.Divider = 209144;
arsenalist 12:96f637ed37f9 129
arsenalist 12:96f637ed37f9 130 ScreenSample[0].x = 230;
arsenalist 12:96f637ed37f9 131 ScreenSample[0].y = 167;
arsenalist 12:96f637ed37f9 132 ScreenSample[1].x = 754;
arsenalist 12:96f637ed37f9 133 ScreenSample[1].y = 163;
arsenalist 12:96f637ed37f9 134 ScreenSample[2].x = 771;
arsenalist 12:96f637ed37f9 135 ScreenSample[2].y = 562;
arsenalist 12:96f637ed37f9 136
arsenalist 12:96f637ed37f9 137 TP.SetCalibration(&matrix, &ScreenSample[0]);
arsenalist 12:96f637ed37f9 138
arsenalist 17:b3ced0e67916 139 //TFT.locate(0,0);
arsenalist 17:b3ced0e67916 140 //TFT.printf(" X:");
arsenalist 17:b3ced0e67916 141 //TFT.locate(70,0);
arsenalist 17:b3ced0e67916 142 //TFT.printf(" Y:");
arsenalist 12:96f637ed37f9 143
arsenalist 12:96f637ed37f9 144 //draw border
arsenalist 12:96f637ed37f9 145 TFT.line(15,15,310,15,Orange);
arsenalist 12:96f637ed37f9 146 TFT.line(310,15,310,250,Orange);
arsenalist 12:96f637ed37f9 147 TFT.line(310,250,15,250,Orange);
arsenalist 12:96f637ed37f9 148 TFT.line(15,250,15,15,Orange);
arsenalist 12:96f637ed37f9 149
arsenalist 12:96f637ed37f9 150 //init main menu
arsenalist 12:96f637ed37f9 151 modeBox menu[6];
arsenalist 12:96f637ed37f9 152
arsenalist 12:96f637ed37f9 153 //wifi config mode
arsenalist 12:96f637ed37f9 154 menu[MODE_WIFI_CONFIG].xTL = 25;
arsenalist 12:96f637ed37f9 155 menu[MODE_WIFI_CONFIG].yTL = 25;
arsenalist 12:96f637ed37f9 156 menu[MODE_WIFI_CONFIG].xBR = 110;
arsenalist 12:96f637ed37f9 157 menu[MODE_WIFI_CONFIG].yBR = 90;
arsenalist 12:96f637ed37f9 158 menu[MODE_WIFI_CONFIG].text = "wifi config";
arsenalist 12:96f637ed37f9 159
arsenalist 12:96f637ed37f9 160 //setting mode
arsenalist 12:96f637ed37f9 161 menu[MODE_SETTINGS].xTL = 120;
arsenalist 12:96f637ed37f9 162 menu[MODE_SETTINGS].yTL = 25;
arsenalist 12:96f637ed37f9 163 menu[MODE_SETTINGS].xBR = 205;
arsenalist 12:96f637ed37f9 164 menu[MODE_SETTINGS].yBR = 90;
arsenalist 12:96f637ed37f9 165 menu[MODE_SETTINGS].text = "settings";
arsenalist 12:96f637ed37f9 166
arsenalist 12:96f637ed37f9 167 //register mode
arsenalist 12:96f637ed37f9 168 menu[MODE_REGISTER].xTL = 25;
arsenalist 12:96f637ed37f9 169 menu[MODE_REGISTER].yTL = 100;
arsenalist 12:96f637ed37f9 170 menu[MODE_REGISTER].xBR = 110;
arsenalist 12:96f637ed37f9 171 menu[MODE_REGISTER].yBR = 165;
arsenalist 12:96f637ed37f9 172 menu[MODE_REGISTER].text = "register";
arsenalist 12:96f637ed37f9 173
arsenalist 12:96f637ed37f9 174 //operational mode
arsenalist 12:96f637ed37f9 175 menu[MODE_OPERATION].xTL = 120;
arsenalist 12:96f637ed37f9 176 menu[MODE_OPERATION].yTL = 100;
arsenalist 12:96f637ed37f9 177 menu[MODE_OPERATION].xBR = 205;
arsenalist 12:96f637ed37f9 178 menu[MODE_OPERATION].yBR = 165;
arsenalist 12:96f637ed37f9 179 menu[MODE_OPERATION].text = "operation";
arsenalist 12:96f637ed37f9 180
arsenalist 12:96f637ed37f9 181 //firmware download mode
arsenalist 12:96f637ed37f9 182 menu[MODE_FIRMWARE_DOWNLOAD].xTL = 215;
arsenalist 12:96f637ed37f9 183 menu[MODE_FIRMWARE_DOWNLOAD].yTL = 25;
arsenalist 12:96f637ed37f9 184 menu[MODE_FIRMWARE_DOWNLOAD].xBR = 300;
arsenalist 12:96f637ed37f9 185 menu[MODE_FIRMWARE_DOWNLOAD].yBR = 90;
arsenalist 17:b3ced0e67916 186 menu[MODE_FIRMWARE_DOWNLOAD].text = "fw dwld";
arsenalist 12:96f637ed37f9 187
arsenalist 12:96f637ed37f9 188 //reserved mode
arsenalist 12:96f637ed37f9 189 menu[5].xTL = 215;
arsenalist 12:96f637ed37f9 190 menu[5].yTL = 100;
arsenalist 12:96f637ed37f9 191 menu[5].xBR = 300;
arsenalist 12:96f637ed37f9 192 menu[5].yBR = 165;
arsenalist 12:96f637ed37f9 193 menu[5].text = "reserved";
arsenalist 12:96f637ed37f9 194
arsenalist 17:b3ced0e67916 195 //draw main menu
arsenalist 12:96f637ed37f9 196 for(int i=0; i<6; i++) {
arsenalist 12:96f637ed37f9 197 TFT.fillrect(menu[i].xTL,menu[i].yTL,menu[i].xBR,menu[i].yBR,Orange);
arsenalist 12:96f637ed37f9 198 }
arsenalist 12:96f637ed37f9 199
arsenalist 17:b3ced0e67916 200 //add text to main menu
arsenalist 17:b3ced0e67916 201 for(int i=0; i<6; i++) {
arsenalist 17:b3ced0e67916 202 TFT.locate(menu[i].xTL,menu[i].yTL);
arsenalist 17:b3ced0e67916 203 TFT.printf("%s",menu[i].text.c_str());
arsenalist 17:b3ced0e67916 204 }
arsenalist 17:b3ced0e67916 205
arsenalist 12:96f637ed37f9 206 while(!modeSelected) {
arsenalist 12:96f637ed37f9 207 if(!TP._tp_irq) {
arsenalist 12:96f637ed37f9 208 if(TP.Read_Ads7843()) {
arsenalist 12:96f637ed37f9 209 TP.getDisplayPoint();
arsenalist 12:96f637ed37f9 210 TPx = TP.display.x;
arsenalist 12:96f637ed37f9 211 TPy = TP.display.y;
arsenalist 12:96f637ed37f9 212 TP.TP_DrawPoint(TPx,TPy, Blue);
arsenalist 17:b3ced0e67916 213 //TFT.locate(25,0);
arsenalist 17:b3ced0e67916 214 //TFT.printf("%03d",TPx);
arsenalist 17:b3ced0e67916 215 //TFT.locate(95,0);
arsenalist 17:b3ced0e67916 216 //TFT.printf("%03d",TPy);
arsenalist 12:96f637ed37f9 217
arsenalist 12:96f637ed37f9 218 for(int i=0; i<6; i++) {
arsenalist 12:96f637ed37f9 219 if((menu[i].xTL < TPx && TPx < menu[i].xBR) && (menu[i].yTL < TPy && TPy < menu[i].yBR)) {
arsenalist 12:96f637ed37f9 220 //TFT.locate(25,170);
arsenalist 12:96f637ed37f9 221 //TFT.printf(" ");
arsenalist 12:96f637ed37f9 222 //TFT.locate(25,170);
arsenalist 12:96f637ed37f9 223 //TFT.printf("mode: %s is selected",menu[i].text.c_str());
arsenalist 12:96f637ed37f9 224 //wait(3);
arsenalist 12:96f637ed37f9 225 md = i;
arsenalist 12:96f637ed37f9 226 modeSelected = true;
arsenalist 12:96f637ed37f9 227 }
arsenalist 12:96f637ed37f9 228 }
arsenalist 12:96f637ed37f9 229 }
arsenalist 12:96f637ed37f9 230 }
arsenalist 12:96f637ed37f9 231 }
arsenalist 12:96f637ed37f9 232
arsenalist 12:96f637ed37f9 233 TFT.locate(25,170);
arsenalist 12:96f637ed37f9 234 TFT.printf(" ");
arsenalist 12:96f637ed37f9 235 TFT.locate(25,170);
arsenalist 13:e8adfe305dbc 236 TFT.printf("mode: %s is selected",menu[md].text.c_str());
arsenalist 13:e8adfe305dbc 237 wait(2);
arsenalist 12:96f637ed37f9 238 TFT.cls();
arsenalist 12:96f637ed37f9 239
arsenalist 12:96f637ed37f9 240 return md;
arsenalist 12:96f637ed37f9 241 }
arsenalist 12:96f637ed37f9 242 /*end lcd and touch*/
arsenalist 12:96f637ed37f9 243
arsenalist 12:96f637ed37f9 244 /*start emma mode*/
arsenalist 12:96f637ed37f9 245 void emmaInit(int mode) {
arsenalist 4:76ab12e2f8a3 246 char s[64];
arsenalist 0:f4e449fa34d7 247 DBG.baud(19200);
arsenalist 0:f4e449fa34d7 248 DBG.printf("\r\nemmaInit\r\n");
arsenalist 12:96f637ed37f9 249 DBG.printf("mode:%d\r\n",mode);
arsenalist 0:f4e449fa34d7 250
arsenalist 0:f4e449fa34d7 251 //read settings
arsenalist 0:f4e449fa34d7 252 //readSetting("emmaUID"); //sd card need to be read once before working correctly
arsenalist 9:a58c04da4476 253 emmaUID = readSetting("emmaUID");
arsenalist 9:a58c04da4476 254 //emmaUID = "066eff575349896767073038";
arsenalist 0:f4e449fa34d7 255 DBG.printf("emmaUID:%s\r\n",emmaUID.c_str());
arsenalist 4:76ab12e2f8a3 256 //calculate hmac
arsenalist 4:76ab12e2f8a3 257 for(int i=0; i<sizeof(s); i++) {
arsenalist 4:76ab12e2f8a3 258 s[i]=0; }
arsenalist 4:76ab12e2f8a3 259 sprintf(s,"emma-%s",emmaUID.c_str());
arsenalist 4:76ab12e2f8a3 260 hmac = calculateMD5(s);
arsenalist 4:76ab12e2f8a3 261 DBG.printf("hmac:%s\r\n",hmac.c_str());
arsenalist 9:a58c04da4476 262 platformDOMAIN = readSetting("platformDOMAIN");
arsenalist 9:a58c04da4476 263 //platformDOMAIN = "testdulu";
arsenalist 0:f4e449fa34d7 264 DBG.printf("platformDOMAIN:%s\r\n",platformDOMAIN.c_str());
arsenalist 9:a58c04da4476 265 platformKEY = readSetting("platformKEY");
arsenalist 9:a58c04da4476 266 //platformKEY = "5980e444-81dd-47ba-8222-6a40bc94fdce";
arsenalist 0:f4e449fa34d7 267 DBG.printf("platformKEY:%s\r\n",platformKEY.c_str());
arsenalist 9:a58c04da4476 268 platformSECRET = readSetting("platformSECRET");
arsenalist 9:a58c04da4476 269 //platformSECRET = "3ca8ec0239fda2b6d12ba1580c91a052";
arsenalist 0:f4e449fa34d7 270 DBG.printf("platformSECRET:%s\r\n",platformSECRET.c_str());
arsenalist 9:a58c04da4476 271 proxySERVER = readSetting("proxySERVER");
arsenalist 0:f4e449fa34d7 272 DBG.printf("proxySERVER:%s\r\n",proxySERVER.c_str());
arsenalist 9:a58c04da4476 273 proxyPORT = readSetting("proxyPORT");
arsenalist 0:f4e449fa34d7 274 DBG.printf("proxyPORT:%s\r\n",proxyPORT.c_str());
arsenalist 9:a58c04da4476 275 proxyAUTH = readSetting("proxyAUTH");
arsenalist 0:f4e449fa34d7 276 DBG.printf("proxyAUTH:%s\r\n",proxyAUTH.c_str());
arsenalist 0:f4e449fa34d7 277
arsenalist 0:f4e449fa34d7 278 //check proxy
arsenalist 0:f4e449fa34d7 279 if(!proxySERVER.empty() && !proxyPORT.empty() && !proxyAUTH.empty()) {
arsenalist 0:f4e449fa34d7 280 useProxy = true;
arsenalist 0:f4e449fa34d7 281 } else {
arsenalist 0:f4e449fa34d7 282 useProxy = false;
arsenalist 0:f4e449fa34d7 283 }
arsenalist 0:f4e449fa34d7 284 //testing purpose
arsenalist 0:f4e449fa34d7 285 useProxy = false;
arsenalist 0:f4e449fa34d7 286 DBG.printf("proxy:%d\r\n",useProxy);
arsenalist 0:f4e449fa34d7 287
arsenalist 8:51a0ca9079ca 288 //check available interface
arsenalist 8:51a0ca9079ca 289 isEthAvailable(); //check whether cable is connected
arsenalist 9:a58c04da4476 290 wifiAvailable = true; //we assume wifi will always available
arsenalist 8:51a0ca9079ca 291 DBG.printf("eth:%d\r\n",ethAvailable);
arsenalist 8:51a0ca9079ca 292 DBG.printf("wifi:%d\r\n",wifiAvailable);
arsenalist 8:51a0ca9079ca 293 DBG.printf("gprs:%d\r\n",gprsAvailable);
arsenalist 0:f4e449fa34d7 294 }
arsenalist 0:f4e449fa34d7 295 void emmaModeWiFiConfig(void) {
arsenalist 0:f4e449fa34d7 296 string str;
arsenalist 18:87f30ba9ddc5 297 TFT.locate(0,0);
arsenalist 18:87f30ba9ddc5 298 TFT.printf(" please wait");
arsenalist 0:f4e449fa34d7 299
arsenalist 0:f4e449fa34d7 300 if(wifiAvailable) {
arsenalist 0:f4e449fa34d7 301 DBG.printf("emmaModeWiFiConfig\r\n");
arsenalist 0:f4e449fa34d7 302
arsenalist 0:f4e449fa34d7 303 //set wifi module to configuration
arsenalist 0:f4e449fa34d7 304 _ESP.printf("MODE=C");
arsenalist 0:f4e449fa34d7 305 while(1) {
arsenalist 0:f4e449fa34d7 306 char rcv[128] = {};
arsenalist 0:f4e449fa34d7 307 rcvReply(rcv,3000);
arsenalist 0:f4e449fa34d7 308 str = rcv;
arsenalist 0:f4e449fa34d7 309 if(str.find("SC_STATUS_FIND_CHANNEL") != std::string::npos)
arsenalist 0:f4e449fa34d7 310 break;
arsenalist 0:f4e449fa34d7 311 }
arsenalist 18:87f30ba9ddc5 312
arsenalist 18:87f30ba9ddc5 313 TFT.locate(0,0);
arsenalist 18:87f30ba9ddc5 314 TFT.printf(" emmaModeWiFiConfig");
arsenalist 18:87f30ba9ddc5 315 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 316 TFT.printf(" connect with emma app now");
arsenalist 18:87f30ba9ddc5 317
arsenalist 0:f4e449fa34d7 318 DBG.printf("entering wifi configuration mode\r\n");
arsenalist 0:f4e449fa34d7 319 while(1) {
arsenalist 0:f4e449fa34d7 320 char rcv[128] = {};
arsenalist 0:f4e449fa34d7 321 rcvReply(rcv,3000);
arsenalist 0:f4e449fa34d7 322 str = rcv;
arsenalist 0:f4e449fa34d7 323 if(str.find("MODE=C OK") != std::string::npos) {
arsenalist 0:f4e449fa34d7 324 //save wifiSSID and wifiPASS
arsenalist 0:f4e449fa34d7 325 if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) {
arsenalist 0:f4e449fa34d7 326 str.erase(str.begin(),str.begin()+str.find("[")+1);
arsenalist 0:f4e449fa34d7 327 str.erase(str.begin()+str.find("]"),str.end());
arsenalist 0:f4e449fa34d7 328
arsenalist 0:f4e449fa34d7 329 MbedJSONValue jsonValue;
arsenalist 0:f4e449fa34d7 330 parse(jsonValue,str.c_str());
arsenalist 0:f4e449fa34d7 331
arsenalist 0:f4e449fa34d7 332 char *parameter[2] = {"wifiSSID","wifiPASS"};
arsenalist 0:f4e449fa34d7 333
arsenalist 0:f4e449fa34d7 334 for(int i=0; i<2; i++) {
arsenalist 0:f4e449fa34d7 335 if(jsonValue.hasMember(parameter[i])) {
arsenalist 0:f4e449fa34d7 336 string val = jsonValue[parameter[i]].get<std::string>();
arsenalist 11:2311b2d5157d 337 int st = writeSetting(parameter[i],val.c_str());
arsenalist 11:2311b2d5157d 338 if(st) {
arsenalist 11:2311b2d5157d 339 DBG.printf("%s is saved\r\n",parameter[i]);
arsenalist 18:87f30ba9ddc5 340 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 341 TFT.printf(" %s is saved\r\n",parameter[i]);
arsenalist 18:87f30ba9ddc5 342 wait(3);
arsenalist 18:87f30ba9ddc5 343 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 344 TFT.printf(" ");
arsenalist 11:2311b2d5157d 345 } else {
arsenalist 11:2311b2d5157d 346 DBG.printf("%s is not saved\r\n",parameter[i]);
arsenalist 18:87f30ba9ddc5 347 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 348 TFT.printf(" %s is not saved\r\n",parameter[i]);
arsenalist 18:87f30ba9ddc5 349 wait(3);
arsenalist 18:87f30ba9ddc5 350 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 351 TFT.printf(" ");
arsenalist 11:2311b2d5157d 352 }
arsenalist 0:f4e449fa34d7 353 }
arsenalist 0:f4e449fa34d7 354 }
arsenalist 18:87f30ba9ddc5 355
arsenalist 18:87f30ba9ddc5 356 //wificonfig finish
arsenalist 18:87f30ba9ddc5 357 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 358 TFT.printf(" ");
arsenalist 18:87f30ba9ddc5 359 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 360 TFT.printf(" wificonfig finish. please restart.");
arsenalist 18:87f30ba9ddc5 361
arsenalist 0:f4e449fa34d7 362 }
arsenalist 18:87f30ba9ddc5 363 } else if(str.find("SC_STATUS_GETTING_SSID_PSWD") != std::string::npos){
arsenalist 18:87f30ba9ddc5 364 DBG.printf("app connected\r\n");
arsenalist 18:87f30ba9ddc5 365 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 366 TFT.printf(" ");
arsenalist 18:87f30ba9ddc5 367 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 368 TFT.printf(" app connected");
arsenalist 0:f4e449fa34d7 369 }
arsenalist 0:f4e449fa34d7 370 }
arsenalist 0:f4e449fa34d7 371 } else {
arsenalist 0:f4e449fa34d7 372 DBG.printf("no wifi found\r\n");
arsenalist 18:87f30ba9ddc5 373 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 374 TFT.printf(" no wifi found");
arsenalist 0:f4e449fa34d7 375 }
arsenalist 0:f4e449fa34d7 376 }
arsenalist 0:f4e449fa34d7 377 void emmaModeSettings(void) {
arsenalist 0:f4e449fa34d7 378 bool clientIsConnected = false;
arsenalist 0:f4e449fa34d7 379 bool serverIsListened = false;
arsenalist 0:f4e449fa34d7 380 char s[32];
arsenalist 0:f4e449fa34d7 381 string str;
arsenalist 0:f4e449fa34d7 382
arsenalist 18:87f30ba9ddc5 383 TFT.locate(0,0);
arsenalist 18:87f30ba9ddc5 384 TFT.printf(" please wait");
arsenalist 18:87f30ba9ddc5 385
arsenalist 8:51a0ca9079ca 386 //create settings dir
arsenalist 0:f4e449fa34d7 387 mkdir("/sd/settings",0777);
arsenalist 8:51a0ca9079ca 388
arsenalist 0:f4e449fa34d7 389 //get and write emmaUID
arsenalist 0:f4e449fa34d7 390 string uid = getUID();
arsenalist 0:f4e449fa34d7 391 sprintf(s,"(%s)",uid.c_str());
arsenalist 0:f4e449fa34d7 392 uid = s;
arsenalist 0:f4e449fa34d7 393 writeSetting("emmaUID",uid);
arsenalist 0:f4e449fa34d7 394
arsenalist 8:51a0ca9079ca 395 if(ethAvailable) {
arsenalist 0:f4e449fa34d7 396 DBG.printf("emmaModeSettings - eth\r\n");
arsenalist 0:f4e449fa34d7 397
arsenalist 0:f4e449fa34d7 398 TCPSocketServer svr;
arsenalist 0:f4e449fa34d7 399 TCPSocketConnection clientSock;
arsenalist 0:f4e449fa34d7 400
arsenalist 0:f4e449fa34d7 401 if(svr.bind(SERVER_PORT) < 0) {
arsenalist 0:f4e449fa34d7 402 DBG.printf("tcp server bind failed\r\n");
arsenalist 0:f4e449fa34d7 403 } else {
arsenalist 0:f4e449fa34d7 404 DBG.printf("tcp server bind success\r\n");
arsenalist 0:f4e449fa34d7 405 serverIsListened = true;
arsenalist 0:f4e449fa34d7 406 }
arsenalist 0:f4e449fa34d7 407
arsenalist 0:f4e449fa34d7 408 DBG.printf("please connect to %s\r\n",ipstack.getEth().getIPAddress());
arsenalist 0:f4e449fa34d7 409
arsenalist 0:f4e449fa34d7 410 if(svr.listen(1) < 0) {
arsenalist 0:f4e449fa34d7 411 DBG.printf("tcp server listen failed\r\n");
arsenalist 0:f4e449fa34d7 412 } else {
arsenalist 0:f4e449fa34d7 413 DBG.printf("tcp server is listening...\r\n");
arsenalist 0:f4e449fa34d7 414 }
arsenalist 0:f4e449fa34d7 415
arsenalist 0:f4e449fa34d7 416 clientSock.set_blocking(false,30000); //timeout after 30sec
arsenalist 0:f4e449fa34d7 417
arsenalist 0:f4e449fa34d7 418 //listening
arsenalist 0:f4e449fa34d7 419 while (serverIsListened) {
arsenalist 0:f4e449fa34d7 420 if(svr.accept(clientSock) < 0) {
arsenalist 0:f4e449fa34d7 421 DBG.printf("failed to accept connection\r\n");
arsenalist 0:f4e449fa34d7 422 } else {
arsenalist 0:f4e449fa34d7 423 DBG.printf("connection success!\r\nIP: %s\r\n",clientSock.get_address());
arsenalist 0:f4e449fa34d7 424 clientIsConnected = true;
arsenalist 0:f4e449fa34d7 425
arsenalist 0:f4e449fa34d7 426 while(clientIsConnected) {
arsenalist 0:f4e449fa34d7 427 char buffer[1024] = {};
arsenalist 0:f4e449fa34d7 428 switch(clientSock.receive(buffer,1023)) {
arsenalist 0:f4e449fa34d7 429 case 0:
arsenalist 0:f4e449fa34d7 430 DBG.printf("received buffer is empty\r\n");
arsenalist 0:f4e449fa34d7 431 clientIsConnected = false;
arsenalist 0:f4e449fa34d7 432 break;
arsenalist 0:f4e449fa34d7 433 case -1:
arsenalist 0:f4e449fa34d7 434 DBG.printf("failed to read data from client\r\n");
arsenalist 0:f4e449fa34d7 435 clientIsConnected = false;
arsenalist 0:f4e449fa34d7 436 break;
arsenalist 0:f4e449fa34d7 437 default:
arsenalist 0:f4e449fa34d7 438 //DBG.printf("received data: %d\r\n%s\r\n",strlen(buffer),buffer);
arsenalist 0:f4e449fa34d7 439 DBG.printf("\r\n");
arsenalist 0:f4e449fa34d7 440
arsenalist 0:f4e449fa34d7 441 str = buffer;
arsenalist 0:f4e449fa34d7 442 if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) {
arsenalist 0:f4e449fa34d7 443 str.erase(str.begin(),str.begin()+str.find("[")+1);
arsenalist 0:f4e449fa34d7 444 str.erase(str.begin()+str.find("]"),str.end());
arsenalist 0:f4e449fa34d7 445
arsenalist 0:f4e449fa34d7 446 MbedJSONValue jsonValue;
arsenalist 0:f4e449fa34d7 447 parse(jsonValue,str.c_str());
arsenalist 0:f4e449fa34d7 448
arsenalist 14:8287f0f5d987 449 char *parameter[5] = {"gprsAPN","proxySERVER","proxyPORT","proxyAUTH","epochTime"};
arsenalist 0:f4e449fa34d7 450
arsenalist 0:f4e449fa34d7 451 for(int i=0; i<4; i++) {
arsenalist 0:f4e449fa34d7 452 if(jsonValue.hasMember(parameter[i])) {
arsenalist 0:f4e449fa34d7 453 string val = jsonValue[parameter[i]].get<std::string>();
arsenalist 0:f4e449fa34d7 454 int st = writeSetting(parameter[i],val.c_str());
arsenalist 0:f4e449fa34d7 455 if(st) {
arsenalist 0:f4e449fa34d7 456 DBG.printf("%s: %s is saved\r\n",parameter[i],val.c_str());
arsenalist 0:f4e449fa34d7 457 } else {
arsenalist 0:f4e449fa34d7 458 DBG.printf("%s is not saved\r\n",parameter[i]);
arsenalist 0:f4e449fa34d7 459 }
arsenalist 0:f4e449fa34d7 460 }
arsenalist 0:f4e449fa34d7 461 }
arsenalist 14:8287f0f5d987 462
arsenalist 14:8287f0f5d987 463 //set time
arsenalist 14:8287f0f5d987 464 if(jsonValue.hasMember(parameter[4])) {
arsenalist 14:8287f0f5d987 465 string epTime = jsonValue[parameter[4]].get<std::string>();
arsenalist 20:ea14f175bbb4 466 time_t seconds;
arsenalist 14:8287f0f5d987 467 sscanf(epTime.c_str(),"%d",&seconds);
arsenalist 14:8287f0f5d987 468 set_time(seconds);
arsenalist 14:8287f0f5d987 469 DBG.printf("time is set\r\n");
arsenalist 14:8287f0f5d987 470 }
arsenalist 0:f4e449fa34d7 471 }
arsenalist 0:f4e449fa34d7 472 break;
arsenalist 0:f4e449fa34d7 473 }
arsenalist 0:f4e449fa34d7 474 }
arsenalist 0:f4e449fa34d7 475 DBG.printf("close connection\r\n");
arsenalist 0:f4e449fa34d7 476 clientSock.close();
arsenalist 0:f4e449fa34d7 477 }
arsenalist 0:f4e449fa34d7 478 }
arsenalist 8:51a0ca9079ca 479 } else if(wifiAvailable) {
arsenalist 8:51a0ca9079ca 480 DBG.printf("emmaModeSettings - wifi\r\n");
arsenalist 8:51a0ca9079ca 481
arsenalist 8:51a0ca9079ca 482 _ESP.printf("MODE=S");
arsenalist 8:51a0ca9079ca 483 while(1) {
arsenalist 8:51a0ca9079ca 484 char rcv[128] = {};
arsenalist 8:51a0ca9079ca 485 rcvReply(rcv,3000);
arsenalist 8:51a0ca9079ca 486 str = rcv;
arsenalist 8:51a0ca9079ca 487 if(str.find("MODE=S_OK") != std::string::npos)
arsenalist 8:51a0ca9079ca 488 break;
arsenalist 8:51a0ca9079ca 489 }
arsenalist 8:51a0ca9079ca 490 DBG.printf("entering settings mode\r\n");
arsenalist 17:b3ced0e67916 491 TFT.locate(0,0);
arsenalist 17:b3ced0e67916 492 TFT.printf(" emmaModeSettings");
arsenalist 17:b3ced0e67916 493 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 494 TFT.printf(" connect with emma app now");
arsenalist 17:b3ced0e67916 495
arsenalist 8:51a0ca9079ca 496 while(1) {
arsenalist 8:51a0ca9079ca 497 char rcv[512] = {};
arsenalist 8:51a0ca9079ca 498 rcvReply(rcv,3000);
arsenalist 8:51a0ca9079ca 499 //DBG.printf("rcv:%s\r\n",rcv);
arsenalist 8:51a0ca9079ca 500 str = rcv;
arsenalist 8:51a0ca9079ca 501 if(str.find("MODE=S_Config") != std::string::npos) {
arsenalist 8:51a0ca9079ca 502 //save gprs and proxy setting
arsenalist 8:51a0ca9079ca 503 if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) {
arsenalist 8:51a0ca9079ca 504 str.erase(str.begin(),str.begin()+str.find("[")+1);
arsenalist 8:51a0ca9079ca 505 str.erase(str.begin()+str.find("]"),str.end());
arsenalist 8:51a0ca9079ca 506
arsenalist 8:51a0ca9079ca 507 MbedJSONValue jsonValue;
arsenalist 8:51a0ca9079ca 508 parse(jsonValue,str.c_str());
arsenalist 8:51a0ca9079ca 509
arsenalist 14:8287f0f5d987 510 char *parameter[5] = {"gprsAPN","proxySERVER","proxyPORT","proxyAUTH","epochTime"};
arsenalist 8:51a0ca9079ca 511
arsenalist 8:51a0ca9079ca 512 for(int i=0; i<4; i++) {
arsenalist 8:51a0ca9079ca 513 if(jsonValue.hasMember(parameter[i])) {
arsenalist 8:51a0ca9079ca 514 string val = jsonValue[parameter[i]].get<std::string>();
arsenalist 8:51a0ca9079ca 515 int st = writeSetting(parameter[i],val.c_str());
arsenalist 8:51a0ca9079ca 516 if(st) {
arsenalist 8:51a0ca9079ca 517 DBG.printf("%s: %s is saved\r\n",parameter[i],val.c_str());
arsenalist 17:b3ced0e67916 518 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 519 TFT.printf(" %s: %s is saved",parameter[i],val.c_str());
arsenalist 17:b3ced0e67916 520 wait(3);
arsenalist 17:b3ced0e67916 521 TFT.locate(0,40);
arsenalist 17:b3ced0e67916 522 TFT.printf(" ");
arsenalist 8:51a0ca9079ca 523 } else {
arsenalist 8:51a0ca9079ca 524 DBG.printf("%s is not saved\r\n",parameter[i]);
arsenalist 17:b3ced0e67916 525 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 526 TFT.printf(" %s is not saved",parameter[i]);
arsenalist 17:b3ced0e67916 527 wait(3);
arsenalist 17:b3ced0e67916 528 TFT.locate(0,40);
arsenalist 17:b3ced0e67916 529 TFT.printf(" ");
arsenalist 8:51a0ca9079ca 530 }
arsenalist 8:51a0ca9079ca 531 }
arsenalist 8:51a0ca9079ca 532 }
arsenalist 14:8287f0f5d987 533
arsenalist 14:8287f0f5d987 534 //set time
arsenalist 14:8287f0f5d987 535 if(jsonValue.hasMember(parameter[4])) {
arsenalist 14:8287f0f5d987 536 string epTime = jsonValue[parameter[4]].get<std::string>();
arsenalist 14:8287f0f5d987 537 time_t seconds;
arsenalist 14:8287f0f5d987 538 sscanf(epTime.c_str(),"%d",&seconds);
arsenalist 14:8287f0f5d987 539 set_time(seconds);
arsenalist 14:8287f0f5d987 540 DBG.printf("time is set\r\n");
arsenalist 17:b3ced0e67916 541 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 542 TFT.printf(" time is set");
arsenalist 17:b3ced0e67916 543 wait(3);
arsenalist 17:b3ced0e67916 544 TFT.locate(0,40);
arsenalist 17:b3ced0e67916 545 TFT.printf(" ");
arsenalist 14:8287f0f5d987 546 }
arsenalist 18:87f30ba9ddc5 547
arsenalist 18:87f30ba9ddc5 548 //setting finish
arsenalist 18:87f30ba9ddc5 549 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 550 TFT.printf(" ");
arsenalist 18:87f30ba9ddc5 551 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 552 TFT.printf(" settings finish. please restart.");
arsenalist 8:51a0ca9079ca 553 }
arsenalist 8:51a0ca9079ca 554 } else if(str.find("connect") != std::string::npos) {
arsenalist 8:51a0ca9079ca 555 DBG.printf("connection success!\r\n");
arsenalist 17:b3ced0e67916 556 TFT.locate(0,20);
arsenalist 17:b3ced0e67916 557 TFT.printf(" ");
arsenalist 17:b3ced0e67916 558 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 559 TFT.printf(" connection success");
arsenalist 8:51a0ca9079ca 560 }
arsenalist 8:51a0ca9079ca 561 }
arsenalist 0:f4e449fa34d7 562 } else {
arsenalist 9:a58c04da4476 563 DBG.printf("no eth or wifi is available\r\n");
arsenalist 17:b3ced0e67916 564 TFT.locate(0,0);
arsenalist 18:87f30ba9ddc5 565 TFT.printf(" no iface avail, please restart!");
arsenalist 0:f4e449fa34d7 566 }
arsenalist 0:f4e449fa34d7 567 }
arsenalist 0:f4e449fa34d7 568 void emmaModeRegister(void) {
arsenalist 0:f4e449fa34d7 569 bool emmaGetRegKey = false;
arsenalist 0:f4e449fa34d7 570 bool emmaRegistered = false;
arsenalist 0:f4e449fa34d7 571 char s[512];
arsenalist 0:f4e449fa34d7 572 char r[256];
arsenalist 0:f4e449fa34d7 573 int connPort;
arsenalist 0:f4e449fa34d7 574 int loop = 0;
arsenalist 0:f4e449fa34d7 575 string connData;
arsenalist 0:f4e449fa34d7 576 string connHost;
arsenalist 4:76ab12e2f8a3 577 //string hmac;
arsenalist 0:f4e449fa34d7 578 string str;
arsenalist 0:f4e449fa34d7 579 string regKey;
arsenalist 0:f4e449fa34d7 580 Timer t;
arsenalist 0:f4e449fa34d7 581
arsenalist 18:87f30ba9ddc5 582 TFT.locate(0,0);
arsenalist 18:87f30ba9ddc5 583 TFT.printf(" please wait");
arsenalist 18:87f30ba9ddc5 584
arsenalist 0:f4e449fa34d7 585 //check connected interface
arsenalist 8:51a0ca9079ca 586 //connectedIface();
arsenalist 8:51a0ca9079ca 587 isEthConnected();
arsenalist 8:51a0ca9079ca 588 isWiFiConnected();
arsenalist 8:51a0ca9079ca 589 isGprsConnected();
arsenalist 0:f4e449fa34d7 590 DBG.printf("ethConnected:%d\r\n",ethConnected);
arsenalist 0:f4e449fa34d7 591 DBG.printf("wifiConnected:%d\r\n",wifiConnected);
arsenalist 0:f4e449fa34d7 592
arsenalist 0:f4e449fa34d7 593 //calculate hmac
arsenalist 4:76ab12e2f8a3 594 //for(int i=0; i<sizeof(s); i++) {
arsenalist 4:76ab12e2f8a3 595 // s[i]=0; }
arsenalist 4:76ab12e2f8a3 596 //sprintf(s,"emma-%s",emmaUID.c_str());
arsenalist 4:76ab12e2f8a3 597 //hmac = calculateMD5(s);
arsenalist 4:76ab12e2f8a3 598 //DBG.printf("hmac:%s\r\n",hmac.c_str());
arsenalist 0:f4e449fa34d7 599
arsenalist 9:a58c04da4476 600 if(ethConnected) {
arsenalist 9:a58c04da4476 601 DBG.printf("emmaModeRegister - eth\r\n");
arsenalist 9:a58c04da4476 602
arsenalist 9:a58c04da4476 603 //set connHost, connPort, connData
arsenalist 9:a58c04da4476 604 if(useProxy) {
arsenalist 9:a58c04da4476 605 DBG.printf("use proxy\r\n");
arsenalist 9:a58c04da4476 606 connHost = proxySERVER;
arsenalist 9:a58c04da4476 607 sscanf(proxyPORT.c_str(),"%d",&connPort);
arsenalist 9:a58c04da4476 608 for(int i=0; i<sizeof(s); i++) {
arsenalist 9:a58c04da4476 609 s[i]=0; }
arsenalist 9:a58c04da4476 610 sprintf(s,"GET http://%s:%d/emma/api/controller/register?uid=%s&hmac=%s HTTP/1.0\nHost: %s\r\n\r\n",EMMA_SERVER_HOST,EMMA_SERVER_PORT,emmaUID.c_str(),hmac.c_str(),EMMA_SERVER_HOST);
arsenalist 9:a58c04da4476 611 connData = s;
arsenalist 9:a58c04da4476 612 } else {
arsenalist 9:a58c04da4476 613 DBG.printf("no proxy\r\n");
arsenalist 9:a58c04da4476 614 connHost = EMMA_SERVER_HOST;
arsenalist 9:a58c04da4476 615 connPort = EMMA_SERVER_PORT;
arsenalist 9:a58c04da4476 616 for(int i=0; i<sizeof(s); i++) {
arsenalist 9:a58c04da4476 617 s[i]=0; }
arsenalist 9:a58c04da4476 618 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(),EMMA_SERVER_HOST);
arsenalist 9:a58c04da4476 619 connData = s;
arsenalist 9:a58c04da4476 620 }
arsenalist 9:a58c04da4476 621
arsenalist 9:a58c04da4476 622 //register
arsenalist 9:a58c04da4476 623 while(!emmaGetRegKey) {
arsenalist 9:a58c04da4476 624 str = "";
arsenalist 9:a58c04da4476 625 str = ethGET(connHost,connPort,connData);
arsenalist 9:a58c04da4476 626 DBG.printf("rsp reg:%s\r\n",str.c_str());
arsenalist 9:a58c04da4476 627
arsenalist 9:a58c04da4476 628 //check and save platform setting
arsenalist 9:a58c04da4476 629 if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) {
arsenalist 9:a58c04da4476 630 str.erase(str.begin(),str.begin()+str.find("[")+1);
arsenalist 9:a58c04da4476 631 str.erase(str.begin()+str.find("]"),str.end());
arsenalist 9:a58c04da4476 632
arsenalist 9:a58c04da4476 633 MbedJSONValue jsonValue;
arsenalist 9:a58c04da4476 634 parse(jsonValue,str.c_str());
arsenalist 9:a58c04da4476 635
arsenalist 9:a58c04da4476 636 char *parameter[4] = {"platformDOMAIN","platformKEY","platformSECRET","registrationKey"};
arsenalist 9:a58c04da4476 637
arsenalist 9:a58c04da4476 638 //save platform parameter
arsenalist 9:a58c04da4476 639 writeSetting(parameter[0],"()"); //sd card need to be initialized
arsenalist 9:a58c04da4476 640 for(int i=0; i<3; i++) {
arsenalist 9:a58c04da4476 641 if(jsonValue.hasMember(parameter[i])) {
arsenalist 9:a58c04da4476 642 string val = jsonValue[parameter[i]].get<std::string>();
arsenalist 9:a58c04da4476 643 int st = writeSetting(parameter[i],val.c_str());
arsenalist 9:a58c04da4476 644 if(st) {
arsenalist 9:a58c04da4476 645 DBG.printf("%s: %s is saved\r\n",parameter[i],val.c_str());
arsenalist 9:a58c04da4476 646 } else {
arsenalist 9:a58c04da4476 647 DBG.printf("%s is not saved\r\n",parameter[i]);
arsenalist 9:a58c04da4476 648 }
arsenalist 9:a58c04da4476 649 }
arsenalist 9:a58c04da4476 650 }
arsenalist 9:a58c04da4476 651
arsenalist 9:a58c04da4476 652 //get registrationKey
arsenalist 9:a58c04da4476 653 if(jsonValue.hasMember(parameter[3])) {
arsenalist 9:a58c04da4476 654 string val = jsonValue[parameter[3]].get<std::string>();
arsenalist 9:a58c04da4476 655 if(val.find("(") != std::string::npos && val.find(")") != std::string::npos) {
arsenalist 9:a58c04da4476 656 val.erase(val.begin(),val.begin()+val.find("(")+1);
arsenalist 9:a58c04da4476 657 val.erase(val.begin()+val.find(")"),val.end());
arsenalist 9:a58c04da4476 658 regKey = val;
arsenalist 9:a58c04da4476 659 DBG.printf("%s: %s\r\n",parameter[3],regKey.c_str());
arsenalist 9:a58c04da4476 660 emmaGetRegKey = true;
arsenalist 9:a58c04da4476 661 }
arsenalist 9:a58c04da4476 662 }
arsenalist 9:a58c04da4476 663 }
arsenalist 9:a58c04da4476 664 }
arsenalist 9:a58c04da4476 665
arsenalist 9:a58c04da4476 666 //calculate hmac
arsenalist 9:a58c04da4476 667 for(int i=0; i<sizeof(r); i++) {
arsenalist 9:a58c04da4476 668 r[i]=0; }
arsenalist 9:a58c04da4476 669 sprintf(r,"emma-%s-%s",emmaUID.c_str(),regKey.c_str());
arsenalist 9:a58c04da4476 670 hmac = calculateMD5(r);
arsenalist 9:a58c04da4476 671 DBG.printf("hmac:%s\r\n",hmac.c_str());
arsenalist 9:a58c04da4476 672
arsenalist 9:a58c04da4476 673 //set connData
arsenalist 9:a58c04da4476 674 if(useProxy) {
arsenalist 9:a58c04da4476 675 DBG.printf("use proxy\r\n");
arsenalist 9:a58c04da4476 676 for(int i=0; i<sizeof(s); i++) {
arsenalist 9:a58c04da4476 677 s[i]=0; }
arsenalist 9:a58c04da4476 678 sprintf(s,"GET http://%s:%d/emma/api/controller/verify?uid=%s&registrationKey=%s&hmac=%s HTTP/1.0\nHost: %s\r\n\r\n",EMMA_SERVER_HOST,EMMA_SERVER_PORT,emmaUID.c_str(),regKey.c_str(),hmac.c_str(),EMMA_SERVER_HOST);
arsenalist 9:a58c04da4476 679 connData = s;
arsenalist 9:a58c04da4476 680 } else {
arsenalist 9:a58c04da4476 681 DBG.printf("no proxy\r\n");
arsenalist 9:a58c04da4476 682 for(int i=0; i<sizeof(s); i++) {
arsenalist 9:a58c04da4476 683 s[i]=0; }
arsenalist 9:a58c04da4476 684 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(),EMMA_SERVER_HOST);
arsenalist 9:a58c04da4476 685 connData = s;
arsenalist 9:a58c04da4476 686 }
arsenalist 9:a58c04da4476 687
arsenalist 9:a58c04da4476 688 //verify registration
arsenalist 9:a58c04da4476 689 while(!emmaRegistered && loop < 12){
arsenalist 9:a58c04da4476 690 str.clear();
arsenalist 9:a58c04da4476 691 str = ethGET(connHost,connPort,connData);
arsenalist 9:a58c04da4476 692 DBG.printf("rsp vrf:%s\r\n",str.c_str());
arsenalist 9:a58c04da4476 693
arsenalist 9:a58c04da4476 694 //check verification
arsenalist 9:a58c04da4476 695 if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) {
arsenalist 9:a58c04da4476 696 str.erase(str.begin(),str.begin()+str.find("[")+1);
arsenalist 9:a58c04da4476 697 str.erase(str.begin()+str.find("]"),str.end());
arsenalist 9:a58c04da4476 698
arsenalist 9:a58c04da4476 699 MbedJSONValue jsonValue;
arsenalist 9:a58c04da4476 700 parse(jsonValue,str.c_str());
arsenalist 9:a58c04da4476 701 if(jsonValue.hasMember("user")) {
arsenalist 9:a58c04da4476 702 string val = jsonValue["user"].get<std::string>();
arsenalist 9:a58c04da4476 703 DBG.printf("%s is registered\r\n",val.c_str());
arsenalist 9:a58c04da4476 704 emmaRegistered = true;
arsenalist 9:a58c04da4476 705 }
arsenalist 9:a58c04da4476 706 }
arsenalist 9:a58c04da4476 707 wait(5);
arsenalist 9:a58c04da4476 708 loop++;
arsenalist 9:a58c04da4476 709 }
arsenalist 9:a58c04da4476 710
arsenalist 9:a58c04da4476 711 //check whether registration success
arsenalist 9:a58c04da4476 712 if(emmaRegistered) {
arsenalist 9:a58c04da4476 713 DBG.printf("registration successful\r\n");
arsenalist 9:a58c04da4476 714 } else {
arsenalist 9:a58c04da4476 715 DBG.printf("registration unsuccessful\r\n");
arsenalist 9:a58c04da4476 716 }
arsenalist 9:a58c04da4476 717 while(1);
arsenalist 9:a58c04da4476 718
arsenalist 9:a58c04da4476 719 } else if(wifiConnected) {
arsenalist 0:f4e449fa34d7 720 DBG.printf("emmaModeRegister - wifi\r\n");
arsenalist 0:f4e449fa34d7 721
arsenalist 0:f4e449fa34d7 722 _ESP.printf("MODE=B");
arsenalist 0:f4e449fa34d7 723 wait(1);
arsenalist 0:f4e449fa34d7 724 while(!esp.ready());
arsenalist 0:f4e449fa34d7 725
arsenalist 0:f4e449fa34d7 726 //set connHost, connPort
arsenalist 0:f4e449fa34d7 727 if(useProxy) {
arsenalist 0:f4e449fa34d7 728 connHost = proxySERVER;
arsenalist 0:f4e449fa34d7 729 sscanf(proxyPORT.c_str(),"%d",&connPort);
arsenalist 0:f4e449fa34d7 730 } else {
arsenalist 0:f4e449fa34d7 731 connHost = EMMA_SERVER_HOST;
arsenalist 0:f4e449fa34d7 732 connPort = EMMA_SERVER_PORT;
arsenalist 0:f4e449fa34d7 733 }
arsenalist 18:87f30ba9ddc5 734 TFT.locate(0,0);
arsenalist 18:87f30ba9ddc5 735 TFT.printf(" emmaModeRegister");
arsenalist 0:f4e449fa34d7 736
arsenalist 0:f4e449fa34d7 737 //rest begin
arsenalist 0:f4e449fa34d7 738 if(!rest.begin(connHost.c_str(),connPort,false)) {
arsenalist 0:f4e449fa34d7 739 DBG.printf("EMMA: fail to setup rest");
arsenalist 0:f4e449fa34d7 740 while(1);
arsenalist 0:f4e449fa34d7 741 }
arsenalist 0:f4e449fa34d7 742 //wifiConnected = true; //with custom firmware, wifi module should connect automatically
arsenalist 0:f4e449fa34d7 743
arsenalist 0:f4e449fa34d7 744 esp.process();
arsenalist 0:f4e449fa34d7 745 if(wifiConnected) {
arsenalist 0:f4e449fa34d7 746 //set connData
arsenalist 0:f4e449fa34d7 747 if(useProxy) {
arsenalist 0:f4e449fa34d7 748 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 749 s[i]=0; }
arsenalist 0:f4e449fa34d7 750 sprintf(s,"http://%s:%d/emma/api/controller/register?uid=%s&hmac=%s",EMMA_SERVER_HOST,EMMA_SERVER_PORT,emmaUID.c_str(),hmac.c_str());
arsenalist 0:f4e449fa34d7 751 connData = s;
arsenalist 0:f4e449fa34d7 752 } else {
arsenalist 0:f4e449fa34d7 753 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 754 s[i]=0; }
arsenalist 0:f4e449fa34d7 755 sprintf(s,"/emma/api/controller/register?uid=%s&hmac=%s",emmaUID.c_str(),hmac.c_str());
arsenalist 0:f4e449fa34d7 756 connData = s;
arsenalist 0:f4e449fa34d7 757 }
arsenalist 0:f4e449fa34d7 758
arsenalist 0:f4e449fa34d7 759 //register
arsenalist 0:f4e449fa34d7 760 while(!emmaGetRegKey) {
arsenalist 0:f4e449fa34d7 761 rest.get(connData.c_str());
arsenalist 0:f4e449fa34d7 762 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 763 s[i]=0; }
arsenalist 0:f4e449fa34d7 764 rest.getResponse(s,sizeof(s));
arsenalist 0:f4e449fa34d7 765 DBG.printf("rsp reg:%s\r\n",s);
arsenalist 0:f4e449fa34d7 766
arsenalist 0:f4e449fa34d7 767 //check and save platform setting
arsenalist 0:f4e449fa34d7 768 str = s;
arsenalist 0:f4e449fa34d7 769 if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) {
arsenalist 0:f4e449fa34d7 770 str.erase(str.begin(),str.begin()+str.find("[")+1);
arsenalist 0:f4e449fa34d7 771 str.erase(str.begin()+str.find("]"),str.end());
arsenalist 0:f4e449fa34d7 772
arsenalist 0:f4e449fa34d7 773 MbedJSONValue jsonValue;
arsenalist 0:f4e449fa34d7 774 parse(jsonValue,str.c_str());
arsenalist 0:f4e449fa34d7 775
arsenalist 0:f4e449fa34d7 776 char *parameter[4] = {"platformDOMAIN","platformKEY","platformSECRET","registrationKey"};
arsenalist 0:f4e449fa34d7 777
arsenalist 0:f4e449fa34d7 778 //save platform parameter
arsenalist 0:f4e449fa34d7 779 writeSetting(parameter[0],"()"); //sd card need to be initialized
arsenalist 0:f4e449fa34d7 780 for(int i=0; i<3; i++) {
arsenalist 0:f4e449fa34d7 781 if(jsonValue.hasMember(parameter[i])) {
arsenalist 0:f4e449fa34d7 782 string val = jsonValue[parameter[i]].get<std::string>();
arsenalist 0:f4e449fa34d7 783 int st = writeSetting(parameter[i],val.c_str());
arsenalist 0:f4e449fa34d7 784 if(st) {
arsenalist 0:f4e449fa34d7 785 DBG.printf("%s: %s is saved\r\n",parameter[i],val.c_str());
arsenalist 0:f4e449fa34d7 786 } else {
arsenalist 0:f4e449fa34d7 787 DBG.printf("%s is not saved\r\n",parameter[i]);
arsenalist 0:f4e449fa34d7 788 }
arsenalist 0:f4e449fa34d7 789 }
arsenalist 0:f4e449fa34d7 790 }
arsenalist 0:f4e449fa34d7 791
arsenalist 0:f4e449fa34d7 792 //get registrationKey
arsenalist 0:f4e449fa34d7 793 if(jsonValue.hasMember(parameter[3])) {
arsenalist 0:f4e449fa34d7 794 string val = jsonValue[parameter[3]].get<std::string>();
arsenalist 0:f4e449fa34d7 795 if(val.find("(") != std::string::npos && val.find(")") != std::string::npos) {
arsenalist 0:f4e449fa34d7 796 val.erase(val.begin(),val.begin()+val.find("(")+1);
arsenalist 0:f4e449fa34d7 797 val.erase(val.begin()+val.find(")"),val.end());
arsenalist 0:f4e449fa34d7 798 regKey = val;
arsenalist 0:f4e449fa34d7 799 DBG.printf("%s: %s\r\n",parameter[3],regKey.c_str());
arsenalist 18:87f30ba9ddc5 800
arsenalist 18:87f30ba9ddc5 801 TFT.locate(0,20);
arsenalist 18:87f30ba9ddc5 802 TFT.printf(" %s: %s\r\n",parameter[3],regKey.c_str());
arsenalist 18:87f30ba9ddc5 803
arsenalist 0:f4e449fa34d7 804 emmaGetRegKey = true;
arsenalist 0:f4e449fa34d7 805 }
arsenalist 0:f4e449fa34d7 806 }
arsenalist 0:f4e449fa34d7 807 }
arsenalist 0:f4e449fa34d7 808 }
arsenalist 0:f4e449fa34d7 809
arsenalist 0:f4e449fa34d7 810 //calculate hmac
arsenalist 0:f4e449fa34d7 811 for(int i=0; i<sizeof(r); i++) {
arsenalist 0:f4e449fa34d7 812 r[i]=0; }
arsenalist 0:f4e449fa34d7 813 sprintf(r,"emma-%s-%s",emmaUID.c_str(),regKey.c_str());
arsenalist 0:f4e449fa34d7 814 hmac = calculateMD5(r);
arsenalist 0:f4e449fa34d7 815 DBG.printf("hmac:%s\r\n",hmac.c_str());
arsenalist 0:f4e449fa34d7 816
arsenalist 0:f4e449fa34d7 817 //set connData
arsenalist 0:f4e449fa34d7 818 if(useProxy) {
arsenalist 0:f4e449fa34d7 819 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 820 s[i]=0; }
arsenalist 0:f4e449fa34d7 821 sprintf(s,"http://%s:%d/emma/api/controller/verify?uid=%s&registrationKey=%s&hmac=%s",EMMA_SERVER_HOST,EMMA_SERVER_PORT,emmaUID.c_str(),regKey.c_str(),hmac.c_str());
arsenalist 0:f4e449fa34d7 822 connData = s;
arsenalist 0:f4e449fa34d7 823 } else {
arsenalist 0:f4e449fa34d7 824 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 825 s[i]=0; }
arsenalist 0:f4e449fa34d7 826 sprintf(s,"/emma/api/controller/verify?uid=%s&registrationKey=%s&hmac=%s",emmaUID.c_str(),regKey.c_str(),hmac.c_str());
arsenalist 0:f4e449fa34d7 827 connData = s;
arsenalist 0:f4e449fa34d7 828 }
arsenalist 0:f4e449fa34d7 829
arsenalist 0:f4e449fa34d7 830 //verify registration
arsenalist 0:f4e449fa34d7 831 while(!emmaRegistered && loop < 12){
arsenalist 0:f4e449fa34d7 832 rest.get(connData.c_str());
arsenalist 0:f4e449fa34d7 833 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 834 s[i]=0; }
arsenalist 0:f4e449fa34d7 835 rest.getResponse(s,sizeof(s));
arsenalist 0:f4e449fa34d7 836 DBG.printf("rsp vrf:%s\r\n",s);
arsenalist 18:87f30ba9ddc5 837 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 838 TFT.printf(" ");
arsenalist 18:87f30ba9ddc5 839 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 840 TFT.printf(" wait:%d\r\n",loop);
arsenalist 0:f4e449fa34d7 841
arsenalist 0:f4e449fa34d7 842 //check verification
arsenalist 0:f4e449fa34d7 843 str = s;
arsenalist 0:f4e449fa34d7 844 if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) {
arsenalist 0:f4e449fa34d7 845 str.erase(str.begin(),str.begin()+str.find("[")+1);
arsenalist 0:f4e449fa34d7 846 str.erase(str.begin()+str.find("]"),str.end());
arsenalist 0:f4e449fa34d7 847
arsenalist 0:f4e449fa34d7 848 MbedJSONValue jsonValue;
arsenalist 0:f4e449fa34d7 849 parse(jsonValue,str.c_str());
arsenalist 0:f4e449fa34d7 850 if(jsonValue.hasMember("user")) {
arsenalist 0:f4e449fa34d7 851 string val = jsonValue["user"].get<std::string>();
arsenalist 18:87f30ba9ddc5 852 DBG.printf(" %s is registered\r\n",val.c_str());
arsenalist 18:87f30ba9ddc5 853 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 854 TFT.printf(" ");
arsenalist 18:87f30ba9ddc5 855 TFT.locate(0,40);
arsenalist 18:87f30ba9ddc5 856 TFT.printf(" %s is registered\r\n",val.c_str());
arsenalist 0:f4e449fa34d7 857 emmaRegistered = true;
arsenalist 0:f4e449fa34d7 858 }
arsenalist 0:f4e449fa34d7 859 }
arsenalist 0:f4e449fa34d7 860 wait(5);
arsenalist 0:f4e449fa34d7 861 loop++;
arsenalist 0:f4e449fa34d7 862 }
arsenalist 0:f4e449fa34d7 863
arsenalist 0:f4e449fa34d7 864 //check whether registration success
arsenalist 0:f4e449fa34d7 865 if(emmaRegistered) {
arsenalist 0:f4e449fa34d7 866 DBG.printf("registration successful\r\n");
arsenalist 18:87f30ba9ddc5 867 TFT.locate(0,60);
arsenalist 18:87f30ba9ddc5 868 TFT.printf(" registration successful\r\n");
arsenalist 0:f4e449fa34d7 869 } else {
arsenalist 0:f4e449fa34d7 870 DBG.printf("registration unsuccessful\r\n");
arsenalist 18:87f30ba9ddc5 871 TFT.locate(0,60);
arsenalist 18:87f30ba9ddc5 872 TFT.printf(" egistration unsuccessful. please restart.\r\n");
arsenalist 0:f4e449fa34d7 873 }
arsenalist 0:f4e449fa34d7 874 while(1);
arsenalist 0:f4e449fa34d7 875 }
arsenalist 0:f4e449fa34d7 876
arsenalist 9:a58c04da4476 877 } else if(gprsConnected) {
arsenalist 0:f4e449fa34d7 878 DBG.printf("emmaModeRegister - gprs\r\n");
arsenalist 0:f4e449fa34d7 879
arsenalist 0:f4e449fa34d7 880 } else {
arsenalist 9:a58c04da4476 881 DBG.printf("no eth, wifi, or gprs is connected\r\n");
arsenalist 18:87f30ba9ddc5 882 TFT.locate(0,60);
arsenalist 18:87f30ba9ddc5 883 TFT.printf(" no iface connected. please restart.\r\n");
arsenalist 0:f4e449fa34d7 884 }
arsenalist 0:f4e449fa34d7 885 }
arsenalist 0:f4e449fa34d7 886
arsenalist 0:f4e449fa34d7 887 void emmaModeOperation(void) {
arsenalist 0:f4e449fa34d7 888 char mqttClientId[32];
arsenalist 22:e18d361bf688 889 char p[64];
arsenalist 14:8287f0f5d987 890 char q[32];
arsenalist 4:76ab12e2f8a3 891 char r[32];
arsenalist 0:f4e449fa34d7 892 char s[512];
arsenalist 0:f4e449fa34d7 893 int loop=0;
arsenalist 21:33bd8b82560f 894 int trial=0;
arsenalist 4:76ab12e2f8a3 895 //string hmac;
arsenalist 22:e18d361bf688 896 string hmacTime;
arsenalist 23:fb369e171b7d 897 string hmacCmd;
arsenalist 0:f4e449fa34d7 898 string str;
arsenalist 14:8287f0f5d987 899 time_t seconds;
arsenalist 0:f4e449fa34d7 900 Timer t;
arsenalist 24:5d58515ba510 901 Timer tPanelEnergy;
arsenalist 24:5d58515ba510 902 Timer tPanel;
arsenalist 4:76ab12e2f8a3 903 Timer tNodes;
arsenalist 0:f4e449fa34d7 904
arsenalist 19:7e3e9332f719 905 TFT.locate(0,0);
arsenalist 19:7e3e9332f719 906 TFT.printf(" please wait");
arsenalist 19:7e3e9332f719 907
arsenalist 0:f4e449fa34d7 908 //check connected interface
arsenalist 8:51a0ca9079ca 909 //connectedIface();
arsenalist 8:51a0ca9079ca 910 isEthConnected();
arsenalist 8:51a0ca9079ca 911 isWiFiConnected();
arsenalist 8:51a0ca9079ca 912 isGprsConnected();
arsenalist 0:f4e449fa34d7 913 DBG.printf("ethConnected:%d\r\n",ethConnected);
arsenalist 0:f4e449fa34d7 914 DBG.printf("wifiConnected:%d\r\n",wifiConnected);
arsenalist 0:f4e449fa34d7 915
arsenalist 13:e8adfe305dbc 916 TFT.locate(0,0);
arsenalist 13:e8adfe305dbc 917 TFT.printf(" emmaModeOperation");
arsenalist 13:e8adfe305dbc 918
arsenalist 13:e8adfe305dbc 919 TFT.locate(0,20);
arsenalist 13:e8adfe305dbc 920 if(ethConnected) {
arsenalist 13:e8adfe305dbc 921 TFT.printf("ETH:Avail");
arsenalist 13:e8adfe305dbc 922 } else {
arsenalist 13:e8adfe305dbc 923 TFT.printf("ETH:N/A");
arsenalist 13:e8adfe305dbc 924 }
arsenalist 13:e8adfe305dbc 925
arsenalist 13:e8adfe305dbc 926 TFT.locate(80,20);
arsenalist 13:e8adfe305dbc 927 if(wifiConnected) {
arsenalist 13:e8adfe305dbc 928 TFT.printf("WiFi:Avail");
arsenalist 13:e8adfe305dbc 929 } else {
arsenalist 13:e8adfe305dbc 930 TFT.printf("WiFi:N/A");
arsenalist 13:e8adfe305dbc 931 }
arsenalist 13:e8adfe305dbc 932
arsenalist 13:e8adfe305dbc 933 TFT.locate(160,20);
arsenalist 13:e8adfe305dbc 934 if(gprsConnected) {
arsenalist 13:e8adfe305dbc 935 TFT.printf("GPRS:Avail");
arsenalist 13:e8adfe305dbc 936 } else {
arsenalist 13:e8adfe305dbc 937 TFT.printf("GPRS:N/A");
arsenalist 13:e8adfe305dbc 938 }
arsenalist 13:e8adfe305dbc 939
arsenalist 0:f4e449fa34d7 940 //calculate hmac
arsenalist 4:76ab12e2f8a3 941 //for(int j=0; j<sizeof(s); j++) {
arsenalist 4:76ab12e2f8a3 942 // s[j]=0; }
arsenalist 4:76ab12e2f8a3 943 //sprintf(s,"emma-%s",emmaUID.c_str());
arsenalist 4:76ab12e2f8a3 944 //hmac = calculateMD5(s);
arsenalist 4:76ab12e2f8a3 945 //DBG.printf("hmac:%s\r\n",hmac.c_str());
arsenalist 0:f4e449fa34d7 946
arsenalist 10:1dc69e0ce7fd 947 if(ethConnected) {
arsenalist 10:1dc69e0ce7fd 948 DBG.printf("emmaModeOperation - eth\r\n");
arsenalist 10:1dc69e0ce7fd 949 //DBG.printf("IP Address:%s\r\n",ipstack.getEth().getIPAddress());
arsenalist 10:1dc69e0ce7fd 950 //DBG.printf("MAC Address:%s\r\n",ipstack.getEth().getMACAddress());
arsenalist 10:1dc69e0ce7fd 951 ethMQTTAttemptConnect(&client, &ipstack);
arsenalist 10:1dc69e0ce7fd 952 //t.start();
arsenalist 10:1dc69e0ce7fd 953 DBG.printf("start\r\n");
arsenalist 10:1dc69e0ce7fd 954 while(true) {
arsenalist 10:1dc69e0ce7fd 955 //if(!ipstack.getEth().linkstatus()) {
arsenalist 10:1dc69e0ce7fd 956 // NVIC_SystemReset();
arsenalist 10:1dc69e0ce7fd 957 //}
arsenalist 10:1dc69e0ce7fd 958 //if(t.read_ms() > 5000) {
arsenalist 10:1dc69e0ce7fd 959 // if(publish(&client,&ipstack) != 0)
arsenalist 10:1dc69e0ce7fd 960 // ethMQTTAttemptConnect(&client, &ipstack);
arsenalist 10:1dc69e0ce7fd 961 // t.reset();
arsenalist 10:1dc69e0ce7fd 962 //}
arsenalist 10:1dc69e0ce7fd 963
arsenalist 10:1dc69e0ce7fd 964 //check for new command
arsenalist 10:1dc69e0ce7fd 965 if(newCommand) {
arsenalist 10:1dc69e0ce7fd 966 DBG.printf("newCommand\r\n");
arsenalist 10:1dc69e0ce7fd 967 //DBG.printf("globalCommand: %s\r\n",globalCommand.c_str());
arsenalist 10:1dc69e0ce7fd 968 //string qw(globCmd);
arsenalist 10:1dc69e0ce7fd 969
arsenalist 10:1dc69e0ce7fd 970 //if(cmd.find("[") != std::string::npos && cmd.find("]") != std::string::npos) {
arsenalist 10:1dc69e0ce7fd 971 // cmd.erase(cmd.begin(),cmd.begin()+cmd.find("[")+1);
arsenalist 10:1dc69e0ce7fd 972 // cmd.erase(cmd.begin()+cmd.find("]"),cmd.end());
arsenalist 10:1dc69e0ce7fd 973 //globalCommand = cmd;
arsenalist 10:1dc69e0ce7fd 974 //newCommand = true;
arsenalist 10:1dc69e0ce7fd 975 //}
arsenalist 10:1dc69e0ce7fd 976 /*
arsenalist 10:1dc69e0ce7fd 977 MbedJSONValue jsonValue;
arsenalist 10:1dc69e0ce7fd 978 parse(jsonValue,globalCommand.c_str());
arsenalist 10:1dc69e0ce7fd 979 char *parameter[5] = {"id","nType","nAddr","dType","cmd"};
arsenalist 10:1dc69e0ce7fd 980
arsenalist 10:1dc69e0ce7fd 981 //check if command is valid
arsenalist 10:1dc69e0ce7fd 982 bool validCommand = true;
arsenalist 10:1dc69e0ce7fd 983 for(int i=0; i<5; i++) {
arsenalist 10:1dc69e0ce7fd 984 validCommand = validCommand && jsonValue.hasMember(parameter[i]);
arsenalist 10:1dc69e0ce7fd 985 }
arsenalist 10:1dc69e0ce7fd 986 DBG.printf("command validity:%d\r\n",validCommand);
arsenalist 10:1dc69e0ce7fd 987
arsenalist 10:1dc69e0ce7fd 988 if(validCommand) {
arsenalist 10:1dc69e0ce7fd 989 string commandId = jsonValue[parameter[0]].get<std::string>();
arsenalist 10:1dc69e0ce7fd 990 string commandNType = jsonValue[parameter[1]].get<std::string>();
arsenalist 10:1dc69e0ce7fd 991 string commandNAddr = jsonValue[parameter[2]].get<std::string>();
arsenalist 10:1dc69e0ce7fd 992 string commandDType = jsonValue[parameter[3]].get<std::string>();
arsenalist 10:1dc69e0ce7fd 993 string commandCmd = jsonValue[parameter[4]].get<std::string>();
arsenalist 10:1dc69e0ce7fd 994
arsenalist 10:1dc69e0ce7fd 995 if(commandNType == "0") { //switch on panel controller
arsenalist 10:1dc69e0ce7fd 996 DBG.printf("command for switch\r\n");
arsenalist 10:1dc69e0ce7fd 997 }
arsenalist 10:1dc69e0ce7fd 998 else if(commandNType == "1") { //node with mac address
arsenalist 10:1dc69e0ce7fd 999 DBG.printf("command for node\r\n");
arsenalist 10:1dc69e0ce7fd 1000 //get node ip address based on node mac address
arsenalist 10:1dc69e0ce7fd 1001 string nodeIP = readNodeIP(commandNAddr);
arsenalist 10:1dc69e0ce7fd 1002 DBG.printf("nodeIP: %s\r\n",nodeIP.c_str());
arsenalist 10:1dc69e0ce7fd 1003
arsenalist 10:1dc69e0ce7fd 1004 //get cmd string based on device type and command number
arsenalist 10:1dc69e0ce7fd 1005 string nodeCmd = readNodeCmd(commandDType,commandCmd);
arsenalist 10:1dc69e0ce7fd 1006 DBG.printf("nodeCmd: %s\r\n",nodeCmd.c_str());
arsenalist 10:1dc69e0ce7fd 1007
arsenalist 10:1dc69e0ce7fd 1008 //execute command
arsenalist 21:33bd8b82560f 1009 //int trial=0;
arsenalist 21:33bd8b82560f 1010 trial = 0;
arsenalist 10:1dc69e0ce7fd 1011 string execStatus="failed";
arsenalist 10:1dc69e0ce7fd 1012
arsenalist 10:1dc69e0ce7fd 1013 while(1) {
arsenalist 10:1dc69e0ce7fd 1014 sprintf(s,"<?xml version=\"1.0\" encoding=\"utf-8\"?><app_cmd cmd=\"5\" /><app_data code=\"%s\"/>\r\n",nodeCmd.c_str());
arsenalist 10:1dc69e0ce7fd 1015 str = s;
arsenalist 10:1dc69e0ce7fd 1016 string rcv = ethGET(nodeIP,REMOTE_TCP_PORT,str);
arsenalist 10:1dc69e0ce7fd 1017 DBG.printf("response:%s\r\n",rcv.c_str());
arsenalist 10:1dc69e0ce7fd 1018 str = rcv;
arsenalist 10:1dc69e0ce7fd 1019 if(str.find("OK") != std::string::npos) {
arsenalist 10:1dc69e0ce7fd 1020 DBG.printf("cmd executed\r\n");
arsenalist 10:1dc69e0ce7fd 1021 execStatus = "success";
arsenalist 10:1dc69e0ce7fd 1022 break;
arsenalist 10:1dc69e0ce7fd 1023 }
arsenalist 10:1dc69e0ce7fd 1024 if(trial>0) { //two times trial
arsenalist 10:1dc69e0ce7fd 1025 DBG.printf("cmd is not executed\r\n");
arsenalist 10:1dc69e0ce7fd 1026 break;
arsenalist 10:1dc69e0ce7fd 1027 }
arsenalist 10:1dc69e0ce7fd 1028 trial++;
arsenalist 10:1dc69e0ce7fd 1029 wait(3);
arsenalist 10:1dc69e0ce7fd 1030 }
arsenalist 10:1dc69e0ce7fd 1031
arsenalist 10:1dc69e0ce7fd 1032 //send execution status
arsenalist 10:1dc69e0ce7fd 1033 }
arsenalist 10:1dc69e0ce7fd 1034 }
arsenalist 10:1dc69e0ce7fd 1035 */
arsenalist 10:1dc69e0ce7fd 1036 newCommand = false;
arsenalist 10:1dc69e0ce7fd 1037 }
arsenalist 10:1dc69e0ce7fd 1038 client.yield(100); //allow MQTT client to receive message
arsenalist 10:1dc69e0ce7fd 1039 }
arsenalist 10:1dc69e0ce7fd 1040 } else if(wifiConnected) {
arsenalist 0:f4e449fa34d7 1041 DBG.printf("emmaModeOperation - wifi\r\n");
arsenalist 0:f4e449fa34d7 1042
arsenalist 0:f4e449fa34d7 1043 //do not delete code below - indicator that esp need to MODE=B and esp.ready() to work
arsenalist 0:f4e449fa34d7 1044 //_ESP.printf("MODE=B");
arsenalist 0:f4e449fa34d7 1045 //wait(1);
arsenalist 0:f4e449fa34d7 1046 //while(!esp.ready());
arsenalist 0:f4e449fa34d7 1047
arsenalist 24:5d58515ba510 1048 /*
arsenalist 0:f4e449fa34d7 1049 DBG.printf("emma: setup mqtt client\r\n");
arsenalist 0:f4e449fa34d7 1050 sprintf(mqttClientId,"emma/%s",emmaUID.c_str());
arsenalist 0:f4e449fa34d7 1051
arsenalist 0:f4e449fa34d7 1052 if(mqtt.begin(mqttClientId, platformKEY.c_str(), platformSECRET.c_str(), 120, 1)) {
arsenalist 0:f4e449fa34d7 1053 mqtt.connectedCb.attach(&mqttConnected);
arsenalist 0:f4e449fa34d7 1054 mqtt.disconnectedCb.attach(&mqttDisconnected);
arsenalist 0:f4e449fa34d7 1055 mqtt.connect(MQTT_HOST,MQTT_PORT,false);
arsenalist 13:e8adfe305dbc 1056 DBG.printf("emma: success to setup mqtt\r\n");
arsenalist 13:e8adfe305dbc 1057 TFT.locate(0,40);
arsenalist 13:e8adfe305dbc 1058 TFT.printf("emma: success to setup mqtt");
arsenalist 0:f4e449fa34d7 1059 }
arsenalist 0:f4e449fa34d7 1060 DBG.printf("emma: system started\r\n");
arsenalist 24:5d58515ba510 1061 */
arsenalist 0:f4e449fa34d7 1062
arsenalist 24:5d58515ba510 1063 //t.start();
arsenalist 24:5d58515ba510 1064 //while(t.read_ms() < 5000) {
arsenalist 24:5d58515ba510 1065 // esp.process();
arsenalist 24:5d58515ba510 1066 //}
arsenalist 24:5d58515ba510 1067 //t.stop();
arsenalist 24:5d58515ba510 1068 //t.reset();
arsenalist 0:f4e449fa34d7 1069
arsenalist 0:f4e449fa34d7 1070 //set ade7758 parameter
arsenalist 0:f4e449fa34d7 1071 ADE.begin();
arsenalist 20:ea14f175bbb4 1072 //ADE.AVRMSCalib = 1526873.00;
arsenalist 20:ea14f175bbb4 1073 //ADE.BVRMSCalib = 534202.00;
arsenalist 20:ea14f175bbb4 1074 //ADE.CVRMSCalib = 456990.00;
arsenalist 20:ea14f175bbb4 1075 //ADE.AIRMSCalib = 39248.00;
arsenalist 20:ea14f175bbb4 1076 //ADE.BIRMSCalib = 654.00;
arsenalist 20:ea14f175bbb4 1077 //ADE.CIRMSCalib = 111.00;
arsenalist 0:f4e449fa34d7 1078
arsenalist 0:f4e449fa34d7 1079 ADE.writeRMSOffset(AIRMSOFFSET, BIRMSOFFSET, CIRMSOFFSET, AVRMSOFFSET, BVRMSOFFSET, CVRMSOFFSET);
arsenalist 0:f4e449fa34d7 1080
arsenalist 0:f4e449fa34d7 1081 ADE.write16bits(AWG, 0);
arsenalist 0:f4e449fa34d7 1082 ADE.write16bits(BWG, 0);
arsenalist 0:f4e449fa34d7 1083 ADE.write16bits(CWG, 0);
arsenalist 0:f4e449fa34d7 1084 ADE.write16bits(AVAG, 0);
arsenalist 0:f4e449fa34d7 1085 ADE.write16bits(BVAG, 0);
arsenalist 0:f4e449fa34d7 1086 ADE.write16bits(CVAG, 0);
arsenalist 0:f4e449fa34d7 1087
arsenalist 16:3c8d0142bf63 1088 //ADE.AWhLSB = 0.000001192;//0.00006025556;
arsenalist 20:ea14f175bbb4 1089 //ADE.AWhLSB = 0.00002109;
arsenalist 20:ea14f175bbb4 1090 //ADE.BWhLSB = 0.25075167;
arsenalist 20:ea14f175bbb4 1091 //ADE.CWhLSB = 0.25075167;
arsenalist 0:f4e449fa34d7 1092
arsenalist 20:ea14f175bbb4 1093 //ADE.AVAhLSB = 0.00008370;
arsenalist 20:ea14f175bbb4 1094 //ADE.BVAhLSB = 0;
arsenalist 20:ea14f175bbb4 1095 //ADE.CVAhLSB = 0;
arsenalist 0:f4e449fa34d7 1096
arsenalist 4:76ab12e2f8a3 1097 //init rest to server
arsenalist 7:7e8c6ad3fd64 1098 if(rest.begin(EMMA_SERVER_HOST,EMMA_SERVER_PORT,false)) {
arsenalist 4:76ab12e2f8a3 1099 DBG.printf("rest to server is created\r\n");
arsenalist 13:e8adfe305dbc 1100 TFT.locate(0,40);
arsenalist 13:e8adfe305dbc 1101 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1102 TFT.locate(0,40);
arsenalist 13:e8adfe305dbc 1103 TFT.printf("rest to server is created");
arsenalist 4:76ab12e2f8a3 1104 } else {
arsenalist 4:76ab12e2f8a3 1105 DBG.printf("rest to server is NOT created\r\n");
arsenalist 13:e8adfe305dbc 1106 TFT.locate(0,40);
arsenalist 13:e8adfe305dbc 1107 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1108 TFT.locate(0,40);
arsenalist 13:e8adfe305dbc 1109 TFT.printf("rest to server is NOT created");
arsenalist 4:76ab12e2f8a3 1110 }
arsenalist 4:76ab12e2f8a3 1111
arsenalist 7:7e8c6ad3fd64 1112 //check firmware update
arsenalist 7:7e8c6ad3fd64 1113
arsenalist 7:7e8c6ad3fd64 1114 //execute last state of switches on board
arsenalist 7:7e8c6ad3fd64 1115
arsenalist 7:7e8c6ad3fd64 1116 //get list of nodes from server
arsenalist 7:7e8c6ad3fd64 1117 sprintf(s,"/emma/api/controller/remotes?uid=%s&hmac=%s",emmaUID.c_str(),hmac.c_str());
arsenalist 7:7e8c6ad3fd64 1118 rest.get(s);
arsenalist 7:7e8c6ad3fd64 1119 for(int i=0; i<sizeof(s); i++) {
arsenalist 7:7e8c6ad3fd64 1120 s[i]=0; }
arsenalist 7:7e8c6ad3fd64 1121 rest.getResponse(s,sizeof(s));
arsenalist 7:7e8c6ad3fd64 1122 str = s;
arsenalist 7:7e8c6ad3fd64 1123 if(str.rfind("[{\"mac\"") != std::string::npos) {
arsenalist 7:7e8c6ad3fd64 1124 DBG.printf("get nodes from server\r\n");
arsenalist 7:7e8c6ad3fd64 1125 str.erase(str.begin(),str.begin()+str.rfind("[{\"mac\""));
arsenalist 7:7e8c6ad3fd64 1126 str.erase(str.begin()+str.rfind("}]")+2,str.end());
arsenalist 7:7e8c6ad3fd64 1127
arsenalist 7:7e8c6ad3fd64 1128 MbedJSONValue jsonValue;
arsenalist 7:7e8c6ad3fd64 1129 parse(jsonValue,str.c_str());
arsenalist 7:7e8c6ad3fd64 1130 char *parameter[2] = {"mac","ip"};
arsenalist 7:7e8c6ad3fd64 1131
arsenalist 13:e8adfe305dbc 1132 TFT.locate(0,40);
arsenalist 13:e8adfe305dbc 1133 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1134 TFT.locate(0,40);
arsenalist 13:e8adfe305dbc 1135 TFT.printf("get %d nodes from server",jsonValue.size());
arsenalist 13:e8adfe305dbc 1136 wait(0.5);
arsenalist 13:e8adfe305dbc 1137 TFT.locate(0,40);
arsenalist 13:e8adfe305dbc 1138 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1139
arsenalist 7:7e8c6ad3fd64 1140 //check whether nodes valid
arsenalist 7:7e8c6ad3fd64 1141 bool validNodes = true;
arsenalist 7:7e8c6ad3fd64 1142 for(int i=0; i<jsonValue.size(); i++) {
arsenalist 7:7e8c6ad3fd64 1143 for(int j=0; j<2; j++) {
arsenalist 7:7e8c6ad3fd64 1144 validNodes = validNodes && jsonValue[i].hasMember(parameter[j]);
arsenalist 7:7e8c6ad3fd64 1145 }
arsenalist 7:7e8c6ad3fd64 1146 }
arsenalist 7:7e8c6ad3fd64 1147 DBG.printf("nodes validity:%d\r\n",validNodes);
arsenalist 7:7e8c6ad3fd64 1148
arsenalist 7:7e8c6ad3fd64 1149 if(validNodes) {
arsenalist 7:7e8c6ad3fd64 1150 for(int i=0; i<jsonValue.size(); i++) {
arsenalist 7:7e8c6ad3fd64 1151 string macValue = jsonValue[i][parameter[0]].get<std::string>();
arsenalist 7:7e8c6ad3fd64 1152 string ipValue = jsonValue[i][parameter[1]].get<std::string>();
arsenalist 7:7e8c6ad3fd64 1153 nodes[i].macAddr = macValue;
arsenalist 7:7e8c6ad3fd64 1154 nodes[i].ipAddr = ipValue;
arsenalist 13:e8adfe305dbc 1155 DBG.printf("nodes[%d]mac:%s\r\n",i,nodes[i].macAddr.c_str());
arsenalist 13:e8adfe305dbc 1156 DBG.printf("nodes[%d]ip:%s\r\n",i,nodes[i].ipAddr.c_str());
arsenalist 7:7e8c6ad3fd64 1157 }
arsenalist 7:7e8c6ad3fd64 1158 }
arsenalist 7:7e8c6ad3fd64 1159
arsenalist 7:7e8c6ad3fd64 1160 } else {
arsenalist 7:7e8c6ad3fd64 1161 DBG.printf("no nodes from server\r\n");
arsenalist 7:7e8c6ad3fd64 1162 }
arsenalist 7:7e8c6ad3fd64 1163
arsenalist 24:5d58515ba510 1164 /*
arsenalist 24:5d58515ba510 1165 //success
arsenalist 24:5d58515ba510 1166 DBG.printf("emma: setup mqtt client\r\n");
arsenalist 24:5d58515ba510 1167 sprintf(mqttClientId,"emma/%s",emmaUID.c_str());
arsenalist 24:5d58515ba510 1168 if(mqtt.begin(mqttClientId, platformKEY.c_str(), platformSECRET.c_str(), 120, 1)) {
arsenalist 24:5d58515ba510 1169 mqtt.connectedCb.attach(&mqttConnected);
arsenalist 24:5d58515ba510 1170 mqtt.disconnectedCb.attach(&mqttDisconnected);
arsenalist 24:5d58515ba510 1171 mqtt.connect(MQTT_HOST,MQTT_PORT,false);
arsenalist 24:5d58515ba510 1172 DBG.printf("emma: success to setup mqtt\r\n");
arsenalist 24:5d58515ba510 1173 TFT.locate(0,40);
arsenalist 24:5d58515ba510 1174 TFT.printf("emma: success to setup mqtt");
arsenalist 24:5d58515ba510 1175 }
arsenalist 24:5d58515ba510 1176 DBG.printf("emma: system started\r\n");
arsenalist 24:5d58515ba510 1177
arsenalist 24:5d58515ba510 1178 t.start();
arsenalist 24:5d58515ba510 1179 while(t.read_ms() < 5000) {
arsenalist 24:5d58515ba510 1180 esp.process();
arsenalist 24:5d58515ba510 1181 }
arsenalist 24:5d58515ba510 1182 t.stop();
arsenalist 24:5d58515ba510 1183 t.reset();
arsenalist 24:5d58515ba510 1184 */
arsenalist 7:7e8c6ad3fd64 1185
arsenalist 4:76ab12e2f8a3 1186 //preset nodes' macAddr and ipAddr
arsenalist 7:7e8c6ad3fd64 1187 //nodes[0].macAddr = "002629034222";
arsenalist 7:7e8c6ad3fd64 1188 //nodes[0].ipAddr = "192.168.2.15";
arsenalist 7:7e8c6ad3fd64 1189 //nodes[1].macAddr = "00262903424e";
arsenalist 7:7e8c6ad3fd64 1190 //nodes[1].ipAddr = "192.168.2.32";
arsenalist 4:76ab12e2f8a3 1191
arsenalist 4:76ab12e2f8a3 1192 //init rest to remotes
arsenalist 4:76ab12e2f8a3 1193 for(int i=0; i<NODES_MAX; i++) {
arsenalist 4:76ab12e2f8a3 1194 if(!nodes[i].ipAddr.empty()) {
arsenalist 4:76ab12e2f8a3 1195 DBG.printf("restConn nodes[%d] is created\r\n",i);
arsenalist 4:76ab12e2f8a3 1196 nodes[i].restConn->begin(nodes[i].ipAddr.c_str(),16038,false);
arsenalist 4:76ab12e2f8a3 1197 wait(1);
arsenalist 4:76ab12e2f8a3 1198 } else {
arsenalist 4:76ab12e2f8a3 1199 DBG.printf("restConn nodes[%d] is NOT created\r\n",i);
arsenalist 4:76ab12e2f8a3 1200 wait(1);
arsenalist 4:76ab12e2f8a3 1201 }
arsenalist 4:76ab12e2f8a3 1202 }
arsenalist 4:76ab12e2f8a3 1203
arsenalist 4:76ab12e2f8a3 1204 _ESP.attach(&rxInterrupt,Serial::RxIrq);
arsenalist 4:76ab12e2f8a3 1205
arsenalist 4:76ab12e2f8a3 1206 //define thread
arsenalist 17:b3ced0e67916 1207 osThreadDef(energyThread, osPriorityBelowNormal, (8*DEFAULT_STACK_SIZE));
arsenalist 0:f4e449fa34d7 1208 //create thread
arsenalist 2:fdfdeb5fd6fd 1209 osThreadCreate(osThread(energyThread),NULL);
arsenalist 0:f4e449fa34d7 1210
arsenalist 24:5d58515ba510 1211 tPanelEnergy.start();
arsenalist 24:5d58515ba510 1212 tPanel.start();
arsenalist 4:76ab12e2f8a3 1213 tNodes.start();
arsenalist 4:76ab12e2f8a3 1214 wait(1);
arsenalist 0:f4e449fa34d7 1215 while(1) {
arsenalist 4:76ab12e2f8a3 1216 checkRxBuffer();
arsenalist 20:ea14f175bbb4 1217 checkVoltagePower();
arsenalist 20:ea14f175bbb4 1218
arsenalist 24:5d58515ba510 1219 //whether espFreeMemory occurs
arsenalist 24:5d58515ba510 1220 if(espFreeMemory) {
arsenalist 24:5d58515ba510 1221 //success if rxInterrupt is disabled
arsenalist 24:5d58515ba510 1222
arsenalist 24:5d58515ba510 1223 //disable UART2
arsenalist 24:5d58515ba510 1224 NVIC_DisableIRQ(USART2_IRQn);
arsenalist 24:5d58515ba510 1225
arsenalist 24:5d58515ba510 1226 DBG.printf("emma: setup mqtt client\r\n");
arsenalist 24:5d58515ba510 1227 sprintf(mqttClientId,"emma/%s",emmaUID.c_str());
arsenalist 24:5d58515ba510 1228 if(mqtt.begin(mqttClientId, platformKEY.c_str(), platformSECRET.c_str(), 120, 1)) {
arsenalist 24:5d58515ba510 1229 mqtt.connectedCb.attach(&mqttConnected);
arsenalist 24:5d58515ba510 1230 mqtt.disconnectedCb.attach(&mqttDisconnected);
arsenalist 24:5d58515ba510 1231 mqtt.connect(MQTT_HOST,MQTT_PORT,false);
arsenalist 24:5d58515ba510 1232 DBG.printf("emma: success to setup mqtt\r\n");
arsenalist 24:5d58515ba510 1233 TFT.locate(0,40);
arsenalist 24:5d58515ba510 1234 TFT.printf("emma: success to setup mqtt");
arsenalist 24:5d58515ba510 1235 }
arsenalist 24:5d58515ba510 1236 DBG.printf("emma: system started\r\n");
arsenalist 24:5d58515ba510 1237
arsenalist 24:5d58515ba510 1238 t.start();
arsenalist 24:5d58515ba510 1239 while(t.read_ms() < 5000) {
arsenalist 24:5d58515ba510 1240 esp.process();
arsenalist 24:5d58515ba510 1241 }
arsenalist 24:5d58515ba510 1242 t.stop();
arsenalist 24:5d58515ba510 1243 t.reset();
arsenalist 24:5d58515ba510 1244
arsenalist 24:5d58515ba510 1245 //enable UART2
arsenalist 24:5d58515ba510 1246 NVIC_EnableIRQ(USART2_IRQn);
arsenalist 24:5d58515ba510 1247
arsenalist 24:5d58515ba510 1248 espFreeMemory = false;
arsenalist 24:5d58515ba510 1249 }
arsenalist 24:5d58515ba510 1250
arsenalist 4:76ab12e2f8a3 1251 //panelEnergy, panelVoltage, and panelPower
arsenalist 24:5d58515ba510 1252 if(tPanelEnergy.read() > 30.0f) {
arsenalist 4:76ab12e2f8a3 1253 DBG.printf("[%d]WattHR for each phase: %.2f, %.2f, %.2f\r\n", loop, AWattHr, BWattHr, CWattHr);
arsenalist 13:e8adfe305dbc 1254 TFT.locate(0,60);
arsenalist 13:e8adfe305dbc 1255 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1256 TFT.locate(0,60);
arsenalist 13:e8adfe305dbc 1257 TFT.printf("[%d]WHR: %.1f, %.1f, %.1f", loop, AWattHr, BWattHr, CWattHr);
arsenalist 13:e8adfe305dbc 1258
arsenalist 4:76ab12e2f8a3 1259 DBG.printf("VRMS for each phase: %.2f, %.2f, %.2f\r\n", AVrms, BVrms, CVrms);
arsenalist 13:e8adfe305dbc 1260 TFT.locate(0,80);
arsenalist 13:e8adfe305dbc 1261 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1262 TFT.locate(0,80);
arsenalist 13:e8adfe305dbc 1263 TFT.printf("VRMS: %.1f, %.1f, %.1f", AVrms, BVrms, CVrms);
arsenalist 13:e8adfe305dbc 1264
arsenalist 4:76ab12e2f8a3 1265 DBG.printf("Watt for each phase: %.2f, %.2f, %.2f\r\n", AWatt, BWatt, CWatt);
arsenalist 13:e8adfe305dbc 1266 TFT.locate(0,100);
arsenalist 13:e8adfe305dbc 1267 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1268 TFT.locate(0,100);
arsenalist 13:e8adfe305dbc 1269 TFT.printf("Watt: %.1f, %.1f, %.1f", AWatt, BWatt, CWatt);
arsenalist 4:76ab12e2f8a3 1270
arsenalist 22:e18d361bf688 1271 if(newEnergyData) {
arsenalist 22:e18d361bf688 1272 //for(int i=1; i<4; i++) {
arsenalist 22:e18d361bf688 1273 for(int i=1; i<2; i++) {
arsenalist 22:e18d361bf688 1274 DBG.printf("sending channel: %d\r\n",i);
arsenalist 22:e18d361bf688 1275 if(i==1){
arsenalist 22:e18d361bf688 1276 XWattHr = AWattHr;
arsenalist 22:e18d361bf688 1277 XVrms = AVrms;
arsenalist 22:e18d361bf688 1278 XWatt = AWatt;
arsenalist 22:e18d361bf688 1279 } else if(i==2) {
arsenalist 22:e18d361bf688 1280 XWattHr = BWattHr;
arsenalist 22:e18d361bf688 1281 XVrms = BVrms;
arsenalist 22:e18d361bf688 1282 XWatt = BWatt;
arsenalist 22:e18d361bf688 1283 } else {
arsenalist 22:e18d361bf688 1284 XWattHr = CWattHr;
arsenalist 22:e18d361bf688 1285 XVrms = CVrms;
arsenalist 22:e18d361bf688 1286 XWatt = CWatt;
arsenalist 22:e18d361bf688 1287 }
arsenalist 24:5d58515ba510 1288
arsenalist 24:5d58515ba510 1289 if(XWattHr != 0.0f) {
arsenalist 22:e18d361bf688 1290
arsenalist 24:5d58515ba510 1291 sprintf(r,"/emma/api/controller/energy/%d",i);
arsenalist 24:5d58515ba510 1292 seconds = time(NULL);
arsenalist 24:5d58515ba510 1293 //for(int j=0; j<sizeof(q); j++) {
arsenalist 24:5d58515ba510 1294 // q[j]=0; }
arsenalist 24:5d58515ba510 1295 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 24:5d58515ba510 1296
arsenalist 24:5d58515ba510 1297 //calculate hmacTime
arsenalist 24:5d58515ba510 1298 for(int j=0; j<sizeof(p); j++) {
arsenalist 24:5d58515ba510 1299 p[j]=0; }
arsenalist 24:5d58515ba510 1300 sprintf(p,"emma-%s-%s",emmaUID.c_str(),q);
arsenalist 24:5d58515ba510 1301 hmacTime = calculateMD5(p);
arsenalist 22:e18d361bf688 1302
arsenalist 24:5d58515ba510 1303 sprintf(s,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"energy\":%.2f,\"voltage\":%.2f,\"power\":%.2f}",
arsenalist 24:5d58515ba510 1304 emmaUID.c_str(),hmacTime.c_str(),q,XWattHr,XVrms,XWatt);
arsenalist 24:5d58515ba510 1305 //DBG.printf("dataEnergy:\r\n%s\r\n",s);
arsenalist 24:5d58515ba510 1306 rest.post(r,s);
arsenalist 24:5d58515ba510 1307 wait(2);
arsenalist 24:5d58515ba510 1308 if(rxBuf.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 24:5d58515ba510 1309 DBG.printf("send channel: %d success\r\n",i);
arsenalist 24:5d58515ba510 1310 TFT.foreground(Green);
arsenalist 24:5d58515ba510 1311 TFT.locate(0,120);
arsenalist 24:5d58515ba510 1312 TFT.printf(" ");
arsenalist 24:5d58515ba510 1313 TFT.locate(0,120);
arsenalist 24:5d58515ba510 1314 TFT.printf("send ch%d success",i);
arsenalist 24:5d58515ba510 1315 wait(1);
arsenalist 24:5d58515ba510 1316 TFT.locate(0,120);
arsenalist 24:5d58515ba510 1317 TFT.printf(" ");
arsenalist 24:5d58515ba510 1318 TFT.foreground(White);
arsenalist 24:5d58515ba510 1319 } else {
arsenalist 24:5d58515ba510 1320 DBG.printf("send channel: %d failed\r\n",i);
arsenalist 24:5d58515ba510 1321 TFT.foreground(Red);
arsenalist 24:5d58515ba510 1322 TFT.locate(0,120);
arsenalist 24:5d58515ba510 1323 TFT.printf(" ");
arsenalist 24:5d58515ba510 1324 TFT.locate(0,120);
arsenalist 24:5d58515ba510 1325 TFT.printf("send ch%d failed",i);
arsenalist 24:5d58515ba510 1326 wait(1);
arsenalist 24:5d58515ba510 1327 TFT.locate(0,120);
arsenalist 24:5d58515ba510 1328 TFT.printf(" ");
arsenalist 24:5d58515ba510 1329 TFT.foreground(White);
arsenalist 24:5d58515ba510 1330 }
arsenalist 22:e18d361bf688 1331 }
arsenalist 4:76ab12e2f8a3 1332 }
arsenalist 22:e18d361bf688 1333
arsenalist 22:e18d361bf688 1334 newEnergyData = false;
arsenalist 0:f4e449fa34d7 1335 }
arsenalist 22:e18d361bf688 1336
arsenalist 24:5d58515ba510 1337 tPanelEnergy.reset();
arsenalist 4:76ab12e2f8a3 1338 loop++;
arsenalist 0:f4e449fa34d7 1339 }
arsenalist 0:f4e449fa34d7 1340
arsenalist 21:33bd8b82560f 1341 //panel environment
arsenalist 5:d00233dd36f5 1342 checkRxBuffer();
arsenalist 21:33bd8b82560f 1343 if(tPanel.read() > 60.0f) {
arsenalist 21:33bd8b82560f 1344 int dTemp=0;
arsenalist 21:33bd8b82560f 1345 int dHum=0;
arsenalist 21:33bd8b82560f 1346 int dGas=0;
arsenalist 21:33bd8b82560f 1347
arsenalist 21:33bd8b82560f 1348 DBG.printf("getPanelEnvironment\r\n");
arsenalist 21:33bd8b82560f 1349
arsenalist 21:33bd8b82560f 1350 //get environment sensor
arsenalist 21:33bd8b82560f 1351 trial=0;
arsenalist 21:33bd8b82560f 1352 while(1) {
arsenalist 21:33bd8b82560f 1353 if(trial>=2) { //two times trial
arsenalist 21:33bd8b82560f 1354 break;
arsenalist 21:33bd8b82560f 1355 }
arsenalist 21:33bd8b82560f 1356 if(d.readData() == DHT11::OK) {
arsenalist 21:33bd8b82560f 1357 dTemp = d.readTemperature();
arsenalist 21:33bd8b82560f 1358 dHum = d.readHumidity();
arsenalist 21:33bd8b82560f 1359 break;
arsenalist 21:33bd8b82560f 1360 }
arsenalist 21:33bd8b82560f 1361 trial++;
arsenalist 21:33bd8b82560f 1362 wait(3);
arsenalist 21:33bd8b82560f 1363 }
arsenalist 21:33bd8b82560f 1364
arsenalist 21:33bd8b82560f 1365 //send environment sensor
arsenalist 24:5d58515ba510 1366 if(dTemp!=0 && dHum!=0) {
arsenalist 24:5d58515ba510 1367 seconds = time(NULL);
arsenalist 24:5d58515ba510 1368 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 22:e18d361bf688 1369
arsenalist 24:5d58515ba510 1370 //calculate hmacTime
arsenalist 24:5d58515ba510 1371 for(int j=0; j<sizeof(p); j++) {
arsenalist 24:5d58515ba510 1372 p[j]=0; }
arsenalist 24:5d58515ba510 1373 sprintf(p,"emma-%s-%s",emmaUID.c_str(),q);
arsenalist 24:5d58515ba510 1374 hmacTime = calculateMD5(p);
arsenalist 22:e18d361bf688 1375
arsenalist 24:5d58515ba510 1376 sprintf(s,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"temp\":%d,\"hum\":%d,\"gas\":%d}",
arsenalist 24:5d58515ba510 1377 emmaUID.c_str(),hmacTime.c_str(),q,dTemp,dHum,dGas);
arsenalist 24:5d58515ba510 1378 //DBG.printf("dataEnvironment:\r\n%s\r\n",s);
arsenalist 24:5d58515ba510 1379 rest.post("/emma/api/controller/environment",s);
arsenalist 24:5d58515ba510 1380 wait(2);
arsenalist 24:5d58515ba510 1381 str = rxBuf;
arsenalist 24:5d58515ba510 1382 if(str.rfind("/environment") != std::string::npos) {
arsenalist 24:5d58515ba510 1383 str.erase(str.begin(),str.begin()+str.rfind("/environment"));
arsenalist 24:5d58515ba510 1384 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 24:5d58515ba510 1385 DBG.printf("send panel environment success\r\n");
arsenalist 24:5d58515ba510 1386 } else {
arsenalist 24:5d58515ba510 1387 DBG.printf("send panel environment failed\r\n");
arsenalist 24:5d58515ba510 1388 }
arsenalist 21:33bd8b82560f 1389 }
arsenalist 24:5d58515ba510 1390 checkRxBuffer();
arsenalist 21:33bd8b82560f 1391 }
arsenalist 21:33bd8b82560f 1392 tPanel.reset();
arsenalist 21:33bd8b82560f 1393 }
arsenalist 21:33bd8b82560f 1394
arsenalist 0:f4e449fa34d7 1395 //nodeTemp
arsenalist 21:33bd8b82560f 1396 checkRxBuffer();
arsenalist 19:7e3e9332f719 1397 if(tNodes.read() > 120.0f) {
arsenalist 5:d00233dd36f5 1398 DBG.printf("getNodesTemperature\r\n");
arsenalist 5:d00233dd36f5 1399
arsenalist 5:d00233dd36f5 1400 for(int i=0; i<NODES_MAX; i++) {
arsenalist 5:d00233dd36f5 1401 if(!nodes[i].ipAddr.empty()) {
arsenalist 5:d00233dd36f5 1402 //get node's temp
arsenalist 5:d00233dd36f5 1403 string temp;
arsenalist 5:d00233dd36f5 1404 nodes[i].restConn->get("/","<?xml version=\"1.0\" encoding=\"utf-8\"?><app_cmd cmd=\"2\"/>\r\n");
arsenalist 5:d00233dd36f5 1405 wait(2);
arsenalist 5:d00233dd36f5 1406 temp = rxBuf;
arsenalist 5:d00233dd36f5 1407 if(temp.rfind(nodes[i].ipAddr) != std::string::npos) {
arsenalist 5:d00233dd36f5 1408 temp.erase(temp.begin(),temp.begin()+temp.rfind(nodes[i].ipAddr));
arsenalist 5:d00233dd36f5 1409 if(temp.rfind("temp=") != std::string::npos) {
arsenalist 5:d00233dd36f5 1410 temp.erase(temp.begin(),temp.begin()+temp.rfind("temp=")+6);
arsenalist 5:d00233dd36f5 1411 temp.erase(temp.begin()+temp.find("\""),temp.end());
arsenalist 5:d00233dd36f5 1412 } else {
arsenalist 5:d00233dd36f5 1413 temp = "0"; //connect to node, but receive none
arsenalist 5:d00233dd36f5 1414 }
arsenalist 5:d00233dd36f5 1415 } else {
arsenalist 5:d00233dd36f5 1416 temp = "0"; //not connected to node
arsenalist 5:d00233dd36f5 1417 }
arsenalist 0:f4e449fa34d7 1418
arsenalist 5:d00233dd36f5 1419 DBG.printf("nodeTemp[%d]:%s\r\n",i,temp.c_str());
arsenalist 5:d00233dd36f5 1420
arsenalist 5:d00233dd36f5 1421 //send node's temp
arsenalist 14:8287f0f5d987 1422 seconds = time(NULL);
arsenalist 22:e18d361bf688 1423 //for(int j=0; j<sizeof(q); j++) {
arsenalist 22:e18d361bf688 1424 // q[j]=0; }
arsenalist 20:ea14f175bbb4 1425 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 22:e18d361bf688 1426
arsenalist 22:e18d361bf688 1427 //calculate hmacTime
arsenalist 22:e18d361bf688 1428 for(int j=0; j<sizeof(p); j++) {
arsenalist 22:e18d361bf688 1429 p[j]=0; }
arsenalist 22:e18d361bf688 1430 sprintf(p,"emma-%s-%s",emmaUID.c_str(),q);
arsenalist 22:e18d361bf688 1431 hmacTime = calculateMD5(p);
arsenalist 22:e18d361bf688 1432
arsenalist 14:8287f0f5d987 1433 sprintf(s,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"mac\":\"%s\",\"value\":%s}",
arsenalist 22:e18d361bf688 1434 emmaUID.c_str(),hmacTime.c_str(),q,nodes[i].macAddr.c_str(),temp.c_str());
arsenalist 19:7e3e9332f719 1435 //DBG.printf("dataNodeTemp:\r\n%s\r\n",s);
arsenalist 0:f4e449fa34d7 1436 rest.post("/emma/api/controller/nodetemp",s);
arsenalist 5:d00233dd36f5 1437 wait(2);
arsenalist 21:33bd8b82560f 1438 str = rxBuf;
arsenalist 21:33bd8b82560f 1439 if(str.rfind("/nodetemp") != std::string::npos) {
arsenalist 21:33bd8b82560f 1440 str.erase(str.begin(),str.begin()+str.rfind("/nodetemp"));
arsenalist 21:33bd8b82560f 1441 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 5:d00233dd36f5 1442 DBG.printf("send nodeTemp success\r\n");
arsenalist 5:d00233dd36f5 1443 } else {
arsenalist 5:d00233dd36f5 1444 DBG.printf("send nodeTemp failed\r\n");
arsenalist 5:d00233dd36f5 1445 }
arsenalist 5:d00233dd36f5 1446 }
arsenalist 6:45f50f1177db 1447 checkRxBuffer();
arsenalist 5:d00233dd36f5 1448 }
arsenalist 0:f4e449fa34d7 1449 }
arsenalist 19:7e3e9332f719 1450 tNodes.reset();
arsenalist 19:7e3e9332f719 1451 }
arsenalist 21:33bd8b82560f 1452
arsenalist 21:33bd8b82560f 1453 //command
arsenalist 5:d00233dd36f5 1454 checkRxBuffer();
arsenalist 0:f4e449fa34d7 1455 if(newCommand) {
arsenalist 5:d00233dd36f5 1456 DBG.printf("newCommand:\r\n%s\r\n",globalCommand.c_str());
arsenalist 13:e8adfe305dbc 1457 TFT.locate(0,160);
arsenalist 13:e8adfe305dbc 1458 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1459 TFT.locate(0,160);
arsenalist 13:e8adfe305dbc 1460 TFT.printf("newCommand");
arsenalist 13:e8adfe305dbc 1461
arsenalist 0:f4e449fa34d7 1462 MbedJSONValue jsonValue;
arsenalist 0:f4e449fa34d7 1463 parse(jsonValue,globalCommand.c_str());
arsenalist 15:136526c28afb 1464 char *parameter[5] = {"name","nType","nAddr","dType","cmd"};
arsenalist 0:f4e449fa34d7 1465
arsenalist 7:7e8c6ad3fd64 1466 //check whether command is valid
arsenalist 0:f4e449fa34d7 1467 bool validCommand = true;
arsenalist 15:136526c28afb 1468 for(int i=0; i<5; i++) {
arsenalist 0:f4e449fa34d7 1469 validCommand = validCommand && jsonValue.hasMember(parameter[i]);
arsenalist 0:f4e449fa34d7 1470 }
arsenalist 0:f4e449fa34d7 1471 DBG.printf("command validity:%d\r\n",validCommand);
arsenalist 0:f4e449fa34d7 1472
arsenalist 0:f4e449fa34d7 1473 if(validCommand) {
arsenalist 15:136526c28afb 1474 string commandName = jsonValue[parameter[0]].get<std::string>();
arsenalist 15:136526c28afb 1475 string commandNType = jsonValue[parameter[1]].get<std::string>();
arsenalist 15:136526c28afb 1476 string commandNAddr = jsonValue[parameter[2]].get<std::string>();
arsenalist 15:136526c28afb 1477 string commandDType = jsonValue[parameter[3]].get<std::string>();
arsenalist 15:136526c28afb 1478 string commandCmd = jsonValue[parameter[4]].get<std::string>();
arsenalist 0:f4e449fa34d7 1479
arsenalist 0:f4e449fa34d7 1480 if(commandNType == "0") { //switch on panel controller
arsenalist 0:f4e449fa34d7 1481 DBG.printf("command for switch\r\n");
arsenalist 0:f4e449fa34d7 1482 }
arsenalist 0:f4e449fa34d7 1483 else if(commandNType == "1") { //node with mac address
arsenalist 0:f4e449fa34d7 1484 DBG.printf("command for node\r\n");
arsenalist 0:f4e449fa34d7 1485 //get node ip address based on node mac address
arsenalist 5:d00233dd36f5 1486 //string nodeIP;
arsenalist 1:d314a43ae6f7 1487 //nodeIp = readNodeIP(commandNAddr);
arsenalist 5:d00233dd36f5 1488 //nodeIP = "192.168.2.15";
arsenalist 0:f4e449fa34d7 1489 //DBG.printf("nodeIP: %s\r\n",nodeIP.c_str());
arsenalist 5:d00233dd36f5 1490
arsenalist 5:d00233dd36f5 1491 //get index of node list based on mac address
arsenalist 5:d00233dd36f5 1492 int idx = NODES_INVALID;
arsenalist 5:d00233dd36f5 1493 for(int i=0; i<NODES_MAX; i++) {
arsenalist 5:d00233dd36f5 1494 if(!nodes[i].macAddr.compare(commandNAddr)) {
arsenalist 5:d00233dd36f5 1495 idx = i;
arsenalist 5:d00233dd36f5 1496 }
arsenalist 5:d00233dd36f5 1497 }
arsenalist 5:d00233dd36f5 1498
arsenalist 5:d00233dd36f5 1499 //execution process
arsenalist 21:33bd8b82560f 1500 //int trial;
arsenalist 15:136526c28afb 1501 string execResult = "failed";
arsenalist 5:d00233dd36f5 1502 if(idx != NODES_INVALID) {
arsenalist 5:d00233dd36f5 1503 DBG.printf("index found at %d\r\n",idx);
arsenalist 0:f4e449fa34d7 1504
arsenalist 5:d00233dd36f5 1505 //get cmd string based on device type and command number
arsenalist 5:d00233dd36f5 1506 string nodeCmd;
arsenalist 14:8287f0f5d987 1507 nodeCmd = readNodeCmd(commandDType,commandCmd);
arsenalist 14:8287f0f5d987 1508 //nodeCmd = "020129A0163B161315131613153C151316131514143C153C16141414141415151315141414141514141415141414143D1514143D141415141414143D14000D"; //turn off
arsenalist 5:d00233dd36f5 1509 //DBG.printf("nodeCmd: %s\r\n",nodeCmd.c_str());
arsenalist 0:f4e449fa34d7 1510
arsenalist 5:d00233dd36f5 1511 //execute command
arsenalist 5:d00233dd36f5 1512 DBG.printf("executing command\r\n");
arsenalist 0:f4e449fa34d7 1513 sprintf(s,"<?xml version=\"1.0\" encoding=\"utf-8\"?><app_cmd cmd=\"5\" /><app_data code=\"%s\"/>\r\n",nodeCmd.c_str());
arsenalist 0:f4e449fa34d7 1514
arsenalist 5:d00233dd36f5 1515 trial=0;
arsenalist 0:f4e449fa34d7 1516 while(1) {
arsenalist 5:d00233dd36f5 1517 //cmdExecuted = false;
arsenalist 5:d00233dd36f5 1518 if(trial>=2) { //two times trial
arsenalist 0:f4e449fa34d7 1519 DBG.printf("cmd is not executed\r\n");
arsenalist 13:e8adfe305dbc 1520 TFT.foreground(Red);
arsenalist 13:e8adfe305dbc 1521 TFT.locate(0,180);
arsenalist 13:e8adfe305dbc 1522 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1523 TFT.locate(0,180);
arsenalist 13:e8adfe305dbc 1524 TFT.printf("cmd is not executed");
arsenalist 14:8287f0f5d987 1525 wait(1);
arsenalist 13:e8adfe305dbc 1526 TFT.locate(0,180);
arsenalist 13:e8adfe305dbc 1527 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1528 TFT.foreground(White);
arsenalist 0:f4e449fa34d7 1529 break;
arsenalist 0:f4e449fa34d7 1530 }
arsenalist 5:d00233dd36f5 1531 nodes[idx].restConn->get("/",s);
arsenalist 5:d00233dd36f5 1532 wait(2);
arsenalist 5:d00233dd36f5 1533 if(rxBuf.find("REST: Sent") != std::string::npos) {
arsenalist 13:e8adfe305dbc 1534 DBG.printf("cmd is executed\r\n");
arsenalist 13:e8adfe305dbc 1535 TFT.foreground(Green);
arsenalist 13:e8adfe305dbc 1536 TFT.locate(0,180);
arsenalist 13:e8adfe305dbc 1537 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1538 TFT.locate(0,180);
arsenalist 13:e8adfe305dbc 1539 TFT.printf("cmd is executed");
arsenalist 14:8287f0f5d987 1540 wait(1);
arsenalist 13:e8adfe305dbc 1541 TFT.locate(0,180);
arsenalist 13:e8adfe305dbc 1542 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1543 TFT.foreground(White);
arsenalist 15:136526c28afb 1544 execResult = "success";
arsenalist 5:d00233dd36f5 1545 break;
arsenalist 5:d00233dd36f5 1546 }
arsenalist 0:f4e449fa34d7 1547 trial++;
arsenalist 5:d00233dd36f5 1548 }
arsenalist 14:8287f0f5d987 1549 } else {
arsenalist 14:8287f0f5d987 1550 TFT.foreground(Red);
arsenalist 14:8287f0f5d987 1551 TFT.locate(0,180);
arsenalist 14:8287f0f5d987 1552 TFT.printf(" ");
arsenalist 14:8287f0f5d987 1553 TFT.locate(0,180);
arsenalist 14:8287f0f5d987 1554 TFT.printf("node is invalid");
arsenalist 14:8287f0f5d987 1555 wait(1);
arsenalist 14:8287f0f5d987 1556 TFT.locate(0,180);
arsenalist 14:8287f0f5d987 1557 TFT.printf(" ");
arsenalist 14:8287f0f5d987 1558 TFT.foreground(White);
arsenalist 5:d00233dd36f5 1559 }
arsenalist 5:d00233dd36f5 1560
arsenalist 5:d00233dd36f5 1561 wait(2);
arsenalist 5:d00233dd36f5 1562 //send execution result
arsenalist 21:33bd8b82560f 1563 //DBG.printf("send execution result\r\n");
arsenalist 23:fb369e171b7d 1564
arsenalist 23:fb369e171b7d 1565 //calculate hmacCmd
arsenalist 23:fb369e171b7d 1566 for(int j=0; j<sizeof(p); j++) {
arsenalist 23:fb369e171b7d 1567 p[j]=0; }
arsenalist 23:fb369e171b7d 1568 sprintf(p,"emma-%s-%s",emmaUID.c_str(),commandCmd.c_str());
arsenalist 23:fb369e171b7d 1569 hmacCmd = calculateMD5(p);
arsenalist 23:fb369e171b7d 1570
arsenalist 23:fb369e171b7d 1571 sprintf(s,"{\"uid\":\"%s\",\"nType\":\"%s\",\"nAddr\":\"%s\",\"dType\":\"%s\",\"cmd\":\"%s\",\"name\":\"%s\",\"result\":\"%s\",\"hmac\":\"%s\"}",
arsenalist 23:fb369e171b7d 1572 emmaUID.c_str(), commandNType.c_str(),commandNAddr.c_str(),commandDType.c_str(),commandCmd.c_str(),commandName.c_str(),execResult.c_str(),hmacCmd.c_str());
arsenalist 5:d00233dd36f5 1573
arsenalist 5:d00233dd36f5 1574 trial=0;
arsenalist 5:d00233dd36f5 1575 while(1) {
arsenalist 5:d00233dd36f5 1576 if(trial>=2) { //two times trial
arsenalist 23:fb369e171b7d 1577 DBG.printf("failed to send execution result\r\n");
arsenalist 5:d00233dd36f5 1578 break;
arsenalist 0:f4e449fa34d7 1579 }
arsenalist 23:fb369e171b7d 1580 rest.post("/emma/api/controller/result",s);
arsenalist 5:d00233dd36f5 1581 wait(2);
arsenalist 23:fb369e171b7d 1582 str = rxBuf;
arsenalist 23:fb369e171b7d 1583 if(str.rfind("/result") != std::string::npos) {
arsenalist 23:fb369e171b7d 1584 str.erase(str.begin(),str.begin()+str.rfind("/result"));
arsenalist 23:fb369e171b7d 1585 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 23:fb369e171b7d 1586 DBG.printf("success to send execution result\r\n");
arsenalist 23:fb369e171b7d 1587 break;
arsenalist 23:fb369e171b7d 1588 }
arsenalist 0:f4e449fa34d7 1589 }
arsenalist 23:fb369e171b7d 1590 checkRxBuffer();
arsenalist 5:d00233dd36f5 1591 trial++;
arsenalist 0:f4e449fa34d7 1592 }
arsenalist 0:f4e449fa34d7 1593 }
arsenalist 0:f4e449fa34d7 1594 }
arsenalist 13:e8adfe305dbc 1595
arsenalist 13:e8adfe305dbc 1596 //clear text on lcd
arsenalist 13:e8adfe305dbc 1597 TFT.locate(0,160);
arsenalist 13:e8adfe305dbc 1598 TFT.printf(" ");
arsenalist 13:e8adfe305dbc 1599
arsenalist 0:f4e449fa34d7 1600 newCommand = false;
arsenalist 2:fdfdeb5fd6fd 1601 }
arsenalist 4:76ab12e2f8a3 1602 osDelay(5000);
arsenalist 0:f4e449fa34d7 1603 }
arsenalist 0:f4e449fa34d7 1604 }
arsenalist 0:f4e449fa34d7 1605 }
arsenalist 0:f4e449fa34d7 1606 void emmaModeFirmwareDownload(void) {
arsenalist 0:f4e449fa34d7 1607 bool emmaGetFirmwareParam = false;
arsenalist 0:f4e449fa34d7 1608
arsenalist 0:f4e449fa34d7 1609 DBG.printf("emmaModeFirmwareDownload\r\n");
arsenalist 0:f4e449fa34d7 1610
arsenalist 0:f4e449fa34d7 1611 char s[384];
arsenalist 0:f4e449fa34d7 1612 string str;
arsenalist 0:f4e449fa34d7 1613 string connData;
arsenalist 0:f4e449fa34d7 1614 string chunk;
arsenalist 0:f4e449fa34d7 1615
arsenalist 0:f4e449fa34d7 1616 //firmware parameter
arsenalist 0:f4e449fa34d7 1617 string firmwareVer;
arsenalist 0:f4e449fa34d7 1618 string firmwareName;
arsenalist 0:f4e449fa34d7 1619 int numPart;
arsenalist 0:f4e449fa34d7 1620
arsenalist 0:f4e449fa34d7 1621 //downloading
arsenalist 0:f4e449fa34d7 1622 string firmwarePart;
arsenalist 0:f4e449fa34d7 1623 string calcMD5;
arsenalist 0:f4e449fa34d7 1624 string srvrMD5;
arsenalist 0:f4e449fa34d7 1625 bool nextPart;
arsenalist 0:f4e449fa34d7 1626
arsenalist 0:f4e449fa34d7 1627 //set wifi to mode bridge
arsenalist 0:f4e449fa34d7 1628 _ESP.printf("MODE=B");
arsenalist 0:f4e449fa34d7 1629 DBG.printf("set mode bridge\r\n");
arsenalist 0:f4e449fa34d7 1630 while(1) {
arsenalist 0:f4e449fa34d7 1631 char rcv[128] = {};
arsenalist 0:f4e449fa34d7 1632 rcvReply(rcv,3000);
arsenalist 0:f4e449fa34d7 1633 str = rcv;
arsenalist 0:f4e449fa34d7 1634 if(str.find("MODE=B_OK") != std::string::npos)
arsenalist 0:f4e449fa34d7 1635 break;
arsenalist 0:f4e449fa34d7 1636 }
arsenalist 0:f4e449fa34d7 1637 DBG.printf("MODE=B\r\n");
arsenalist 0:f4e449fa34d7 1638
arsenalist 0:f4e449fa34d7 1639 esp.enable();
arsenalist 0:f4e449fa34d7 1640 wait(1);
arsenalist 0:f4e449fa34d7 1641 while(!esp.ready());
arsenalist 0:f4e449fa34d7 1642
arsenalist 0:f4e449fa34d7 1643 if(!rest.begin("candra.tritronik.com",3128,false)) {
arsenalist 0:f4e449fa34d7 1644 DBG.printf("EMMA: fail to setup rest");
arsenalist 0:f4e449fa34d7 1645 while(1);
arsenalist 0:f4e449fa34d7 1646 }
arsenalist 0:f4e449fa34d7 1647
arsenalist 0:f4e449fa34d7 1648 //wifiConnected = true; //with custom firmware, panel should connect wifi automatically
arsenalist 0:f4e449fa34d7 1649 useProxy = true;
arsenalist 0:f4e449fa34d7 1650
arsenalist 0:f4e449fa34d7 1651 esp.process();
arsenalist 0:f4e449fa34d7 1652 //set connData
arsenalist 0:f4e449fa34d7 1653 if(useProxy) {
arsenalist 0:f4e449fa34d7 1654 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 1655 s[i]=0; }
arsenalist 0:f4e449fa34d7 1656 //sprintf(s,"http://%s:%d/emma/api/controller/register?uid=%s&hmac=%s",EMMA_SERVER_HOST,EMMA_SERVER_PORT,emmaUID.c_str(),hmac.c_str());
arsenalist 0:f4e449fa34d7 1657 sprintf(s,"http://192.168.128.69/emmaController/firmware/firmwareParameter");
arsenalist 0:f4e449fa34d7 1658 connData = s;
arsenalist 0:f4e449fa34d7 1659 } else {
arsenalist 0:f4e449fa34d7 1660 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 1661 s[i]=0; }
arsenalist 0:f4e449fa34d7 1662 //sprintf(s,"/emma/api/controller/register?uid=%s&hmac=%s",emmaUID.c_str(),hmac.c_str());
arsenalist 0:f4e449fa34d7 1663 sprintf(s,"/emmaController/firmware/firmwareParameter");
arsenalist 0:f4e449fa34d7 1664 connData = s;
arsenalist 0:f4e449fa34d7 1665 }
arsenalist 0:f4e449fa34d7 1666
arsenalist 0:f4e449fa34d7 1667 //get parameter of firmware to be downloaded
arsenalist 0:f4e449fa34d7 1668 while(!emmaGetFirmwareParam) {
arsenalist 0:f4e449fa34d7 1669 rest.get(connData.c_str());
arsenalist 0:f4e449fa34d7 1670 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 1671 s[i]=0; }
arsenalist 0:f4e449fa34d7 1672 rest.getResponse(s,sizeof(s));
arsenalist 0:f4e449fa34d7 1673 //DBG.printf("rsp param:%s\r\n",s);
arsenalist 0:f4e449fa34d7 1674
arsenalist 0:f4e449fa34d7 1675 str = s;
arsenalist 0:f4e449fa34d7 1676 if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) {
arsenalist 0:f4e449fa34d7 1677 str.erase(str.begin(),str.begin()+str.find("[")+1);
arsenalist 0:f4e449fa34d7 1678 str.erase(str.begin()+str.find("]"),str.end());
arsenalist 0:f4e449fa34d7 1679
arsenalist 0:f4e449fa34d7 1680 MbedJSONValue jsonValue;
arsenalist 0:f4e449fa34d7 1681 parse(jsonValue,str.c_str());
arsenalist 0:f4e449fa34d7 1682
arsenalist 0:f4e449fa34d7 1683 char *parameter[2] = {"firmwareVer","numPart"};
arsenalist 0:f4e449fa34d7 1684
arsenalist 0:f4e449fa34d7 1685 for(int i=0; i<2; i++) {
arsenalist 0:f4e449fa34d7 1686 if(jsonValue.hasMember(parameter[i])) {
arsenalist 0:f4e449fa34d7 1687 string val = jsonValue[parameter[i]].get<std::string>();
arsenalist 0:f4e449fa34d7 1688 if(i==0) {
arsenalist 0:f4e449fa34d7 1689 firmwareVer = val;
arsenalist 0:f4e449fa34d7 1690 } else if(i==1) {
arsenalist 0:f4e449fa34d7 1691 sscanf(val.c_str(),"%d",&numPart);
arsenalist 0:f4e449fa34d7 1692 }
arsenalist 0:f4e449fa34d7 1693 }
arsenalist 0:f4e449fa34d7 1694 }
arsenalist 0:f4e449fa34d7 1695
arsenalist 0:f4e449fa34d7 1696 if(!firmwareVer.empty() && numPart!=0) {
arsenalist 0:f4e449fa34d7 1697 emmaGetFirmwareParam = true;
arsenalist 0:f4e449fa34d7 1698 }
arsenalist 0:f4e449fa34d7 1699 }
arsenalist 0:f4e449fa34d7 1700 }
arsenalist 0:f4e449fa34d7 1701 DBG.printf("firmwareVer:%s\r\n",firmwareVer.c_str());
arsenalist 0:f4e449fa34d7 1702 DBG.printf("numPart:%d\r\n",numPart);
arsenalist 0:f4e449fa34d7 1703
arsenalist 0:f4e449fa34d7 1704 //clear firmware file
arsenalist 0:f4e449fa34d7 1705 while(1) {
arsenalist 0:f4e449fa34d7 1706 if(clearFirmware()){
arsenalist 0:f4e449fa34d7 1707 DBG.printf("clear firmware on sd card\r\n\r\n");
arsenalist 0:f4e449fa34d7 1708 break;
arsenalist 0:f4e449fa34d7 1709 }
arsenalist 0:f4e449fa34d7 1710 wait(1);
arsenalist 0:f4e449fa34d7 1711 }
arsenalist 0:f4e449fa34d7 1712
arsenalist 0:f4e449fa34d7 1713 //set connData
arsenalist 0:f4e449fa34d7 1714 if(useProxy) {
arsenalist 0:f4e449fa34d7 1715 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 1716 s[i]=0; }
arsenalist 0:f4e449fa34d7 1717 sprintf(s,"http://192.168.128.69/emmaController/firmware/%s",firmwareVer.c_str());
arsenalist 0:f4e449fa34d7 1718 connData = s;
arsenalist 0:f4e449fa34d7 1719 } else {
arsenalist 0:f4e449fa34d7 1720 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 1721 s[i]=0; }
arsenalist 0:f4e449fa34d7 1722 sprintf(s,"/emmaController/firmware/%s",firmwareVer.c_str());
arsenalist 0:f4e449fa34d7 1723 connData = s;
arsenalist 0:f4e449fa34d7 1724 }
arsenalist 0:f4e449fa34d7 1725
arsenalist 0:f4e449fa34d7 1726 //download firmware
arsenalist 0:f4e449fa34d7 1727 for(int n=0; n<numPart; n++) {
arsenalist 0:f4e449fa34d7 1728 nextPart = false;
arsenalist 0:f4e449fa34d7 1729 while(!nextPart) {
arsenalist 0:f4e449fa34d7 1730 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 1731 s[i]=0; }
arsenalist 0:f4e449fa34d7 1732 sprintf(s,"%s/firmware_Hex_%s_%d",connData.c_str(),firmwareVer.c_str(),n);
arsenalist 0:f4e449fa34d7 1733 rest.get(s);
arsenalist 0:f4e449fa34d7 1734 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 1735 s[i]=0; }
arsenalist 0:f4e449fa34d7 1736 rest.getResponse(s,sizeof(s));
arsenalist 0:f4e449fa34d7 1737 //DBG.printf("rsp[%d]:%s\r\n",n,s);
arsenalist 0:f4e449fa34d7 1738
arsenalist 0:f4e449fa34d7 1739 str = s;
arsenalist 0:f4e449fa34d7 1740 if(str.find("{") != std::string::npos && str.find("}") != std::string::npos) {
arsenalist 0:f4e449fa34d7 1741 str.erase(str.begin(),str.begin()+str.find("{")+1);
arsenalist 0:f4e449fa34d7 1742 str.erase(str.begin()+str.find("}"),str.end());
arsenalist 0:f4e449fa34d7 1743 //DBG.printf("firmwarePart[%d]:%s\r\n",n,str.c_str());
arsenalist 0:f4e449fa34d7 1744 firmwarePart = str;
arsenalist 0:f4e449fa34d7 1745
arsenalist 0:f4e449fa34d7 1746 //calculated MD5
arsenalist 0:f4e449fa34d7 1747 calcMD5 = calculateMD5(firmwarePart);
arsenalist 0:f4e449fa34d7 1748 //DBG.printf("calcMD5[%d]:%s\r\n",n,calcMD5.c_str());
arsenalist 0:f4e449fa34d7 1749
arsenalist 0:f4e449fa34d7 1750 //MD5 from server
arsenalist 0:f4e449fa34d7 1751 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 1752 s[i]=0; }
arsenalist 0:f4e449fa34d7 1753 sprintf(s,"%s/MD5/firmware_MD5_%s_%d",connData.c_str(),firmwareVer.c_str(),n);
arsenalist 0:f4e449fa34d7 1754 rest.get(s);
arsenalist 0:f4e449fa34d7 1755 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 1756 s[i]=0; }
arsenalist 0:f4e449fa34d7 1757 rest.getResponse(s,sizeof(s));
arsenalist 0:f4e449fa34d7 1758
arsenalist 0:f4e449fa34d7 1759 str = s;
arsenalist 0:f4e449fa34d7 1760 if(str.find("{") != std::string::npos && str.find("}") != std::string::npos) {
arsenalist 0:f4e449fa34d7 1761 str.erase(str.begin(),str.begin()+str.find("{")+1);
arsenalist 0:f4e449fa34d7 1762 str.erase(str.begin()+str.find("}"),str.end());
arsenalist 0:f4e449fa34d7 1763 srvrMD5 = str;
arsenalist 0:f4e449fa34d7 1764 //DBG.printf("srvrMD5[%d]:%s\r\n",n,srvrMD5.c_str());
arsenalist 0:f4e449fa34d7 1765
arsenalist 0:f4e449fa34d7 1766 //compare original MD5 vs MD5 from server
arsenalist 0:f4e449fa34d7 1767 if(strcmp(calcMD5.c_str(),srvrMD5.c_str()) == 0) {
arsenalist 0:f4e449fa34d7 1768 //DBG.printf("MD5 correct\r\n");
arsenalist 0:f4e449fa34d7 1769
arsenalist 0:f4e449fa34d7 1770 //save to sd card
arsenalist 0:f4e449fa34d7 1771 int st = writeFirmwareHexToChar(firmwarePart);
arsenalist 0:f4e449fa34d7 1772 if(st) {
arsenalist 0:f4e449fa34d7 1773 DBG.printf("firmwarePart[%d/%d] written\r\n",n,numPart-1);
arsenalist 0:f4e449fa34d7 1774 nextPart = true;
arsenalist 0:f4e449fa34d7 1775 }
arsenalist 0:f4e449fa34d7 1776
arsenalist 0:f4e449fa34d7 1777 } else {
arsenalist 0:f4e449fa34d7 1778 DBG.printf("MD5 incorrect\r\n");
arsenalist 0:f4e449fa34d7 1779 }
arsenalist 0:f4e449fa34d7 1780 }
arsenalist 0:f4e449fa34d7 1781 } else {
arsenalist 0:f4e449fa34d7 1782 DBG.printf("retry to fetch firmwarePart[%d]\r\n",n);
arsenalist 0:f4e449fa34d7 1783 }
arsenalist 0:f4e449fa34d7 1784 wait(0.5);
arsenalist 0:f4e449fa34d7 1785 }
arsenalist 0:f4e449fa34d7 1786 }
arsenalist 0:f4e449fa34d7 1787 DBG.printf("download finished\r\n");
arsenalist 0:f4e449fa34d7 1788 }
arsenalist 12:96f637ed37f9 1789 /*end emma mode*/
arsenalist 0:f4e449fa34d7 1790
arsenalist 4:76ab12e2f8a3 1791 /*start energy related*/
arsenalist 0:f4e449fa34d7 1792 void energyThread(void const*) {
arsenalist 19:7e3e9332f719 1793 Timer tEnergy;
arsenalist 19:7e3e9332f719 1794
arsenalist 19:7e3e9332f719 1795 while(1) {
arsenalist 19:7e3e9332f719 1796 tEnergy.start();
arsenalist 19:7e3e9332f719 1797 DBG.printf("energyThread-start\r\n");
arsenalist 19:7e3e9332f719 1798
arsenalist 19:7e3e9332f719 1799 AWattHrSum = 0;
arsenalist 19:7e3e9332f719 1800 BWattHrSum = 0;
arsenalist 19:7e3e9332f719 1801 CWattHrSum = 0;
arsenalist 19:7e3e9332f719 1802
arsenalist 20:ea14f175bbb4 1803 while(tEnergy.read() < 1*60.0) {
arsenalist 19:7e3e9332f719 1804 AWattHrValue = ADE.getWattHR(PHASE_A);
arsenalist 19:7e3e9332f719 1805 BWattHrValue = ADE.getWattHR(PHASE_B);
arsenalist 19:7e3e9332f719 1806 CWattHrValue = ADE.getWattHR(PHASE_C);
arsenalist 19:7e3e9332f719 1807
arsenalist 19:7e3e9332f719 1808 AWattHrSum += AWattHrValue;
arsenalist 19:7e3e9332f719 1809 BWattHrSum += BWattHrValue;
arsenalist 20:ea14f175bbb4 1810 CWattHrSum += CWattHrValue;
arsenalist 20:ea14f175bbb4 1811
arsenalist 20:ea14f175bbb4 1812
arsenalist 20:ea14f175bbb4 1813 //start check voltage and power
arsenalist 21:33bd8b82560f 1814 AVrms = ADE.VRMS(PHASE_A) * 0.000124f; //0.000158; //constants are from calculateVRMS function
arsenalist 21:33bd8b82560f 1815 BVrms = ADE.VRMS(PHASE_B) * 0.000123f;
arsenalist 21:33bd8b82560f 1816 CVrms = ADE.VRMS(PHASE_C) * 0.000122f;
arsenalist 20:ea14f175bbb4 1817
arsenalist 21:33bd8b82560f 1818 AIrms = ADE.IRMS(PHASE_A) * 0.00001006f; //0.0000125f; //constants are from calculateIRMS function
arsenalist 21:33bd8b82560f 1819 BIrms = ADE.IRMS(PHASE_B) * 0.00001005f;
arsenalist 21:33bd8b82560f 1820 CIrms = ADE.IRMS(PHASE_C) * 0.00001004f;
arsenalist 20:ea14f175bbb4 1821
arsenalist 20:ea14f175bbb4 1822 AWatt = AVrms * AIrms;
arsenalist 20:ea14f175bbb4 1823 BWatt = BVrms * BIrms;
arsenalist 20:ea14f175bbb4 1824 CWatt = CVrms * CIrms;
arsenalist 20:ea14f175bbb4 1825 //end check voltage and power
arsenalist 20:ea14f175bbb4 1826
arsenalist 19:7e3e9332f719 1827 }
arsenalist 19:7e3e9332f719 1828
arsenalist 19:7e3e9332f719 1829 AWattHr = AWattHrSum * 0.0000198f;
arsenalist 19:7e3e9332f719 1830 BWattHr = BWattHrSum * 0.0000197f;
arsenalist 19:7e3e9332f719 1831 CWattHr = CWattHrSum * 0.0000196f;
arsenalist 19:7e3e9332f719 1832
arsenalist 22:e18d361bf688 1833 newEnergyData = true;
arsenalist 22:e18d361bf688 1834
arsenalist 19:7e3e9332f719 1835 tEnergy.stop();
arsenalist 19:7e3e9332f719 1836 tEnergy.reset();
arsenalist 19:7e3e9332f719 1837 DBG.printf("energyThread-finish\r\n");
arsenalist 19:7e3e9332f719 1838 }
arsenalist 0:f4e449fa34d7 1839 }
arsenalist 21:33bd8b82560f 1840 void checkVoltagePower(void) {
arsenalist 4:76ab12e2f8a3 1841 //check if voltage or power violates threshold
arsenalist 22:e18d361bf688 1842 char p[64];
arsenalist 20:ea14f175bbb4 1843 char q[32];
arsenalist 4:76ab12e2f8a3 1844 char s[256];
arsenalist 22:e18d361bf688 1845 string hmacTime;
arsenalist 4:76ab12e2f8a3 1846 string str;
arsenalist 20:ea14f175bbb4 1847 time_t seconds;
arsenalist 4:76ab12e2f8a3 1848
arsenalist 4:76ab12e2f8a3 1849 //DBG.printf("checkVoltagePower-start\r\n");
arsenalist 4:76ab12e2f8a3 1850
arsenalist 20:ea14f175bbb4 1851 //vrms and irms might be placed inside energy calculation routine
arsenalist 20:ea14f175bbb4 1852 /*
arsenalist 19:7e3e9332f719 1853 AVrms = ADE.VRMS(PHASE_A) * 0.000128f; //0.000158; //constants are from calculateVRMS function
arsenalist 19:7e3e9332f719 1854 BVrms = ADE.VRMS(PHASE_B) * 0.000127f; //0.000157;
arsenalist 19:7e3e9332f719 1855 CVrms = ADE.VRMS(PHASE_C) * 0.000126f; //0.000156;
arsenalist 19:7e3e9332f719 1856
arsenalist 19:7e3e9332f719 1857 AIrms = ADE.IRMS(PHASE_A) * 0.0000125f; //constants are from calculateIRMS function
arsenalist 19:7e3e9332f719 1858 BIrms = ADE.IRMS(PHASE_B) * 0.0000123f;
arsenalist 19:7e3e9332f719 1859 CIrms = ADE.IRMS(PHASE_C) * 0.0000124f;
arsenalist 4:76ab12e2f8a3 1860
arsenalist 4:76ab12e2f8a3 1861 AWatt = AVrms * AIrms;
arsenalist 4:76ab12e2f8a3 1862 BWatt = BVrms * BIrms;
arsenalist 4:76ab12e2f8a3 1863 CWatt = CVrms * CIrms;
arsenalist 20:ea14f175bbb4 1864 */
arsenalist 4:76ab12e2f8a3 1865
arsenalist 21:33bd8b82560f 1866 //DBG.printf("Vrms of each phase:%.2f - %.2f - %.2f\r\n", AVrms, BVrms, CVrms);
arsenalist 21:33bd8b82560f 1867 //DBG.printf("Watt of each phase:%.2f - %.2f - %.2f\r\n", AWatt, BWatt, CWatt);
arsenalist 21:33bd8b82560f 1868 //wait(1);
arsenalist 19:7e3e9332f719 1869
arsenalist 20:ea14f175bbb4 1870 //get time
arsenalist 20:ea14f175bbb4 1871 seconds = time(NULL);
arsenalist 20:ea14f175bbb4 1872 strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds));
arsenalist 20:ea14f175bbb4 1873
arsenalist 22:e18d361bf688 1874 //calculate hmacTime
arsenalist 22:e18d361bf688 1875 for(int j=0; j<sizeof(p); j++) {
arsenalist 22:e18d361bf688 1876 p[j]=0; }
arsenalist 22:e18d361bf688 1877 sprintf(p,"emma-%s-%s",emmaUID.c_str(),q);
arsenalist 22:e18d361bf688 1878 hmacTime = calculateMD5(p);
arsenalist 22:e18d361bf688 1879
arsenalist 4:76ab12e2f8a3 1880 if(AVrms > VRMSTHRESHOLD || AWatt > WATTTHRESHOLD) {
arsenalist 4:76ab12e2f8a3 1881 DBG.printf("alert on ch1\r\n");
arsenalist 20:ea14f175bbb4 1882 sprintf(s,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"voltage\":%.2f,\"power\":%.2f}",
arsenalist 22:e18d361bf688 1883 emmaUID.c_str(),hmacTime.c_str(),q,AVrms,AWatt);
arsenalist 4:76ab12e2f8a3 1884 rest.post("/emma/api/controller/alert/1",s);
arsenalist 4:76ab12e2f8a3 1885 wait(2);
arsenalist 4:76ab12e2f8a3 1886 str = rxBuf;
arsenalist 4:76ab12e2f8a3 1887 if(str.rfind("/alert/1") != std::string::npos) {
arsenalist 4:76ab12e2f8a3 1888 str.erase(str.begin(),str.begin()+str.rfind("/alert/1"));
arsenalist 4:76ab12e2f8a3 1889 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 4:76ab12e2f8a3 1890 DBG.printf("send alert ch1 success\r\n");
arsenalist 4:76ab12e2f8a3 1891 } else {
arsenalist 4:76ab12e2f8a3 1892 DBG.printf("send alert ch1 failed\r\n");
arsenalist 4:76ab12e2f8a3 1893 }
arsenalist 4:76ab12e2f8a3 1894 }
arsenalist 4:76ab12e2f8a3 1895 }
arsenalist 4:76ab12e2f8a3 1896
arsenalist 4:76ab12e2f8a3 1897 if(BVrms > VRMSTHRESHOLD || BWatt > WATTTHRESHOLD) {
arsenalist 4:76ab12e2f8a3 1898 DBG.printf("alert on ch2\r\n");
arsenalist 20:ea14f175bbb4 1899 sprintf(s,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"voltage\":%.2f,\"power\":%.2f}",
arsenalist 22:e18d361bf688 1900 emmaUID.c_str(),hmacTime.c_str(),q,BVrms,BWatt);
arsenalist 4:76ab12e2f8a3 1901 rest.post("/emma/api/controller/alert/2",s);
arsenalist 4:76ab12e2f8a3 1902 wait(2);
arsenalist 4:76ab12e2f8a3 1903 str = rxBuf;
arsenalist 4:76ab12e2f8a3 1904 if(str.rfind("/alert/2") != std::string::npos) {
arsenalist 4:76ab12e2f8a3 1905 str.erase(str.begin(),str.begin()+str.rfind("/alert/2"));
arsenalist 4:76ab12e2f8a3 1906 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 4:76ab12e2f8a3 1907 DBG.printf("send alert ch2 success\r\n");
arsenalist 4:76ab12e2f8a3 1908 } else {
arsenalist 4:76ab12e2f8a3 1909 DBG.printf("send alert ch2 failed\r\n");
arsenalist 4:76ab12e2f8a3 1910 }
arsenalist 4:76ab12e2f8a3 1911 }
arsenalist 4:76ab12e2f8a3 1912 }
arsenalist 4:76ab12e2f8a3 1913
arsenalist 4:76ab12e2f8a3 1914 if(CVrms > VRMSTHRESHOLD || CWatt > WATTTHRESHOLD) {
arsenalist 7:7e8c6ad3fd64 1915 DBG.printf("alert on ch3\r\n");
arsenalist 4:76ab12e2f8a3 1916 DBG.printf("alert on ch3\r\n");
arsenalist 20:ea14f175bbb4 1917 sprintf(s,"{\"uid\":\"%s\",\"hmac\":\"%s\",\"time\":\"%s\",\"voltage\":%.2f,\"power\":%.2f}",
arsenalist 22:e18d361bf688 1918 emmaUID.c_str(),hmacTime.c_str(),q,CVrms,CWatt);
arsenalist 4:76ab12e2f8a3 1919 rest.post("/emma/api/controller/alert/3",s);
arsenalist 4:76ab12e2f8a3 1920 wait(2);
arsenalist 4:76ab12e2f8a3 1921 str = rxBuf;
arsenalist 4:76ab12e2f8a3 1922 if(str.rfind("/alert/3") != std::string::npos) {
arsenalist 4:76ab12e2f8a3 1923 str.erase(str.begin(),str.begin()+str.rfind("/alert/3"));
arsenalist 4:76ab12e2f8a3 1924 if(str.find("\"status\":\"success\"") != std::string::npos) {
arsenalist 4:76ab12e2f8a3 1925 DBG.printf("send alert ch3 success\r\n");
arsenalist 4:76ab12e2f8a3 1926 } else {
arsenalist 4:76ab12e2f8a3 1927 DBG.printf("send alert ch3 failed\r\n");
arsenalist 4:76ab12e2f8a3 1928 }
arsenalist 4:76ab12e2f8a3 1929 }
arsenalist 4:76ab12e2f8a3 1930 }
arsenalist 4:76ab12e2f8a3 1931 //DBG.printf("checkVoltagePower-finish\r\n");
arsenalist 4:76ab12e2f8a3 1932 }
arsenalist 4:76ab12e2f8a3 1933 /*end energy related*/
arsenalist 0:f4e449fa34d7 1934
arsenalist 0:f4e449fa34d7 1935 /*start wifi mqtt*/
arsenalist 0:f4e449fa34d7 1936 void mqttConnected(void* response) {
arsenalist 1:d314a43ae6f7 1937 DBG.printf("MQTT Connected\r\n");
arsenalist 0:f4e449fa34d7 1938 char mqttTopic[64];
arsenalist 0:f4e449fa34d7 1939 sprintf(mqttTopic,"%s/%s/command",platformDOMAIN.c_str(),emmaUID.c_str());
arsenalist 0:f4e449fa34d7 1940 mqtt.subscribe(mqttTopic);
arsenalist 0:f4e449fa34d7 1941 }
arsenalist 0:f4e449fa34d7 1942 void mqttDisconnected(void* response) {
arsenalist 1:d314a43ae6f7 1943 DBG.printf("MQTT Disconnected\r\n");
arsenalist 0:f4e449fa34d7 1944 }
arsenalist 0:f4e449fa34d7 1945 /*end wifi mqtt*/
arsenalist 0:f4e449fa34d7 1946
arsenalist 0:f4e449fa34d7 1947 /*start wifi rest*/
arsenalist 4:76ab12e2f8a3 1948 void rxInterrupt(void) {
arsenalist 4:76ab12e2f8a3 1949 char c;
arsenalist 4:76ab12e2f8a3 1950
arsenalist 4:76ab12e2f8a3 1951 while(_ESP.readable()) {
arsenalist 4:76ab12e2f8a3 1952 c = _ESP.getc();
arsenalist 4:76ab12e2f8a3 1953 if(c != 0) { //char is not null
arsenalist 4:76ab12e2f8a3 1954 rxBuf += c;
arsenalist 4:76ab12e2f8a3 1955 }
arsenalist 4:76ab12e2f8a3 1956 }
arsenalist 4:76ab12e2f8a3 1957 }
arsenalist 4:76ab12e2f8a3 1958 void checkRxBuffer(void) {
arsenalist 4:76ab12e2f8a3 1959 //check new command
arsenalist 4:76ab12e2f8a3 1960 if(rxBuf.rfind("/command") != std::string::npos) {
arsenalist 4:76ab12e2f8a3 1961 rxBuf.erase(rxBuf.begin(),rxBuf.begin()+rxBuf.rfind("/command"));
arsenalist 4:76ab12e2f8a3 1962 if(rxBuf.find("[{") != std::string::npos && rxBuf.find("}]") != std::string::npos) {
arsenalist 4:76ab12e2f8a3 1963 rxBuf.erase(rxBuf.begin(),rxBuf.begin()+rxBuf.find("[{")+1);
arsenalist 4:76ab12e2f8a3 1964 rxBuf.erase(rxBuf.begin()+rxBuf.find("]"),rxBuf.end());
arsenalist 4:76ab12e2f8a3 1965 globalCommand = rxBuf;
arsenalist 4:76ab12e2f8a3 1966 //DBG.printf("gC:%s\r\n",globalCommand.c_str());
arsenalist 4:76ab12e2f8a3 1967 newCommand = true;
arsenalist 4:76ab12e2f8a3 1968 }
arsenalist 4:76ab12e2f8a3 1969 }
arsenalist 4:76ab12e2f8a3 1970
arsenalist 24:5d58515ba510 1971 //check free memory -> reinitialize mqtt connection
arsenalist 24:5d58515ba510 1972 if(rxBuf.rfind("Free memory") != std::string::npos || rxBuf.rfind("dhcp client start") != std::string::npos) {
arsenalist 24:5d58515ba510 1973 espFreeMemory = true;
arsenalist 24:5d58515ba510 1974 }
arsenalist 24:5d58515ba510 1975
arsenalist 4:76ab12e2f8a3 1976 //clear rxBuf
arsenalist 4:76ab12e2f8a3 1977 rxBuf.clear();
arsenalist 4:76ab12e2f8a3 1978 }
arsenalist 0:f4e449fa34d7 1979 /*end wifi rest*/
arsenalist 0:f4e449fa34d7 1980
arsenalist 0:f4e449fa34d7 1981 /*start eth mqtt*/
arsenalist 0:f4e449fa34d7 1982 void ethMQTTMessageArrived(MQTT::MessageData& md) {
arsenalist 0:f4e449fa34d7 1983 MQTT::Message &message = md.message;
arsenalist 0:f4e449fa34d7 1984 DBG.printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n",
arsenalist 0:f4e449fa34d7 1985 message.qos, message.retained, message.dup, message.id);
arsenalist 0:f4e449fa34d7 1986 DBG.printf("Payload: %.*s\r\n", message.payloadlen, (char*)message.payload);
arsenalist 0:f4e449fa34d7 1987 //DBG.printf("Payload %s\r\n",message.payload);
arsenalist 0:f4e449fa34d7 1988
arsenalist 0:f4e449fa34d7 1989
arsenalist 0:f4e449fa34d7 1990 //check whether cmd is json
arsenalist 0:f4e449fa34d7 1991 //char r[255];
arsenalist 0:f4e449fa34d7 1992 char *s = (char*)message.payload;
arsenalist 0:f4e449fa34d7 1993 string sp(s);
arsenalist 0:f4e449fa34d7 1994 //sprintf(s,"%.*s",message.payloadlen, (char*)message.payload);
arsenalist 0:f4e449fa34d7 1995 //sprintf(globCmd,"%s",s);
arsenalist 0:f4e449fa34d7 1996 //DBG.printf("Payload: %s\r\n", r);
arsenalist 0:f4e449fa34d7 1997 //string cmd = r;
arsenalist 0:f4e449fa34d7 1998 //globalCommand = cmd;
arsenalist 10:1dc69e0ce7fd 1999
arsenalist 10:1dc69e0ce7fd 2000 //globalCommand = sp;
arsenalist 10:1dc69e0ce7fd 2001
arsenalist 0:f4e449fa34d7 2002 //globCmd = (char*)message.payload;
arsenalist 0:f4e449fa34d7 2003 //string globCmd((char*)message.payload);
arsenalist 0:f4e449fa34d7 2004 //std::string *sp = static_cast<std::char*>(message.payload);
arsenalist 0:f4e449fa34d7 2005 //string sp((char*)message.payload);
arsenalist 10:1dc69e0ce7fd 2006
arsenalist 10:1dc69e0ce7fd 2007 //DBG.printf("String: %s\r\n",sp.c_str());
arsenalist 10:1dc69e0ce7fd 2008
arsenalist 0:f4e449fa34d7 2009 //globCmd = sp;
arsenalist 0:f4e449fa34d7 2010
arsenalist 10:1dc69e0ce7fd 2011 //newCommand = true;
arsenalist 10:1dc69e0ce7fd 2012 if(sp.find("[") != std::string::npos && sp.find("]") != std::string::npos) {
arsenalist 10:1dc69e0ce7fd 2013 sp.erase(sp.begin(),sp.begin()+sp.find("[")+1);
arsenalist 10:1dc69e0ce7fd 2014 sp.erase(sp.begin()+sp.find("]"),sp.end());
arsenalist 10:1dc69e0ce7fd 2015 globalCommand = sp;
arsenalist 0:f4e449fa34d7 2016 newCommand = true;
arsenalist 0:f4e449fa34d7 2017 }
arsenalist 10:1dc69e0ce7fd 2018 sp.clear();
arsenalist 0:f4e449fa34d7 2019 }
arsenalist 0:f4e449fa34d7 2020
arsenalist 0:f4e449fa34d7 2021 int ethMQTTConnect(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack) {
arsenalist 0:f4e449fa34d7 2022 //char hostname[] = "q.thingfabric.com";
arsenalist 0:f4e449fa34d7 2023 //char hostname[] = "192.168.131.200";
arsenalist 0:f4e449fa34d7 2024 //int rc = ipstack->connect(hostname, MQTT_PORT);
arsenalist 0:f4e449fa34d7 2025 int rc = ipstack->connect(MQTT_HOST, MQTT_PORT);
arsenalist 0:f4e449fa34d7 2026
arsenalist 0:f4e449fa34d7 2027 if(rc!=0)
arsenalist 0:f4e449fa34d7 2028 return rc;
arsenalist 0:f4e449fa34d7 2029
arsenalist 0:f4e449fa34d7 2030 //MQTT Connect
arsenalist 0:f4e449fa34d7 2031 //char clientId[] = "emma/0674ff575349896767072538";
arsenalist 0:f4e449fa34d7 2032 char clientId [32];
arsenalist 0:f4e449fa34d7 2033 sprintf(clientId,"emma/%s",emmaUID.c_str());
arsenalist 0:f4e449fa34d7 2034 //DBG.printf("clientId:%s\r\n",clientId);
arsenalist 0:f4e449fa34d7 2035 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
arsenalist 0:f4e449fa34d7 2036 data.MQTTVersion = 3;
arsenalist 0:f4e449fa34d7 2037 data.clientID.cstring = clientId;
arsenalist 0:f4e449fa34d7 2038 data.username.cstring = "761b233e-a49a-4830-a8ae-87cec3dc1086";
arsenalist 0:f4e449fa34d7 2039 data.password.cstring = "ef25cf4567fbc07113252f8d72b7faf2";
arsenalist 0:f4e449fa34d7 2040
arsenalist 0:f4e449fa34d7 2041 if((rc = client->connect(&data)) == 0) {
arsenalist 0:f4e449fa34d7 2042 DBG.printf("connected\r\n");
arsenalist 0:f4e449fa34d7 2043 }
arsenalist 0:f4e449fa34d7 2044
arsenalist 0:f4e449fa34d7 2045 //MQTT Subscribe
arsenalist 0:f4e449fa34d7 2046 //char* topic = "gaisbwqreqrfxjc/0674ff575349896767072538/command";
arsenalist 0:f4e449fa34d7 2047 char s[64];
arsenalist 0:f4e449fa34d7 2048 sprintf(s,"%s/%s/command",platformDOMAIN.c_str(),emmaUID.c_str());
arsenalist 0:f4e449fa34d7 2049 string topic = s;
arsenalist 0:f4e449fa34d7 2050 //DBG.printf("topic:%s\r\n",topic.c_str());
arsenalist 0:f4e449fa34d7 2051 if((rc=client->subscribe(topic.c_str(),MQTT::QOS0,ethMQTTMessageArrived)) == 0) {
arsenalist 0:f4e449fa34d7 2052 DBG.printf("subscribe success!\r\n");
arsenalist 0:f4e449fa34d7 2053 }
arsenalist 0:f4e449fa34d7 2054 return rc;
arsenalist 0:f4e449fa34d7 2055 }
arsenalist 0:f4e449fa34d7 2056 void ethMQTTAttemptConnect(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack) {
arsenalist 0:f4e449fa34d7 2057 int retryAttempt = 0;
arsenalist 0:f4e449fa34d7 2058
arsenalist 0:f4e449fa34d7 2059 while(!ipstack->getEth().linkstatus()) {
arsenalist 0:f4e449fa34d7 2060 DBG.printf("Ethernet link not present. Check cable connection\r\n");
arsenalist 0:f4e449fa34d7 2061 wait(1);
arsenalist 0:f4e449fa34d7 2062 }
arsenalist 0:f4e449fa34d7 2063
arsenalist 0:f4e449fa34d7 2064 while(ethMQTTConnect(client,ipstack) != 0) {
arsenalist 0:f4e449fa34d7 2065 int timeout = 3;
arsenalist 0:f4e449fa34d7 2066 DBG.printf("Retry attempt number %d waiting %d\r\n", retryAttempt, timeout);
arsenalist 0:f4e449fa34d7 2067 wait(timeout);
arsenalist 0:f4e449fa34d7 2068 retryAttempt++;
arsenalist 0:f4e449fa34d7 2069 }
arsenalist 0:f4e449fa34d7 2070 }
arsenalist 0:f4e449fa34d7 2071 /*end eth mqtt*/
arsenalist 0:f4e449fa34d7 2072
arsenalist 0:f4e449fa34d7 2073 /*start emma settings*/
arsenalist 0:f4e449fa34d7 2074 string getUID(void) {
arsenalist 0:f4e449fa34d7 2075 char s[32];
arsenalist 0:f4e449fa34d7 2076 unsigned long *unique = (unsigned long *)BASE_ADDR;
arsenalist 0:f4e449fa34d7 2077 sprintf(s,"%08x%08x%08x",unique[0], unique[1], unique[2]);
arsenalist 0:f4e449fa34d7 2078 return s;
arsenalist 0:f4e449fa34d7 2079 }
arsenalist 0:f4e449fa34d7 2080
arsenalist 0:f4e449fa34d7 2081 string readSetting(string parameter) {
arsenalist 0:f4e449fa34d7 2082 FILE *fp;
arsenalist 0:f4e449fa34d7 2083 signed char c;
arsenalist 0:f4e449fa34d7 2084 int i=0;
arsenalist 0:f4e449fa34d7 2085 char s[64];
arsenalist 0:f4e449fa34d7 2086 string strS;
arsenalist 0:f4e449fa34d7 2087
arsenalist 0:f4e449fa34d7 2088 sprintf(s,"/sd/settings/%s.txt",parameter.c_str());
arsenalist 0:f4e449fa34d7 2089
arsenalist 0:f4e449fa34d7 2090 fp = fopen(s,"r");
arsenalist 0:f4e449fa34d7 2091 memset(s,0,sizeof(s));
arsenalist 0:f4e449fa34d7 2092 if(fp != NULL) {
arsenalist 0:f4e449fa34d7 2093 while(1) {
arsenalist 0:f4e449fa34d7 2094 c = fgetc(fp);
arsenalist 0:f4e449fa34d7 2095 if(c == EOF){
arsenalist 0:f4e449fa34d7 2096 break;
arsenalist 0:f4e449fa34d7 2097 }
arsenalist 0:f4e449fa34d7 2098 s[i] = c;
arsenalist 0:f4e449fa34d7 2099 i++;
arsenalist 0:f4e449fa34d7 2100 }
arsenalist 0:f4e449fa34d7 2101 strS = s;
arsenalist 0:f4e449fa34d7 2102 if(strS.find("(") != std::string::npos && strS.find(")") != std::string::npos) {
arsenalist 0:f4e449fa34d7 2103 strS.erase(strS.begin(),strS.begin()+strS.find("(")+1);
arsenalist 0:f4e449fa34d7 2104 strS.erase(strS.begin()+strS.find(")"),strS.end());
arsenalist 0:f4e449fa34d7 2105 } else {
arsenalist 0:f4e449fa34d7 2106 strS = "";
arsenalist 0:f4e449fa34d7 2107 }
arsenalist 0:f4e449fa34d7 2108 }
arsenalist 0:f4e449fa34d7 2109 fclose(fp);
arsenalist 0:f4e449fa34d7 2110 return strS;
arsenalist 0:f4e449fa34d7 2111 }
arsenalist 0:f4e449fa34d7 2112
arsenalist 0:f4e449fa34d7 2113 bool writeSetting(string parameter, string value) {
arsenalist 0:f4e449fa34d7 2114 FILE *fp;
arsenalist 0:f4e449fa34d7 2115 char s[255];
arsenalist 0:f4e449fa34d7 2116
arsenalist 0:f4e449fa34d7 2117 sprintf(s,"/sd/settings/%s.txt",parameter.c_str());
arsenalist 0:f4e449fa34d7 2118 fp = fopen(s,"w");
arsenalist 0:f4e449fa34d7 2119 if(fp != NULL) {
arsenalist 0:f4e449fa34d7 2120 fprintf(fp,value.c_str());
arsenalist 0:f4e449fa34d7 2121 fclose(fp);
arsenalist 0:f4e449fa34d7 2122 return true;
arsenalist 0:f4e449fa34d7 2123 }
arsenalist 0:f4e449fa34d7 2124 return false;
arsenalist 0:f4e449fa34d7 2125 }
arsenalist 0:f4e449fa34d7 2126 /*end emma settings*/
arsenalist 0:f4e449fa34d7 2127
arsenalist 0:f4e449fa34d7 2128 /*start emma node*/
arsenalist 0:f4e449fa34d7 2129 string readNodeIP(string macAddr) {
arsenalist 0:f4e449fa34d7 2130 FILE *fp;
arsenalist 0:f4e449fa34d7 2131 signed char c;
arsenalist 0:f4e449fa34d7 2132 int i=0;
arsenalist 0:f4e449fa34d7 2133 char s[64];
arsenalist 0:f4e449fa34d7 2134 string strS;
arsenalist 0:f4e449fa34d7 2135
arsenalist 0:f4e449fa34d7 2136 sprintf(s,"/sd/nodeList/%s/nodeIP.txt",macAddr.c_str());
arsenalist 0:f4e449fa34d7 2137
arsenalist 0:f4e449fa34d7 2138 fp = fopen(s,"r");
arsenalist 0:f4e449fa34d7 2139 memset(s,0,sizeof(s));
arsenalist 0:f4e449fa34d7 2140 if(fp != NULL) {
arsenalist 0:f4e449fa34d7 2141 while(1) {
arsenalist 0:f4e449fa34d7 2142 c = fgetc(fp);
arsenalist 0:f4e449fa34d7 2143 if(c == EOF){
arsenalist 0:f4e449fa34d7 2144 break;
arsenalist 0:f4e449fa34d7 2145 }
arsenalist 0:f4e449fa34d7 2146 s[i] = c;
arsenalist 0:f4e449fa34d7 2147 i++;
arsenalist 0:f4e449fa34d7 2148 }
arsenalist 0:f4e449fa34d7 2149 strS = s;
arsenalist 0:f4e449fa34d7 2150 if(strS.find("(") != std::string::npos && strS.find(")") != std::string::npos) {
arsenalist 0:f4e449fa34d7 2151 strS.erase(strS.begin(),strS.begin()+strS.find("(")+1);
arsenalist 0:f4e449fa34d7 2152 strS.erase(strS.begin()+strS.find(")"),strS.end());
arsenalist 0:f4e449fa34d7 2153 } else {
arsenalist 0:f4e449fa34d7 2154 strS = "";
arsenalist 0:f4e449fa34d7 2155 }
arsenalist 0:f4e449fa34d7 2156 }
arsenalist 0:f4e449fa34d7 2157 fclose(fp);
arsenalist 0:f4e449fa34d7 2158 return strS;
arsenalist 0:f4e449fa34d7 2159 }
arsenalist 0:f4e449fa34d7 2160
arsenalist 0:f4e449fa34d7 2161 string readNodeCmd(string dType, string cmd) {
arsenalist 0:f4e449fa34d7 2162 FILE *fp;
arsenalist 0:f4e449fa34d7 2163 signed char c;
arsenalist 0:f4e449fa34d7 2164 int i=0;
arsenalist 0:f4e449fa34d7 2165 char s[128];
arsenalist 0:f4e449fa34d7 2166 string strS;
arsenalist 0:f4e449fa34d7 2167
arsenalist 0:f4e449fa34d7 2168 sprintf(s,"/sd/nodeCode/%s/%s.txt",dType.c_str(),cmd.c_str());
arsenalist 0:f4e449fa34d7 2169
arsenalist 0:f4e449fa34d7 2170 fp = fopen(s,"r");
arsenalist 0:f4e449fa34d7 2171 memset(s,0,sizeof(s));
arsenalist 0:f4e449fa34d7 2172 if(fp != NULL) {
arsenalist 0:f4e449fa34d7 2173 while(1) {
arsenalist 0:f4e449fa34d7 2174 c = fgetc(fp);
arsenalist 0:f4e449fa34d7 2175 if(c == EOF){
arsenalist 0:f4e449fa34d7 2176 break;
arsenalist 0:f4e449fa34d7 2177 }
arsenalist 0:f4e449fa34d7 2178 s[i] = c;
arsenalist 0:f4e449fa34d7 2179 i++;
arsenalist 0:f4e449fa34d7 2180 }
arsenalist 0:f4e449fa34d7 2181 strS = s;
arsenalist 0:f4e449fa34d7 2182 if(strS.find("(") != std::string::npos && strS.find(")") != std::string::npos) {
arsenalist 0:f4e449fa34d7 2183 strS.erase(strS.begin(),strS.begin()+strS.find("(")+1);
arsenalist 0:f4e449fa34d7 2184 strS.erase(strS.begin()+strS.find(")"),strS.end());
arsenalist 0:f4e449fa34d7 2185 } else {
arsenalist 0:f4e449fa34d7 2186 strS = "";
arsenalist 0:f4e449fa34d7 2187 }
arsenalist 0:f4e449fa34d7 2188 }
arsenalist 0:f4e449fa34d7 2189 fclose(fp);
arsenalist 0:f4e449fa34d7 2190 return strS;
arsenalist 0:f4e449fa34d7 2191 }
arsenalist 0:f4e449fa34d7 2192
arsenalist 0:f4e449fa34d7 2193 string *readNodeList(void) {
arsenalist 0:f4e449fa34d7 2194 static string nd[10]; //max node
arsenalist 0:f4e449fa34d7 2195 DIR *d;
arsenalist 0:f4e449fa34d7 2196 struct dirent *p;
arsenalist 0:f4e449fa34d7 2197 string q;
arsenalist 0:f4e449fa34d7 2198 int i=0;
arsenalist 0:f4e449fa34d7 2199
arsenalist 0:f4e449fa34d7 2200 d = opendir("/sd/nodeList");
arsenalist 0:f4e449fa34d7 2201 if(d != NULL) {
arsenalist 0:f4e449fa34d7 2202 while((p = readdir(d)) != NULL) {
arsenalist 0:f4e449fa34d7 2203 q = p->d_name;
arsenalist 0:f4e449fa34d7 2204 nd[i] = q;
arsenalist 0:f4e449fa34d7 2205 i++;
arsenalist 0:f4e449fa34d7 2206 }
arsenalist 0:f4e449fa34d7 2207 }
arsenalist 0:f4e449fa34d7 2208 closedir(d);
arsenalist 0:f4e449fa34d7 2209 return nd;
arsenalist 0:f4e449fa34d7 2210 }
arsenalist 0:f4e449fa34d7 2211
arsenalist 0:f4e449fa34d7 2212 string wifiGetNodeTemp(string macAddr) {
arsenalist 0:f4e449fa34d7 2213 int trial=0;
arsenalist 0:f4e449fa34d7 2214 string nodeIP = readNodeIP(macAddr);
arsenalist 0:f4e449fa34d7 2215 string str;
arsenalist 0:f4e449fa34d7 2216 string temp = "0";
arsenalist 0:f4e449fa34d7 2217
arsenalist 0:f4e449fa34d7 2218 if(rest.begin(nodeIP.c_str(),REMOTE_TCP_PORT,false)) {
arsenalist 0:f4e449fa34d7 2219 while(1) {
arsenalist 0:f4e449fa34d7 2220 char rcv[256] = {};
arsenalist 0:f4e449fa34d7 2221 rest.get("/","<?xml version=\"1.0\" encoding=\"utf-8\"?><app_cmd cmd=\"2\"/>\r\n");
arsenalist 0:f4e449fa34d7 2222 rest.getResponse(rcv,sizeof(rcv));
arsenalist 0:f4e449fa34d7 2223 str = rcv;
arsenalist 0:f4e449fa34d7 2224 if(str.find("temp=") != std::string::npos) {
arsenalist 0:f4e449fa34d7 2225 str.erase(str.begin(),str.begin()+str.find("temp=")+6);
arsenalist 0:f4e449fa34d7 2226 str.erase(str.begin()+str.find("\""),str.end());
arsenalist 0:f4e449fa34d7 2227 temp = str;
arsenalist 0:f4e449fa34d7 2228 break;
arsenalist 0:f4e449fa34d7 2229 }
arsenalist 0:f4e449fa34d7 2230 if(trial>1) { //three times trial
arsenalist 0:f4e449fa34d7 2231 break;
arsenalist 0:f4e449fa34d7 2232 }
arsenalist 0:f4e449fa34d7 2233 trial++;
arsenalist 0:f4e449fa34d7 2234 wait(2);
arsenalist 0:f4e449fa34d7 2235 }
arsenalist 0:f4e449fa34d7 2236 }
arsenalist 0:f4e449fa34d7 2237 return temp;
arsenalist 0:f4e449fa34d7 2238 }
arsenalist 0:f4e449fa34d7 2239 /*end emma node*/
arsenalist 0:f4e449fa34d7 2240
arsenalist 0:f4e449fa34d7 2241 /*start emma connection function*/
arsenalist 0:f4e449fa34d7 2242 string ethGET(string host, int port, string url) {
arsenalist 0:f4e449fa34d7 2243 char buf[1024];
arsenalist 0:f4e449fa34d7 2244 char s[256];
arsenalist 0:f4e449fa34d7 2245 int ret;
arsenalist 0:f4e449fa34d7 2246 TCPSocketConnection sock;
arsenalist 0:f4e449fa34d7 2247 Timer t;
arsenalist 0:f4e449fa34d7 2248
arsenalist 0:f4e449fa34d7 2249 sprintf(s,"%s",url.c_str());
arsenalist 0:f4e449fa34d7 2250 sock.connect(host.c_str(),port);
arsenalist 0:f4e449fa34d7 2251 sock.send_all(s,sizeof(s)-1);
arsenalist 0:f4e449fa34d7 2252 wait(2);
arsenalist 0:f4e449fa34d7 2253
arsenalist 0:f4e449fa34d7 2254 //receive return
arsenalist 0:f4e449fa34d7 2255 t.start();
arsenalist 0:f4e449fa34d7 2256 while(1) {
arsenalist 0:f4e449fa34d7 2257 ret = sock.receive(buf, sizeof(buf));
arsenalist 0:f4e449fa34d7 2258 if(ret<=0 || t.read_ms() > 10000) {
arsenalist 0:f4e449fa34d7 2259 t.stop();
arsenalist 0:f4e449fa34d7 2260 break;
arsenalist 0:f4e449fa34d7 2261 }
arsenalist 0:f4e449fa34d7 2262 }
arsenalist 0:f4e449fa34d7 2263 sock.close();
arsenalist 0:f4e449fa34d7 2264 return buf;
arsenalist 0:f4e449fa34d7 2265 }
arsenalist 0:f4e449fa34d7 2266 /*end emma connection function*/
arsenalist 0:f4e449fa34d7 2267
arsenalist 0:f4e449fa34d7 2268 /*start emma private function*/
arsenalist 8:51a0ca9079ca 2269 /*
arsenalist 8:51a0ca9079ca 2270 void connectedIface(void) { //WARNING: should be run in emmaModeRegister and emmaModeOperation only - problem with esp, after MODE=B, cannot go back to MODE=S
arsenalist 0:f4e449fa34d7 2271 char s[512];
arsenalist 0:f4e449fa34d7 2272 int connPort;
arsenalist 0:f4e449fa34d7 2273 string connHost;
arsenalist 0:f4e449fa34d7 2274 string str;
arsenalist 0:f4e449fa34d7 2275 Timer t;
arsenalist 0:f4e449fa34d7 2276
arsenalist 0:f4e449fa34d7 2277 //wifi interface
arsenalist 0:f4e449fa34d7 2278 if(wifiAvailable) {
arsenalist 0:f4e449fa34d7 2279 _ESP.printf("MODE=B");
arsenalist 0:f4e449fa34d7 2280 if(useProxy) {
arsenalist 0:f4e449fa34d7 2281 connHost = proxySERVER;
arsenalist 0:f4e449fa34d7 2282 sscanf(proxyPORT.c_str(),"%d",&connPort);
arsenalist 0:f4e449fa34d7 2283 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 2284 s[i]=0; }
arsenalist 4:76ab12e2f8a3 2285 sprintf(s,"http://%s:%d/emma/api/controller/test HTTP/1.0\nHost: %s\r\n\r\n",EMMA_SERVER_HOST,EMMA_SERVER_PORT,EMMA_SERVER_HOST);
arsenalist 0:f4e449fa34d7 2286 } else {
arsenalist 0:f4e449fa34d7 2287 connHost = EMMA_SERVER_HOST;
arsenalist 0:f4e449fa34d7 2288 connPort = EMMA_SERVER_PORT;
arsenalist 0:f4e449fa34d7 2289 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 2290 s[i]=0; }
arsenalist 4:76ab12e2f8a3 2291 sprintf(s,"/emma/api/controller/test");
arsenalist 0:f4e449fa34d7 2292 }
arsenalist 0:f4e449fa34d7 2293 wait(1);
arsenalist 0:f4e449fa34d7 2294 t.start();
arsenalist 0:f4e449fa34d7 2295 while(!esp.ready() && t.read_ms() < 5000);
arsenalist 0:f4e449fa34d7 2296 t.stop();
arsenalist 0:f4e449fa34d7 2297 if(rest.begin(connHost.c_str(),connPort,false)) {
arsenalist 0:f4e449fa34d7 2298 //DBG.printf("rest begin\r\n");
arsenalist 0:f4e449fa34d7 2299 esp.process();
arsenalist 0:f4e449fa34d7 2300 rest.get(s);
arsenalist 0:f4e449fa34d7 2301 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 2302 s[i]=0; }
arsenalist 0:f4e449fa34d7 2303 rest.getResponse(s,sizeof(s));
arsenalist 0:f4e449fa34d7 2304 str = s;
arsenalist 0:f4e449fa34d7 2305 //DBG.printf("response:%s\r\n",s);
arsenalist 0:f4e449fa34d7 2306 if(str.find("OK") != std::string::npos) {
arsenalist 0:f4e449fa34d7 2307 wifiConnected = true;
arsenalist 0:f4e449fa34d7 2308 }
arsenalist 0:f4e449fa34d7 2309 } else {
arsenalist 0:f4e449fa34d7 2310 wifiConnected = false;
arsenalist 0:f4e449fa34d7 2311 }
arsenalist 0:f4e449fa34d7 2312 } else {
arsenalist 0:f4e449fa34d7 2313 wifiConnected = false;
arsenalist 0:f4e449fa34d7 2314 }
arsenalist 0:f4e449fa34d7 2315
arsenalist 0:f4e449fa34d7 2316 //eth interface
arsenalist 0:f4e449fa34d7 2317 if(ethAvailable) {
arsenalist 0:f4e449fa34d7 2318 if(useProxy) {
arsenalist 0:f4e449fa34d7 2319 connHost = proxySERVER;
arsenalist 0:f4e449fa34d7 2320 sscanf(proxyPORT.c_str(),"%d",&connPort);
arsenalist 0:f4e449fa34d7 2321 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 2322 s[i]=0; }
arsenalist 0:f4e449fa34d7 2323 sprintf(s,"GET http://%s:%d/emma/api/web/test HTTP/1.0\nHost: %s\r\n\r\n",EMMA_SERVER_HOST,EMMA_SERVER_PORT,EMMA_SERVER_HOST);
arsenalist 0:f4e449fa34d7 2324 } else {
arsenalist 0:f4e449fa34d7 2325 connHost = EMMA_SERVER_HOST;
arsenalist 0:f4e449fa34d7 2326 connPort = EMMA_SERVER_PORT;
arsenalist 0:f4e449fa34d7 2327 for(int i=0; i<sizeof(s); i++) {
arsenalist 0:f4e449fa34d7 2328 s[i]=0; }
arsenalist 0:f4e449fa34d7 2329 strcpy(s,"GET /emma/api/web/test HTTP/1.0\nHost: %s\r\n\r\n");
arsenalist 0:f4e449fa34d7 2330 }
arsenalist 0:f4e449fa34d7 2331
arsenalist 0:f4e449fa34d7 2332 t.start();
arsenalist 0:f4e449fa34d7 2333 while(1) {
arsenalist 0:f4e449fa34d7 2334 str = ethGET(connHost,connPort,s);
arsenalist 0:f4e449fa34d7 2335 if(str.find("OK") != std::string::npos) {
arsenalist 0:f4e449fa34d7 2336 t.stop();
arsenalist 0:f4e449fa34d7 2337 ethConnected = true;
arsenalist 0:f4e449fa34d7 2338 break;
arsenalist 0:f4e449fa34d7 2339 }
arsenalist 0:f4e449fa34d7 2340 if(t.read_ms() > 5000) {
arsenalist 0:f4e449fa34d7 2341 t.stop();
arsenalist 0:f4e449fa34d7 2342 ethConnected = false;
arsenalist 0:f4e449fa34d7 2343 break;
arsenalist 0:f4e449fa34d7 2344 }
arsenalist 0:f4e449fa34d7 2345 }
arsenalist 0:f4e449fa34d7 2346 } else {
arsenalist 0:f4e449fa34d7 2347 ethConnected = false;
arsenalist 0:f4e449fa34d7 2348 }
arsenalist 0:f4e449fa34d7 2349
arsenalist 0:f4e449fa34d7 2350 //gprs interface
arsenalist 0:f4e449fa34d7 2351 }
arsenalist 8:51a0ca9079ca 2352 */
arsenalist 8:51a0ca9079ca 2353 void isEthAvailable(void) {
arsenalist 8:51a0ca9079ca 2354 if(ipstack.getEth().linkstatus()) {
arsenalist 8:51a0ca9079ca 2355 ethAvailable = true;
arsenalist 8:51a0ca9079ca 2356 } else {
arsenalist 8:51a0ca9079ca 2357 ethAvailable = false;
arsenalist 8:51a0ca9079ca 2358 }
arsenalist 8:51a0ca9079ca 2359 }
arsenalist 8:51a0ca9079ca 2360
arsenalist 8:51a0ca9079ca 2361 void isEthConnected(void) {
arsenalist 8:51a0ca9079ca 2362 char s[512];
arsenalist 8:51a0ca9079ca 2363 int connPort;
arsenalist 8:51a0ca9079ca 2364 string connHost;
arsenalist 8:51a0ca9079ca 2365 string str;
arsenalist 8:51a0ca9079ca 2366 Timer t;
arsenalist 8:51a0ca9079ca 2367
arsenalist 8:51a0ca9079ca 2368 if(ethAvailable) {
arsenalist 8:51a0ca9079ca 2369 if(useProxy) {
arsenalist 8:51a0ca9079ca 2370 connHost = proxySERVER;
arsenalist 8:51a0ca9079ca 2371 sscanf(proxyPORT.c_str(),"%d",&connPort);
arsenalist 8:51a0ca9079ca 2372 for(int i=0; i<sizeof(s); i++) {
arsenalist 8:51a0ca9079ca 2373 s[i]=0; }
arsenalist 8:51a0ca9079ca 2374 sprintf(s,"GET http://%s:%d/emma/api/controller/test HTTP/1.0\nHost: %s\r\n\r\n",EMMA_SERVER_HOST,EMMA_SERVER_PORT,EMMA_SERVER_HOST);
arsenalist 8:51a0ca9079ca 2375 } else {
arsenalist 8:51a0ca9079ca 2376 connHost = EMMA_SERVER_HOST;
arsenalist 8:51a0ca9079ca 2377 connPort = EMMA_SERVER_PORT;
arsenalist 8:51a0ca9079ca 2378 for(int i=0; i<sizeof(s); i++) {
arsenalist 8:51a0ca9079ca 2379 s[i]=0; }
arsenalist 8:51a0ca9079ca 2380 strcpy(s,"GET /emma/api/controller/test HTTP/1.0\nHost: %s\r\n\r\n");
arsenalist 8:51a0ca9079ca 2381 }
arsenalist 8:51a0ca9079ca 2382
arsenalist 8:51a0ca9079ca 2383 t.start();
arsenalist 8:51a0ca9079ca 2384 while(1) {
arsenalist 8:51a0ca9079ca 2385 str = ethGET(connHost,connPort,s);
arsenalist 8:51a0ca9079ca 2386 if(str.find("OK") != std::string::npos) {
arsenalist 8:51a0ca9079ca 2387 t.stop();
arsenalist 8:51a0ca9079ca 2388 ethConnected = true;
arsenalist 8:51a0ca9079ca 2389 break;
arsenalist 8:51a0ca9079ca 2390 }
arsenalist 8:51a0ca9079ca 2391 if(t.read_ms() > 5000) {
arsenalist 8:51a0ca9079ca 2392 t.stop();
arsenalist 8:51a0ca9079ca 2393 ethConnected = false;
arsenalist 8:51a0ca9079ca 2394 break;
arsenalist 8:51a0ca9079ca 2395 }
arsenalist 8:51a0ca9079ca 2396 }
arsenalist 8:51a0ca9079ca 2397 } else {
arsenalist 8:51a0ca9079ca 2398 ethConnected = false;
arsenalist 8:51a0ca9079ca 2399 }
arsenalist 8:51a0ca9079ca 2400 }
arsenalist 8:51a0ca9079ca 2401
arsenalist 8:51a0ca9079ca 2402 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 2403 char s[512];
arsenalist 8:51a0ca9079ca 2404 int connPort;
arsenalist 8:51a0ca9079ca 2405 string connHost;
arsenalist 8:51a0ca9079ca 2406 string str;
arsenalist 8:51a0ca9079ca 2407 Timer t;
arsenalist 8:51a0ca9079ca 2408
arsenalist 8:51a0ca9079ca 2409 if(wifiAvailable) {
arsenalist 8:51a0ca9079ca 2410 _ESP.printf("MODE=B");
arsenalist 8:51a0ca9079ca 2411 if(useProxy) {
arsenalist 8:51a0ca9079ca 2412 connHost = proxySERVER;
arsenalist 8:51a0ca9079ca 2413 sscanf(proxyPORT.c_str(),"%d",&connPort);
arsenalist 8:51a0ca9079ca 2414 for(int i=0; i<sizeof(s); i++) {
arsenalist 8:51a0ca9079ca 2415 s[i]=0; }
arsenalist 8:51a0ca9079ca 2416 sprintf(s,"http://%s:%d/emma/api/controller/test HTTP/1.0\nHost: %s\r\n\r\n",EMMA_SERVER_HOST,EMMA_SERVER_PORT,EMMA_SERVER_HOST);
arsenalist 8:51a0ca9079ca 2417 } else {
arsenalist 8:51a0ca9079ca 2418 connHost = EMMA_SERVER_HOST;
arsenalist 8:51a0ca9079ca 2419 connPort = EMMA_SERVER_PORT;
arsenalist 8:51a0ca9079ca 2420 for(int i=0; i<sizeof(s); i++) {
arsenalist 8:51a0ca9079ca 2421 s[i]=0; }
arsenalist 8:51a0ca9079ca 2422 sprintf(s,"/emma/api/controller/test");
arsenalist 8:51a0ca9079ca 2423 }
arsenalist 8:51a0ca9079ca 2424 wait(1);
arsenalist 8:51a0ca9079ca 2425 t.start();
arsenalist 8:51a0ca9079ca 2426 while(!esp.ready() && t.read_ms() < 5000);
arsenalist 8:51a0ca9079ca 2427 t.stop();
arsenalist 8:51a0ca9079ca 2428 if(rest.begin(connHost.c_str(),connPort,false)) {
arsenalist 8:51a0ca9079ca 2429 //DBG.printf("rest begin\r\n");
arsenalist 8:51a0ca9079ca 2430 esp.process();
arsenalist 8:51a0ca9079ca 2431 rest.get(s);
arsenalist 8:51a0ca9079ca 2432 for(int i=0; i<sizeof(s); i++) {
arsenalist 8:51a0ca9079ca 2433 s[i]=0; }
arsenalist 8:51a0ca9079ca 2434 rest.getResponse(s,sizeof(s));
arsenalist 8:51a0ca9079ca 2435 str = s;
arsenalist 8:51a0ca9079ca 2436 //DBG.printf("response:%s\r\n",s);
arsenalist 8:51a0ca9079ca 2437 if(str.find("OK") != std::string::npos) {
arsenalist 8:51a0ca9079ca 2438 wifiConnected = true;
arsenalist 8:51a0ca9079ca 2439 }
arsenalist 8:51a0ca9079ca 2440 } else {
arsenalist 8:51a0ca9079ca 2441 wifiConnected = false;
arsenalist 8:51a0ca9079ca 2442 }
arsenalist 8:51a0ca9079ca 2443 } else {
arsenalist 8:51a0ca9079ca 2444 wifiConnected = false;
arsenalist 8:51a0ca9079ca 2445 }
arsenalist 8:51a0ca9079ca 2446 }
arsenalist 8:51a0ca9079ca 2447
arsenalist 8:51a0ca9079ca 2448 void isGprsConnected(void) {
arsenalist 8:51a0ca9079ca 2449
arsenalist 8:51a0ca9079ca 2450 }
arsenalist 0:f4e449fa34d7 2451
arsenalist 0:f4e449fa34d7 2452 void addChar(char *s, char c) {
arsenalist 0:f4e449fa34d7 2453 uint16_t k; //customized for EMS
arsenalist 0:f4e449fa34d7 2454 k = strlen(s);
arsenalist 0:f4e449fa34d7 2455 s[k] = c;
arsenalist 0:f4e449fa34d7 2456 s[k + 1] = 0;
arsenalist 0:f4e449fa34d7 2457 }
arsenalist 0:f4e449fa34d7 2458
arsenalist 0:f4e449fa34d7 2459 void rcvReply(char *r, int to) {
arsenalist 0:f4e449fa34d7 2460 Timer t;
arsenalist 0:f4e449fa34d7 2461 bool ended = false;
arsenalist 0:f4e449fa34d7 2462 char c;
arsenalist 0:f4e449fa34d7 2463
arsenalist 0:f4e449fa34d7 2464 strcpy(r,"");
arsenalist 0:f4e449fa34d7 2465 t.start();
arsenalist 0:f4e449fa34d7 2466 while(!ended) {
arsenalist 0:f4e449fa34d7 2467 if(_ESP.readable()) {
arsenalist 0:f4e449fa34d7 2468 c = _ESP.getc();
arsenalist 0:f4e449fa34d7 2469 addChar(r,c);
arsenalist 0:f4e449fa34d7 2470 t.start();
arsenalist 0:f4e449fa34d7 2471 }
arsenalist 0:f4e449fa34d7 2472 if(t.read_ms() > to) {
arsenalist 0:f4e449fa34d7 2473 ended = true;
arsenalist 0:f4e449fa34d7 2474 }
arsenalist 0:f4e449fa34d7 2475 }
arsenalist 0:f4e449fa34d7 2476 addChar(r, 0x00);
arsenalist 0:f4e449fa34d7 2477 }
arsenalist 0:f4e449fa34d7 2478
arsenalist 0:f4e449fa34d7 2479 string calculateMD5(string text) {
arsenalist 0:f4e449fa34d7 2480 char s[64];
arsenalist 0:f4e449fa34d7 2481 memset(s,0,sizeof(s)); //for unknown reason, after reading UID, the 's' will contaion UID data
arsenalist 0:f4e449fa34d7 2482 uint8_t hash[16];
arsenalist 0:f4e449fa34d7 2483 MD5::computeHash(hash, (uint8_t*)text.c_str(), strlen(text.c_str()));
arsenalist 0:f4e449fa34d7 2484 for(int i=0; i<16; ++i) {
arsenalist 0:f4e449fa34d7 2485 sprintf(s,"%s%02x",s,hash[i]);
arsenalist 0:f4e449fa34d7 2486 }
arsenalist 0:f4e449fa34d7 2487 return s;
arsenalist 0:f4e449fa34d7 2488 }
arsenalist 0:f4e449fa34d7 2489
arsenalist 0:f4e449fa34d7 2490 bool writeFirmwareHexToChar(string value) {
arsenalist 0:f4e449fa34d7 2491 FILE *fp;
arsenalist 0:f4e449fa34d7 2492 char s[32];
arsenalist 0:f4e449fa34d7 2493 int number;
arsenalist 0:f4e449fa34d7 2494 string chunk;
arsenalist 0:f4e449fa34d7 2495
arsenalist 0:f4e449fa34d7 2496 sprintf(s,"/sd/newFirmware/firmware.bin");
arsenalist 0:f4e449fa34d7 2497 fp = fopen(s,"a");
arsenalist 0:f4e449fa34d7 2498 if(fp != NULL) {
arsenalist 0:f4e449fa34d7 2499 for(int ch=0; ch<value.size(); ch+=2) {
arsenalist 0:f4e449fa34d7 2500 chunk = value.substr(ch,2);
arsenalist 0:f4e449fa34d7 2501 sscanf(chunk.c_str(),"%x",&number);
arsenalist 0:f4e449fa34d7 2502 fprintf(fp,"%c",number);
arsenalist 0:f4e449fa34d7 2503 }
arsenalist 0:f4e449fa34d7 2504 fclose(fp);
arsenalist 0:f4e449fa34d7 2505 return true;
arsenalist 0:f4e449fa34d7 2506 }
arsenalist 0:f4e449fa34d7 2507 return false;
arsenalist 0:f4e449fa34d7 2508 }
arsenalist 0:f4e449fa34d7 2509
arsenalist 0:f4e449fa34d7 2510 bool clearFirmware(void) {
arsenalist 0:f4e449fa34d7 2511 FILE *fp;
arsenalist 0:f4e449fa34d7 2512 char s[32];
arsenalist 0:f4e449fa34d7 2513
arsenalist 0:f4e449fa34d7 2514 sprintf(s,"/sd/newFirmware/firmware.bin");
arsenalist 0:f4e449fa34d7 2515 fp = fopen(s,"w");
arsenalist 0:f4e449fa34d7 2516 if(fp != NULL) {
arsenalist 0:f4e449fa34d7 2517 fprintf(fp,"");
arsenalist 0:f4e449fa34d7 2518 fclose(fp);
arsenalist 0:f4e449fa34d7 2519 return true;
arsenalist 0:f4e449fa34d7 2520 }
arsenalist 0:f4e449fa34d7 2521 return false;
arsenalist 0:f4e449fa34d7 2522 }
arsenalist 0:f4e449fa34d7 2523 /*end emma private function*/