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:
Thu Aug 20 13:16:16 2015 +0000
Revision:
43:612547648ed1
Parent:
42:b32e51a374c7
Child:
44:c1d11c491237
utilize appNAME parameter.; working modeRegister and modeOperation with WiFi interface.

Who changed what in which revision?

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