Dependencies:   BufferedSerial analogAverager voltageRegulator netStatReg analogMinMax CounterMinMax

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(&eth);
+                    #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(&eth);
+                    #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(&eth);
-                        #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(&eth);
-                        #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;
-        }
     }
 }