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:
bonchenko
Date:
Fri Aug 07 16:27:42 2015 +0000
Revision:
29:d809e6e4343f
Parent:
28:cd25d46cb141
able to subscribe for >10 hours

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