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
main.cpp@9:d6e7981dfc89, 2019-10-01 (annotated)
- Committer:
- masterkookus
- Date:
- Tue Oct 01 15:51:59 2019 +0000
- Revision:
- 9:d6e7981dfc89
- Parent:
- 8:fa2a2c3a16ce
- Child:
- 10:9da863a6da3e
Polling+Tap Command and Metering Command
Who changed what in which revision?
User | Revision | Line number | New 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 | //polltick=true; |
masterkookus | 3:ac1f2af8bd0f | 43 | setTick(true); |
masterkookus | 1:a57cbebba3fd | 44 | } |
masterkookus | 1:a57cbebba3fd | 45 | |
masterkookus | 4:98cdccfb17d6 | 46 | void confignetdevices(EthernetInterface *eth) |
masterkookus | 4:98cdccfb17d6 | 47 | { |
masterkookus | 7:be13a9037d41 | 48 | net1.cltPort=setclientport; |
masterkookus | 7:be13a9037d41 | 49 | net1.srv_addr=setclientaddress; |
masterkookus | 6:9f97716eae76 | 50 | net1.cltIsActive=false; |
masterkookus | 9:d6e7981dfc89 | 51 | net1.serIsActive=false; |
masterkookus | 6:9f97716eae76 | 52 | net1.cltCloseConnection=false; |
masterkookus | 6:9f97716eae76 | 53 | net1.pollTime=0; |
masterkookus | 8:fa2a2c3a16ce | 54 | net1.pollTimeout=0; |
masterkookus | 7:be13a9037d41 | 55 | net1.pollInterval=setpollinterval; |
masterkookus | 7:be13a9037d41 | 56 | net1.pollRequestSent=false; |
masterkookus | 7:be13a9037d41 | 57 | net1.pollResponseReceived=false; |
masterkookus | 8:fa2a2c3a16ce | 58 | net1.srv_sock.set_blocking(true); |
masterkookus | 8:fa2a2c3a16ce | 59 | net1.srv_sock.set_timeout(100); |
masterkookus | 7:be13a9037d41 | 60 | net1.aliveTimeout=setservertimeout; |
masterkookus | 8:fa2a2c3a16ce | 61 | net1.srv.set_blocking(true); |
masterkookus | 8:fa2a2c3a16ce | 62 | net1.srv.set_timeout(100); |
masterkookus | 7:be13a9037d41 | 63 | net1.pollEnabled=setpollenabled; |
masterkookus | 7:be13a9037d41 | 64 | net1.pollTimeoutCount=0; |
masterkookus | 8:fa2a2c3a16ce | 65 | net1.pollState=0; |
masterkookus | 8:fa2a2c3a16ce | 66 | net1.pollTimeoutCount=0; |
masterkookus | 8:fa2a2c3a16ce | 67 | net1.sendRetryCount=0; |
masterkookus | 8:fa2a2c3a16ce | 68 | net1.messageFailCount=0; |
masterkookus | 8:fa2a2c3a16ce | 69 | net1.txMessageCount=0; |
masterkookus | 8:fa2a2c3a16ce | 70 | net1.rxMessageCount=0; |
masterkookus | 9:d6e7981dfc89 | 71 | net1.connectCmd=false; |
masterkookus | 4:98cdccfb17d6 | 72 | |
masterkookus | 4:98cdccfb17d6 | 73 | /* Open the server on ethernet stack */ |
masterkookus | 4:98cdccfb17d6 | 74 | net1.srv.open(eth); |
masterkookus | 6:9f97716eae76 | 75 | net1.srvIsActive=false; |
masterkookus | 6:9f97716eae76 | 76 | net1.srvCloseConnection=false; |
masterkookus | 4:98cdccfb17d6 | 77 | |
masterkookus | 4:98cdccfb17d6 | 78 | /* Bind port 23 to the server */ |
masterkookus | 7:be13a9037d41 | 79 | net1.srvPort=setserverport; |
masterkookus | 6:9f97716eae76 | 80 | net1.srv.bind(net1.srvPort); |
masterkookus | 4:98cdccfb17d6 | 81 | |
masterkookus | 4:98cdccfb17d6 | 82 | /* Can handle 5 simultaneous connections */ |
masterkookus | 4:98cdccfb17d6 | 83 | net1.srv.listen(5); |
masterkookus | 7:be13a9037d41 | 84 | sport0.baud(sport0baud); |
masterkookus | 4:98cdccfb17d6 | 85 | } |
masterkookus | 4:98cdccfb17d6 | 86 | |
masterkookus | 7:be13a9037d41 | 87 | void dataprocess(netsys *net2) |
masterkookus | 0:03ab7f7596e2 | 88 | { |
masterkookus | 7:be13a9037d41 | 89 | int txc; |
masterkookus | 5:c656fd08007b | 90 | char cchar; |
masterkookus | 5:c656fd08007b | 91 | char cbuf[256]; |
masterkookus | 5:c656fd08007b | 92 | unsigned int clen=0; |
masterkookus | 5:c656fd08007b | 93 | unsigned int cbc; |
masterkookus | 8:fa2a2c3a16ce | 94 | float4byte valpack; |
masterkookus | 8:fa2a2c3a16ce | 95 | short2byte timepack; |
masterkookus | 5:c656fd08007b | 96 | |
masterkookus | 4:98cdccfb17d6 | 97 | while(1) |
masterkookus | 0:03ab7f7596e2 | 98 | { |
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 | 7:be13a9037d41 | 105 | if (net2->pollRequestSent) |
masterkookus | 7:be13a9037d41 | 106 | { |
masterkookus | 7:be13a9037d41 | 107 | if (clen>0) |
masterkookus | 7:be13a9037d41 | 108 | { |
masterkookus | 7:be13a9037d41 | 109 | net2->pollResponseReceived=true; |
masterkookus | 7:be13a9037d41 | 110 | } |
masterkookus | 7:be13a9037d41 | 111 | } |
masterkookus | 9:d6e7981dfc89 | 112 | if (net2->devMsgOpenRx) |
masterkookus | 9:d6e7981dfc89 | 113 | { |
masterkookus | 9:d6e7981dfc89 | 114 | sport0.write(cbuf,clen); |
masterkookus | 9:d6e7981dfc89 | 115 | clen=0; |
masterkookus | 9:d6e7981dfc89 | 116 | } |
masterkookus | 9:d6e7981dfc89 | 117 | else if (clen>3) |
masterkookus | 5:c656fd08007b | 118 | { |
masterkookus | 7:be13a9037d41 | 119 | for (cbc=0;cbc<clen-3;cbc++) |
masterkookus | 5:c656fd08007b | 120 | { |
masterkookus | 9:d6e7981dfc89 | 121 | if (net2->serIsActive==true) |
masterkookus | 8:fa2a2c3a16ce | 122 | { |
masterkookus | 9:d6e7981dfc89 | 123 | if ((cbuf[cbc]==0x4d) && (cbuf[cbc+1]==0x45) && (cbuf[cbc+2]==0x54)) |
masterkookus | 8:fa2a2c3a16ce | 124 | { |
masterkookus | 9:d6e7981dfc89 | 125 | sport0.write(cbuf,clen); |
masterkookus | 9:d6e7981dfc89 | 126 | net2->devMsgOpenRx=true; |
masterkookus | 9:d6e7981dfc89 | 127 | net2->devMsgReq=0; |
masterkookus | 9:d6e7981dfc89 | 128 | clen=0; |
masterkookus | 9:d6e7981dfc89 | 129 | break; |
masterkookus | 8:fa2a2c3a16ce | 130 | } |
masterkookus | 9:d6e7981dfc89 | 131 | |
masterkookus | 9:d6e7981dfc89 | 132 | if ((cbuf[cbc]==0x54) && (cbuf[cbc+1]==0x41) && (cbuf[cbc+2]==0x50)) |
masterkookus | 9:d6e7981dfc89 | 133 | { |
masterkookus | 9:d6e7981dfc89 | 134 | sport0.write(cbuf,clen); |
masterkookus | 9:d6e7981dfc89 | 135 | net2->devMsgOpenRx=true; |
masterkookus | 9:d6e7981dfc89 | 136 | net2->devMsgReq=0; |
masterkookus | 9:d6e7981dfc89 | 137 | clen=0; |
masterkookus | 9:d6e7981dfc89 | 138 | break; |
masterkookus | 9:d6e7981dfc89 | 139 | } |
masterkookus | 9:d6e7981dfc89 | 140 | if ((cbuf[cbc]==0x41) && (cbuf[cbc+1]==0x43) && (cbuf[cbc+2]==0x43)) |
masterkookus | 7:be13a9037d41 | 141 | { |
masterkookus | 8:fa2a2c3a16ce | 142 | sport0.write(cbuf,clen); |
masterkookus | 9:d6e7981dfc89 | 143 | net2->devMsgPos=1; |
masterkookus | 9:d6e7981dfc89 | 144 | clen=0; |
masterkookus | 9:d6e7981dfc89 | 145 | break; |
masterkookus | 9:d6e7981dfc89 | 146 | } |
masterkookus | 9:d6e7981dfc89 | 147 | if (cbuf[cbc]==0x2a) |
masterkookus | 9:d6e7981dfc89 | 148 | { |
masterkookus | 9:d6e7981dfc89 | 149 | sport0.write(cbuf,clen); |
masterkookus | 9:d6e7981dfc89 | 150 | net2->devMsgPos=2; |
masterkookus | 9:d6e7981dfc89 | 151 | clen=0; |
masterkookus | 9:d6e7981dfc89 | 152 | break; |
masterkookus | 9:d6e7981dfc89 | 153 | } |
masterkookus | 9:d6e7981dfc89 | 154 | if ((cbuf[cbc]==0x3d) && (cbuf[cbc+1]==0x3e)) |
masterkookus | 9:d6e7981dfc89 | 155 | { |
masterkookus | 9:d6e7981dfc89 | 156 | sport0.write(cbuf,clen); |
masterkookus | 9:d6e7981dfc89 | 157 | net2->devMsgPos=4; |
masterkookus | 9:d6e7981dfc89 | 158 | clen=0; |
masterkookus | 9:d6e7981dfc89 | 159 | break; |
masterkookus | 9:d6e7981dfc89 | 160 | } |
masterkookus | 9:d6e7981dfc89 | 161 | if ((cbuf[cbc]==0x3d)) |
masterkookus | 9:d6e7981dfc89 | 162 | { |
masterkookus | 9:d6e7981dfc89 | 163 | sport0.write(cbuf,clen); |
masterkookus | 9:d6e7981dfc89 | 164 | net2->devMsgPos=0; |
masterkookus | 8:fa2a2c3a16ce | 165 | clen=0; |
masterkookus | 8:fa2a2c3a16ce | 166 | break; |
masterkookus | 7:be13a9037d41 | 167 | } |
masterkookus | 9:d6e7981dfc89 | 168 | } |
masterkookus | 9:d6e7981dfc89 | 169 | if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xC0)) |
masterkookus | 9:d6e7981dfc89 | 170 | { |
masterkookus | 9:d6e7981dfc89 | 171 | sport0.write(cbuf,clen); |
masterkookus | 9:d6e7981dfc89 | 172 | net2->pollState=1; |
masterkookus | 9:d6e7981dfc89 | 173 | clen=0; |
masterkookus | 9:d6e7981dfc89 | 174 | break; |
masterkookus | 9:d6e7981dfc89 | 175 | } |
masterkookus | 9:d6e7981dfc89 | 176 | if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xC1)) |
masterkookus | 9:d6e7981dfc89 | 177 | { |
masterkookus | 9:d6e7981dfc89 | 178 | sport0.write(cbuf,clen); |
masterkookus | 9:d6e7981dfc89 | 179 | if (vReg1.numAnalog!=cbuf[6]) |
masterkookus | 7:be13a9037d41 | 180 | { |
masterkookus | 9:d6e7981dfc89 | 181 | printf("\r\nAnalog Channel Count Off\r\n"); |
masterkookus | 9:d6e7981dfc89 | 182 | net2->pollState=0; |
masterkookus | 9:d6e7981dfc89 | 183 | clen=0; |
masterkookus | 9:d6e7981dfc89 | 184 | break; |
masterkookus | 9:d6e7981dfc89 | 185 | } |
masterkookus | 9:d6e7981dfc89 | 186 | if (vReg1.numDigital!=cbuf[8]) |
masterkookus | 9:d6e7981dfc89 | 187 | { |
masterkookus | 9:d6e7981dfc89 | 188 | printf("\r\nDigital Channel Count Off\r\n"); |
masterkookus | 9:d6e7981dfc89 | 189 | net2->pollState=0; |
masterkookus | 8:fa2a2c3a16ce | 190 | clen=0; |
masterkookus | 8:fa2a2c3a16ce | 191 | break; |
masterkookus | 7:be13a9037d41 | 192 | } |
masterkookus | 9:d6e7981dfc89 | 193 | char anum=16; |
masterkookus | 9:d6e7981dfc89 | 194 | char nxc; |
masterkookus | 9:d6e7981dfc89 | 195 | for (txc=0;txc<vReg1.numAnalog;txc++) |
masterkookus | 8:fa2a2c3a16ce | 196 | { |
masterkookus | 9:d6e7981dfc89 | 197 | for (nxc=0;nxc<6;nxc++) |
masterkookus | 8:fa2a2c3a16ce | 198 | { |
masterkookus | 9:d6e7981dfc89 | 199 | if(vReg1.analogs[txc].analogName[nxc]!=cbuf[anum+nxc]) |
masterkookus | 9:d6e7981dfc89 | 200 | { |
masterkookus | 9:d6e7981dfc89 | 201 | printf("\r\nPoint %d Failed\r\n",txc); |
masterkookus | 9:d6e7981dfc89 | 202 | break; |
masterkookus | 9:d6e7981dfc89 | 203 | } |
masterkookus | 8:fa2a2c3a16ce | 204 | } |
masterkookus | 9:d6e7981dfc89 | 205 | anum = anum + 11; |
masterkookus | 8:fa2a2c3a16ce | 206 | } |
masterkookus | 9:d6e7981dfc89 | 207 | net2->pollState=2; |
masterkookus | 9:d6e7981dfc89 | 208 | clen=0; |
masterkookus | 9:d6e7981dfc89 | 209 | break; |
masterkookus | 9:d6e7981dfc89 | 210 | } |
masterkookus | 9:d6e7981dfc89 | 211 | if ((cbuf[cbc]==0xA5) && (cbuf[cbc+1]==0xD1)) |
masterkookus | 9:d6e7981dfc89 | 212 | { |
masterkookus | 9:d6e7981dfc89 | 213 | char anum=cbc+4; |
masterkookus | 9:d6e7981dfc89 | 214 | for (txc=0;txc<vReg1.numAnalog;txc++) |
masterkookus | 9:d6e7981dfc89 | 215 | { |
masterkookus | 9:d6e7981dfc89 | 216 | valpack.bytes[3]=cbuf[anum]; |
masterkookus | 9:d6e7981dfc89 | 217 | valpack.bytes[2]=cbuf[anum+1]; |
masterkookus | 9:d6e7981dfc89 | 218 | valpack.bytes[1]=cbuf[anum+2]; |
masterkookus | 9:d6e7981dfc89 | 219 | valpack.bytes[0]=cbuf[anum+3]; |
masterkookus | 9:d6e7981dfc89 | 220 | vReg1.analogs[txc].analog1Value = valpack.cmdflt; |
masterkookus | 9:d6e7981dfc89 | 221 | anum = anum + 4; |
masterkookus | 9:d6e7981dfc89 | 222 | printf("%.2f\r\n",vReg1.analogs[txc].analog1Value); |
masterkookus | 9:d6e7981dfc89 | 223 | } |
masterkookus | 9:d6e7981dfc89 | 224 | vReg1.timeStamp.month=cbuf[anum]; |
masterkookus | 9:d6e7981dfc89 | 225 | vReg1.timeStamp.day=cbuf[anum+1]; |
masterkookus | 9:d6e7981dfc89 | 226 | vReg1.timeStamp.year=cbuf[anum+2]; |
masterkookus | 9:d6e7981dfc89 | 227 | vReg1.timeStamp.hour=cbuf[anum+3]; |
masterkookus | 9:d6e7981dfc89 | 228 | vReg1.timeStamp.min=cbuf[anum+4]; |
masterkookus | 9:d6e7981dfc89 | 229 | vReg1.timeStamp.sec=cbuf[anum+5]; |
masterkookus | 9:d6e7981dfc89 | 230 | timepack.bytes[1]=cbuf[anum+6]; |
masterkookus | 9:d6e7981dfc89 | 231 | timepack.bytes[0]=cbuf[anum+7]; |
masterkookus | 9:d6e7981dfc89 | 232 | vReg1.timeStamp.msec=timepack.cmdshort; |
masterkookus | 9:d6e7981dfc89 | 233 | 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 | 234 | anum=anum+8; |
masterkookus | 9:d6e7981dfc89 | 235 | for (txc=0;txc<vReg1.numDigital;txc++) |
masterkookus | 9:d6e7981dfc89 | 236 | { |
masterkookus | 9:d6e7981dfc89 | 237 | vReg1.digitalTargets[txc]=cbuf[anum+txc]; |
masterkookus | 9:d6e7981dfc89 | 238 | } |
masterkookus | 9:d6e7981dfc89 | 239 | clen=0; |
masterkookus | 9:d6e7981dfc89 | 240 | break; |
masterkookus | 5:c656fd08007b | 241 | } |
masterkookus | 5:c656fd08007b | 242 | } |
masterkookus | 7:be13a9037d41 | 243 | if (clen>0) |
masterkookus | 7:be13a9037d41 | 244 | { |
masterkookus | 7:be13a9037d41 | 245 | printf("Command not Received\r\n"); |
masterkookus | 7:be13a9037d41 | 246 | clen=0; |
masterkookus | 7:be13a9037d41 | 247 | } |
masterkookus | 7:be13a9037d41 | 248 | } |
masterkookus | 7:be13a9037d41 | 249 | } |
masterkookus | 7:be13a9037d41 | 250 | } |
masterkookus | 7:be13a9037d41 | 251 | |
masterkookus | 7:be13a9037d41 | 252 | //Ethernet to Ethernet Send Data |
masterkookus | 7:be13a9037d41 | 253 | void datantx(netsys *net2) |
masterkookus | 7:be13a9037d41 | 254 | { |
masterkookus | 7:be13a9037d41 | 255 | while(1) |
masterkookus | 7:be13a9037d41 | 256 | { |
masterkookus | 6:9f97716eae76 | 257 | if (net2->cltIsActive) |
masterkookus | 0:03ab7f7596e2 | 258 | { |
masterkookus | 7:be13a9037d41 | 259 | while (net2->sendState==3) |
masterkookus | 5:c656fd08007b | 260 | { |
masterkookus | 5:c656fd08007b | 261 | if (net2->connectRetry == true) |
masterkookus | 5:c656fd08007b | 262 | { |
masterkookus | 5:c656fd08007b | 263 | wait_ms(100); |
masterkookus | 5:c656fd08007b | 264 | } |
masterkookus | 9:d6e7981dfc89 | 265 | net2->connectCmd=true; |
masterkookus | 6:9f97716eae76 | 266 | ret = net2->srv_sock.connect(net2->srv_addr,net2->cltPort); |
masterkookus | 5:c656fd08007b | 267 | if (ret==0) |
masterkookus | 5:c656fd08007b | 268 | { |
masterkookus | 5:c656fd08007b | 269 | net2->connectRetry = false; |
masterkookus | 5:c656fd08007b | 270 | printf("Connected %d\r\n",ret); |
masterkookus | 8:fa2a2c3a16ce | 271 | net2->sendState=4; |
masterkookus | 8:fa2a2c3a16ce | 272 | } |
masterkookus | 8:fa2a2c3a16ce | 273 | else if (ret==-3015) |
masterkookus | 8:fa2a2c3a16ce | 274 | { |
masterkookus | 8:fa2a2c3a16ce | 275 | printf("May already be connected, attempting send.\r\n"); |
masterkookus | 8:fa2a2c3a16ce | 276 | net2->connectRetry = false; |
masterkookus | 7:be13a9037d41 | 277 | net2->sendState=4; |
masterkookus | 5:c656fd08007b | 278 | } |
masterkookus | 5:c656fd08007b | 279 | else |
masterkookus | 5:c656fd08007b | 280 | { |
masterkookus | 5:c656fd08007b | 281 | net2->connectRetry = true; |
masterkookus | 7:be13a9037d41 | 282 | net2->sendRetryCount++; |
masterkookus | 5:c656fd08007b | 283 | printf("Connect Attempt Failed, Code: %d\r\n",ret); |
masterkookus | 7:be13a9037d41 | 284 | if (net2->sendRetryCount>3) |
masterkookus | 5:c656fd08007b | 285 | { |
masterkookus | 5:c656fd08007b | 286 | printf("Communication Failed, Closing\r\n"); |
masterkookus | 9:d6e7981dfc89 | 287 | net2->connectCmd=false; |
masterkookus | 5:c656fd08007b | 288 | net2->connectRetry = false; |
masterkookus | 7:be13a9037d41 | 289 | net2->sendRetryCount = 0; |
masterkookus | 5:c656fd08007b | 290 | net2->messageFailCount++; |
masterkookus | 6:9f97716eae76 | 291 | net2->cltCloseConnection=true; |
masterkookus | 7:be13a9037d41 | 292 | net2->sendState=0; |
masterkookus | 7:be13a9037d41 | 293 | net2->sendTime=0; |
masterkookus | 5:c656fd08007b | 294 | } |
masterkookus | 5:c656fd08007b | 295 | } |
masterkookus | 5:c656fd08007b | 296 | } |
masterkookus | 7:be13a9037d41 | 297 | while (net2->sendState==4) |
masterkookus | 5:c656fd08007b | 298 | { |
masterkookus | 5:c656fd08007b | 299 | if (net2->sendRetry == true) |
masterkookus | 5:c656fd08007b | 300 | { |
masterkookus | 5:c656fd08007b | 301 | wait_ms(100); |
masterkookus | 5:c656fd08007b | 302 | } |
masterkookus | 9:d6e7981dfc89 | 303 | net2->connectCmd=false; |
masterkookus | 7:be13a9037d41 | 304 | ret = net2->srv_sock.send(net2->sendString,net2->sendLen); |
masterkookus | 5:c656fd08007b | 305 | if (ret>=0) |
masterkookus | 5:c656fd08007b | 306 | { |
masterkookus | 5:c656fd08007b | 307 | printf("Send Result %d\r\n",ret); |
masterkookus | 5:c656fd08007b | 308 | net2->sendRetry = false; |
masterkookus | 5:c656fd08007b | 309 | net2->txMessageCount++; |
masterkookus | 8:fa2a2c3a16ce | 310 | net2->sendState=5; |
masterkookus | 7:be13a9037d41 | 311 | net2->sendTime=0; |
masterkookus | 5:c656fd08007b | 312 | } |
masterkookus | 5:c656fd08007b | 313 | else |
masterkookus | 5:c656fd08007b | 314 | { |
masterkookus | 5:c656fd08007b | 315 | net2->sendRetry = true; |
masterkookus | 7:be13a9037d41 | 316 | net2->sendRetryCount++; |
masterkookus | 5:c656fd08007b | 317 | printf("Send Attempt Failed, Code: %d\r\n",ret); |
masterkookus | 7:be13a9037d41 | 318 | if (net2->sendRetryCount>3) |
masterkookus | 5:c656fd08007b | 319 | { |
masterkookus | 5:c656fd08007b | 320 | printf("Communication Failed, Closing\r\n"); |
masterkookus | 5:c656fd08007b | 321 | net2->sendRetry = false; |
masterkookus | 7:be13a9037d41 | 322 | net2->sendRetryCount = 0; |
masterkookus | 5:c656fd08007b | 323 | net2->messageFailCount++; |
masterkookus | 6:9f97716eae76 | 324 | net2->cltCloseConnection=true; |
masterkookus | 7:be13a9037d41 | 325 | net2->sendState=0; |
masterkookus | 7:be13a9037d41 | 326 | net2->sendTime=0; |
masterkookus | 5:c656fd08007b | 327 | } |
masterkookus | 5:c656fd08007b | 328 | } |
masterkookus | 5:c656fd08007b | 329 | } |
masterkookus | 8:fa2a2c3a16ce | 330 | } |
masterkookus | 8:fa2a2c3a16ce | 331 | } |
masterkookus | 8:fa2a2c3a16ce | 332 | } |
masterkookus | 8:fa2a2c3a16ce | 333 | |
masterkookus | 8:fa2a2c3a16ce | 334 | //Ethernet receive data and send to aux devices (serial, etc...) |
masterkookus | 8:fa2a2c3a16ce | 335 | void datancrx(netsys *net2) |
masterkookus | 8:fa2a2c3a16ce | 336 | { |
masterkookus | 8:fa2a2c3a16ce | 337 | char rxbuf[256]; |
masterkookus | 8:fa2a2c3a16ce | 338 | int rxlen=0; |
masterkookus | 8:fa2a2c3a16ce | 339 | int rxc; |
masterkookus | 8:fa2a2c3a16ce | 340 | while (1) |
masterkookus | 8:fa2a2c3a16ce | 341 | { |
masterkookus | 8:fa2a2c3a16ce | 342 | while (net2->cltIsActive) |
masterkookus | 8:fa2a2c3a16ce | 343 | { |
masterkookus | 8:fa2a2c3a16ce | 344 | rxlen=net2->srv_sock.recv(rxbuf, sizeof(rxbuf)); |
masterkookus | 8:fa2a2c3a16ce | 345 | if (rxlen>0) |
masterkookus | 5:c656fd08007b | 346 | { |
masterkookus | 8:fa2a2c3a16ce | 347 | net2->aliveTime=0; |
masterkookus | 8:fa2a2c3a16ce | 348 | for (rxc = 0;rxc<rxlen;rxc++) |
masterkookus | 8:fa2a2c3a16ce | 349 | { |
masterkookus | 8:fa2a2c3a16ce | 350 | receiveBuffer.push(rxbuf[rxc]); |
masterkookus | 8:fa2a2c3a16ce | 351 | } |
masterkookus | 8:fa2a2c3a16ce | 352 | printf("Client Received Data\r\n"); |
masterkookus | 8:fa2a2c3a16ce | 353 | net2->rxMessageCount++; |
masterkookus | 5:c656fd08007b | 354 | } |
masterkookus | 0:03ab7f7596e2 | 355 | } |
masterkookus | 0:03ab7f7596e2 | 356 | } |
masterkookus | 0:03ab7f7596e2 | 357 | } |
masterkookus | 0:03ab7f7596e2 | 358 | |
masterkookus | 7:be13a9037d41 | 359 | //Ethernet receive data and send to aux devices (serial, etc...) |
masterkookus | 8:fa2a2c3a16ce | 360 | void datansrx(netsys *net2) |
masterkookus | 0:03ab7f7596e2 | 361 | { |
masterkookus | 0:03ab7f7596e2 | 362 | char rxbuf[256]; |
masterkookus | 0:03ab7f7596e2 | 363 | int rxlen=0; |
masterkookus | 5:c656fd08007b | 364 | int rxc; |
masterkookus | 0:03ab7f7596e2 | 365 | while (1) |
masterkookus | 0:03ab7f7596e2 | 366 | { |
masterkookus | 6:9f97716eae76 | 367 | while (net2->srvIsActive) |
masterkookus | 0:03ab7f7596e2 | 368 | { |
masterkookus | 0:03ab7f7596e2 | 369 | rxlen=net2->clt_sock.recv(rxbuf, sizeof(rxbuf)); |
masterkookus | 4:98cdccfb17d6 | 370 | if (rxlen>0) |
masterkookus | 4:98cdccfb17d6 | 371 | { |
masterkookus | 4:98cdccfb17d6 | 372 | net2->aliveTime=0; |
masterkookus | 5:c656fd08007b | 373 | for (rxc = 0;rxc<rxlen;rxc++) |
masterkookus | 5:c656fd08007b | 374 | { |
masterkookus | 7:be13a9037d41 | 375 | receiveBuffer.push(rxbuf[rxc]); |
masterkookus | 5:c656fd08007b | 376 | } |
masterkookus | 8:fa2a2c3a16ce | 377 | printf("Server Received Data\r\n"); |
masterkookus | 5:c656fd08007b | 378 | net2->rxMessageCount++; |
masterkookus | 4:98cdccfb17d6 | 379 | } |
masterkookus | 0:03ab7f7596e2 | 380 | } |
masterkookus | 0:03ab7f7596e2 | 381 | } |
masterkookus | 0:03ab7f7596e2 | 382 | } |
masterkookus | 0:03ab7f7596e2 | 383 | |
masterkookus | 8:fa2a2c3a16ce | 384 | //Serial device to server |
masterkookus | 0:03ab7f7596e2 | 385 | void datasrx(netsys *net2) |
masterkookus | 0:03ab7f7596e2 | 386 | { |
masterkookus | 0:03ab7f7596e2 | 387 | char rxbuf[256]; |
masterkookus | 0:03ab7f7596e2 | 388 | int rxlen=0; |
masterkookus | 9:d6e7981dfc89 | 389 | int rxindex=0; |
masterkookus | 0:03ab7f7596e2 | 390 | int rxc; |
masterkookus | 9:d6e7981dfc89 | 391 | bool crRx = false; |
masterkookus | 9:d6e7981dfc89 | 392 | int4byte cmdpack; |
masterkookus | 9:d6e7981dfc89 | 393 | |
masterkookus | 0:03ab7f7596e2 | 394 | while (1) |
masterkookus | 0:03ab7f7596e2 | 395 | { |
masterkookus | 9:d6e7981dfc89 | 396 | rxlen=sport0.readable(); |
masterkookus | 9:d6e7981dfc89 | 397 | if (rxlen>0) |
masterkookus | 0:03ab7f7596e2 | 398 | { |
masterkookus | 9:d6e7981dfc89 | 399 | for (rxc=0;rxc<rxlen;rxc++) |
masterkookus | 9:d6e7981dfc89 | 400 | { |
masterkookus | 9:d6e7981dfc89 | 401 | rxbuf[rxindex+rxc]=sport0.getc(); |
masterkookus | 9:d6e7981dfc89 | 402 | if (rxbuf[rxindex+rxc]=='\r') |
masterkookus | 9:d6e7981dfc89 | 403 | { |
masterkookus | 9:d6e7981dfc89 | 404 | crRx=true; |
masterkookus | 9:d6e7981dfc89 | 405 | } |
masterkookus | 9:d6e7981dfc89 | 406 | } |
masterkookus | 9:d6e7981dfc89 | 407 | rxindex=rxindex+rxlen; |
masterkookus | 9:d6e7981dfc89 | 408 | printf("%d\r\n",rxlen); |
masterkookus | 9:d6e7981dfc89 | 409 | printf("%d\r\n",rxindex); |
masterkookus | 9:d6e7981dfc89 | 410 | rxlen=0; |
masterkookus | 9:d6e7981dfc89 | 411 | if ((rxindex>2) && (crRx==true)) |
masterkookus | 0:03ab7f7596e2 | 412 | { |
masterkookus | 9:d6e7981dfc89 | 413 | crRx=false; |
masterkookus | 9:d6e7981dfc89 | 414 | for (rxc=0;rxc<=rxindex-3;rxc++) |
masterkookus | 0:03ab7f7596e2 | 415 | { |
masterkookus | 9:d6e7981dfc89 | 416 | cmdpack.bytes[3]=rxbuf[rxc]; |
masterkookus | 9:d6e7981dfc89 | 417 | cmdpack.bytes[2]=rxbuf[rxc+1]; |
masterkookus | 9:d6e7981dfc89 | 418 | cmdpack.bytes[1]=rxbuf[rxc+2]; |
masterkookus | 9:d6e7981dfc89 | 419 | cmdpack.bytes[0]=rxbuf[rxc+3]; |
masterkookus | 9:d6e7981dfc89 | 420 | printf("%08x\r\n",cmdpack.cmdint); |
masterkookus | 9:d6e7981dfc89 | 421 | if (cmdpack.cmdint==0x4d45544d) |
masterkookus | 9:d6e7981dfc89 | 422 | { |
masterkookus | 9:d6e7981dfc89 | 423 | printf("MIN MAX METERING\r\n"); |
masterkookus | 9:d6e7981dfc89 | 424 | net2->devMsgReq=1; |
masterkookus | 9:d6e7981dfc89 | 425 | net2->devMsgPos=2; |
masterkookus | 9:d6e7981dfc89 | 426 | rxindex=0; |
masterkookus | 9:d6e7981dfc89 | 427 | } |
masterkookus | 9:d6e7981dfc89 | 428 | if (cmdpack.cmdint==0x54415052) |
masterkookus | 9:d6e7981dfc89 | 429 | { |
masterkookus | 9:d6e7981dfc89 | 430 | printf("TAP REPORT\r\n"); |
masterkookus | 9:d6e7981dfc89 | 431 | net2->devMsgReq=2; |
masterkookus | 9:d6e7981dfc89 | 432 | net2->devMsgPos=2; |
masterkookus | 9:d6e7981dfc89 | 433 | rxindex=0; |
masterkookus | 9:d6e7981dfc89 | 434 | } |
masterkookus | 0:03ab7f7596e2 | 435 | } |
masterkookus | 9:d6e7981dfc89 | 436 | if (rxindex>0) |
masterkookus | 9:d6e7981dfc89 | 437 | { |
masterkookus | 9:d6e7981dfc89 | 438 | printf("Serial Command Not Found"); |
masterkookus | 9:d6e7981dfc89 | 439 | rxindex=0; |
masterkookus | 9:d6e7981dfc89 | 440 | } |
masterkookus | 0:03ab7f7596e2 | 441 | } |
masterkookus | 0:03ab7f7596e2 | 442 | } |
masterkookus | 0:03ab7f7596e2 | 443 | } |
masterkookus | 0:03ab7f7596e2 | 444 | } |
masterkookus | 0:03ab7f7596e2 | 445 | |
masterkookus | 2:ec972966689e | 446 | //Checks for a Ethernet to Serial connection |
masterkookus | 0:03ab7f7596e2 | 447 | void conchk(netsys *net2) |
masterkookus | 0:03ab7f7596e2 | 448 | { |
masterkookus | 0:03ab7f7596e2 | 449 | TCPServer *server=&(net2->srv); |
masterkookus | 0:03ab7f7596e2 | 450 | TCPSocket *client_socket=&(net2->clt_sock); |
masterkookus | 0:03ab7f7596e2 | 451 | SocketAddress *client_address=&(net2->clt_addr); |
masterkookus | 0:03ab7f7596e2 | 452 | |
masterkookus | 0:03ab7f7596e2 | 453 | while(1) |
masterkookus | 0:03ab7f7596e2 | 454 | { |
masterkookus | 5:c656fd08007b | 455 | while (server->accept(client_socket, client_address) < 0) |
masterkookus | 0:03ab7f7596e2 | 456 | { |
masterkookus | 5:c656fd08007b | 457 | //printf("Connection Failed.\r\n"); |
masterkookus | 0:03ab7f7596e2 | 458 | } |
masterkookus | 6:9f97716eae76 | 459 | printf("Server Port %d\r\n", net2->srvPort); |
masterkookus | 5:c656fd08007b | 460 | printf("accept %s:%d\r\n", client_address->get_ip_address(), client_address->get_port()); |
masterkookus | 5:c656fd08007b | 461 | net2->aliveTime=0; |
masterkookus | 6:9f97716eae76 | 462 | net2->srvIsActive=true; |
masterkookus | 0:03ab7f7596e2 | 463 | } |
masterkookus | 0:03ab7f7596e2 | 464 | } |
masterkookus | 0:03ab7f7596e2 | 465 | |
masterkookus | 0:03ab7f7596e2 | 466 | int main() |
masterkookus | 0:03ab7f7596e2 | 467 | { |
masterkookus | 0:03ab7f7596e2 | 468 | EthernetInterface eth; |
masterkookus | 7:be13a9037d41 | 469 | eth.set_network(setseveraddress,setsevermask,setsevergateway); //Use these parameters for static IP |
masterkookus | 0:03ab7f7596e2 | 470 | eth.connect(); |
masterkookus | 0:03ab7f7596e2 | 471 | |
masterkookus | 8:fa2a2c3a16ce | 472 | initVoltageRegulator(&vReg1); |
masterkookus | 8:fa2a2c3a16ce | 473 | |
masterkookus | 0:03ab7f7596e2 | 474 | printf("The target IP address is '%s'\r\n", eth.get_ip_address()); |
masterkookus | 8:fa2a2c3a16ce | 475 | printf("%s\r\n",vReg1.analogs[0].analogName); |
masterkookus | 4:98cdccfb17d6 | 476 | confignetdevices(ð); |
masterkookus | 2:ec972966689e | 477 | /* Setup Ethernet to Serial Connection Thread */ |
masterkookus | 0:03ab7f7596e2 | 478 | conchkthread[0].start(callback(conchk,&net1)); |
masterkookus | 2:ec972966689e | 479 | /* Setup polltick Ticker */ |
masterkookus | 7:be13a9037d41 | 480 | nettimer.attach_us(heartbeat,10000); |
masterkookus | 2:ec972966689e | 481 | /* Setup Ethernet to Serial transmit data Thread */ |
masterkookus | 8:fa2a2c3a16ce | 482 | rxtxdatathread[0].start(callback(datansrx,&net1)); |
masterkookus | 8:fa2a2c3a16ce | 483 | rxtxdatathread[1].start(callback(datancrx,&net1)); |
masterkookus | 2:ec972966689e | 484 | /* Setup Ethernet to Serial receive data Thread */ |
masterkookus | 8:fa2a2c3a16ce | 485 | rxtxdatathread[2].start(callback(datasrx,&net1)); |
masterkookus | 8:fa2a2c3a16ce | 486 | rxtxdatathread[3].start(callback(datantx,&net1)); |
masterkookus | 8:fa2a2c3a16ce | 487 | rxtxdatathread[4].start(callback(dataprocess,&net1)); |
masterkookus | 7:be13a9037d41 | 488 | |
masterkookus | 7:be13a9037d41 | 489 | unsigned int txc; |
masterkookus | 7:be13a9037d41 | 490 | unsigned int sxc; |
masterkookus | 3:ac1f2af8bd0f | 491 | |
masterkookus | 0:03ab7f7596e2 | 492 | while (true) { |
masterkookus | 3:ac1f2af8bd0f | 493 | |
masterkookus | 3:ac1f2af8bd0f | 494 | polltick=getTick(); |
masterkookus | 3:ac1f2af8bd0f | 495 | |
masterkookus | 3:ac1f2af8bd0f | 496 | if (polltick) |
masterkookus | 3:ac1f2af8bd0f | 497 | { |
masterkookus | 3:ac1f2af8bd0f | 498 | setTick(false); |
masterkookus | 3:ac1f2af8bd0f | 499 | incTime(); |
masterkookus | 3:ac1f2af8bd0f | 500 | currenttime=getTime(); |
masterkookus | 6:9f97716eae76 | 501 | net1.pollTime++; |
masterkookus | 7:be13a9037d41 | 502 | net1.sendTime++; |
masterkookus | 6:9f97716eae76 | 503 | if (net1.srvIsActive) |
masterkookus | 0:03ab7f7596e2 | 504 | { |
masterkookus | 4:98cdccfb17d6 | 505 | net1.aliveTime++; |
masterkookus | 6:9f97716eae76 | 506 | if (net1.aliveTime>net1.aliveTimeout) |
masterkookus | 4:98cdccfb17d6 | 507 | { |
masterkookus | 4:98cdccfb17d6 | 508 | printf("Closed\r\n"); |
masterkookus | 4:98cdccfb17d6 | 509 | net1.clt_sock.close(); |
masterkookus | 6:9f97716eae76 | 510 | net1.srvIsActive=false; |
masterkookus | 6:9f97716eae76 | 511 | net1.srvCloseConnection=false; |
masterkookus | 4:98cdccfb17d6 | 512 | } |
masterkookus | 4:98cdccfb17d6 | 513 | |
masterkookus | 0:03ab7f7596e2 | 514 | } |
masterkookus | 7:be13a9037d41 | 515 | if (net1.pollEnabled) |
masterkookus | 4:98cdccfb17d6 | 516 | { |
masterkookus | 7:be13a9037d41 | 517 | if (net1.pollTime >= net1.pollInterval) |
masterkookus | 7:be13a9037d41 | 518 | { |
masterkookus | 9:d6e7981dfc89 | 519 | if ((net1.sendState==0)||(net1.sendState==5)) |
masterkookus | 7:be13a9037d41 | 520 | { |
masterkookus | 9:d6e7981dfc89 | 521 | if (net1.devMsgReq>0) |
masterkookus | 9:d6e7981dfc89 | 522 | { |
masterkookus | 9:d6e7981dfc89 | 523 | net1.serTimeoutCount=0; |
masterkookus | 9:d6e7981dfc89 | 524 | sendLength.push(serCmdSeq[2][net1.devMsgPos]); |
masterkookus | 9:d6e7981dfc89 | 525 | for (txc=0;txc<serCmdSeq[2][net1.devMsgPos];txc++) |
masterkookus | 9:d6e7981dfc89 | 526 | { |
masterkookus | 9:d6e7981dfc89 | 527 | sendBuffer.push(serCmd[serCmdSeq[net1.devMsgReq-1][net1.devMsgPos]][txc]); |
masterkookus | 9:d6e7981dfc89 | 528 | } |
masterkookus | 9:d6e7981dfc89 | 529 | if (net1.serIsActive==false) |
masterkookus | 9:d6e7981dfc89 | 530 | { |
masterkookus | 9:d6e7981dfc89 | 531 | net1.serIsActive=true; |
masterkookus | 9:d6e7981dfc89 | 532 | } |
masterkookus | 9:d6e7981dfc89 | 533 | } |
masterkookus | 9:d6e7981dfc89 | 534 | else |
masterkookus | 9:d6e7981dfc89 | 535 | { |
masterkookus | 9:d6e7981dfc89 | 536 | sendLength.push(2); |
masterkookus | 9:d6e7981dfc89 | 537 | for (txc=0;txc<2;txc++) |
masterkookus | 9:d6e7981dfc89 | 538 | { |
masterkookus | 9:d6e7981dfc89 | 539 | sendBuffer.push(fmCmd[net1.pollState][txc]); |
masterkookus | 9:d6e7981dfc89 | 540 | } |
masterkookus | 9:d6e7981dfc89 | 541 | } |
masterkookus | 9:d6e7981dfc89 | 542 | if (net1.sendState==0) |
masterkookus | 9:d6e7981dfc89 | 543 | { |
masterkookus | 9:d6e7981dfc89 | 544 | net1.sendState=1; |
masterkookus | 9:d6e7981dfc89 | 545 | net1.pollRequestSent=true; |
masterkookus | 9:d6e7981dfc89 | 546 | } |
masterkookus | 7:be13a9037d41 | 547 | } |
masterkookus | 7:be13a9037d41 | 548 | net1.pollTime=0; |
masterkookus | 7:be13a9037d41 | 549 | } |
masterkookus | 9:d6e7981dfc89 | 550 | if ((net1.sendState==5) || (net1.serIsActive)) |
masterkookus | 7:be13a9037d41 | 551 | { |
masterkookus | 8:fa2a2c3a16ce | 552 | net1.pollTimeout++; |
masterkookus | 8:fa2a2c3a16ce | 553 | if (net1.pollTimeout==setpolltimeout) |
masterkookus | 7:be13a9037d41 | 554 | { |
masterkookus | 8:fa2a2c3a16ce | 555 | if (net1.pollRequestSent) |
masterkookus | 7:be13a9037d41 | 556 | { |
masterkookus | 8:fa2a2c3a16ce | 557 | printf("Poll Request Sent\r\n"); |
masterkookus | 8:fa2a2c3a16ce | 558 | if (net1.pollResponseReceived==false) |
masterkookus | 8:fa2a2c3a16ce | 559 | { |
masterkookus | 8:fa2a2c3a16ce | 560 | printf("Poll Response Not Received\r\n"); |
masterkookus | 8:fa2a2c3a16ce | 561 | } |
masterkookus | 8:fa2a2c3a16ce | 562 | else |
masterkookus | 8:fa2a2c3a16ce | 563 | { |
masterkookus | 8:fa2a2c3a16ce | 564 | printf("Poll Response Received\r\n"); |
masterkookus | 8:fa2a2c3a16ce | 565 | } |
masterkookus | 7:be13a9037d41 | 566 | net1.pollRequestSent=false; |
masterkookus | 8:fa2a2c3a16ce | 567 | net1.pollResponseReceived=false; |
masterkookus | 9:d6e7981dfc89 | 568 | if (net1.serIsActive==false) |
masterkookus | 9:d6e7981dfc89 | 569 | { |
masterkookus | 9:d6e7981dfc89 | 570 | net1.cltCloseConnection=true; |
masterkookus | 9:d6e7981dfc89 | 571 | net1.sendState=0; |
masterkookus | 9:d6e7981dfc89 | 572 | } |
masterkookus | 9:d6e7981dfc89 | 573 | } |
masterkookus | 9:d6e7981dfc89 | 574 | if (net1.serIsActive) |
masterkookus | 9:d6e7981dfc89 | 575 | { |
masterkookus | 9:d6e7981dfc89 | 576 | net1.devMsgOpenRx=false; |
masterkookus | 9:d6e7981dfc89 | 577 | if ((net1.serTimeoutCount==sertimeoutperiods) || (net1.devMsgReq==0)) |
masterkookus | 9:d6e7981dfc89 | 578 | { |
masterkookus | 9:d6e7981dfc89 | 579 | net1.cltCloseConnection=true; |
masterkookus | 9:d6e7981dfc89 | 580 | net1.devMsgReq=0; |
masterkookus | 9:d6e7981dfc89 | 581 | net1.serIsActive=false; |
masterkookus | 9:d6e7981dfc89 | 582 | net1.sendState=0; |
masterkookus | 9:d6e7981dfc89 | 583 | } |
masterkookus | 9:d6e7981dfc89 | 584 | else |
masterkookus | 9:d6e7981dfc89 | 585 | { |
masterkookus | 9:d6e7981dfc89 | 586 | net1.pollTimeout=0; |
masterkookus | 9:d6e7981dfc89 | 587 | net1.serTimeoutCount++; |
masterkookus | 9:d6e7981dfc89 | 588 | printf("Serial Active Timeout Count: %d\r\n",net1.serTimeoutCount); |
masterkookus | 9:d6e7981dfc89 | 589 | } |
masterkookus | 7:be13a9037d41 | 590 | } |
masterkookus | 7:be13a9037d41 | 591 | } |
masterkookus | 7:be13a9037d41 | 592 | } |
masterkookus | 8:fa2a2c3a16ce | 593 | else |
masterkookus | 8:fa2a2c3a16ce | 594 | { |
masterkookus | 8:fa2a2c3a16ce | 595 | net1.pollTimeout=0; |
masterkookus | 8:fa2a2c3a16ce | 596 | } |
masterkookus | 7:be13a9037d41 | 597 | } |
masterkookus | 7:be13a9037d41 | 598 | if (net1.sendTime == 10) |
masterkookus | 7:be13a9037d41 | 599 | { |
masterkookus | 7:be13a9037d41 | 600 | switch (net1.sendState) |
masterkookus | 5:c656fd08007b | 601 | { |
masterkookus | 5:c656fd08007b | 602 | case 1: |
masterkookus | 7:be13a9037d41 | 603 | if (!sendLength.empty()) |
masterkookus | 7:be13a9037d41 | 604 | { |
masterkookus | 7:be13a9037d41 | 605 | sendLength.pop(net1.sendLen); |
masterkookus | 7:be13a9037d41 | 606 | for (sxc=0;sxc<net1.sendLen;sxc++) |
masterkookus | 7:be13a9037d41 | 607 | { |
masterkookus | 7:be13a9037d41 | 608 | sendBuffer.pop(net1.sendString[sxc]); |
masterkookus | 7:be13a9037d41 | 609 | } |
masterkookus | 7:be13a9037d41 | 610 | } |
masterkookus | 7:be13a9037d41 | 611 | else |
masterkookus | 7:be13a9037d41 | 612 | { |
masterkookus | 7:be13a9037d41 | 613 | net1.sendState=0; |
masterkookus | 7:be13a9037d41 | 614 | } |
masterkookus | 6:9f97716eae76 | 615 | ret=net1.srv_sock.open(ð); |
masterkookus | 5:c656fd08007b | 616 | printf("Socket%d\r\n",ret); |
masterkookus | 5:c656fd08007b | 617 | if (ret < 0) |
masterkookus | 5:c656fd08007b | 618 | { |
masterkookus | 8:fa2a2c3a16ce | 619 | if (ret==-3003) |
masterkookus | 8:fa2a2c3a16ce | 620 | { |
masterkookus | 8:fa2a2c3a16ce | 621 | printf("May already be attached, attempting connect.\r\n"); |
masterkookus | 8:fa2a2c3a16ce | 622 | } |
masterkookus | 8:fa2a2c3a16ce | 623 | else |
masterkookus | 8:fa2a2c3a16ce | 624 | { |
masterkookus | 8:fa2a2c3a16ce | 625 | net1.attachRetry = true; |
masterkookus | 8:fa2a2c3a16ce | 626 | net1.sendRetryCount=0; |
masterkookus | 8:fa2a2c3a16ce | 627 | net1.sendState=2; |
masterkookus | 8:fa2a2c3a16ce | 628 | net1.sendTime=0; |
masterkookus | 8:fa2a2c3a16ce | 629 | break; |
masterkookus | 8:fa2a2c3a16ce | 630 | } |
masterkookus | 5:c656fd08007b | 631 | } |
masterkookus | 7:be13a9037d41 | 632 | net1.sendState=3; |
masterkookus | 7:be13a9037d41 | 633 | net1.sendTime=11; |
masterkookus | 6:9f97716eae76 | 634 | net1.cltIsActive=true; |
masterkookus | 5:c656fd08007b | 635 | break; |
masterkookus | 5:c656fd08007b | 636 | case 2: |
masterkookus | 6:9f97716eae76 | 637 | ret=net1.srv_sock.open(ð); |
masterkookus | 5:c656fd08007b | 638 | printf("Socket%d\r\n",ret); |
masterkookus | 5:c656fd08007b | 639 | if (ret < 0) |
masterkookus | 5:c656fd08007b | 640 | { |
masterkookus | 7:be13a9037d41 | 641 | net1.attachRetry = true; |
masterkookus | 7:be13a9037d41 | 642 | net1.sendRetryCount++; |
masterkookus | 7:be13a9037d41 | 643 | net1.sendTime=0; |
masterkookus | 5:c656fd08007b | 644 | printf("Attach Attempt Failed, Code: %d\r\n",ret); |
masterkookus | 7:be13a9037d41 | 645 | if (net1.sendRetryCount>3) |
masterkookus | 5:c656fd08007b | 646 | { |
masterkookus | 5:c656fd08007b | 647 | printf("Communication Failed, Closing\r\n"); |
masterkookus | 7:be13a9037d41 | 648 | net1.attachRetry = false; |
masterkookus | 7:be13a9037d41 | 649 | net1.sendRetryCount = 0; |
masterkookus | 6:9f97716eae76 | 650 | net1.messageFailCount++; |
masterkookus | 7:be13a9037d41 | 651 | net1.sendState=0; |
masterkookus | 7:be13a9037d41 | 652 | net1.sendTime=0; |
masterkookus | 5:c656fd08007b | 653 | } |
masterkookus | 5:c656fd08007b | 654 | break; |
masterkookus | 5:c656fd08007b | 655 | } |
masterkookus | 7:be13a9037d41 | 656 | net1.sendState=0; |
masterkookus | 7:be13a9037d41 | 657 | net1.attachRetry = false; |
masterkookus | 7:be13a9037d41 | 658 | net1.sendTime=11; |
masterkookus | 6:9f97716eae76 | 659 | net1.cltIsActive=true; |
masterkookus | 5:c656fd08007b | 660 | break; |
masterkookus | 5:c656fd08007b | 661 | default: |
masterkookus | 7:be13a9037d41 | 662 | net1.sendTime=0; |
masterkookus | 7:be13a9037d41 | 663 | if (!sendLength.empty()) |
masterkookus | 7:be13a9037d41 | 664 | { |
masterkookus | 8:fa2a2c3a16ce | 665 | if (net1.sendState==5) |
masterkookus | 8:fa2a2c3a16ce | 666 | { |
masterkookus | 9:d6e7981dfc89 | 667 | |
masterkookus | 9:d6e7981dfc89 | 668 | sendLength.pop(net1.sendLen); |
masterkookus | 9:d6e7981dfc89 | 669 | for (sxc=0;sxc<net1.sendLen;sxc++) |
masterkookus | 8:fa2a2c3a16ce | 670 | { |
masterkookus | 9:d6e7981dfc89 | 671 | sendBuffer.pop(net1.sendString[sxc]); |
masterkookus | 8:fa2a2c3a16ce | 672 | } |
masterkookus | 8:fa2a2c3a16ce | 673 | net1.sendState=4; |
masterkookus | 8:fa2a2c3a16ce | 674 | } |
masterkookus | 8:fa2a2c3a16ce | 675 | else |
masterkookus | 8:fa2a2c3a16ce | 676 | { |
masterkookus | 8:fa2a2c3a16ce | 677 | net1.sendState=1; |
masterkookus | 8:fa2a2c3a16ce | 678 | } |
masterkookus | 7:be13a9037d41 | 679 | } |
masterkookus | 5:c656fd08007b | 680 | break; |
masterkookus | 5:c656fd08007b | 681 | } |
masterkookus | 4:98cdccfb17d6 | 682 | } |
masterkookus | 1:a57cbebba3fd | 683 | } |
masterkookus | 8:fa2a2c3a16ce | 684 | if (net1.cltCloseConnection==true) |
masterkookus | 8:fa2a2c3a16ce | 685 | { |
masterkookus | 8:fa2a2c3a16ce | 686 | printf("Client Socket Closed\r\n"); |
masterkookus | 8:fa2a2c3a16ce | 687 | net1.srv_sock.close(); |
masterkookus | 8:fa2a2c3a16ce | 688 | net1.cltIsActive=false; |
masterkookus | 8:fa2a2c3a16ce | 689 | net1.cltCloseConnection=false; |
masterkookus | 8:fa2a2c3a16ce | 690 | net1.sendState=0; |
masterkookus | 8:fa2a2c3a16ce | 691 | } |
masterkookus | 0:03ab7f7596e2 | 692 | } |
masterkookus | 0:03ab7f7596e2 | 693 | } |