MQTT for Eth, Wifi, GPRS

Dependencies:   FP MQTTPacket

Dependents:   PB_Emma_Ethernet

Fork of MQTT by W5500-Ethernet-Interface Makers

Committer:
bonchenko
Date:
Fri Aug 07 02:50:57 2015 +0000
Revision:
45:ba32a33d6867
Parent:
23:05fc7de97d4a
Ethernet able to subscribe to MQTT commands for > 12 hours

Who changed what in which revision?

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