emma controller code in production board v1

Dependencies:   ADE7758_v1 Crypto DHT11 MQTT MbedJSONValueEmma SDFileSystem TFT_ILI9341 SWSPI SetRTC TFT_fonts Touch W5500Interface mbed-rtos mbed-src SoftSerial

Fork of emma_controller_energy by Emma

Committer:
arsenalist
Date:
Wed Aug 19 08:52:27 2015 +0000
Revision:
37:93f196daf5cf
Parent:
36:ed696fd1b44e
Child:
38:e44f35f8129d
Update emmaModeSettings (Eth and WiFi) text on LCD.

Who changed what in which revision?

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