This demonstrates the process of communicating through ethernet to a SEL-2431 Voltage Regulator Control Panel using SEL Fast Message. Basic device commands and data cna be requested and displayed over a connected serial port. This is a basic version and full testing and documentation has yet to be completed.

Dependencies:   BufferedSerial analogAverager voltageRegulator netStatReg analogMinMax CounterMinMax

Committer:
masterkookus
Date:
Wed Oct 02 12:12:30 2019 +0000
Revision:
10:9da863a6da3e
Parent:
9:d6e7981dfc89
Child:
11:d40adc7de05f
Demand Report added and poll times optimized

Who changed what in which revision?

UserRevisionLine numberNew contents of line
masterkookus 0:03ab7f7596e2 1 #if !FEATURE_LWIP
masterkookus 0:03ab7f7596e2 2 #error [NOT_SUPPORTED] LWIP not supported for this target
masterkookus 0:03ab7f7596e2 3 #endif
masterkookus 0:03ab7f7596e2 4
masterkookus 0:03ab7f7596e2 5 #include "mbed.h"
masterkookus 0:03ab7f7596e2 6 #include "EthernetInterface.h"
masterkookus 0:03ab7f7596e2 7 #include "TCPServer.h"
masterkookus 0:03ab7f7596e2 8 #include "TCPSocket.h"
masterkookus 0:03ab7f7596e2 9 #include "BufferedSerial.h"
masterkookus 3:ac1f2af8bd0f 10 #include "nettime.h"
masterkookus 3:ac1f2af8bd0f 11 #include "netdevices.h"
masterkookus 7:be13a9037d41 12 #include "mydevices.h"
masterkookus 5:c656fd08007b 13 #include "platform/CircularBuffer.h"
masterkookus 8:fa2a2c3a16ce 14 #include "netDataTypes.h"
masterkookus 8:fa2a2c3a16ce 15 #include "selMsg.h"
masterkookus 8:fa2a2c3a16ce 16 #include "string.h"
masterkookus 0:03ab7f7596e2 17
masterkookus 7:be13a9037d41 18 Ticker nettimer;
masterkookus 0:03ab7f7596e2 19
masterkookus 6:9f97716eae76 20 struct netsys net1;
masterkookus 8:fa2a2c3a16ce 21 struct vRegData vReg1;
masterkookus 1:a57cbebba3fd 22
masterkookus 1:a57cbebba3fd 23 bool polltick;
masterkookus 0:03ab7f7596e2 24
masterkookus 7:be13a9037d41 25 BufferedSerial sport0(sport0tx, sport0rx, sport0buff, sport0mult); // UART2
masterkookus 0:03ab7f7596e2 26
masterkookus 7:be13a9037d41 27 CircularBuffer<char, 1024> receiveBuffer;
masterkookus 7:be13a9037d41 28 CircularBuffer<char, 64> sendLength;
masterkookus 7:be13a9037d41 29 CircularBuffer<char, 1024> sendBuffer;
masterkookus 9:d6e7981dfc89 30 CircularBuffer<char, 16> serrxbuffer;
masterkookus 5:c656fd08007b 31
masterkookus 0:03ab7f7596e2 32 Thread conchkthread[2];
masterkookus 4:98cdccfb17d6 33 Thread rxtxdatathread[5];
masterkookus 4:98cdccfb17d6 34
masterkookus 4:98cdccfb17d6 35 unsigned int currenttime=0;
masterkookus 0:03ab7f7596e2 36
masterkookus 5:c656fd08007b 37 nsapi_error_t ret;
masterkookus 5:c656fd08007b 38
masterkookus 2:ec972966689e 39 //Provides the deivce poll timing
masterkookus 1:a57cbebba3fd 40 void heartbeat()
masterkookus 1:a57cbebba3fd 41 {
masterkookus 3:ac1f2af8bd0f 42 setTick(true);
masterkookus 1:a57cbebba3fd 43 }
masterkookus 1:a57cbebba3fd 44
masterkookus 4:98cdccfb17d6 45 void confignetdevices(EthernetInterface *eth)
masterkookus 4:98cdccfb17d6 46 {
masterkookus 7:be13a9037d41 47 net1.cltPort=setclientport;
masterkookus 7:be13a9037d41 48 net1.srv_addr=setclientaddress;
masterkookus 6:9f97716eae76 49 net1.cltIsActive=false;
masterkookus 9:d6e7981dfc89 50 net1.serIsActive=false;
masterkookus 6:9f97716eae76 51 net1.cltCloseConnection=false;
masterkookus 6:9f97716eae76 52 net1.pollTime=0;
masterkookus 8:fa2a2c3a16ce 53 net1.pollTimeout=0;
masterkookus 7:be13a9037d41 54 net1.pollRequestSent=false;
masterkookus 7:be13a9037d41 55 net1.pollResponseReceived=false;
masterkookus 8:fa2a2c3a16ce 56 net1.srv_sock.set_blocking(true);
masterkookus 8:fa2a2c3a16ce 57 net1.srv_sock.set_timeout(100);
masterkookus 7:be13a9037d41 58 net1.aliveTimeout=setservertimeout;
masterkookus 8:fa2a2c3a16ce 59 net1.srv.set_blocking(true);
masterkookus 8:fa2a2c3a16ce 60 net1.srv.set_timeout(100);
masterkookus 7:be13a9037d41 61 net1.pollEnabled=setpollenabled;
masterkookus 7:be13a9037d41 62 net1.pollTimeoutCount=0;
masterkookus 10:9da863a6da3e 63 net1.configState=0;
masterkookus 8:fa2a2c3a16ce 64 net1.pollTimeoutCount=0;
masterkookus 8:fa2a2c3a16ce 65 net1.sendRetryCount=0;
masterkookus 8:fa2a2c3a16ce 66 net1.messageFailCount=0;
masterkookus 8:fa2a2c3a16ce 67 net1.txMessageCount=0;
masterkookus 8:fa2a2c3a16ce 68 net1.rxMessageCount=0;
masterkookus 10:9da863a6da3e 69 net1.fmEnabled=false;
masterkookus 10:9da863a6da3e 70 net1.fmdEnabled=false;
masterkookus 4:98cdccfb17d6 71
masterkookus 4:98cdccfb17d6 72 /* Open the server on ethernet stack */
masterkookus 4:98cdccfb17d6 73 net1.srv.open(eth);
masterkookus 6:9f97716eae76 74 net1.srvIsActive=false;
masterkookus 6:9f97716eae76 75 net1.srvCloseConnection=false;
masterkookus 4:98cdccfb17d6 76
masterkookus 4:98cdccfb17d6 77 /* Bind port 23 to the server */
masterkookus 7:be13a9037d41 78 net1.srvPort=setserverport;
masterkookus 6:9f97716eae76 79 net1.srv.bind(net1.srvPort);
masterkookus 4:98cdccfb17d6 80
masterkookus 4:98cdccfb17d6 81 /* Can handle 5 simultaneous connections */
masterkookus 4:98cdccfb17d6 82 net1.srv.listen(5);
masterkookus 7:be13a9037d41 83 sport0.baud(sport0baud);
masterkookus 4:98cdccfb17d6 84 }
masterkookus 4:98cdccfb17d6 85
masterkookus 7:be13a9037d41 86 void dataprocess(netsys *net2)
masterkookus 0:03ab7f7596e2 87 {
masterkookus 7:be13a9037d41 88 int txc;
masterkookus 5:c656fd08007b 89 char cchar;
masterkookus 5:c656fd08007b 90 char cbuf[256];
masterkookus 5:c656fd08007b 91 unsigned int clen=0;
masterkookus 5:c656fd08007b 92 unsigned int cbc;
masterkookus 8:fa2a2c3a16ce 93 float4byte valpack;
masterkookus 8:fa2a2c3a16ce 94 short2byte timepack;
masterkookus 5:c656fd08007b 95
masterkookus 4:98cdccfb17d6 96 while(1)
masterkookus 0:03ab7f7596e2 97 {
masterkookus 10:9da863a6da3e 98 //Check to see if the Receive Buffer has anything
masterkookus 7:be13a9037d41 99 while (!receiveBuffer.empty())
masterkookus 5:c656fd08007b 100 {
masterkookus 7:be13a9037d41 101 receiveBuffer.pop(cchar);
masterkookus 8:fa2a2c3a16ce 102 cbuf[clen]=cchar;
masterkookus 5:c656fd08007b 103 clen++;
masterkookus 5:c656fd08007b 104 }
masterkookus 10:9da863a6da3e 105 //If a Poll Request has been made and data has been received set flag
masterkookus 7:be13a9037d41 106 if (net2->pollRequestSent)
masterkookus 7:be13a9037d41 107 {
masterkookus 7:be13a9037d41 108 if (clen>0)
masterkookus 7:be13a9037d41 109 {
masterkookus 7:be13a9037d41 110 net2->pollResponseReceived=true;
masterkookus 7:be13a9037d41 111 }
masterkookus 7:be13a9037d41 112 }
masterkookus 10:9da863a6da3e 113 //Check to see if bulk data and reports being sent from device due to serial command
masterkookus 9:d6e7981dfc89 114 if (net2->devMsgOpenRx)
masterkookus 9:d6e7981dfc89 115 {
masterkookus 9:d6e7981dfc89 116 sport0.write(cbuf,clen);
masterkookus 9:d6e7981dfc89 117 clen=0;
masterkookus 9:d6e7981dfc89 118 }
masterkookus 10:9da863a6da3e 119 //Check to see if at least 4 characters have been received
masterkookus 9:d6e7981dfc89 120 else if (clen>3)
masterkookus 5:c656fd08007b 121 {
masterkookus 10:9da863a6da3e 122 //Cycle through received data to search for a command
masterkookus 7:be13a9037d41 123 for (cbc=0;cbc<clen-3;cbc++)
masterkookus 5:c656fd08007b 124 {
masterkookus 10:9da863a6da3e 125 //Check to see if serial commands are currently being received
masterkookus 9:d6e7981dfc89 126 if (net2->serIsActive==true)
masterkookus 8:fa2a2c3a16ce 127 {
masterkookus 10:9da863a6da3e 128 //If relay acknowledges max metering command set bulk receive flag
masterkookus 9:d6e7981dfc89 129 if ((cbuf[cbc]==0x4d) && (cbuf[cbc+1]==0x45) && (cbuf[cbc+2]==0x54))
masterkookus 8:fa2a2c3a16ce 130 {
masterkookus 9:d6e7981dfc89 131 sport0.write(cbuf,clen);
masterkookus 9:d6e7981dfc89 132 net2->devMsgOpenRx=true;
masterkookus 9:d6e7981dfc89 133 net2->devMsgReq=0;
masterkookus 9:d6e7981dfc89 134 clen=0;
masterkookus 9:d6e7981dfc89 135 break;
masterkookus 8:fa2a2c3a16ce 136 }
masterkookus 10:9da863a6da3e 137 //If relay acknowledges tap report command set bulk receive flag
masterkookus 9:d6e7981dfc89 138 if ((cbuf[cbc]==0x54) && (cbuf[cbc+1]==0x41) && (cbuf[cbc+2]==0x50))
masterkookus 9:d6e7981dfc89 139 {
masterkookus 9:d6e7981dfc89 140 sport0.write(cbuf,clen);
masterkookus 9:d6e7981dfc89 141 net2->devMsgOpenRx=true;
masterkookus 9:d6e7981dfc89 142 net2->devMsgReq=0;
masterkookus 9:d6e7981dfc89 143 clen=0;
masterkookus 9:d6e7981dfc89 144 break;
masterkookus 9:d6e7981dfc89 145 }
masterkookus 10:9da863a6da3e 146 //If relay acknowledges level 1 login attempt increment command pointer to password
masterkookus 9:d6e7981dfc89 147 if ((cbuf[cbc]==0x41) && (cbuf[cbc+1]==0x43) && (cbuf[cbc+2]==0x43))
masterkookus 7:be13a9037d41 148 {
masterkookus 8:fa2a2c3a16ce 149 sport0.write(cbuf,clen);
masterkookus 9:d6e7981dfc89 150 net2->devMsgPos=1;
masterkookus 9:d6e7981dfc89 151 clen=0;
masterkookus 9:d6e7981dfc89 152 break;
masterkookus 9:d6e7981dfc89 153 }
masterkookus 10:9da863a6da3e 154 //If relay sends mask character increment command pointer to send \r\n
masterkookus 9:d6e7981dfc89 155 if (cbuf[cbc]==0x2a)
masterkookus 9:d6e7981dfc89 156 {
masterkookus 9:d6e7981dfc89 157 sport0.write(cbuf,clen);
masterkookus 9:d6e7981dfc89 158 net2->devMsgPos=2;
masterkookus 9:d6e7981dfc89 159 clen=0;
masterkookus 9:d6e7981dfc89 160 break;
masterkookus 9:d6e7981dfc89 161 }
masterkookus 10:9da863a6da3e 162 //If relay is in access level 1 or higher increment command pointer to desired command
masterkookus 9:d6e7981dfc89 163 if ((cbuf[cbc]==0x3d) && (cbuf[cbc+1]==0x3e))
masterkookus 9:d6e7981dfc89 164 {
masterkookus 9:d6e7981dfc89 165 sport0.write(cbuf,clen);
masterkookus 9:d6e7981dfc89 166 net2->devMsgPos=4;
masterkookus 9:d6e7981dfc89 167 clen=0;
masterkookus 9:d6e7981dfc89 168 break;
masterkookus 9:d6e7981dfc89 169 }
masterkookus 10:9da863a6da3e 170 //If relay in level 0 increment command pointer to access command
masterkookus 9:d6e7981dfc89 171 if ((cbuf[cbc]==0x3d))
masterkookus 9:d6e7981dfc89 172 {
masterkookus 9:d6e7981dfc89 173 sport0.write(cbuf,clen);
masterkookus 9:d6e7981dfc89 174 net2->devMsgPos=0;
masterkookus 8:fa2a2c3a16ce 175 clen=0;
masterkookus 8:fa2a2c3a16ce 176 break;
masterkookus 7:be13a9037d41 177 }
masterkookus 9:d6e7981dfc89 178 }
masterkookus 10:9da863a6da3e 179 //Check fast message conficuration
masterkookus 9:d6e7981dfc89 180 if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xC0))
masterkookus 9:d6e7981dfc89 181 {
masterkookus 9:d6e7981dfc89 182 sport0.write(cbuf,clen);
masterkookus 10:9da863a6da3e 183 net2->configState=1;
masterkookus 9:d6e7981dfc89 184 clen=0;
masterkookus 9:d6e7981dfc89 185 break;
masterkookus 9:d6e7981dfc89 186 }
masterkookus 10:9da863a6da3e 187 //Check fast meter configuration
masterkookus 9:d6e7981dfc89 188 if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xC1))
masterkookus 9:d6e7981dfc89 189 {
masterkookus 9:d6e7981dfc89 190 sport0.write(cbuf,clen);
masterkookus 10:9da863a6da3e 191 //Ensure Analog channl count is correct
masterkookus 9:d6e7981dfc89 192 if (vReg1.numAnalog!=cbuf[6])
masterkookus 7:be13a9037d41 193 {
masterkookus 10:9da863a6da3e 194 printf("\r\nFast Meter Analog Channel Count Off\r\n");
masterkookus 9:d6e7981dfc89 195 clen=0;
masterkookus 9:d6e7981dfc89 196 break;
masterkookus 9:d6e7981dfc89 197 }
masterkookus 10:9da863a6da3e 198 //Ensure Digital register count is correct
masterkookus 9:d6e7981dfc89 199 if (vReg1.numDigital!=cbuf[8])
masterkookus 9:d6e7981dfc89 200 {
masterkookus 10:9da863a6da3e 201 printf("\r\nFast Meter Digital Channel Count Off\r\n");
masterkookus 8:fa2a2c3a16ce 202 clen=0;
masterkookus 8:fa2a2c3a16ce 203 break;
masterkookus 7:be13a9037d41 204 }
masterkookus 9:d6e7981dfc89 205 char anum=16;
masterkookus 9:d6e7981dfc89 206 char nxc;
masterkookus 10:9da863a6da3e 207 //Verify Analog names are correct
masterkookus 9:d6e7981dfc89 208 for (txc=0;txc<vReg1.numAnalog;txc++)
masterkookus 8:fa2a2c3a16ce 209 {
masterkookus 9:d6e7981dfc89 210 for (nxc=0;nxc<6;nxc++)
masterkookus 8:fa2a2c3a16ce 211 {
masterkookus 9:d6e7981dfc89 212 if(vReg1.analogs[txc].analogName[nxc]!=cbuf[anum+nxc])
masterkookus 9:d6e7981dfc89 213 {
masterkookus 9:d6e7981dfc89 214 printf("\r\nPoint %d Failed\r\n",txc);
masterkookus 9:d6e7981dfc89 215 break;
masterkookus 9:d6e7981dfc89 216 }
masterkookus 8:fa2a2c3a16ce 217 }
masterkookus 9:d6e7981dfc89 218 anum = anum + 11;
masterkookus 8:fa2a2c3a16ce 219 }
masterkookus 10:9da863a6da3e 220 net2->configState=3;
masterkookus 10:9da863a6da3e 221 net2->fmEnabled=true;
masterkookus 9:d6e7981dfc89 222 clen=0;
masterkookus 9:d6e7981dfc89 223 break;
masterkookus 9:d6e7981dfc89 224 }
masterkookus 10:9da863a6da3e 225 //Receive data
masterkookus 9:d6e7981dfc89 226 if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xD1))
masterkookus 9:d6e7981dfc89 227 {
masterkookus 9:d6e7981dfc89 228 char anum=cbc+4;
masterkookus 9:d6e7981dfc89 229 for (txc=0;txc<vReg1.numAnalog;txc++)
masterkookus 9:d6e7981dfc89 230 {
masterkookus 9:d6e7981dfc89 231 valpack.bytes[3]=cbuf[anum];
masterkookus 9:d6e7981dfc89 232 valpack.bytes[2]=cbuf[anum+1];
masterkookus 9:d6e7981dfc89 233 valpack.bytes[1]=cbuf[anum+2];
masterkookus 9:d6e7981dfc89 234 valpack.bytes[0]=cbuf[anum+3];
masterkookus 9:d6e7981dfc89 235 vReg1.analogs[txc].analog1Value = valpack.cmdflt;
masterkookus 9:d6e7981dfc89 236 anum = anum + 4;
masterkookus 9:d6e7981dfc89 237 printf("%.2f\r\n",vReg1.analogs[txc].analog1Value);
masterkookus 9:d6e7981dfc89 238 }
masterkookus 9:d6e7981dfc89 239 vReg1.timeStamp.month=cbuf[anum];
masterkookus 9:d6e7981dfc89 240 vReg1.timeStamp.day=cbuf[anum+1];
masterkookus 9:d6e7981dfc89 241 vReg1.timeStamp.year=cbuf[anum+2];
masterkookus 9:d6e7981dfc89 242 vReg1.timeStamp.hour=cbuf[anum+3];
masterkookus 9:d6e7981dfc89 243 vReg1.timeStamp.min=cbuf[anum+4];
masterkookus 9:d6e7981dfc89 244 vReg1.timeStamp.sec=cbuf[anum+5];
masterkookus 9:d6e7981dfc89 245 timepack.bytes[1]=cbuf[anum+6];
masterkookus 9:d6e7981dfc89 246 timepack.bytes[0]=cbuf[anum+7];
masterkookus 9:d6e7981dfc89 247 vReg1.timeStamp.msec=timepack.cmdshort;
masterkookus 9:d6e7981dfc89 248 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);
masterkookus 9:d6e7981dfc89 249 anum=anum+8;
masterkookus 9:d6e7981dfc89 250 for (txc=0;txc<vReg1.numDigital;txc++)
masterkookus 9:d6e7981dfc89 251 {
masterkookus 9:d6e7981dfc89 252 vReg1.digitalTargets[txc]=cbuf[anum+txc];
masterkookus 9:d6e7981dfc89 253 }
masterkookus 9:d6e7981dfc89 254 clen=0;
masterkookus 9:d6e7981dfc89 255 break;
masterkookus 5:c656fd08007b 256 }
masterkookus 10:9da863a6da3e 257 //Check fast demand meter configuration
masterkookus 10:9da863a6da3e 258 if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xC2))
masterkookus 10:9da863a6da3e 259 {
masterkookus 10:9da863a6da3e 260 sport0.write(cbuf,clen);
masterkookus 10:9da863a6da3e 261 //Ensure Analog channl count is correct
masterkookus 10:9da863a6da3e 262 if (vReg1.numDemAnalog!=cbuf[6])
masterkookus 10:9da863a6da3e 263 {
masterkookus 10:9da863a6da3e 264 printf("\r\nDemand Analog Channel Count Off\r\n");
masterkookus 10:9da863a6da3e 265 clen=0;
masterkookus 10:9da863a6da3e 266 break;
masterkookus 10:9da863a6da3e 267 }
masterkookus 10:9da863a6da3e 268 char anum=18;
masterkookus 10:9da863a6da3e 269 char nxc;
masterkookus 10:9da863a6da3e 270 //Verify Analog names are correct
masterkookus 10:9da863a6da3e 271 for (txc=0;txc<vReg1.numDemAnalog;txc++)
masterkookus 10:9da863a6da3e 272 {
masterkookus 10:9da863a6da3e 273 for (nxc=0;nxc<6;nxc++)
masterkookus 10:9da863a6da3e 274 {
masterkookus 10:9da863a6da3e 275 if(vReg1.analogs[txc+vReg1.numAnalog].analogName[nxc]!=cbuf[anum+nxc])
masterkookus 10:9da863a6da3e 276 {
masterkookus 10:9da863a6da3e 277 printf("%c %c\r\n",vReg1.analogs[txc+vReg1.numAnalog].analogName[nxc],cbuf[anum+nxc]);
masterkookus 10:9da863a6da3e 278 printf("\r\nPoint %d Failed\r\n",txc);
masterkookus 10:9da863a6da3e 279 break;
masterkookus 10:9da863a6da3e 280 }
masterkookus 10:9da863a6da3e 281 }
masterkookus 10:9da863a6da3e 282 anum = anum + 11;
masterkookus 10:9da863a6da3e 283 }
masterkookus 10:9da863a6da3e 284 net2->configState=9;
masterkookus 10:9da863a6da3e 285 net2->fmdEnabled=true;
masterkookus 10:9da863a6da3e 286 clen=0;
masterkookus 10:9da863a6da3e 287 break;
masterkookus 10:9da863a6da3e 288 }
masterkookus 10:9da863a6da3e 289 //Receive demand data
masterkookus 10:9da863a6da3e 290 if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xD2))
masterkookus 10:9da863a6da3e 291 {
masterkookus 10:9da863a6da3e 292 char anum=cbc+4;
masterkookus 10:9da863a6da3e 293 for (txc=0;txc<vReg1.numDemAnalog;txc++)
masterkookus 10:9da863a6da3e 294 {
masterkookus 10:9da863a6da3e 295 valpack.bytes[3]=cbuf[anum];
masterkookus 10:9da863a6da3e 296 valpack.bytes[2]=cbuf[anum+1];
masterkookus 10:9da863a6da3e 297 valpack.bytes[1]=cbuf[anum+2];
masterkookus 10:9da863a6da3e 298 valpack.bytes[0]=cbuf[anum+3];
masterkookus 10:9da863a6da3e 299 vReg1.analogs[txc].analog1Value = valpack.cmdflt;
masterkookus 10:9da863a6da3e 300 anum = anum + 4;
masterkookus 10:9da863a6da3e 301 printf("%.2f\r\n",vReg1.analogs[txc].analog1Value);
masterkookus 10:9da863a6da3e 302 }
masterkookus 10:9da863a6da3e 303 vReg1.demTimeStamp.month=cbuf[anum];
masterkookus 10:9da863a6da3e 304 vReg1.demTimeStamp.day=cbuf[anum+1];
masterkookus 10:9da863a6da3e 305 vReg1.demTimeStamp.year=cbuf[anum+2];
masterkookus 10:9da863a6da3e 306 vReg1.demTimeStamp.hour=cbuf[anum+3];
masterkookus 10:9da863a6da3e 307 vReg1.demTimeStamp.min=cbuf[anum+4];
masterkookus 10:9da863a6da3e 308 vReg1.demTimeStamp.sec=cbuf[anum+5];
masterkookus 10:9da863a6da3e 309 timepack.bytes[1]=cbuf[anum+6];
masterkookus 10:9da863a6da3e 310 timepack.bytes[0]=cbuf[anum+7];
masterkookus 10:9da863a6da3e 311 vReg1.demTimeStamp.msec=timepack.cmdshort;
masterkookus 10:9da863a6da3e 312 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);
masterkookus 10:9da863a6da3e 313 break;
masterkookus 10:9da863a6da3e 314 }
masterkookus 5:c656fd08007b 315 }
masterkookus 7:be13a9037d41 316 if (clen>0)
masterkookus 7:be13a9037d41 317 {
masterkookus 7:be13a9037d41 318 printf("Command not Received\r\n");
masterkookus 7:be13a9037d41 319 clen=0;
masterkookus 7:be13a9037d41 320 }
masterkookus 7:be13a9037d41 321 }
masterkookus 7:be13a9037d41 322 }
masterkookus 7:be13a9037d41 323 }
masterkookus 7:be13a9037d41 324
masterkookus 7:be13a9037d41 325 //Ethernet to Ethernet Send Data
masterkookus 7:be13a9037d41 326 void datantx(netsys *net2)
masterkookus 7:be13a9037d41 327 {
masterkookus 7:be13a9037d41 328 while(1)
masterkookus 7:be13a9037d41 329 {
masterkookus 6:9f97716eae76 330 if (net2->cltIsActive)
masterkookus 0:03ab7f7596e2 331 {
masterkookus 10:9da863a6da3e 332 //Attempt to connect to server
masterkookus 7:be13a9037d41 333 while (net2->sendState==3)
masterkookus 5:c656fd08007b 334 {
masterkookus 10:9da863a6da3e 335 //delay connect attempt if previous attempt unsuccessful
masterkookus 5:c656fd08007b 336 if (net2->connectRetry == true)
masterkookus 5:c656fd08007b 337 {
masterkookus 5:c656fd08007b 338 wait_ms(100);
masterkookus 5:c656fd08007b 339 }
masterkookus 10:9da863a6da3e 340 //Attempt to connectg
masterkookus 6:9f97716eae76 341 ret = net2->srv_sock.connect(net2->srv_addr,net2->cltPort);
masterkookus 10:9da863a6da3e 342 //If connect successful proceed to send data
masterkookus 5:c656fd08007b 343 if (ret==0)
masterkookus 5:c656fd08007b 344 {
masterkookus 5:c656fd08007b 345 net2->connectRetry = false;
masterkookus 5:c656fd08007b 346 printf("Connected %d\r\n",ret);
masterkookus 8:fa2a2c3a16ce 347 net2->sendState=4;
masterkookus 8:fa2a2c3a16ce 348 }
masterkookus 10:9da863a6da3e 349 //If connect attempt failed check to see if may already be connected
masterkookus 8:fa2a2c3a16ce 350 else if (ret==-3015)
masterkookus 8:fa2a2c3a16ce 351 {
masterkookus 8:fa2a2c3a16ce 352 printf("May already be connected, attempting send.\r\n");
masterkookus 8:fa2a2c3a16ce 353 net2->connectRetry = false;
masterkookus 7:be13a9037d41 354 net2->sendState=4;
masterkookus 5:c656fd08007b 355 }
masterkookus 10:9da863a6da3e 356 //If connect attempt failed on other error attempt reconnect
masterkookus 5:c656fd08007b 357 else
masterkookus 5:c656fd08007b 358 {
masterkookus 5:c656fd08007b 359 net2->connectRetry = true;
masterkookus 7:be13a9037d41 360 net2->sendRetryCount++;
masterkookus 5:c656fd08007b 361 printf("Connect Attempt Failed, Code: %d\r\n",ret);
masterkookus 10:9da863a6da3e 362 //If connect attempt failed exceeds 3 then end attempt
masterkookus 7:be13a9037d41 363 if (net2->sendRetryCount>3)
masterkookus 5:c656fd08007b 364 {
masterkookus 5:c656fd08007b 365 printf("Communication Failed, Closing\r\n");
masterkookus 5:c656fd08007b 366 net2->connectRetry = false;
masterkookus 7:be13a9037d41 367 net2->sendRetryCount = 0;
masterkookus 5:c656fd08007b 368 net2->messageFailCount++;
masterkookus 6:9f97716eae76 369 net2->cltCloseConnection=true;
masterkookus 7:be13a9037d41 370 net2->sendState=0;
masterkookus 7:be13a9037d41 371 net2->sendTime=0;
masterkookus 5:c656fd08007b 372 }
masterkookus 5:c656fd08007b 373 }
masterkookus 5:c656fd08007b 374 }
masterkookus 10:9da863a6da3e 375 //Attempt to send data
masterkookus 7:be13a9037d41 376 while (net2->sendState==4)
masterkookus 5:c656fd08007b 377 {
masterkookus 10:9da863a6da3e 378 //Delay send data attempt if previous attempt failed
masterkookus 5:c656fd08007b 379 if (net2->sendRetry == true)
masterkookus 5:c656fd08007b 380 {
masterkookus 5:c656fd08007b 381 wait_ms(100);
masterkookus 5:c656fd08007b 382 }
masterkookus 10:9da863a6da3e 383 //Attempt to send data
masterkookus 7:be13a9037d41 384 ret = net2->srv_sock.send(net2->sendString,net2->sendLen);
masterkookus 10:9da863a6da3e 385 //If data send successful proceed to wait for response
masterkookus 5:c656fd08007b 386 if (ret>=0)
masterkookus 5:c656fd08007b 387 {
masterkookus 5:c656fd08007b 388 printf("Send Result %d\r\n",ret);
masterkookus 5:c656fd08007b 389 net2->sendRetry = false;
masterkookus 5:c656fd08007b 390 net2->txMessageCount++;
masterkookus 8:fa2a2c3a16ce 391 net2->sendState=5;
masterkookus 7:be13a9037d41 392 net2->sendTime=0;
masterkookus 5:c656fd08007b 393 }
masterkookus 10:9da863a6da3e 394 //If send attempt failed attempt to re-send data
masterkookus 5:c656fd08007b 395 else
masterkookus 5:c656fd08007b 396 {
masterkookus 5:c656fd08007b 397 net2->sendRetry = true;
masterkookus 7:be13a9037d41 398 net2->sendRetryCount++;
masterkookus 5:c656fd08007b 399 printf("Send Attempt Failed, Code: %d\r\n",ret);
masterkookus 10:9da863a6da3e 400 //If send attempt failed exceeds 3 then end attempt
masterkookus 7:be13a9037d41 401 if (net2->sendRetryCount>3)
masterkookus 5:c656fd08007b 402 {
masterkookus 5:c656fd08007b 403 printf("Communication Failed, Closing\r\n");
masterkookus 5:c656fd08007b 404 net2->sendRetry = false;
masterkookus 7:be13a9037d41 405 net2->sendRetryCount = 0;
masterkookus 5:c656fd08007b 406 net2->messageFailCount++;
masterkookus 6:9f97716eae76 407 net2->cltCloseConnection=true;
masterkookus 7:be13a9037d41 408 net2->sendState=0;
masterkookus 7:be13a9037d41 409 net2->sendTime=0;
masterkookus 5:c656fd08007b 410 }
masterkookus 5:c656fd08007b 411 }
masterkookus 5:c656fd08007b 412 }
masterkookus 8:fa2a2c3a16ce 413 }
masterkookus 8:fa2a2c3a16ce 414 }
masterkookus 8:fa2a2c3a16ce 415 }
masterkookus 8:fa2a2c3a16ce 416
masterkookus 8:fa2a2c3a16ce 417 //Ethernet receive data and send to aux devices (serial, etc...)
masterkookus 8:fa2a2c3a16ce 418 void datancrx(netsys *net2)
masterkookus 8:fa2a2c3a16ce 419 {
masterkookus 8:fa2a2c3a16ce 420 char rxbuf[256];
masterkookus 8:fa2a2c3a16ce 421 int rxlen=0;
masterkookus 8:fa2a2c3a16ce 422 int rxc;
masterkookus 8:fa2a2c3a16ce 423 while (1)
masterkookus 8:fa2a2c3a16ce 424 {
masterkookus 10:9da863a6da3e 425 //If the client is active check to see if data has been received
masterkookus 8:fa2a2c3a16ce 426 while (net2->cltIsActive)
masterkookus 8:fa2a2c3a16ce 427 {
masterkookus 10:9da863a6da3e 428 //Store the length of the received data
masterkookus 8:fa2a2c3a16ce 429 rxlen=net2->srv_sock.recv(rxbuf, sizeof(rxbuf));
masterkookus 10:9da863a6da3e 430 //if there is data then push data into received buffer
masterkookus 8:fa2a2c3a16ce 431 if (rxlen>0)
masterkookus 5:c656fd08007b 432 {
masterkookus 8:fa2a2c3a16ce 433 net2->aliveTime=0;
masterkookus 8:fa2a2c3a16ce 434 for (rxc = 0;rxc<rxlen;rxc++)
masterkookus 8:fa2a2c3a16ce 435 {
masterkookus 8:fa2a2c3a16ce 436 receiveBuffer.push(rxbuf[rxc]);
masterkookus 8:fa2a2c3a16ce 437 }
masterkookus 8:fa2a2c3a16ce 438 printf("Client Received Data\r\n");
masterkookus 10:9da863a6da3e 439 //Increment received message counter
masterkookus 8:fa2a2c3a16ce 440 net2->rxMessageCount++;
masterkookus 5:c656fd08007b 441 }
masterkookus 0:03ab7f7596e2 442 }
masterkookus 0:03ab7f7596e2 443 }
masterkookus 0:03ab7f7596e2 444 }
masterkookus 0:03ab7f7596e2 445
masterkookus 7:be13a9037d41 446 //Ethernet receive data and send to aux devices (serial, etc...)
masterkookus 8:fa2a2c3a16ce 447 void datansrx(netsys *net2)
masterkookus 0:03ab7f7596e2 448 {
masterkookus 0:03ab7f7596e2 449 char rxbuf[256];
masterkookus 0:03ab7f7596e2 450 int rxlen=0;
masterkookus 5:c656fd08007b 451 int rxc;
masterkookus 0:03ab7f7596e2 452 while (1)
masterkookus 0:03ab7f7596e2 453 {
masterkookus 10:9da863a6da3e 454 //If the server is active check to see if data has been received
masterkookus 6:9f97716eae76 455 while (net2->srvIsActive)
masterkookus 0:03ab7f7596e2 456 {
masterkookus 10:9da863a6da3e 457 //Store the length of the received data
masterkookus 0:03ab7f7596e2 458 rxlen=net2->clt_sock.recv(rxbuf, sizeof(rxbuf));
masterkookus 10:9da863a6da3e 459 //if there is data then push data into received buffer
masterkookus 4:98cdccfb17d6 460 if (rxlen>0)
masterkookus 4:98cdccfb17d6 461 {
masterkookus 4:98cdccfb17d6 462 net2->aliveTime=0;
masterkookus 5:c656fd08007b 463 for (rxc = 0;rxc<rxlen;rxc++)
masterkookus 5:c656fd08007b 464 {
masterkookus 7:be13a9037d41 465 receiveBuffer.push(rxbuf[rxc]);
masterkookus 5:c656fd08007b 466 }
masterkookus 8:fa2a2c3a16ce 467 printf("Server Received Data\r\n");
masterkookus 10:9da863a6da3e 468 //Increment received message counter
masterkookus 5:c656fd08007b 469 net2->rxMessageCount++;
masterkookus 4:98cdccfb17d6 470 }
masterkookus 0:03ab7f7596e2 471 }
masterkookus 0:03ab7f7596e2 472 }
masterkookus 0:03ab7f7596e2 473 }
masterkookus 0:03ab7f7596e2 474
masterkookus 8:fa2a2c3a16ce 475 //Serial device to server
masterkookus 0:03ab7f7596e2 476 void datasrx(netsys *net2)
masterkookus 0:03ab7f7596e2 477 {
masterkookus 0:03ab7f7596e2 478 char rxbuf[256];
masterkookus 0:03ab7f7596e2 479 int rxlen=0;
masterkookus 9:d6e7981dfc89 480 int rxindex=0;
masterkookus 0:03ab7f7596e2 481 int rxc;
masterkookus 9:d6e7981dfc89 482 bool crRx = false;
masterkookus 9:d6e7981dfc89 483 int4byte cmdpack;
masterkookus 9:d6e7981dfc89 484
masterkookus 0:03ab7f7596e2 485 while (1)
masterkookus 0:03ab7f7596e2 486 {
masterkookus 10:9da863a6da3e 487 //Check to see if there is any data received by serial port and store length
masterkookus 9:d6e7981dfc89 488 rxlen=sport0.readable();
masterkookus 10:9da863a6da3e 489 //If data is ready push into receive buffer
masterkookus 9:d6e7981dfc89 490 if (rxlen>0)
masterkookus 0:03ab7f7596e2 491 {
masterkookus 9:d6e7981dfc89 492 for (rxc=0;rxc<rxlen;rxc++)
masterkookus 9:d6e7981dfc89 493 {
masterkookus 9:d6e7981dfc89 494 rxbuf[rxindex+rxc]=sport0.getc();
masterkookus 10:9da863a6da3e 495 //Check to see if a carriage return has been detected
masterkookus 9:d6e7981dfc89 496 if (rxbuf[rxindex+rxc]=='\r')
masterkookus 9:d6e7981dfc89 497 {
masterkookus 9:d6e7981dfc89 498 crRx=true;
masterkookus 9:d6e7981dfc89 499 }
masterkookus 9:d6e7981dfc89 500 }
masterkookus 10:9da863a6da3e 501 //Store the current cursor location in the buffer
masterkookus 9:d6e7981dfc89 502 rxindex=rxindex+rxlen;
masterkookus 10:9da863a6da3e 503 //printf("%d\r\n",rxlen);
masterkookus 10:9da863a6da3e 504 //printf("%d\r\n",rxindex);
masterkookus 10:9da863a6da3e 505 //Set the received length to zero
masterkookus 9:d6e7981dfc89 506 rxlen=0;
masterkookus 10:9da863a6da3e 507 //If there is data in the buffer and a carriage return has been detected search for a command
masterkookus 9:d6e7981dfc89 508 if ((rxindex>2) && (crRx==true))
masterkookus 0:03ab7f7596e2 509 {
masterkookus 10:9da863a6da3e 510 //Set the carriage return flag false
masterkookus 9:d6e7981dfc89 511 crRx=false;
masterkookus 9:d6e7981dfc89 512 for (rxc=0;rxc<=rxindex-3;rxc++)
masterkookus 0:03ab7f7596e2 513 {
masterkookus 9:d6e7981dfc89 514 cmdpack.bytes[3]=rxbuf[rxc];
masterkookus 9:d6e7981dfc89 515 cmdpack.bytes[2]=rxbuf[rxc+1];
masterkookus 9:d6e7981dfc89 516 cmdpack.bytes[1]=rxbuf[rxc+2];
masterkookus 9:d6e7981dfc89 517 cmdpack.bytes[0]=rxbuf[rxc+3];
masterkookus 10:9da863a6da3e 518 //printf("%08x\r\n",cmdpack.cmdint);
masterkookus 10:9da863a6da3e 519 //Search for the Min/Max command
masterkookus 9:d6e7981dfc89 520 if (cmdpack.cmdint==0x4d45544d)
masterkookus 9:d6e7981dfc89 521 {
masterkookus 9:d6e7981dfc89 522 printf("MIN MAX METERING\r\n");
masterkookus 9:d6e7981dfc89 523 net2->devMsgReq=1;
masterkookus 9:d6e7981dfc89 524 net2->devMsgPos=2;
masterkookus 9:d6e7981dfc89 525 rxindex=0;
masterkookus 9:d6e7981dfc89 526 }
masterkookus 10:9da863a6da3e 527 //Search for the Tap Report Command
masterkookus 9:d6e7981dfc89 528 if (cmdpack.cmdint==0x54415052)
masterkookus 9:d6e7981dfc89 529 {
masterkookus 9:d6e7981dfc89 530 printf("TAP REPORT\r\n");
masterkookus 9:d6e7981dfc89 531 net2->devMsgReq=2;
masterkookus 9:d6e7981dfc89 532 net2->devMsgPos=2;
masterkookus 9:d6e7981dfc89 533 rxindex=0;
masterkookus 9:d6e7981dfc89 534 }
masterkookus 0:03ab7f7596e2 535 }
masterkookus 10:9da863a6da3e 536 //If no command found set cursor location to zero
masterkookus 9:d6e7981dfc89 537 if (rxindex>0)
masterkookus 9:d6e7981dfc89 538 {
masterkookus 9:d6e7981dfc89 539 printf("Serial Command Not Found");
masterkookus 9:d6e7981dfc89 540 rxindex=0;
masterkookus 9:d6e7981dfc89 541 }
masterkookus 0:03ab7f7596e2 542 }
masterkookus 0:03ab7f7596e2 543 }
masterkookus 0:03ab7f7596e2 544 }
masterkookus 0:03ab7f7596e2 545 }
masterkookus 0:03ab7f7596e2 546
masterkookus 2:ec972966689e 547 //Checks for a Ethernet to Serial connection
masterkookus 0:03ab7f7596e2 548 void conchk(netsys *net2)
masterkookus 0:03ab7f7596e2 549 {
masterkookus 0:03ab7f7596e2 550 TCPServer *server=&(net2->srv);
masterkookus 0:03ab7f7596e2 551 TCPSocket *client_socket=&(net2->clt_sock);
masterkookus 0:03ab7f7596e2 552 SocketAddress *client_address=&(net2->clt_addr);
masterkookus 0:03ab7f7596e2 553
masterkookus 0:03ab7f7596e2 554 while(1)
masterkookus 0:03ab7f7596e2 555 {
masterkookus 10:9da863a6da3e 556 //Wait for someone to connect
masterkookus 5:c656fd08007b 557 while (server->accept(client_socket, client_address) < 0)
masterkookus 0:03ab7f7596e2 558 {
masterkookus 5:c656fd08007b 559 //printf("Connection Failed.\r\n");
masterkookus 0:03ab7f7596e2 560 }
masterkookus 6:9f97716eae76 561 printf("Server Port %d\r\n", net2->srvPort);
masterkookus 5:c656fd08007b 562 printf("accept %s:%d\r\n", client_address->get_ip_address(), client_address->get_port());
masterkookus 5:c656fd08007b 563 net2->aliveTime=0;
masterkookus 6:9f97716eae76 564 net2->srvIsActive=true;
masterkookus 0:03ab7f7596e2 565 }
masterkookus 0:03ab7f7596e2 566 }
masterkookus 0:03ab7f7596e2 567
masterkookus 10:9da863a6da3e 568 void sendCmd(char cmdNum)
masterkookus 10:9da863a6da3e 569 {
masterkookus 10:9da863a6da3e 570 sendLength.push(2);
masterkookus 10:9da863a6da3e 571 for (char txc=0;txc<2;txc++)
masterkookus 10:9da863a6da3e 572 {
masterkookus 10:9da863a6da3e 573 sendBuffer.push(fmCmd[cmdNum][txc]);
masterkookus 10:9da863a6da3e 574 }
masterkookus 10:9da863a6da3e 575 }
masterkookus 10:9da863a6da3e 576
masterkookus 0:03ab7f7596e2 577 int main()
masterkookus 0:03ab7f7596e2 578 {
masterkookus 0:03ab7f7596e2 579 EthernetInterface eth;
masterkookus 7:be13a9037d41 580 eth.set_network(setseveraddress,setsevermask,setsevergateway); //Use these parameters for static IP
masterkookus 0:03ab7f7596e2 581 eth.connect();
masterkookus 0:03ab7f7596e2 582
masterkookus 8:fa2a2c3a16ce 583 initVoltageRegulator(&vReg1);
masterkookus 8:fa2a2c3a16ce 584
masterkookus 0:03ab7f7596e2 585 printf("The target IP address is '%s'\r\n", eth.get_ip_address());
masterkookus 8:fa2a2c3a16ce 586 printf("%s\r\n",vReg1.analogs[0].analogName);
masterkookus 4:98cdccfb17d6 587 confignetdevices(&eth);
masterkookus 2:ec972966689e 588 /* Setup Ethernet to Serial Connection Thread */
masterkookus 0:03ab7f7596e2 589 conchkthread[0].start(callback(conchk,&net1));
masterkookus 2:ec972966689e 590 /* Setup polltick Ticker */
masterkookus 7:be13a9037d41 591 nettimer.attach_us(heartbeat,10000);
masterkookus 2:ec972966689e 592 /* Setup Ethernet to Serial transmit data Thread */
masterkookus 8:fa2a2c3a16ce 593 rxtxdatathread[0].start(callback(datansrx,&net1));
masterkookus 8:fa2a2c3a16ce 594 rxtxdatathread[1].start(callback(datancrx,&net1));
masterkookus 2:ec972966689e 595 /* Setup Ethernet to Serial receive data Thread */
masterkookus 8:fa2a2c3a16ce 596 rxtxdatathread[2].start(callback(datasrx,&net1));
masterkookus 8:fa2a2c3a16ce 597 rxtxdatathread[3].start(callback(datantx,&net1));
masterkookus 8:fa2a2c3a16ce 598 rxtxdatathread[4].start(callback(dataprocess,&net1));
masterkookus 7:be13a9037d41 599
masterkookus 7:be13a9037d41 600 unsigned int txc;
masterkookus 7:be13a9037d41 601 unsigned int sxc;
masterkookus 3:ac1f2af8bd0f 602
masterkookus 0:03ab7f7596e2 603 while (true) {
masterkookus 3:ac1f2af8bd0f 604
masterkookus 3:ac1f2af8bd0f 605 polltick=getTick();
masterkookus 3:ac1f2af8bd0f 606
masterkookus 3:ac1f2af8bd0f 607 if (polltick)
masterkookus 3:ac1f2af8bd0f 608 {
masterkookus 3:ac1f2af8bd0f 609 setTick(false);
masterkookus 3:ac1f2af8bd0f 610 incTime();
masterkookus 3:ac1f2af8bd0f 611 currenttime=getTime();
masterkookus 6:9f97716eae76 612 net1.pollTime++;
masterkookus 10:9da863a6da3e 613 net1.fmPollTime++;
masterkookus 10:9da863a6da3e 614 net1.fmdPollTime++;
masterkookus 7:be13a9037d41 615 net1.sendTime++;
masterkookus 6:9f97716eae76 616 if (net1.srvIsActive)
masterkookus 0:03ab7f7596e2 617 {
masterkookus 4:98cdccfb17d6 618 net1.aliveTime++;
masterkookus 6:9f97716eae76 619 if (net1.aliveTime>net1.aliveTimeout)
masterkookus 4:98cdccfb17d6 620 {
masterkookus 4:98cdccfb17d6 621 printf("Closed\r\n");
masterkookus 4:98cdccfb17d6 622 net1.clt_sock.close();
masterkookus 6:9f97716eae76 623 net1.srvIsActive=false;
masterkookus 6:9f97716eae76 624 net1.srvCloseConnection=false;
masterkookus 4:98cdccfb17d6 625 }
masterkookus 4:98cdccfb17d6 626
masterkookus 0:03ab7f7596e2 627 }
masterkookus 7:be13a9037d41 628 if (net1.pollEnabled)
masterkookus 4:98cdccfb17d6 629 {
masterkookus 10:9da863a6da3e 630 if (net1.pollTime >= setpollinterval)
masterkookus 7:be13a9037d41 631 {
masterkookus 9:d6e7981dfc89 632 if ((net1.sendState==0)||(net1.sendState==5))
masterkookus 7:be13a9037d41 633 {
masterkookus 9:d6e7981dfc89 634 if (net1.devMsgReq>0)
masterkookus 9:d6e7981dfc89 635 {
masterkookus 9:d6e7981dfc89 636 net1.serTimeoutCount=0;
masterkookus 9:d6e7981dfc89 637 sendLength.push(serCmdSeq[2][net1.devMsgPos]);
masterkookus 9:d6e7981dfc89 638 for (txc=0;txc<serCmdSeq[2][net1.devMsgPos];txc++)
masterkookus 9:d6e7981dfc89 639 {
masterkookus 9:d6e7981dfc89 640 sendBuffer.push(serCmd[serCmdSeq[net1.devMsgReq-1][net1.devMsgPos]][txc]);
masterkookus 9:d6e7981dfc89 641 }
masterkookus 9:d6e7981dfc89 642 if (net1.serIsActive==false)
masterkookus 9:d6e7981dfc89 643 {
masterkookus 9:d6e7981dfc89 644 net1.serIsActive=true;
masterkookus 9:d6e7981dfc89 645 }
masterkookus 9:d6e7981dfc89 646 }
masterkookus 9:d6e7981dfc89 647 else
masterkookus 9:d6e7981dfc89 648 {
masterkookus 10:9da863a6da3e 649 if (net1.configState<9)
masterkookus 9:d6e7981dfc89 650 {
masterkookus 10:9da863a6da3e 651 sendCmd(net1.configState);
masterkookus 10:9da863a6da3e 652 if (net1.sendState==0)
masterkookus 10:9da863a6da3e 653 {
masterkookus 10:9da863a6da3e 654 net1.sendState=1;
masterkookus 10:9da863a6da3e 655 net1.pollRequestSent=true;
masterkookus 10:9da863a6da3e 656 }
masterkookus 10:9da863a6da3e 657 }
masterkookus 10:9da863a6da3e 658 }
masterkookus 10:9da863a6da3e 659
masterkookus 10:9da863a6da3e 660 }
masterkookus 10:9da863a6da3e 661 net1.pollTime=0;
masterkookus 10:9da863a6da3e 662 }
masterkookus 10:9da863a6da3e 663 if (net1.fmPollTime >= setfmpollinterval)
masterkookus 10:9da863a6da3e 664 {
masterkookus 10:9da863a6da3e 665 if (net1.serIsActive==false)
masterkookus 10:9da863a6da3e 666 {
masterkookus 10:9da863a6da3e 667 if ((net1.sendState==0)||(net1.sendState==5))
masterkookus 10:9da863a6da3e 668 {
masterkookus 10:9da863a6da3e 669 {
masterkookus 10:9da863a6da3e 670 if (net1.fmEnabled)
masterkookus 10:9da863a6da3e 671 {
masterkookus 10:9da863a6da3e 672 sendCmd(2);
masterkookus 10:9da863a6da3e 673 if (net1.sendState==0)
masterkookus 10:9da863a6da3e 674 {
masterkookus 10:9da863a6da3e 675 net1.sendState=1;
masterkookus 10:9da863a6da3e 676 net1.pollRequestSent=true;
masterkookus 10:9da863a6da3e 677 }
masterkookus 10:9da863a6da3e 678 }
masterkookus 9:d6e7981dfc89 679 }
masterkookus 9:d6e7981dfc89 680 }
masterkookus 10:9da863a6da3e 681 if (net1.fmPollTime>setfmpollinterval)
masterkookus 9:d6e7981dfc89 682 {
masterkookus 10:9da863a6da3e 683 net1.fmPollTime=net1.fmPollTime-setfmpollinterval;
masterkookus 10:9da863a6da3e 684 }
masterkookus 10:9da863a6da3e 685 else
masterkookus 10:9da863a6da3e 686 {
masterkookus 10:9da863a6da3e 687 net1.fmPollTime=0;
masterkookus 9:d6e7981dfc89 688 }
masterkookus 7:be13a9037d41 689 }
masterkookus 10:9da863a6da3e 690 }
masterkookus 10:9da863a6da3e 691 if (net1.fmdPollTime >= setfmdemandpollinterval)
masterkookus 10:9da863a6da3e 692 {
masterkookus 10:9da863a6da3e 693 if (net1.serIsActive==false)
masterkookus 10:9da863a6da3e 694 {
masterkookus 10:9da863a6da3e 695 if ((net1.sendState==0)||(net1.sendState==5))
masterkookus 10:9da863a6da3e 696 {
masterkookus 10:9da863a6da3e 697 {
masterkookus 10:9da863a6da3e 698 if (net1.fmdEnabled)
masterkookus 10:9da863a6da3e 699 {
masterkookus 10:9da863a6da3e 700 sendCmd(4);
masterkookus 10:9da863a6da3e 701 if (net1.sendState==0)
masterkookus 10:9da863a6da3e 702 {
masterkookus 10:9da863a6da3e 703 net1.sendState=1;
masterkookus 10:9da863a6da3e 704 net1.pollRequestSent=true;
masterkookus 10:9da863a6da3e 705 }
masterkookus 10:9da863a6da3e 706 }
masterkookus 10:9da863a6da3e 707 }
masterkookus 10:9da863a6da3e 708 }
masterkookus 10:9da863a6da3e 709 if (net1.fmdPollTime>setfmdemandpollinterval)
masterkookus 10:9da863a6da3e 710 {
masterkookus 10:9da863a6da3e 711 net1.fmdPollTime=net1.fmdPollTime-setfmdemandpollinterval;
masterkookus 10:9da863a6da3e 712 }
masterkookus 10:9da863a6da3e 713 else
masterkookus 10:9da863a6da3e 714 {
masterkookus 10:9da863a6da3e 715 net1.fmdPollTime=0;
masterkookus 10:9da863a6da3e 716 }
masterkookus 10:9da863a6da3e 717 }
masterkookus 7:be13a9037d41 718 }
masterkookus 9:d6e7981dfc89 719 if ((net1.sendState==5) || (net1.serIsActive))
masterkookus 7:be13a9037d41 720 {
masterkookus 8:fa2a2c3a16ce 721 net1.pollTimeout++;
masterkookus 8:fa2a2c3a16ce 722 if (net1.pollTimeout==setpolltimeout)
masterkookus 7:be13a9037d41 723 {
masterkookus 8:fa2a2c3a16ce 724 if (net1.pollRequestSent)
masterkookus 7:be13a9037d41 725 {
masterkookus 8:fa2a2c3a16ce 726 printf("Poll Request Sent\r\n");
masterkookus 8:fa2a2c3a16ce 727 if (net1.pollResponseReceived==false)
masterkookus 8:fa2a2c3a16ce 728 {
masterkookus 8:fa2a2c3a16ce 729 printf("Poll Response Not Received\r\n");
masterkookus 8:fa2a2c3a16ce 730 }
masterkookus 8:fa2a2c3a16ce 731 else
masterkookus 8:fa2a2c3a16ce 732 {
masterkookus 8:fa2a2c3a16ce 733 printf("Poll Response Received\r\n");
masterkookus 8:fa2a2c3a16ce 734 }
masterkookus 7:be13a9037d41 735 net1.pollRequestSent=false;
masterkookus 8:fa2a2c3a16ce 736 net1.pollResponseReceived=false;
masterkookus 9:d6e7981dfc89 737 if (net1.serIsActive==false)
masterkookus 9:d6e7981dfc89 738 {
masterkookus 9:d6e7981dfc89 739 net1.cltCloseConnection=true;
masterkookus 9:d6e7981dfc89 740 net1.sendState=0;
masterkookus 9:d6e7981dfc89 741 }
masterkookus 9:d6e7981dfc89 742 }
masterkookus 9:d6e7981dfc89 743 if (net1.serIsActive)
masterkookus 9:d6e7981dfc89 744 {
masterkookus 9:d6e7981dfc89 745 if ((net1.serTimeoutCount==sertimeoutperiods) || (net1.devMsgReq==0))
masterkookus 9:d6e7981dfc89 746 {
masterkookus 10:9da863a6da3e 747 net1.devMsgOpenRx=false;
masterkookus 9:d6e7981dfc89 748 net1.cltCloseConnection=true;
masterkookus 9:d6e7981dfc89 749 net1.devMsgReq=0;
masterkookus 9:d6e7981dfc89 750 net1.serIsActive=false;
masterkookus 9:d6e7981dfc89 751 net1.sendState=0;
masterkookus 9:d6e7981dfc89 752 }
masterkookus 9:d6e7981dfc89 753 else
masterkookus 9:d6e7981dfc89 754 {
masterkookus 9:d6e7981dfc89 755 net1.pollTimeout=0;
masterkookus 9:d6e7981dfc89 756 net1.serTimeoutCount++;
masterkookus 9:d6e7981dfc89 757 printf("Serial Active Timeout Count: %d\r\n",net1.serTimeoutCount);
masterkookus 9:d6e7981dfc89 758 }
masterkookus 7:be13a9037d41 759 }
masterkookus 7:be13a9037d41 760 }
masterkookus 7:be13a9037d41 761 }
masterkookus 8:fa2a2c3a16ce 762 else
masterkookus 8:fa2a2c3a16ce 763 {
masterkookus 8:fa2a2c3a16ce 764 net1.pollTimeout=0;
masterkookus 8:fa2a2c3a16ce 765 }
masterkookus 7:be13a9037d41 766 }
masterkookus 7:be13a9037d41 767 if (net1.sendTime == 10)
masterkookus 7:be13a9037d41 768 {
masterkookus 7:be13a9037d41 769 switch (net1.sendState)
masterkookus 5:c656fd08007b 770 {
masterkookus 5:c656fd08007b 771 case 1:
masterkookus 7:be13a9037d41 772 if (!sendLength.empty())
masterkookus 7:be13a9037d41 773 {
masterkookus 7:be13a9037d41 774 sendLength.pop(net1.sendLen);
masterkookus 7:be13a9037d41 775 for (sxc=0;sxc<net1.sendLen;sxc++)
masterkookus 7:be13a9037d41 776 {
masterkookus 7:be13a9037d41 777 sendBuffer.pop(net1.sendString[sxc]);
masterkookus 7:be13a9037d41 778 }
masterkookus 7:be13a9037d41 779 }
masterkookus 7:be13a9037d41 780 else
masterkookus 7:be13a9037d41 781 {
masterkookus 7:be13a9037d41 782 net1.sendState=0;
masterkookus 7:be13a9037d41 783 }
masterkookus 6:9f97716eae76 784 ret=net1.srv_sock.open(&eth);
masterkookus 5:c656fd08007b 785 printf("Socket%d\r\n",ret);
masterkookus 5:c656fd08007b 786 if (ret < 0)
masterkookus 5:c656fd08007b 787 {
masterkookus 8:fa2a2c3a16ce 788 if (ret==-3003)
masterkookus 8:fa2a2c3a16ce 789 {
masterkookus 8:fa2a2c3a16ce 790 printf("May already be attached, attempting connect.\r\n");
masterkookus 8:fa2a2c3a16ce 791 }
masterkookus 8:fa2a2c3a16ce 792 else
masterkookus 8:fa2a2c3a16ce 793 {
masterkookus 8:fa2a2c3a16ce 794 net1.attachRetry = true;
masterkookus 8:fa2a2c3a16ce 795 net1.sendRetryCount=0;
masterkookus 8:fa2a2c3a16ce 796 net1.sendState=2;
masterkookus 8:fa2a2c3a16ce 797 net1.sendTime=0;
masterkookus 8:fa2a2c3a16ce 798 break;
masterkookus 8:fa2a2c3a16ce 799 }
masterkookus 5:c656fd08007b 800 }
masterkookus 7:be13a9037d41 801 net1.sendState=3;
masterkookus 7:be13a9037d41 802 net1.sendTime=11;
masterkookus 6:9f97716eae76 803 net1.cltIsActive=true;
masterkookus 5:c656fd08007b 804 break;
masterkookus 5:c656fd08007b 805 case 2:
masterkookus 6:9f97716eae76 806 ret=net1.srv_sock.open(&eth);
masterkookus 5:c656fd08007b 807 printf("Socket%d\r\n",ret);
masterkookus 5:c656fd08007b 808 if (ret < 0)
masterkookus 5:c656fd08007b 809 {
masterkookus 7:be13a9037d41 810 net1.attachRetry = true;
masterkookus 7:be13a9037d41 811 net1.sendRetryCount++;
masterkookus 7:be13a9037d41 812 net1.sendTime=0;
masterkookus 5:c656fd08007b 813 printf("Attach Attempt Failed, Code: %d\r\n",ret);
masterkookus 7:be13a9037d41 814 if (net1.sendRetryCount>3)
masterkookus 5:c656fd08007b 815 {
masterkookus 5:c656fd08007b 816 printf("Communication Failed, Closing\r\n");
masterkookus 7:be13a9037d41 817 net1.attachRetry = false;
masterkookus 7:be13a9037d41 818 net1.sendRetryCount = 0;
masterkookus 6:9f97716eae76 819 net1.messageFailCount++;
masterkookus 7:be13a9037d41 820 net1.sendState=0;
masterkookus 7:be13a9037d41 821 net1.sendTime=0;
masterkookus 5:c656fd08007b 822 }
masterkookus 5:c656fd08007b 823 break;
masterkookus 5:c656fd08007b 824 }
masterkookus 7:be13a9037d41 825 net1.sendState=0;
masterkookus 7:be13a9037d41 826 net1.attachRetry = false;
masterkookus 7:be13a9037d41 827 net1.sendTime=11;
masterkookus 6:9f97716eae76 828 net1.cltIsActive=true;
masterkookus 5:c656fd08007b 829 break;
masterkookus 5:c656fd08007b 830 default:
masterkookus 7:be13a9037d41 831 net1.sendTime=0;
masterkookus 7:be13a9037d41 832 if (!sendLength.empty())
masterkookus 7:be13a9037d41 833 {
masterkookus 8:fa2a2c3a16ce 834 if (net1.sendState==5)
masterkookus 8:fa2a2c3a16ce 835 {
masterkookus 9:d6e7981dfc89 836
masterkookus 9:d6e7981dfc89 837 sendLength.pop(net1.sendLen);
masterkookus 9:d6e7981dfc89 838 for (sxc=0;sxc<net1.sendLen;sxc++)
masterkookus 8:fa2a2c3a16ce 839 {
masterkookus 9:d6e7981dfc89 840 sendBuffer.pop(net1.sendString[sxc]);
masterkookus 8:fa2a2c3a16ce 841 }
masterkookus 8:fa2a2c3a16ce 842 net1.sendState=4;
masterkookus 8:fa2a2c3a16ce 843 }
masterkookus 8:fa2a2c3a16ce 844 else
masterkookus 8:fa2a2c3a16ce 845 {
masterkookus 8:fa2a2c3a16ce 846 net1.sendState=1;
masterkookus 8:fa2a2c3a16ce 847 }
masterkookus 7:be13a9037d41 848 }
masterkookus 5:c656fd08007b 849 break;
masterkookus 5:c656fd08007b 850 }
masterkookus 4:98cdccfb17d6 851 }
masterkookus 1:a57cbebba3fd 852 }
masterkookus 8:fa2a2c3a16ce 853 if (net1.cltCloseConnection==true)
masterkookus 8:fa2a2c3a16ce 854 {
masterkookus 8:fa2a2c3a16ce 855 printf("Client Socket Closed\r\n");
masterkookus 8:fa2a2c3a16ce 856 net1.srv_sock.close();
masterkookus 8:fa2a2c3a16ce 857 net1.cltIsActive=false;
masterkookus 8:fa2a2c3a16ce 858 net1.cltCloseConnection=false;
masterkookus 8:fa2a2c3a16ce 859 net1.sendState=0;
masterkookus 8:fa2a2c3a16ce 860 }
masterkookus 0:03ab7f7596e2 861 }
masterkookus 0:03ab7f7596e2 862 }