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:
- 44:c1d11c491237
- Parent:
- 43:612547648ed1
- Child:
- 45:2406c2b6995a
--- a/emmaCode.cpp Thu Aug 20 13:16:16 2015 +0000 +++ b/emmaCode.cpp Wed Aug 26 07:18:33 2015 +0000 @@ -14,7 +14,8 @@ //init eth port SPI spi(PB_15, PB_14, PB_13); //mosi, miso, sck -MQTTEthernet ipstack(&spi, PB_12, PC_6); //spi, cs, reset +EthernetInterface eth(&spi, PB_12, PC_6); //spi, cs, reset +//MQTTEthernet ipstack(&spi, PB_12, PC_6); //spi, cs, reset //MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack); //init sd card @@ -126,20 +127,37 @@ Matrix matrix; Coordinate ScreenSample[3]; - matrix.An = 580; - matrix.Bn = 75980; - matrix.Cn = -3410580; - matrix.Dn = 57855; - matrix.En = -2465; - matrix.Fn = -3483515; - matrix.Divider = 209144; + //lcd type 1 + //matrix.An = 580; + //matrix.Bn = 75980; + //matrix.Cn = -3410580; + //matrix.Dn = 57855; + //matrix.En = -2465; + //matrix.Fn = -3483515; + //matrix.Divider = 209144; + + //ScreenSample[0].x = 230; + //ScreenSample[0].y = 167; + //ScreenSample[1].x = 754; + //ScreenSample[1].y = 163; + //ScreenSample[2].x = 771; + //ScreenSample[2].y = 562; - ScreenSample[0].x = 230; - ScreenSample[0].y = 167; - ScreenSample[1].x = 754; - ScreenSample[1].y = 163; - ScreenSample[2].x = 771; - ScreenSample[2].y = 562; + //lcd type 2 + matrix.An = 1305; + matrix.Bn = -77430; + matrix.Cn = 75296670; + matrix.Dn = -57275; + matrix.En = -1160; + matrix.Fn = 55285220; + matrix.Divider = 211002; + + ScreenSample[0].x = 782; + ScreenSample[0].y = 863; + ScreenSample[1].x = 248; + ScreenSample[1].y = 854; + ScreenSample[2].x = 256; + ScreenSample[2].y = 459; TP.SetCalibration(&matrix, &ScreenSample[0]); @@ -193,12 +211,12 @@ menu[MODE_FIRMWARE_DOWNLOAD].name = "fw dwld"; //reserved mode - menu[5].xTL = 215; - menu[5].yTL = 100; - menu[5].xBR = 300; - menu[5].yBR = 165; - menu[5].text = "6.reserved "; - menu[5].name = "reserved"; + menu[MODE_RESERVED].xTL = 215; + menu[MODE_RESERVED].yTL = 100; + menu[MODE_RESERVED].xBR = 300; + menu[MODE_RESERVED].yBR = 165; + menu[MODE_RESERVED].text = "6.reserved "; + menu[MODE_RESERVED].name = "reserved"; //draw main menu for(int i=0; i<6; i++) { @@ -452,7 +470,8 @@ serverIsListened = true; } - DBG.printf("please connect to %s\r\n",ipstack.getEth().getIPAddress()); + //DBG.printf("please connect to %s\r\n",ipstack.getEth().getIPAddress()); + DBG.printf("please connect to %s\r\n",eth.getIPAddress()); if(svr.listen(1) < 0) { DBG.printf("tcp server listen failed\r\n"); @@ -1001,7 +1020,8 @@ char p[64]; char q[32]; char r[32]; - char s[4096]; + //char s[4096]; + char s[512]; int connBodyLen; int connPort; int loop=0; @@ -1029,46 +1049,37 @@ TFT.printf(" emmaModeOperation"); TFT.locate(0,20); + TFT.printf(" Interface:"); + + TFT.locate(75,20); if(ethConnected) { - TFT.printf("ETH:Avail"); + TFT.printf("ETH"); + } else if(wifiConnected) { + TFT.printf("WiFi"); + } else if(gprsConnected) { + TFT.printf("GPRS"); } else { - TFT.printf("ETH:N/A"); + TFT.printf("N/A"); } - TFT.locate(80,20); - if(wifiConnected) { - TFT.printf("WiFi:Avail"); - } else { - TFT.printf("WiFi:N/A"); - } - - TFT.locate(160,20); - if(gprsConnected) { - TFT.printf("GPRS:Avail"); - } else { - TFT.printf("GPRS:N/A"); - } + //set ade7758 parameter + ADE.begin(); + ADE.writeRMSOffset(AIRMSOFFSET, BIRMSOFFSET, CIRMSOFFSET, AVRMSOFFSET, BVRMSOFFSET, CVRMSOFFSET); + ADE.write16bits(AWG, 0); + ADE.write16bits(BWG, 0); + ADE.write16bits(CWG, 0); + ADE.write16bits(AVAG, 0); + ADE.write16bits(BVAG, 0); + ADE.write16bits(CVAG, 0); if(ethConnected) { DBG.printf("emmaModeOperation - eth\r\n"); - /* - //start new log indicator + + //new log indicator seconds = time(NULL); strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds)); DBG.printf("newLog:%d\r\n",writeLog(q,"++++++++++Ethernet++++++++++")); - //set ade7758 parameter - ADE.begin(); - - ADE.writeRMSOffset(AIRMSOFFSET, BIRMSOFFSET, CIRMSOFFSET, AVRMSOFFSET, BVRMSOFFSET, CVRMSOFFSET); - - ADE.write16bits(AWG, 0); - ADE.write16bits(BWG, 0); - ADE.write16bits(CWG, 0); - ADE.write16bits(AVAG, 0); - ADE.write16bits(BVAG, 0); - ADE.write16bits(CVAG, 0); - //check firmware update //execute last state of switches on board @@ -1078,10 +1089,10 @@ //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()); 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); + sscanf(restPORT.c_str(),"%d",&connPort); str.clear(); - sscanf(restPORT.c_str(),"%d",&connPort); str = ethREST(restSERVER,connPort,s); - DBG.printf("str:%s\r\n",str.c_str()); + //DBG.printf("str:%s\r\n",str.c_str()); if(str.rfind("[{\"type\"") != std::string::npos) { DBG.printf("get nodes from server\r\n"); str.erase(str.begin(),str.begin()+str.rfind("[{\"type\"")); @@ -1110,13 +1121,13 @@ if(validNodes) { for(int i=0; i<jsonValue.size(); i++) { - string typeValue = jsonValue[i][parameter[0]].get<std::string>(); + int typeValue = jsonValue[i][parameter[0]].get<int>(); string macValue = jsonValue[i][parameter[1]].get<std::string>(); string ipValue = jsonValue[i][parameter[2]].get<std::string>(); nodes[i].type = typeValue; nodes[i].macAddr = macValue; nodes[i].ipAddr = ipValue; - DBG.printf("nodes[%d]type:%s\r\n",i,nodes[i].type.c_str()); + DBG.printf("nodes[%d]type:%d\r\n",i,nodes[i].type); DBG.printf("nodes[%d]mac:%s\r\n",i,nodes[i].macAddr.c_str()); DBG.printf("nodes[%d]ip:%s\r\n",i,nodes[i].ipAddr.c_str()); } @@ -1139,6 +1150,7 @@ //checkVoltagePower(); //need revision to support ethernet //panelEnergy, panelVoltage, and panelPower + /* if(tPanelEnergy.read() > 30.0f) { DBG.printf("[%d]WattHR for each phase: %.2f, %.2f, %.2f\r\n", loop, AWattHr, BWattHr, CWattHr); TFT.locate(0,60); @@ -1181,8 +1193,8 @@ strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds)); //calculate hmacTime - for(int j=0; j<sizeof(p); j++) { - p[j]=0; } + //for(int j=0; j<sizeof(p); j++) { + // p[j]=0; } sprintf(p,"emma-%s-%s",emmaUID.c_str(),q); hmacTime = calculateMD5(p); @@ -1195,6 +1207,7 @@ str.clear(); sscanf(restPORT.c_str(),"%d",&connPort); str = ethREST(restSERVER,connPort,r); + DBG.printf("str:%s",str.c_str()); if(str.find("\"status\":\"success\"") != std::string::npos) { //logging purpose seconds = time(NULL); @@ -1210,7 +1223,7 @@ wait(1); TFT.locate(0,120); TFT.printf(" "); - TFT.foreground(White); + TFT.foreground(White); } else { //logging purpose seconds = time(NULL); @@ -1237,17 +1250,23 @@ tPanelEnergy.reset(); loop++; } + */ //panel environment + //command + connBodyLen = sprintf(connBody,"{\"uid\":\"005e00553533510334313732\",\"hmac\":\"9424c60e708d8e3d3dff6d23fb104339\"}"); + sprintf(s,"POST /emma/api/controller/command HTTP/1.0\nHost: 36.80.35.8\nContent-Length:%d\n\n%s\r\n\r\n",connBodyLen,connBody); + str.clear(); + str = ethREST("36.80.35.8",8080,s); + DBG.printf("str:%s\r\n",str.c_str()); + osDelay(5000); } - */ - } else if(wifiConnected) { DBG.printf("emmaModeOperation - wifi\r\n"); - //start new log and dbg indicator + //new log and dbg indicator seconds = time(NULL); strftime(q, 32, "%Y-%m-%d %H:%M:%S",localtime(&seconds)); DBG.printf("newLog:%d\r\n",writeLog(q,"++++++++++WiFi++++++++++")); @@ -1281,6 +1300,8 @@ //t.reset(); //set ade7758 parameter + //start set beforehand + /* ADE.begin(); ADE.writeRMSOffset(AIRMSOFFSET, BIRMSOFFSET, CIRMSOFFSET, AVRMSOFFSET, BVRMSOFFSET, CVRMSOFFSET); @@ -1291,6 +1312,8 @@ ADE.write16bits(AVAG, 0); ADE.write16bits(BVAG, 0); ADE.write16bits(CVAG, 0); + */ + //end start beforehand //init rest to server sscanf(restPORT.c_str(),"%d",&connPort); @@ -1732,7 +1755,7 @@ //command sprintf(r,"/%s/api/controller/command",appNAME.c_str()); sprintf(s,"{\"uid\":\"%s\",\"hmac\":\"%s\"}", - emmaUID.c_str(),hmacTime.c_str()); + emmaUID.c_str(),hmacTime.c_str()); //INI HARUSNYA HMAC BUKAN? //rest.get("/emma/api/controller/command"); rest.post(r,s); @@ -2314,6 +2337,73 @@ } DBG.printf("download finished\r\n"); } + +void emmaModeReserved(void) { + char connBody[128]; + char s[256]; + char buf[1024]; + int connBodyLen; + int i=0; + int ret=99; + string str; + Timer t; + TCPSocketConnection sock; + + /* + eth.init(); + while(1) { + //command + connBodyLen = sprintf(connBody,"{\"uid\":\"005e00553533510334313732\",\"hmac\":\"9424c60e708d8e3d3dff6d23fb104339\"}"); + sprintf(s,"POST /emma/api/controller/command HTTP/1.0\nHost: 36.80.35.8\nContent-Length:%d\n\n%s\r\n\r\n",connBodyLen,connBody); + str.clear(); + str = ethREST("36.80.35.8",8080,s); + DBG.printf("[%d]str:%s\r\n",i,str.c_str()); + i++; + wait(5); + } + */ + + //start working as expected + eth.init(); + eth.connect(); + connBodyLen = sprintf(connBody,"{\"uid\":\"005e00553533510334313732\",\"hmac\":\"9424c60e708d8e3d3dff6d23fb104339\"}"); + sprintf(s,"POST /emma/api/controller/command HTTP/1.0\nHost: 36.80.35.8\nContent-Length:%d\n\n%s\r\n\r\n",connBodyLen,connBody); + + while(1) { + //eth.connect(); + t.start(); + while(eth.linkstatus() && t.read() < 5 && ret !=0) { + ret = sock.connect("36.80.35.8",8080); + } + t.stop(); + t.reset(); + + memset(buf,0,sizeof(buf)); + if(sock.is_connected()) { + DBG.printf("connect\r\n"); + sock.send_all(s,sizeof(s)-1); + wait(2); + //receive return + t.start(); + while(1) { + ret = sock.receive(buf, sizeof(buf)); + if(ret<=0 || t.read() > 5) { + t.stop(); + t.reset(); + break; + } + } + sock.close(); + } else { + DBG.printf("not connected\r\n"); + } + //eth.disconnect(); + DBG.printf("[%d]BUF:%s\r\n\r\n",i,buf); + i++; + wait(5); + } + //end working as expected +} /*end emma mode*/ /*start energy related*/ @@ -2546,207 +2636,6 @@ } /*end wifi rest*/ -int publish(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack) -{ - MQTT::Message message; - char* topic = new char[strlen(mqttDOMAIN.c_str())+strlen(emmaUID.c_str())+9]; - *topic = '\0'; - strcat(topic, mqttDOMAIN.c_str()); - strcat(topic, "/"); - strcat(topic, emmaUID.c_str()); - strcat(topic, "/dummy"); - - const char buf[25] = "{\"d\":{\"myName\":\"EMMA\"}}"; - - message.qos = MQTT::QOS2; - message.retained = false; - message.dup = false; - message.payload = (void*)buf; - message.payloadlen = strlen(buf); - - DBG.printf("Publishing %s\r\n", buf); - return client->publish(topic, &message); -} - -/*start eth mqtt*/ -void ethMQTTMessageArrived(MQTT::MessageData& md) { - MQTT::Message &message = md.message; - char topic[md.topicName.lenstring.len + 1]; - string str; - sprintf(topic, "%.*s", md.topicName.lenstring.len, md.topicName.lenstring.data); - - DBG.printf("Message arrived on topic %s: %.*s\r\n", topic, message.payloadlen, message.payload); - char *s = (char*)message.payload; - string sp(s); - if(sp.find("[") != std::string::npos && sp.find("]") != std::string::npos) { - sp.erase(sp.begin(),sp.begin()+sp.find("[")+1); - sp.erase(sp.begin()+sp.find("]"),sp.end()); - } - else { - DBG.printf("Invalid MQTT command"); - return; - } - - MbedJSONValue jsonValue; - parse(jsonValue, sp.c_str()); - const char *parameter[5] = {"name","nType","nAddr","dType","cmd"}; - - //check if command is valid - bool validCommand = true; - for(int i=0; i<5; i++) { - validCommand = validCommand && jsonValue.hasMember(parameter[i]); - } - DBG.printf("command validity:%d\r\n",validCommand); - - //check for new command - if(validCommand) { - string commandId = jsonValue[parameter[0]].get<std::string>(); - string commandNType = jsonValue[parameter[1]].get<std::string>(); - string commandNAddr = jsonValue[parameter[2]].get<std::string>(); - string commandDType = jsonValue[parameter[3]].get<std::string>(); - string commandCmd = jsonValue[parameter[4]].get<std::string>(); - - if(commandNType == "0") { //switch on panel controller - DBG.printf("command for switch\r\n"); - } - else if(commandNType == "1") { //node with mac address - DBG.printf("command for node\r\n"); - //get node ip address based on node mac address - string nodeIP = readNodeIP(commandNAddr); - //DBG.printf("nodeIP: %s\r\n",nodeIP.c_str()); - - //get cmd string based on device type and command number - string nodeCmd = readNodeCmd(commandDType,commandCmd); - //DBG.printf("nodeCmd: %s\r\n",nodeCmd.c_str()); - //execute command - int trial=0; - trial = 0; - bool execStatus=false; - - while( !execStatus ) { - sprintf(s,"<?xml version=\"1.0\" encoding=\"utf-8\"?><app_cmd cmd=\"5\" /><app_data code=\"%s\"/>\r\n",nodeCmd.c_str()); - str.assign(s); - DBG.printf("str value:%s\r\n",str.c_str()); - string rcv = ethREST(nodeIP,REMOTE_TCP_PORT,str); // cause mqtt to stop - DBG.printf("response:%s\r\n",rcv.c_str()); - str = rcv; - if(str.find("OK") != std::string::npos) { - DBG.printf("CMD executed successfully\r\n"); - execStatus = true; - break; - } - if(trial>5) { //two times trial - DBG.printf("cmd is not executed\r\n"); - execStatus = false; - } - DBG.printf("Trial++\r\n"); - trial++; - wait(3); - } - DBG.printf("Send execution status\r\n"); - //send execution status - } - } - DBG.printf("Finish processing new command\r\n"); - - /* - MQTT::Message &message = md.message; - DBG.printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", - message.qos, message.retained, message.dup, message.id); - DBG.printf("Payload: %.*s\r\n", message.payloadlen, (char*)message.payload); - //DBG.printf("Payload %s\r\n",message.payload); - - - //check whether cmd is json - //char r[255]; - char *s = (char*)message.payload; - string sp(s); - //sprintf(s,"%.*s",message.payloadlen, (char*)message.payload); - //sprintf(globCmd,"%s",s); - //DBG.printf("Payload: %s\r\n", r); - //string cmd = r; - //globalCommand = cmd; - - //globalCommand = sp; - - //globCmd = (char*)message.payload; - //string globCmd((char*)message.payload); - //std::string *sp = static_cast<std::char*>(message.payload); - //string sp((char*)message.payload); - - //DBG.printf("String: %s\r\n",sp.c_str()); - - //globCmd = sp; - - //newCommand = true; - if(sp.find("[") != std::string::npos && sp.find("]") != std::string::npos) { - sp.erase(sp.begin(),sp.begin()+sp.find("[")+1); - sp.erase(sp.begin()+sp.find("]"),sp.end()); - globalCommand = sp; - newCommand = true; - } - sp.clear(); - */ -} - -int ethMQTTConnect(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack) { - char *pMqttServer = &mqttSERVER[0u]; - int connPort; - sscanf(mqttPORT.c_str(),"%d",&connPort); - int rc = ipstack->connect(pMqttServer, connPort); - - if(rc!=0) - return rc; - - //MQTT Connect - char clientId [64]; - sprintf(clientId,"emma/%s",emmaUID.c_str()); - //DBG.printf("clientId:%s\r\n",clientId); - - MQTTPacket_connectData data = MQTTPacket_connectData_initializer; - data.MQTTVersion = 3; - data.clientID.cstring = clientId; - data.username.cstring = "761b233e-a49a-4830-a8ae-87cec3dc1086"; - data.password.cstring = "ef25cf4567fbc07113252f8d72b7faf2"; - - if((rc = client->connect(&data)) == 0) { - DBG.printf("ethMQTT connected\r\n"); - } - - //MQTT Subscribe - //char s[64]; - //sprintf(s,"%s/%s/command",mqttDOMAIN.c_str(),emmaUID.c_str()); - //string topic = s; - char* topic = new char[strlen(mqttDOMAIN.c_str())+strlen(emmaUID.c_str())+9]; - *topic = '\0'; - strcat(topic, mqttDOMAIN.c_str()); - strcat(topic, "/"); - strcat(topic, emmaUID.c_str()); - strcat(topic, "/command"); - DBG.printf("topic:%s\r\n",topic); - - if((rc=client->subscribe(topic,MQTT::QOS0,ethMQTTMessageArrived)) == 0) { - DBG.printf("subscribe success!\r\n"); - } - return rc; -} -void ethMQTTAttemptConnect(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack) { - int retryAttempt = 0; - - while(!ipstack->getEth().linkstatus()) { - DBG.printf("Ethernet link not present. Check cable connection\r\n"); - wait(1); - } - - while(ethMQTTConnect(client,ipstack) != 0) { - int timeout = 3; - DBG.printf("Retry attempt number %d waiting %d\r\n", retryAttempt, timeout); - wait(timeout); - retryAttempt++; - } -} -/*end eth mqtt*/ - /*start emma settings*/ string getUID(void) { char s[32]; @@ -2927,6 +2816,10 @@ char buf[1024]; char s[256]; int ret; + + //eth.init(); //use DHCP + eth.connect(); + TCPSocketConnection sock; Timer t; @@ -2945,17 +2838,20 @@ } } sock.close(); + eth.disconnect(); return buf; } /*end emma connection function*/ /*start emma private function*/ void isEthAvailable(void) { - if(ipstack.getEth().linkstatus()) { + //if(ipstack.getEth().linkstatus()) { + if(eth.linkstatus()) { ethAvailable = true; } else { ethAvailable = false; } + eth.init(); //init ethernet } void isEthConnected(void) { @@ -2969,22 +2865,21 @@ if(useProxy) { connHost = proxySERVER; sscanf(proxyPORT.c_str(),"%d",&connPort); - for(int i=0; i<sizeof(s); i++) { - s[i]=0; } + //for(int i=0; i<sizeof(s); i++) { + // s[i]=0; } 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()); } else { connHost = restSERVER; - //connPort = restPORT; sscanf(restPORT.c_str(),"%d",&connPort); - for(int i=0; i<sizeof(s); i++) { - s[i]=0; } + //for(int i=0; i<sizeof(s); i++) { + // s[i]=0; } sprintf(s,"GET /%s/api/controller/test HTTP/1.0\nHost: %s\r\n\r\n",appNAME.c_str(),restSERVER.c_str()); } t.start(); while(1) { str = ethREST(connHost,connPort,s); - if(str.find("OK") != std::string::npos) { + if(str.find("\"status\":\"OK\"") != std::string::npos) { t.stop(); ethConnected = true; break; @@ -3046,15 +2941,14 @@ if(useProxy) { connHost = proxySERVER; sscanf(proxyPORT.c_str(),"%d",&connPort); - for(int i=0; i<sizeof(s); i++) { - s[i]=0; } + //for(int i=0; i<sizeof(s); i++) { + // s[i]=0; } 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()); } else { connHost = restSERVER; - //connPort = restPORT; sscanf(restPORT.c_str(),"%d",&connPort); - for(int i=0; i<sizeof(s); i++) { - s[i]=0; } + //for(int i=0; i<sizeof(s); i++) { + // s[i]=0; } sprintf(s,"/%s/api/controller/test",appNAME.c_str()); } wait(2); @@ -3063,15 +2957,15 @@ t.stop(); t.reset(); if(rest.begin(connHost.c_str(),connPort,false)) { - DBG.printf("rest begin\r\n"); + //DBG.printf("rest begin\r\n"); esp.process(); rest.get(s); - for(int i=0; i<sizeof(s); i++) { - s[i]=0; } + //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) { + if(str.find("\"status\":\"OK\"") != std::string::npos) { wifiConnected = true; } } else {