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
Diff: emmaCode.cpp
- Revision:
- 8:51a0ca9079ca
- Parent:
- 7:7e8c6ad3fd64
- Child:
- 9:a58c04da4476
--- a/emmaCode.cpp Fri Jul 10 05:26:04 2015 +0000 +++ b/emmaCode.cpp Sat Jul 11 09:38:12 2015 +0000 @@ -5,8 +5,8 @@ //init wifi port Serial _ESP(PA_2, PA_3); //tx, rx -//init espduino -ESP esp(&_ESP, &DBG, ESP_CH_PD, ESP_BAUD); +//init espduino - without ch_pd pin +ESP esp(&_ESP, &DBG, ESP_BAUD); //init wifi mqtt ESPMQTT mqtt(&esp); //init wifi rest @@ -18,10 +18,10 @@ MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack); //init sd card -SDFileSystem sd(PA_7, PA_6, PA_5, PC_12, "sd"); //mosi, miso, sck, cs +SDFileSystem sd(PA_7, PA_6, PA_5, PB_3, "sd"); //mosi, miso, sck, cs -//init ade7758 -ADE7758 ADE(PB_5, PD_2, PB_4, PB_6, PB_7); +//init ade7758 - without cs pin +ADE7758 ADE(PB_6, PB_4, PB_5, PB_2); //mosi, miso, sck, irq //emma settings string emmaUID; @@ -115,9 +115,12 @@ useProxy = false; DBG.printf("proxy:%d\r\n",useProxy); - //preset available interface - wifiAvailable = true; - ethAvailable = true; + //check available interface + isEthAvailable(); //check whether cable is connected + wifiAvailable = true; //we assume wifi will always ready to use + DBG.printf("eth:%d\r\n",ethAvailable); + DBG.printf("wifi:%d\r\n",wifiAvailable); + DBG.printf("gprs:%d\r\n",gprsAvailable); } void emmaModeWiFiConfig(void) { string str; @@ -174,58 +177,16 @@ char s[32]; string str; + //create settings dir mkdir("/sd/settings",0777); + //get and write emmaUID string uid = getUID(); sprintf(s,"(%s)",uid.c_str()); uid = s; writeSetting("emmaUID",uid); - if(wifiAvailable) { - DBG.printf("emmaModeSettings - wifi\r\n"); - - _ESP.printf("MODE=S"); - while(1) { - char rcv[128] = {}; - rcvReply(rcv,3000); - str = rcv; - if(str.find("MODE=S_OK") != std::string::npos) - break; - } - DBG.printf("entering settings mode\r\n"); - while(1) { - char rcv[512] = {}; - rcvReply(rcv,3000); - //DBG.printf("rcv:%s\r\n",rcv); - str = rcv; - if(str.find("MODE=S_Config") != std::string::npos) { - //save gprs and proxy setting - if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) { - str.erase(str.begin(),str.begin()+str.find("[")+1); - str.erase(str.begin()+str.find("]"),str.end()); - - MbedJSONValue jsonValue; - parse(jsonValue,str.c_str()); - - char *parameter[4] = {"gprsAPN","proxySERVER","proxyPORT","proxyAUTH"}; - - for(int i=0; i<4; i++) { - if(jsonValue.hasMember(parameter[i])) { - string val = jsonValue[parameter[i]].get<std::string>(); - int st = writeSetting(parameter[i],val.c_str()); - if(st) { - DBG.printf("%s: %s is saved\r\n",parameter[i],val.c_str()); - } else { - DBG.printf("%s is not saved\r\n",parameter[i]); - } - } - } - } - } else if(str.find("connect") != std::string::npos) { - DBG.printf("connection success!\r\n"); - } - } - } else if(ethAvailable) { + if(ethAvailable) { DBG.printf("emmaModeSettings - eth\r\n"); TCPSocketServer svr; @@ -300,8 +261,52 @@ clientSock.close(); } } + } else if(wifiAvailable) { + DBG.printf("emmaModeSettings - wifi\r\n"); + + _ESP.printf("MODE=S"); + while(1) { + char rcv[128] = {}; + rcvReply(rcv,3000); + str = rcv; + if(str.find("MODE=S_OK") != std::string::npos) + break; + } + DBG.printf("entering settings mode\r\n"); + while(1) { + char rcv[512] = {}; + rcvReply(rcv,3000); + //DBG.printf("rcv:%s\r\n",rcv); + str = rcv; + if(str.find("MODE=S_Config") != std::string::npos) { + //save gprs and proxy setting + if(str.find("[") != std::string::npos && str.find("]") != std::string::npos) { + str.erase(str.begin(),str.begin()+str.find("[")+1); + str.erase(str.begin()+str.find("]"),str.end()); + + MbedJSONValue jsonValue; + parse(jsonValue,str.c_str()); + + char *parameter[4] = {"gprsAPN","proxySERVER","proxyPORT","proxyAUTH"}; + + for(int i=0; i<4; i++) { + if(jsonValue.hasMember(parameter[i])) { + string val = jsonValue[parameter[i]].get<std::string>(); + int st = writeSetting(parameter[i],val.c_str()); + if(st) { + DBG.printf("%s: %s is saved\r\n",parameter[i],val.c_str()); + } else { + DBG.printf("%s is not saved\r\n",parameter[i]); + } + } + } + } + } else if(str.find("connect") != std::string::npos) { + DBG.printf("connection success!\r\n"); + } + } } else { - DBG.printf("no wifi or eth found\r\n"); + DBG.printf("no eth or wifi available\r\n"); } } void emmaModeRegister(void) { @@ -319,7 +324,10 @@ Timer t; //check connected interface - connectedIface(); + //connectedIface(); + isEthConnected(); + isWiFiConnected(); + isGprsConnected(); DBG.printf("ethConnected:%d\r\n",ethConnected); DBG.printf("wifiConnected:%d\r\n",wifiConnected); @@ -608,7 +616,10 @@ Timer tNodes; //check connected interface - connectedIface(); + //connectedIface(); + isEthConnected(); + isWiFiConnected(); + isGprsConnected(); DBG.printf("ethConnected:%d\r\n",ethConnected); DBG.printf("wifiConnected:%d\r\n",wifiConnected); @@ -1325,23 +1336,6 @@ /*end energy related*/ /*start wifi mqtt*/ -void wifiCb(void* response) { - uint32_t status; - RESPONSE res(response); - - if(res.getArgc() == 1) { - res.popArgs((uint8_t*)&status,4); - if(status == STATION_GOT_IP) { - DBG.printf("WIFI Connected\r\n"); - mqtt.connect(MQTT_HOST,MQTT_PORT,false); - wifiConnected = true; - } - else { - wifiConnected = false; - mqtt.disconnect(); - } - } -} void mqttConnected(void* response) { DBG.printf("MQTT Connected\r\n"); char mqttTopic[64]; @@ -1351,48 +1345,9 @@ void mqttDisconnected(void* response) { DBG.printf("MQTT Disconnected\r\n"); } -void mqttData(void* response) { - RESPONSE res(response); - - //DBG.printf("Received:\r\n"); - //DBG.printf("topic="); - string topic = res.popString(); - DBG.printf(topic.c_str()); - DBG.printf("\r\n"); - - //DBG.printf("command="); - string cmd = res.popString(); - DBG.printf(cmd.c_str()); - DBG.printf("\r\n"); - - //check whether cmd is json - if(cmd.find("[") != std::string::npos && cmd.find("]") != std::string::npos) { - cmd.erase(cmd.begin(),cmd.begin()+cmd.find("[")+1); - cmd.erase(cmd.begin()+cmd.find("]"),cmd.end()); - globalCommand = cmd; - newCommand = true; - } -} -void mqttPublished(void* response) { -} /*end wifi mqtt*/ /*start wifi rest*/ -void restWifiCb(void* response) { - uint32_t status; - RESPONSE res(response); - - if(res.getArgc() == 1) { - res.popArgs((uint8_t*)&status,4); - if(status == STATION_GOT_IP) { - DBG.printf("WIFI Connected\r\n"); - wifiConnected = true; - } - else { - wifiConnected = false; - } - } -} void rxInterrupt(void) { char c; @@ -1706,7 +1661,8 @@ /*end emma connection function*/ /*start emma private function*/ -void connectedIface(void) { //WARNING: should be run in emmaModeRegister and emmaModeOperation +/* +void connectedIface(void) { //WARNING: should be run in emmaModeRegister and emmaModeOperation only - problem with esp, after MODE=B, cannot go back to MODE=S char s[512]; int connPort; string connHost; @@ -1788,6 +1744,105 @@ //gprs interface } +*/ +void isEthAvailable(void) { + if(ipstack.getEth().linkstatus()) { + ethAvailable = true; + } else { + ethAvailable = false; + } +} + +void isEthConnected(void) { + char s[512]; + int connPort; + string connHost; + string str; + Timer t; + + if(ethAvailable) { + if(useProxy) { + connHost = proxySERVER; + sscanf(proxyPORT.c_str(),"%d",&connPort); + for(int i=0; i<sizeof(s); i++) { + s[i]=0; } + sprintf(s,"GET http://%s:%d/emma/api/controller/test HTTP/1.0\nHost: %s\r\n\r\n",EMMA_SERVER_HOST,EMMA_SERVER_PORT,EMMA_SERVER_HOST); + } else { + connHost = EMMA_SERVER_HOST; + connPort = EMMA_SERVER_PORT; + for(int i=0; i<sizeof(s); i++) { + s[i]=0; } + strcpy(s,"GET /emma/api/controller/test HTTP/1.0\nHost: %s\r\n\r\n"); + } + + t.start(); + while(1) { + str = ethGET(connHost,connPort,s); + if(str.find("OK") != std::string::npos) { + t.stop(); + ethConnected = true; + break; + } + if(t.read_ms() > 5000) { + t.stop(); + ethConnected = false; + break; + } + } + } else { + ethConnected = false; + } +} + +void isWiFiConnected(void) { //WARNING: should be run in emmaModeRegister and emmaModeOperation only - limitation with esp, after MODE=B, cannot go to MODE=S + char s[512]; + int connPort; + string connHost; + string str; + Timer t; + + if(wifiAvailable) { + _ESP.printf("MODE=B"); + if(useProxy) { + connHost = proxySERVER; + sscanf(proxyPORT.c_str(),"%d",&connPort); + for(int i=0; i<sizeof(s); i++) { + s[i]=0; } + sprintf(s,"http://%s:%d/emma/api/controller/test HTTP/1.0\nHost: %s\r\n\r\n",EMMA_SERVER_HOST,EMMA_SERVER_PORT,EMMA_SERVER_HOST); + } else { + connHost = EMMA_SERVER_HOST; + connPort = EMMA_SERVER_PORT; + for(int i=0; i<sizeof(s); i++) { + s[i]=0; } + sprintf(s,"/emma/api/controller/test"); + } + wait(1); + t.start(); + while(!esp.ready() && t.read_ms() < 5000); + t.stop(); + if(rest.begin(connHost.c_str(),connPort,false)) { + //DBG.printf("rest begin\r\n"); + esp.process(); + rest.get(s); + for(int i=0; i<sizeof(s); i++) { + s[i]=0; } + rest.getResponse(s,sizeof(s)); + str = s; + //DBG.printf("response:%s\r\n",s); + if(str.find("OK") != std::string::npos) { + wifiConnected = true; + } + } else { + wifiConnected = false; + } + } else { + wifiConnected = false; + } +} + +void isGprsConnected(void) { + +} void addChar(char *s, char c) { uint16_t k; //customized for EMS