Dependencies: BufferedSerial analogAverager voltageRegulator netStatReg analogMinMax CounterMinMax
Diff: main.cpp
- Revision:
- 12:4bb088c27838
- Parent:
- 11:d40adc7de05f
- Child:
- 13:4d533751f951
--- a/main.cpp Wed Oct 02 19:16:25 2019 +0000 +++ b/main.cpp Mon Oct 07 12:44:38 2019 +0000 @@ -2,7 +2,7 @@ #error [NOT_SUPPORTED] LWIP not supported for this target #endif -//#define netmsgdebug +#define netmsgdebug #include "mbed.h" #include "EthernetInterface.h" @@ -19,24 +19,26 @@ #include "analogAverager.h" #include "analogMinMax.h" #include "counterMinMax.h" +#include "netStatusReg.h" Ticker nettimer; +Timer netDevTimers[6]; struct netsys net1; struct vRegData vReg1; -analogAverager voltageAvg(120,true,0.9,true,1.1); -analogMinMax voltageMinMax(120,true,0.9,true,1.1); +analogAverager voltageAvg(120,true,true,0.9,true,true,1.1); +analogMinMax voltageMinMax(120,true,true,0.9,true,true,1.1); counterMinMax tapMinMax(0,true,-16,true,16); bool polltick; +bool sendtick; BufferedSerial sport0(sport0tx, sport0rx, sport0buff, sport0mult); // UART2 -CircularBuffer<char, 1024> receiveBuffer; +CircularBuffer<char, 256> receiveBuffer; CircularBuffer<char, 64> sendLength; -CircularBuffer<char, 1024> sendBuffer; -CircularBuffer<char, 16> serrxbuffer; +CircularBuffer<char, 256> sendBuffer; Thread conchkthread[2]; Thread rxtxdatathread[5]; @@ -48,40 +50,129 @@ //Provides the deivce poll timing void heartbeat() { - setTick(true); + setPollTick(true); + + //Provide Sender Task Tick + if (netDevTimers[0].read_ms()>=100) + { + netDevTimers[0].reset(); + setSendTick(true); + } + //Server Unsolicited Message Timeout + //if (bit_isset(net1.statusReg,srvIsActive)) + if (bit_isset(srvIsActive)) + { + if (netDevTimers[1].read_ms()>=setservertimeout) + { + netDevTimers[1].reset(); + netDevTimers[1].stop(); + //bit_toset(net1.statusReg,srvCloseConnection); + bit_toset(srvCloseConnection); + } + } + //if (bit_isset(net1.statusReg,devOnline)) + if (bit_isset(devOnline)) + { + //Fast Demand Poll Tick + //if (bit_isset(net1.statusReg,fmdEnabled)) + if (bit_isset(fmdEnabled)) + { + if (netDevTimers[2].read_ms()>=setfmdemandpollinterval) + { + netDevTimers[2].reset(); + //bit_toset(net1.statusReg,fmdPollReq); + bit_toset(fmdPollReq); + voltageAvg.resetNum(); + voltageMinMax.resetNum(); + tapMinMax.resetNum(); + } + } + else + { + if (netDevTimers[2].read_ms()>=8000) + { + netDevTimers[2].reset(); + //bit_toset(net1.statusReg,fmdPollReq); + bit_toset(fmdPollReq); + } + } + //Fast Meter Poll Tick + //if (bit_isset(net1.statusReg,fmEnabled)) + if (bit_isset(fmEnabled)) + { + if (netDevTimers[3].read_ms()>=setfmpollinterval) + { + netDevTimers[3].reset(); + //bit_toset(net1.statusReg,fmPollReq); + bit_toset(fmPollReq); + } + } + else + { + if (netDevTimers[3].read_ms()>=8000) + { + netDevTimers[3].reset(); + //bit_toset(net1.statusReg,fmPollReq); + bit_toset(fmPollReq); + } + } + } + else + { + if (netDevTimers[3].read_ms()>=8000) + { + netDevTimers[3].reset(); + //bit_toset(net1.statusReg,fmCfgReq); + bit_toset(fmCfgReq); + } + } + //Fast Message Timeout + //if ((bit_isset(net1.statusReg,fmPollInProg)) || (bit_isset(net1.statusReg,fmdPollInProg))) + if ((bit_isset(fmPollInProg)) || (bit_isset(fmdPollInProg))) + { + if (netDevTimers[4].read_ms()>=2000) + { + netDevTimers[4].reset(); + netDevTimers[4].stop(); + //bit_toset(net1.statusReg,fmCloseConnection); + //bit_toset(net1.statusReg,fmTimeout); + bit_toset(fmCloseConnection); + bit_toset(fmTimeout); + } + } + //Serial Message Timeout + //if (bit_isset(net1.statusReg,serPollInProg)) + if (bit_isset(serPollInProg)) + { + if (netDevTimers[5].read_ms()>=net1.serMsgTimeout) + { + netDevTimers[5].reset(); + netDevTimers[5].stop(); + //bit_toset(net1.statusReg,serCloseConnection); + //bit_toset(net1.statusReg,serTimeout); + bit_toset(serCloseConnection); + bit_toset(serTimeout); + } + } } void confignetdevices(EthernetInterface *eth) { + //net1.statusReg=0; net1.cltPort=setclientport; net1.srv_addr=setclientaddress; - net1.cltIsActive=false; - net1.serIsActive=false; - net1.cltCloseConnection=false; - net1.pollTime=0; - net1.pollTimeout=0; - net1.pollRequestSent=false; - net1.pollResponseReceived=false; net1.srv_sock.set_blocking(true); net1.srv_sock.set_timeout(100); - net1.aliveTimeout=setservertimeout; net1.srv.set_blocking(true); net1.srv.set_timeout(100); - net1.pollEnabled=setpollenabled; - net1.pollTimeoutCount=0; - net1.configState=0; - net1.pollTimeoutCount=0; net1.sendRetryCount=0; net1.messageFailCount=0; net1.txMessageCount=0; net1.rxMessageCount=0; - net1.fmEnabled=false; - net1.fmdEnabled=false; + net1.serMsgTimeout=150; /* Open the server on ethernet stack */ net1.srv.open(eth); - net1.srvIsActive=false; - net1.srvCloseConnection=false; /* Bind port 23 to the server */ net1.srvPort=setserverport; @@ -112,15 +203,16 @@ clen++; } //If a Poll Request has been made and data has been received set flag - if (net2->pollRequestSent) - { - if (clen>0) - { - net2->pollResponseReceived=true; - } - } + //bit_sis(bit_isset(net2->statusReg,serPollInProg),net2->statusReg,serRespRx); + //bit_sis(bit_isset(net2->statusReg,fmPollInProg),net2->statusReg,fmRespRx); + //bit_sis(bit_isset(net2->statusReg,fmdPollInProg),net2->statusReg,fmdRespRx); + bit_sis(serPollInProg,serRespRx); + bit_sis(fmPollInProg,fmRespRx); + bit_sis(fmdPollInProg,fmdRespRx); + //Check to see if bulk data and reports being sent from device due to serial command - if (net2->devMsgOpenRx) + //if (bit_isset(net2->statusReg,serMsgRx)) + if (bit_isset(serMsgRx)) { sport0.write(cbuf,clen); clen=0; @@ -131,14 +223,27 @@ //Cycle through received data to search for a command for (cbc=0;cbc<clen-3;cbc++) { + //Check fast message configuration + if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xC0)) + { + sport0.write(cbuf,clen); + //bit_toclear(net1.statusReg,fmCfgInProg); + //bit_toset(net1.statusReg,devOnline); + bit_toclear(fmCfgInProg); + bit_toset(devOnline); + clen=0; + break; + } //Check to see if serial commands are currently being received - if (net2->serIsActive==true) + //if (bit_isset(net2->statusReg,serPollInProg)) + if (bit_isset(serPollInProg)) { //If relay acknowledges max metering command set bulk receive flag if ((cbuf[cbc]==0x4d) && (cbuf[cbc+1]==0x45) && (cbuf[cbc+2]==0x54)) { sport0.write(cbuf,clen); - net2->devMsgOpenRx=true; + //bit_toset(net2->statusReg,serMsgRx); + bit_toset(serMsgRx); net2->devMsgReq=0; clen=0; break; @@ -147,7 +252,8 @@ if ((cbuf[cbc]==0x54) && (cbuf[cbc+1]==0x41) && (cbuf[cbc+2]==0x50)) { sport0.write(cbuf,clen); - net2->devMsgOpenRx=true; + //bit_toset(net2->statusReg,serMsgRx); + bit_toset(serMsgRx); net2->devMsgReq=0; clen=0; break; @@ -185,163 +291,163 @@ break; } } - //Check fast message conficuration - if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xC0)) - { - sport0.write(cbuf,clen); - net2->configState=1; - clen=0; - break; - } - //Check fast meter configuration - if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xC1)) + //if (bit_isset(net2->statusReg,fmPollInProg)) + if (bit_isset(fmPollInProg)) { - sport0.write(cbuf,clen); - //Ensure Analog channl count is correct - if (vReg1.numAnalog!=cbuf[6]) + //Check fast meter configuration + if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xC1)) { - #ifdef netmsgdebug - printf("\r\nFast Meter Analog Channel Count Off\r\n"); - #endif - clen=0; - break; - } - //Ensure Digital register count is correct - if (vReg1.numDigital!=cbuf[8]) - { - #ifdef netmsgdebug - printf("\r\nFast Meter Digital Channel Count Off\r\n"); - #endif + sport0.write(cbuf,clen); + //Ensure Analog channl count is correct + if (vReg1.numAnalog!=cbuf[6]) + { + #ifdef netmsgdebug + printf("\r\nFast Meter Analog Channel Count Off\r\n"); + #endif + clen=0; + break; + } + //Ensure Digital register count is correct + if (vReg1.numDigital!=cbuf[8]) + { + #ifdef netmsgdebug + printf("\r\nFast Meter Digital Channel Count Off\r\n"); + #endif + clen=0; + break; + } + char anum=16; + char nxc; + //Verify Analog names are correct + for (txc=0;txc<vReg1.numAnalog;txc++) + { + for (nxc=0;nxc<6;nxc++) + { + if(vReg1.analogs[txc].analogName[nxc]!=cbuf[anum+nxc]) + { + #ifdef netmsgdebug + printf("\r\nPoint %d Failed\r\n",txc); + #endif + break; + } + } + anum = anum + 11; + } + //bit_toset(net2->statusReg,fmEnabled); + bit_toset(fmEnabled); clen=0; break; } - char anum=16; - char nxc; - //Verify Analog names are correct - for (txc=0;txc<vReg1.numAnalog;txc++) - { - for (nxc=0;nxc<6;nxc++) - { - if(vReg1.analogs[txc].analogName[nxc]!=cbuf[anum+nxc]) - { - #ifdef netmsgdebug - printf("\r\nPoint %d Failed\r\n",txc); - #endif - break; - } - } - anum = anum + 11; - } - net2->configState=3; - net2->fmEnabled=true; - clen=0; - break; - } - //Receive data - if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xD1)) - { - char anum=cbc+4; - for (txc=0;txc<vReg1.numAnalog;txc++) + //Receive data + if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xD1)) { - valpack.bytes[3]=cbuf[anum]; - valpack.bytes[2]=cbuf[anum+1]; - valpack.bytes[1]=cbuf[anum+2]; - valpack.bytes[0]=cbuf[anum+3]; - vReg1.analogs[txc].analog1Value = valpack.cmdflt; - anum = anum + 4; - printf("%.2f\r\n",vReg1.analogs[txc].analog1Value); + char anum=cbc+4; + for (txc=0;txc<vReg1.numAnalog;txc++) + { + valpack.bytes[3]=cbuf[anum]; + valpack.bytes[2]=cbuf[anum+1]; + valpack.bytes[1]=cbuf[anum+2]; + valpack.bytes[0]=cbuf[anum+3]; + vReg1.analogs[txc].analog1Value = valpack.cmdflt; + anum = anum + 4; + printf("%.2f\r\n",vReg1.analogs[txc].analog1Value); + } + vReg1.timeStamp.month=cbuf[anum]; + vReg1.timeStamp.day=cbuf[anum+1]; + vReg1.timeStamp.year=cbuf[anum+2]; + vReg1.timeStamp.hour=cbuf[anum+3]; + vReg1.timeStamp.min=cbuf[anum+4]; + vReg1.timeStamp.sec=cbuf[anum+5]; + timepack.bytes[1]=cbuf[anum+6]; + timepack.bytes[0]=cbuf[anum+7]; + vReg1.timeStamp.msec=timepack.cmdshort; + printf("%d/%d/%d %d:%d:%d.%d\r\n",vReg1.timeStamp.month,vReg1.timeStamp.day,vReg1.timeStamp.year,vReg1.timeStamp.hour,vReg1.timeStamp.min,vReg1.timeStamp.sec,vReg1.timeStamp.msec); + anum=anum+8; + for (txc=0;txc<vReg1.numDigital;txc++) + { + vReg1.digitalTargets[txc]=cbuf[anum+txc]; + } + clen=0; + tapMinMax.putVal(vReg1.analogs[7].analog1Value); + voltageMinMax.putVal(vReg1.analogs[9].analog1Value); + voltageAvg.putVal(vReg1.analogs[9].analog1Value); + break; } - vReg1.timeStamp.month=cbuf[anum]; - vReg1.timeStamp.day=cbuf[anum+1]; - vReg1.timeStamp.year=cbuf[anum+2]; - vReg1.timeStamp.hour=cbuf[anum+3]; - vReg1.timeStamp.min=cbuf[anum+4]; - vReg1.timeStamp.sec=cbuf[anum+5]; - timepack.bytes[1]=cbuf[anum+6]; - timepack.bytes[0]=cbuf[anum+7]; - vReg1.timeStamp.msec=timepack.cmdshort; - printf("%d/%d/%d %d:%d:%d.%d\r\n",vReg1.timeStamp.month,vReg1.timeStamp.day,vReg1.timeStamp.year,vReg1.timeStamp.hour,vReg1.timeStamp.min,vReg1.timeStamp.sec,vReg1.timeStamp.msec); - anum=anum+8; - for (txc=0;txc<vReg1.numDigital;txc++) + } + //if (bit_isset(net2->statusReg,fmdPollInProg)) + if (bit_isset(fmdPollInProg)) + { + //Check fast demand meter configuration + if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xC2)) { - vReg1.digitalTargets[txc]=cbuf[anum+txc]; - } - clen=0; - tapMinMax.putVal(vReg1.analogs[7].analog1Value); - voltageMinMax.putVal(vReg1.analogs[9].analog1Value); - voltageAvg.putVal(vReg1.analogs[9].analog1Value); - break; - } - //Check fast demand meter configuration - if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xC2)) - { - sport0.write(cbuf,clen); - //Ensure Analog channl count is correct - if (vReg1.numDemAnalog!=cbuf[6]) - { - #ifdef netmsgdebug - printf("\r\nDemand Analog Channel Count Off\r\n"); - #endif + sport0.write(cbuf,clen); + //Ensure Analog channl count is correct + if (vReg1.numDemAnalog!=cbuf[6]) + { + #ifdef netmsgdebug + printf("\r\nDemand Analog Channel Count Off\r\n"); + #endif + clen=0; + break; + } + char anum=18; + char nxc; + //Verify Analog names are correct + for (txc=0;txc<vReg1.numDemAnalog;txc++) + { + for (nxc=0;nxc<6;nxc++) + { + if(vReg1.analogs[txc+vReg1.numAnalog].analogName[nxc]!=cbuf[anum+nxc]) + { + #ifdef netmsgdebug + printf("\r\nPoint %d Failed\r\n",txc); + #endif + break; + } + } + anum = anum + 11; + } + //bit_toset(net2->statusReg,fmdEnabled); + bit_toset(fmdEnabled); clen=0; break; } - char anum=18; - char nxc; - //Verify Analog names are correct - for (txc=0;txc<vReg1.numDemAnalog;txc++) - { - for (nxc=0;nxc<6;nxc++) - { - if(vReg1.analogs[txc+vReg1.numAnalog].analogName[nxc]!=cbuf[anum+nxc]) - { - #ifdef netmsgdebug - printf("\r\nPoint %d Failed\r\n",txc); - #endif - break; - } - } - anum = anum + 11; - } - net2->configState=9; - net2->fmdEnabled=true; - clen=0; - break; - } - //Receive demand data - if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xD2)) - { - char anum=cbc+4; - for (txc=0;txc<vReg1.numDemAnalog;txc++) + //Receive demand data + if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xD2)) { - valpack.bytes[3]=cbuf[anum]; - valpack.bytes[2]=cbuf[anum+1]; - valpack.bytes[1]=cbuf[anum+2]; - valpack.bytes[0]=cbuf[anum+3]; - vReg1.analogs[txc].analog1Value = valpack.cmdflt; - anum = anum + 4; - //printf("%.2f\r\n",vReg1.analogs[txc].analog1Value); + char anum=cbc+4; + for (txc=0;txc<vReg1.numDemAnalog;txc++) + { + valpack.bytes[3]=cbuf[anum]; + valpack.bytes[2]=cbuf[anum+1]; + valpack.bytes[1]=cbuf[anum+2]; + valpack.bytes[0]=cbuf[anum+3]; + vReg1.analogs[txc].analog1Value = valpack.cmdflt; + anum = anum + 4; + //printf("%.2f\r\n",vReg1.analogs[txc].analog1Value); + } + vReg1.demTimeStamp.month=cbuf[anum]; + vReg1.demTimeStamp.day=cbuf[anum+1]; + vReg1.demTimeStamp.year=cbuf[anum+2]; + vReg1.demTimeStamp.hour=cbuf[anum+3]; + vReg1.demTimeStamp.min=cbuf[anum+4]; + vReg1.demTimeStamp.sec=cbuf[anum+5]; + timepack.bytes[1]=cbuf[anum+6]; + timepack.bytes[0]=cbuf[anum+7]; + vReg1.demTimeStamp.msec=timepack.cmdshort; + sport0.printf("%d/%d/%d %d:%d:%d.%d\r\n",vReg1.demTimeStamp.month,vReg1.demTimeStamp.day,vReg1.demTimeStamp.year,vReg1.demTimeStamp.hour,vReg1.demTimeStamp.min,vReg1.demTimeStamp.sec,vReg1.demTimeStamp.msec); + vReg1.calculated[0].analog1Value=voltageMinMax.getMin(); + vReg1.calculated[1].analog1Value=voltageAvg.getAvg(); + vReg1.calculated[2].analog1Value=voltageMinMax.getMax(); + vReg1.calculated[3].analog1Value=tapMinMax.getMin(); + vReg1.calculated[4].analog1Value=tapMinMax.getMax(); + sport0.printf("%.2f\r\n",vReg1.calculated[0].analog1Value); + sport0.printf("%.2f\r\n",vReg1.calculated[1].analog1Value); + sport0.printf("%.2f\r\n",vReg1.calculated[2].analog1Value); + sport0.printf("%.2f\r\n",vReg1.calculated[3].analog1Value); + sport0.printf("%.2f\r\n",vReg1.calculated[4].analog1Value); + break; } - vReg1.demTimeStamp.month=cbuf[anum]; - vReg1.demTimeStamp.day=cbuf[anum+1]; - vReg1.demTimeStamp.year=cbuf[anum+2]; - vReg1.demTimeStamp.hour=cbuf[anum+3]; - vReg1.demTimeStamp.min=cbuf[anum+4]; - vReg1.demTimeStamp.sec=cbuf[anum+5]; - timepack.bytes[1]=cbuf[anum+6]; - timepack.bytes[0]=cbuf[anum+7]; - vReg1.demTimeStamp.msec=timepack.cmdshort; - sport0.printf("%d/%d/%d %d:%d:%d.%d\r\n",vReg1.demTimeStamp.month,vReg1.demTimeStamp.day,vReg1.demTimeStamp.year,vReg1.demTimeStamp.hour,vReg1.demTimeStamp.min,vReg1.demTimeStamp.sec,vReg1.demTimeStamp.msec); - vReg1.calculated[0].analog1Value=voltageMinMax.getMin(); - vReg1.calculated[1].analog1Value=voltageAvg.getAvg(); - vReg1.calculated[2].analog1Value=voltageMinMax.getMax(); - vReg1.calculated[3].analog1Value=tapMinMax.getMin(); - vReg1.calculated[4].analog1Value=tapMinMax.getMax(); - sport0.printf("%.2f\r\n",vReg1.calculated[0].analog1Value); - sport0.printf("%.2f\r\n",vReg1.calculated[1].analog1Value); - sport0.printf("%.2f\r\n",vReg1.calculated[2].analog1Value); - sport0.printf("%.2f\r\n",vReg1.calculated[3].analog1Value); - sport0.printf("%.2f\r\n",vReg1.calculated[4].analog1Value); - break; } } if (clen>0) @@ -360,22 +466,25 @@ { while(1) { - if (net2->cltIsActive) + //if (bit_isset(net2->statusReg,cltIsActive)) + if (bit_isset(cltIsActive)) { //Attempt to connect to server while (net2->sendState==3) { //delay connect attempt if previous attempt unsuccessful - if (net2->connectRetry == true) + //if (bit_isset(net2->statusReg,connectRetry)) + if (bit_isset(connectRetry)) { wait_ms(100); } - //Attempt to connectg + //Attempt to connect ret = net2->srv_sock.connect(net2->srv_addr,net2->cltPort); //If connect successful proceed to send data if (ret==0) { - net2->connectRetry = false; + //bit_toclear(net2->statusReg,connectRetry); + bit_toclear(connectRetry); #ifdef netmsgdebug printf("Connected %d\r\n",ret); #endif @@ -387,13 +496,15 @@ #ifdef netmsgdebug printf("May already be connected, attempting send.\r\n"); #endif - net2->connectRetry = false; + //bit_toclear(net2->statusReg,connectRetry); + bit_toclear(connectRetry); net2->sendState=4; } //If connect attempt failed on other error attempt reconnect else { - net2->connectRetry = true; + //bit_toset(net2->statusReg,connectRetry); + bit_toset(connectRetry); net2->sendRetryCount++; #ifdef netmsgdebug printf("Connect Attempt Failed, Code: %d\r\n",ret); @@ -404,12 +515,13 @@ #ifdef netmsgdebug printf("Communication Failed, Closing\r\n"); #endif - net2->connectRetry = false; + //bit_toclear(net2->statusReg,connectRetry); + bit_toclear(connectRetry); net2->sendRetryCount = 0; net2->messageFailCount++; - net2->cltCloseConnection=true; + //bit_toset(net2->statusReg,cltCloseConnection); + bit_toset(cltCloseConnection); net2->sendState=0; - net2->sendTime=0; } } } @@ -417,7 +529,8 @@ while (net2->sendState==4) { //Delay send data attempt if previous attempt failed - if (net2->sendRetry == true) + //if (bit_isset(net2->statusReg,sendRetry)) + if (bit_isset(sendRetry)) { wait_ms(100); } @@ -429,15 +542,16 @@ #ifdef netmsgdebug printf("Send Result %d\r\n",ret); #endif - net2->sendRetry = false; + //bit_toclear(net2->statusReg,sendRetry); + bit_toclear(sendRetry); net2->txMessageCount++; net2->sendState=5; - net2->sendTime=0; } //If send attempt failed attempt to re-send data else { - net2->sendRetry = true; + //bit_toset(net2->statusReg,sendRetry); + bit_toset(sendRetry); net2->sendRetryCount++; #ifdef netmsgdebug printf("Send Attempt Failed, Code: %d\r\n",ret); @@ -448,12 +562,13 @@ #ifdef netmsgdebug printf("Communication Failed, Closing\r\n"); #endif - net2->sendRetry = false; + //bit_toclear(net2->statusReg,sendRetry); + bit_toclear(sendRetry); net2->sendRetryCount = 0; net2->messageFailCount++; - net2->cltCloseConnection=true; + //bit_toset(net2->statusReg,cltCloseConnection); + bit_toset(cltCloseConnection); net2->sendState=0; - net2->sendTime=0; } } } @@ -470,14 +585,14 @@ while (1) { //If the client is active check to see if data has been received - while (net2->cltIsActive) + //while (bit_isset(net2->statusReg,cltIsActive)) + while (bit_isset(cltIsActive)) { //Store the length of the received data rxlen=net2->srv_sock.recv(rxbuf, sizeof(rxbuf)); //if there is data then push data into received buffer if (rxlen>0) { - net2->aliveTime=0; for (rxc = 0;rxc<rxlen;rxc++) { receiveBuffer.push(rxbuf[rxc]); @@ -501,14 +616,14 @@ while (1) { //If the server is active check to see if data has been received - while (net2->srvIsActive) + //while (bit_isset(net2->statusReg,srvIsActive)) + while (bit_isset(srvIsActive)) { //Store the length of the received data rxlen=net2->clt_sock.recv(rxbuf, sizeof(rxbuf)); //if there is data then push data into received buffer if (rxlen>0) { - net2->aliveTime=0; for (rxc = 0;rxc<rxlen;rxc++) { receiveBuffer.push(rxbuf[rxc]); @@ -573,7 +688,7 @@ #ifdef netmsgdebug printf("MIN MAX METERING\r\n"); #endif - net2->devMsgReq=1; + net2->devMsgReq=0; net2->devMsgPos=2; rxindex=0; } @@ -583,7 +698,7 @@ #ifdef netmsgdebug printf("TAP REPORT\r\n"); #endif - net2->devMsgReq=2; + net2->devMsgReq=1; net2->devMsgPos=2; rxindex=0; } @@ -619,8 +734,8 @@ printf("Server Port %d\r\n", net2->srvPort); printf("accept %s:%d\r\n", client_address->get_ip_address(), client_address->get_port()); #endif - net2->aliveTime=0; - net2->srvIsActive=true; + //bit_toset(net2->statusReg,srvIsActive); + bit_toset(srvIsActive); } } @@ -633,6 +748,15 @@ } } +void sendSerCmd(char cmdNum, char cmdCnt) +{ + sendLength.push(cmdCnt); + for (char txc=0;txc<cmdCnt;txc++) + { + sendBuffer.push(serCmd[cmdNum][txc]); + } +} + int main() { EthernetInterface eth; @@ -656,289 +780,271 @@ rxtxdatathread[2].start(callback(datasrx,&net1)); rxtxdatathread[3].start(callback(datantx,&net1)); rxtxdatathread[4].start(callback(dataprocess,&net1)); + + unsigned int sxc; - unsigned int txc; - unsigned int sxc; + netDevTimers[0].start(); + netDevTimers[2].start(); + netDevTimers[3].start(); while (true) { - polltick=getTick(); + polltick=getPollTick(); if (polltick) { - setTick(false); - incTime(); - currenttime=getTime(); - net1.pollTime++; - net1.fmPollTime++; - net1.fmdPollTime++; - net1.sendTime++; - if (net1.srvIsActive) + setPollTick(false); + //if (bit_isset(net1.statusReg,srvCloseConnection)) + if (bit_isset(srvCloseConnection)) { - net1.aliveTime++; - if (net1.aliveTime>net1.aliveTimeout) - { - #ifdef netmsgdebug - printf("Closed\r\n"); - #endif - net1.clt_sock.close(); - net1.srvIsActive=false; - net1.srvCloseConnection=false; - } + #ifdef netmsgdebug + printf("Closed\r\n"); + #endif + net1.clt_sock.close(); + //bit_toclear(net1.statusReg,srvIsActive); + //bit_toclear(net1.statusReg,srvCloseConnection); + bit_toclear(srvIsActive); + bit_toclear(srvCloseConnection); } - if (net1.pollEnabled) + //if (bit_isset(net1.statusReg,serCloseConnection)) + if (bit_isset(serCloseConnection)) + { + #ifdef netmsgdebug + printf("Serial Connection Closed\r\n"); + #endif + net1.srv_sock.close(); + net1.sendState=0; + //if (bit_isset(net1.statusReg,serRespRx)) + if (bit_isset(serRespRx)) + { + net1.rxMessageCount++; + } + else + { + net1.serTimeoutCount++; + } + //bit_toclear(net1.statusReg,serclose); + bit_toclear(serclose); + } + //if (bit_isset(net1.statusReg,fmCloseConnection)) + if (bit_isset(fmCloseConnection)) { - if (net1.pollTime >= setpollinterval) + #ifdef netmsgdebug + printf("Fast Meter Connection Closed\r\n"); + #endif + net1.srv_sock.close(); + //bit_toclear(net1.statusReg,cltIsActive); + bit_toclear(cltIsActive); + net1.sendState=0; + //if ((bit_isset(net1.statusReg,fmRespRx)) || (bit_isset(net1.statusReg,fmdRespRx))) + if ((bit_isset(fmRespRx)) || (bit_isset(fmdRespRx))) + { + net1.rxMessageCount++; + } + else { - if ((net1.sendState==0)||(net1.sendState==5)) + net1.fmTimeoutCount++; + } + //bit_toclear(net1.statusReg,fmclose); + bit_toclear(fmclose); + //printf("Status %08x\r\n",net1.statusReg); + } + //if (bit_isset(net1.statusReg,cltCloseConnection)) + if (bit_isset(cltCloseConnection)) + { + #ifdef netmsgdebug + printf("Connection Closed\r\n"); + #endif + net1.srv_sock.close(); + net1.sendState=0; + //bit_toclear(net1.statusReg,cltclose); + bit_toclear(cltclose); + } + + //if ((bit_isclear(net1.statusReg,serPollInProg)) && (bit_isclear(net1.statusReg,fmPollInProg)) && (bit_isclear(net1.statusReg,fmdPollInProg)) && (bit_isset(net1.statusReg,devOnline))) + if ((bit_isclear(serPollInProg)) && (bit_isclear(fmPollInProg)) && (bit_isclear(fmdPollInProg)) && (bit_isset(devOnline))) + { + //if (bit_isset(net1.statusReg,fmdPollReq)) + if (bit_isset(fmdPollReq)) + { + //if (bit_isset(net1.statusReg,fmdEnabled)) + if (bit_isset(fmdEnabled)) + { + printf("Demand Reading\r\n"); + sendCmd(4); + //bit_toclear(net1.statusReg,fmdPollReq); + //bit_toset(net1.statusReg,fmdPollInProg); + bit_toclear(fmdPollReq); + bit_toset(fmdPollInProg); + } + else { - if (net1.devMsgReq>0) - { - net1.serTimeoutCount=0; - sendLength.push(serCmdSeq[2][net1.devMsgPos]); - for (txc=0;txc<serCmdSeq[2][net1.devMsgPos];txc++) - { - sendBuffer.push(serCmd[serCmdSeq[net1.devMsgReq-1][net1.devMsgPos]][txc]); - } - if (net1.serIsActive==false) - { - net1.serIsActive=true; - } - } - else + printf("Demand Configuration\r\n"); + sendCmd(3); + //bit_toclear(net1.statusReg,fmdPollReq); + //bit_toset(net1.statusReg,fmdPollInProg); + bit_toclear(fmdPollReq); + bit_toset(fmdPollInProg); + } + netDevTimers[4].start(); + } + //else if (bit_isset(net1.statusReg,fmPollReq)) + else if (bit_isset(fmPollReq)) + { + //if (bit_isset(net1.statusReg,fmEnabled)) + if (bit_isset(fmEnabled)) + { + printf("Meter Reading\r\n"); + sendCmd(2); + //bit_toclear(net1.statusReg,fmPollReq); + //bit_toset(net1.statusReg,fmPollInProg); + bit_toclear(fmPollReq); + bit_toset(fmPollInProg); + } + else + { + printf("Meter Configuration\r\n"); + sendCmd(1); + //bit_toclear(net1.statusReg,fmPollReq); + //bit_toset(net1.statusReg,fmPollInProg); + bit_toclear(fmPollReq); + bit_toset(fmPollInProg); + } + netDevTimers[4].start(); + } + //else if (bit_isset(net1.statusReg,serPollReq)) + else if (bit_isset(serPollReq)) + { + //if (bit_isset(net1.statusReg,serEnabled)) + if (bit_isset(serEnabled)) + { + sendSerCmd(serCmdSeq[net1.devMsgReq][net1.devMsgPos],serCmdlen[net1.devMsgReq][net1.devMsgPos]); + //bit_toclear(net1.statusReg,serPollReq); + //bit_toset(net1.statusReg,serPollInProg); + bit_toclear(serPollReq); + bit_toset(serPollInProg); + } + netDevTimers[5].start(); + } + } + //if ((bit_isclear(net1.statusReg,devOnline)) && (bit_isclear(net1.statusReg,fmCfgInProg)) && (bit_isset(net1.statusReg,fmCfgReq))) + if ((bit_isclear(devOnline)) && (bit_isclear(fmCfgInProg)) && (bit_isset(fmCfgReq))) + { + sendCmd(0); + //bit_toclear(net1.statusReg,fmCfgReq); + //bit_toset(net1.statusReg,fmCfgInProg); + bit_toclear(fmCfgReq); + bit_toset(fmCfgInProg); + net1.sendState=1; + } + } + + + //Begin Sending Data + sendtick=getSendTick(); + + if (sendtick) + { + setSendTick(false); + sport0.printf("Status %08x\r\n",getStatus()); + switch (net1.sendState) + { + case 0: + if (!sendLength.empty()) + { + sendLength.pop(net1.sendLen); + for (sxc=0;sxc<net1.sendLen;sxc++) { - if (net1.configState<9) - { - sendCmd(net1.configState); - if (net1.sendState==0) - { - net1.sendState=1; - net1.pollRequestSent=true; - } - } + sendBuffer.pop(net1.sendString[sxc]); } - + net1.sendState=1; } - net1.pollTime=0; - } - if (net1.fmPollTime >= setfmpollinterval) - { - if (net1.serIsActive==false) + break; + case 1: + /*if (!sendLength.empty()) { - if ((net1.sendState==0)||(net1.sendState==5)) + sendLength.pop(net1.sendLen); + for (sxc=0;sxc<net1.sendLen;sxc++) { - { - if (net1.fmEnabled) - { - sendCmd(2); - if (net1.sendState==0) - { - net1.sendState=1; - net1.pollRequestSent=true; - } - } - } - } - if (net1.fmPollTime>setfmpollinterval) - { - net1.fmPollTime=net1.fmPollTime-setfmpollinterval; - } - else - { - net1.fmPollTime=0; + sendBuffer.pop(net1.sendString[sxc]); } } - } - if (net1.fmdPollTime >= setfmdemandpollinterval) - { - if (net1.serIsActive==false) + else { - if ((net1.sendState==0)||(net1.sendState==5)) + net1.sendState=0; + }*/ + ret=net1.srv_sock.open(ð); + #ifdef netmsgdebug + printf("Socket%d\r\n",ret); + #endif + if (ret < 0) + { + if (ret==-3003) { - { - if (net1.fmdEnabled) - { - sendCmd(4); - if (net1.sendState==0) - { - net1.sendState=1; - net1.pollRequestSent=true; - } - } - } - } - if (net1.fmdPollTime>setfmdemandpollinterval) - { - net1.fmdPollTime=net1.fmdPollTime-setfmdemandpollinterval; + #ifdef netmsgdebug + printf("May already be attached, attempting connect.\r\n"); + #endif } else { - net1.fmdPollTime=0; + //bit_toset(net1.statusReg,attachRetry); + bit_toset(attachRetry); + net1.sendRetryCount=0; + net1.sendState=2; + break; } } - } - if ((net1.sendState==5) || (net1.serIsActive)) - { - net1.pollTimeout++; - if (net1.pollTimeout==setpolltimeout) + net1.sendState=3; + //bit_toset(net1.statusReg,cltIsActive); + bit_toset(cltIsActive); + break; + case 2: + ret=net1.srv_sock.open(ð); + #ifdef netmsgdebug + printf("Socket%d\r\n",ret); + #endif + if (ret < 0) { - if (net1.pollRequestSent) + //bit_toset(net1.statusReg,attachRetry); + bit_toset(attachRetry); + net1.sendRetryCount++; + #ifdef netmsgdebug + printf("Attach Attempt Failed, Code: %d\r\n",ret); + #endif + if (net1.sendRetryCount>3) { #ifdef netmsgdebug - printf("Poll Request Sent\r\n"); + printf("Communication Failed, Closing\r\n"); #endif - if (net1.pollResponseReceived==false) - { - #ifdef netmsgdebug - printf("Poll Response Not Received\r\n"); - #endif - } - else - { - #ifdef netmsgdebug - printf("Poll Response Received\r\n"); - #endif - } - net1.pollRequestSent=false; - net1.pollResponseReceived=false; - if (net1.serIsActive==false) - { - net1.cltCloseConnection=true; - net1.sendState=0; - } - } - if (net1.serIsActive) - { - if ((net1.serTimeoutCount==sertimeoutperiods) || (net1.devMsgReq==0)) - { - net1.devMsgOpenRx=false; - net1.cltCloseConnection=true; - net1.devMsgReq=0; - net1.serIsActive=false; - net1.sendState=0; - } - else - { - net1.pollTimeout=0; - net1.serTimeoutCount++; - #ifdef netmsgdebug - printf("Serial Active Timeout Count: %d\r\n",net1.serTimeoutCount); - #endif - } - } - } - } - else - { - net1.pollTimeout=0; - } - } - if (net1.sendTime == 10) - { - switch (net1.sendState) - { - case 1: - if (!sendLength.empty()) - { - sendLength.pop(net1.sendLen); - for (sxc=0;sxc<net1.sendLen;sxc++) - { - sendBuffer.pop(net1.sendString[sxc]); - } - } - else - { + //bit_toclear(net1.statusReg,attachRetry); + bit_toclear(attachRetry); + net1.sendRetryCount = 0; + net1.messageFailCount++; net1.sendState=0; } - ret=net1.srv_sock.open(ð); - #ifdef netmsgdebug - printf("Socket%d\r\n",ret); - #endif - if (ret < 0) - { - if (ret==-3003) - { - #ifdef netmsgdebug - printf("May already be attached, attempting connect.\r\n"); - #endif - } - else - { - net1.attachRetry = true; - net1.sendRetryCount=0; - net1.sendState=2; - net1.sendTime=0; - break; - } - } - net1.sendState=3; - net1.sendTime=11; - net1.cltIsActive=true; break; - case 2: - ret=net1.srv_sock.open(ð); - #ifdef netmsgdebug - printf("Socket%d\r\n",ret); - #endif - if (ret < 0) + } + net1.sendState=3; + //bit_toclear(net1.statusReg,attachRetry); + //bit_toset(net1.statusReg,cltIsActive); + bit_toclear(attachRetry); + bit_toset(cltIsActive); + break; + case 5: + if (!sendLength.empty()) + { + sendLength.pop(net1.sendLen); + for (sxc=0;sxc<net1.sendLen;sxc++) { - net1.attachRetry = true; - net1.sendRetryCount++; - net1.sendTime=0; - #ifdef netmsgdebug - printf("Attach Attempt Failed, Code: %d\r\n",ret); - #endif - if (net1.sendRetryCount>3) - { - #ifdef netmsgdebug - printf("Communication Failed, Closing\r\n"); - #endif - net1.attachRetry = false; - net1.sendRetryCount = 0; - net1.messageFailCount++; - net1.sendState=0; - net1.sendTime=0; - } - break; + sendBuffer.pop(net1.sendString[sxc]); } - net1.sendState=0; - net1.attachRetry = false; - net1.sendTime=11; - net1.cltIsActive=true; - break; - default: - net1.sendTime=0; - if (!sendLength.empty()) - { - if (net1.sendState==5) - { - - sendLength.pop(net1.sendLen); - for (sxc=0;sxc<net1.sendLen;sxc++) - { - sendBuffer.pop(net1.sendString[sxc]); - } - net1.sendState=4; - } - else - { - net1.sendState=1; - } - } - break; - } + net1.sendState=4; + } + break; + default: + break; } } - if (net1.cltCloseConnection==true) - { - #ifdef netmsgdebug - printf("Client Socket Closed\r\n"); - #endif - net1.srv_sock.close(); - net1.cltIsActive=false; - net1.cltCloseConnection=false; - net1.sendState=0; - } } }