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@7:be13a9037d41, 2019-09-23 (annotated)
- Committer:
- masterkookus
- Date:
- Mon Sep 23 12:29:52 2019 +0000
- Revision:
- 7:be13a9037d41
- Parent:
- 6:9f97716eae76
- Child:
- 8:fa2a2c3a16ce
Defines for operation in header, basic functionality complete
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 | 0:03ab7f7596e2 | 14 | |
masterkookus | 7:be13a9037d41 | 15 | Ticker nettimer; |
masterkookus | 0:03ab7f7596e2 | 16 | |
masterkookus | 6:9f97716eae76 | 17 | struct netsys net1; |
masterkookus | 1:a57cbebba3fd | 18 | |
masterkookus | 1:a57cbebba3fd | 19 | bool polltick; |
masterkookus | 0:03ab7f7596e2 | 20 | |
masterkookus | 7:be13a9037d41 | 21 | BufferedSerial sport0(sport0tx, sport0rx, sport0buff, sport0mult); // UART2 |
masterkookus | 0:03ab7f7596e2 | 22 | |
masterkookus | 7:be13a9037d41 | 23 | CircularBuffer<char, 1024> receiveBuffer; |
masterkookus | 7:be13a9037d41 | 24 | CircularBuffer<char, 64> sendLength; |
masterkookus | 7:be13a9037d41 | 25 | CircularBuffer<char, 1024> sendBuffer; |
masterkookus | 5:c656fd08007b | 26 | |
masterkookus | 0:03ab7f7596e2 | 27 | Thread conchkthread[2]; |
masterkookus | 4:98cdccfb17d6 | 28 | Thread rxtxdatathread[5]; |
masterkookus | 4:98cdccfb17d6 | 29 | |
masterkookus | 4:98cdccfb17d6 | 30 | unsigned int currenttime=0; |
masterkookus | 0:03ab7f7596e2 | 31 | |
masterkookus | 5:c656fd08007b | 32 | nsapi_error_t ret; |
masterkookus | 5:c656fd08007b | 33 | |
masterkookus | 2:ec972966689e | 34 | //Provides the deivce poll timing |
masterkookus | 1:a57cbebba3fd | 35 | void heartbeat() |
masterkookus | 1:a57cbebba3fd | 36 | { |
masterkookus | 3:ac1f2af8bd0f | 37 | //polltick=true; |
masterkookus | 3:ac1f2af8bd0f | 38 | setTick(true); |
masterkookus | 1:a57cbebba3fd | 39 | } |
masterkookus | 1:a57cbebba3fd | 40 | |
masterkookus | 4:98cdccfb17d6 | 41 | void confignetdevices(EthernetInterface *eth) |
masterkookus | 4:98cdccfb17d6 | 42 | { |
masterkookus | 7:be13a9037d41 | 43 | net1.cltPort=setclientport; |
masterkookus | 7:be13a9037d41 | 44 | net1.srv_addr=setclientaddress; |
masterkookus | 6:9f97716eae76 | 45 | net1.cltIsActive=false; |
masterkookus | 6:9f97716eae76 | 46 | net1.cltCloseConnection=false; |
masterkookus | 7:be13a9037d41 | 47 | net1.pollTimeout=setpolltimeout; |
masterkookus | 6:9f97716eae76 | 48 | net1.pollTime=0; |
masterkookus | 7:be13a9037d41 | 49 | net1.pollInterval=setpollinterval; |
masterkookus | 7:be13a9037d41 | 50 | net1.pollRequestSent=false; |
masterkookus | 7:be13a9037d41 | 51 | net1.pollResponseReceived=false; |
masterkookus | 6:9f97716eae76 | 52 | net1.srv_sock.set_blocking(false); |
masterkookus | 7:be13a9037d41 | 53 | net1.aliveTimeout=setservertimeout; |
masterkookus | 5:c656fd08007b | 54 | net1.srv.set_blocking(false); |
masterkookus | 7:be13a9037d41 | 55 | net1.pollEnabled=setpollenabled; |
masterkookus | 7:be13a9037d41 | 56 | net1.pollTimeoutCount=0; |
masterkookus | 4:98cdccfb17d6 | 57 | |
masterkookus | 4:98cdccfb17d6 | 58 | /* Open the server on ethernet stack */ |
masterkookus | 4:98cdccfb17d6 | 59 | net1.srv.open(eth); |
masterkookus | 6:9f97716eae76 | 60 | net1.srvIsActive=false; |
masterkookus | 6:9f97716eae76 | 61 | net1.srvCloseConnection=false; |
masterkookus | 4:98cdccfb17d6 | 62 | |
masterkookus | 4:98cdccfb17d6 | 63 | /* Bind port 23 to the server */ |
masterkookus | 7:be13a9037d41 | 64 | net1.srvPort=setserverport; |
masterkookus | 6:9f97716eae76 | 65 | net1.srv.bind(net1.srvPort); |
masterkookus | 4:98cdccfb17d6 | 66 | |
masterkookus | 4:98cdccfb17d6 | 67 | /* Can handle 5 simultaneous connections */ |
masterkookus | 4:98cdccfb17d6 | 68 | net1.srv.listen(5); |
masterkookus | 7:be13a9037d41 | 69 | sport0.baud(sport0baud); |
masterkookus | 4:98cdccfb17d6 | 70 | } |
masterkookus | 4:98cdccfb17d6 | 71 | |
masterkookus | 7:be13a9037d41 | 72 | void dataprocess(netsys *net2) |
masterkookus | 0:03ab7f7596e2 | 73 | { |
masterkookus | 7:be13a9037d41 | 74 | char* tstcmd = "Tock\r\n"; |
masterkookus | 7:be13a9037d41 | 75 | char tstlen; |
masterkookus | 7:be13a9037d41 | 76 | int txc; |
masterkookus | 5:c656fd08007b | 77 | char cchar; |
masterkookus | 5:c656fd08007b | 78 | char cbuf[256]; |
masterkookus | 5:c656fd08007b | 79 | unsigned int clen=0; |
masterkookus | 5:c656fd08007b | 80 | unsigned int cbc; |
masterkookus | 5:c656fd08007b | 81 | union packer4byte |
masterkookus | 5:c656fd08007b | 82 | { |
masterkookus | 5:c656fd08007b | 83 | unsigned int cmdint; |
masterkookus | 5:c656fd08007b | 84 | char bytes[4]; |
masterkookus | 5:c656fd08007b | 85 | }; |
masterkookus | 5:c656fd08007b | 86 | packer4byte cmdpack; |
masterkookus | 5:c656fd08007b | 87 | |
masterkookus | 4:98cdccfb17d6 | 88 | while(1) |
masterkookus | 0:03ab7f7596e2 | 89 | { |
masterkookus | 7:be13a9037d41 | 90 | while (!receiveBuffer.empty()) |
masterkookus | 5:c656fd08007b | 91 | { |
masterkookus | 7:be13a9037d41 | 92 | receiveBuffer.pop(cchar); |
masterkookus | 5:c656fd08007b | 93 | clen++; |
masterkookus | 5:c656fd08007b | 94 | cbuf[clen]=cchar; |
masterkookus | 5:c656fd08007b | 95 | } |
masterkookus | 7:be13a9037d41 | 96 | if (net2->pollRequestSent) |
masterkookus | 7:be13a9037d41 | 97 | { |
masterkookus | 7:be13a9037d41 | 98 | if (clen>0) |
masterkookus | 7:be13a9037d41 | 99 | { |
masterkookus | 7:be13a9037d41 | 100 | net2->pollResponseReceived=true; |
masterkookus | 7:be13a9037d41 | 101 | } |
masterkookus | 7:be13a9037d41 | 102 | } |
masterkookus | 5:c656fd08007b | 103 | if (clen>3) |
masterkookus | 5:c656fd08007b | 104 | { |
masterkookus | 7:be13a9037d41 | 105 | for (cbc=0;cbc<clen-3;cbc++) |
masterkookus | 5:c656fd08007b | 106 | { |
masterkookus | 7:be13a9037d41 | 107 | printf("Length: %d\r\n",clen); |
masterkookus | 7:be13a9037d41 | 108 | printf("%c%c%c%c\r\n",cbuf[cbc],cbuf[cbc+1],cbuf[cbc+2],cbuf[cbc+3]); |
masterkookus | 5:c656fd08007b | 109 | cmdpack.bytes[3]=cbuf[cbc]; |
masterkookus | 5:c656fd08007b | 110 | cmdpack.bytes[2]=cbuf[cbc+1]; |
masterkookus | 5:c656fd08007b | 111 | cmdpack.bytes[1]=cbuf[cbc+2]; |
masterkookus | 5:c656fd08007b | 112 | cmdpack.bytes[0]=cbuf[cbc+3]; |
masterkookus | 5:c656fd08007b | 113 | if (cmdpack.cmdint==0x5469636b) |
masterkookus | 5:c656fd08007b | 114 | { |
masterkookus | 7:be13a9037d41 | 115 | tstlen=strlen(tstcmd); |
masterkookus | 7:be13a9037d41 | 116 | sendLength.push(tstlen); |
masterkookus | 7:be13a9037d41 | 117 | for (txc=0;txc<6;txc++) |
masterkookus | 7:be13a9037d41 | 118 | { |
masterkookus | 7:be13a9037d41 | 119 | sendBuffer.push(tstcmd[txc]); |
masterkookus | 7:be13a9037d41 | 120 | } |
masterkookus | 7:be13a9037d41 | 121 | if (net2->sendState==0) |
masterkookus | 7:be13a9037d41 | 122 | { |
masterkookus | 7:be13a9037d41 | 123 | net2->sendState=1; |
masterkookus | 7:be13a9037d41 | 124 | } |
masterkookus | 5:c656fd08007b | 125 | clen=0; |
masterkookus | 5:c656fd08007b | 126 | break; |
masterkookus | 5:c656fd08007b | 127 | } |
masterkookus | 5:c656fd08007b | 128 | } |
masterkookus | 7:be13a9037d41 | 129 | if (clen>0) |
masterkookus | 7:be13a9037d41 | 130 | { |
masterkookus | 7:be13a9037d41 | 131 | printf("Command not Received\r\n"); |
masterkookus | 7:be13a9037d41 | 132 | clen=0; |
masterkookus | 7:be13a9037d41 | 133 | } |
masterkookus | 7:be13a9037d41 | 134 | } |
masterkookus | 7:be13a9037d41 | 135 | } |
masterkookus | 7:be13a9037d41 | 136 | } |
masterkookus | 7:be13a9037d41 | 137 | |
masterkookus | 7:be13a9037d41 | 138 | //Ethernet to Ethernet Send Data |
masterkookus | 7:be13a9037d41 | 139 | void datantx(netsys *net2) |
masterkookus | 7:be13a9037d41 | 140 | { |
masterkookus | 7:be13a9037d41 | 141 | while(1) |
masterkookus | 7:be13a9037d41 | 142 | { |
masterkookus | 6:9f97716eae76 | 143 | if (net2->cltIsActive) |
masterkookus | 0:03ab7f7596e2 | 144 | { |
masterkookus | 7:be13a9037d41 | 145 | while (net2->sendState==3) |
masterkookus | 5:c656fd08007b | 146 | { |
masterkookus | 5:c656fd08007b | 147 | if (net2->connectRetry == true) |
masterkookus | 5:c656fd08007b | 148 | { |
masterkookus | 5:c656fd08007b | 149 | wait_ms(100); |
masterkookus | 5:c656fd08007b | 150 | } |
masterkookus | 6:9f97716eae76 | 151 | ret = net2->srv_sock.connect(net2->srv_addr,net2->cltPort); |
masterkookus | 5:c656fd08007b | 152 | if (ret==0) |
masterkookus | 5:c656fd08007b | 153 | { |
masterkookus | 5:c656fd08007b | 154 | net2->connectRetry = false; |
masterkookus | 5:c656fd08007b | 155 | printf("Connected %d\r\n",ret); |
masterkookus | 6:9f97716eae76 | 156 | net2->cltCloseConnection=true; |
masterkookus | 7:be13a9037d41 | 157 | net2->sendState=4; |
masterkookus | 5:c656fd08007b | 158 | } |
masterkookus | 5:c656fd08007b | 159 | else |
masterkookus | 5:c656fd08007b | 160 | { |
masterkookus | 5:c656fd08007b | 161 | net2->connectRetry = true; |
masterkookus | 7:be13a9037d41 | 162 | net2->sendRetryCount++; |
masterkookus | 5:c656fd08007b | 163 | printf("Connect Attempt Failed, Code: %d\r\n",ret); |
masterkookus | 7:be13a9037d41 | 164 | if (net2->sendRetryCount>3) |
masterkookus | 5:c656fd08007b | 165 | { |
masterkookus | 5:c656fd08007b | 166 | printf("Communication Failed, Closing\r\n"); |
masterkookus | 5:c656fd08007b | 167 | net2->connectRetry = false; |
masterkookus | 7:be13a9037d41 | 168 | net2->sendRetryCount = 0; |
masterkookus | 5:c656fd08007b | 169 | net2->messageFailCount++; |
masterkookus | 6:9f97716eae76 | 170 | net2->cltCloseConnection=true; |
masterkookus | 7:be13a9037d41 | 171 | net2->sendState=0; |
masterkookus | 7:be13a9037d41 | 172 | net2->sendTime=0; |
masterkookus | 5:c656fd08007b | 173 | } |
masterkookus | 5:c656fd08007b | 174 | } |
masterkookus | 5:c656fd08007b | 175 | } |
masterkookus | 7:be13a9037d41 | 176 | while (net2->sendState==4) |
masterkookus | 5:c656fd08007b | 177 | { |
masterkookus | 5:c656fd08007b | 178 | if (net2->sendRetry == true) |
masterkookus | 5:c656fd08007b | 179 | { |
masterkookus | 5:c656fd08007b | 180 | wait_ms(100); |
masterkookus | 5:c656fd08007b | 181 | } |
masterkookus | 7:be13a9037d41 | 182 | ret = net2->srv_sock.send(net2->sendString,net2->sendLen); |
masterkookus | 5:c656fd08007b | 183 | if (ret>=0) |
masterkookus | 5:c656fd08007b | 184 | { |
masterkookus | 5:c656fd08007b | 185 | printf("Send Result %d\r\n",ret); |
masterkookus | 5:c656fd08007b | 186 | net2->sendRetry = false; |
masterkookus | 5:c656fd08007b | 187 | net2->txMessageCount++; |
masterkookus | 6:9f97716eae76 | 188 | net2->cltCloseConnection=true; |
masterkookus | 7:be13a9037d41 | 189 | net2->sendState=0; |
masterkookus | 7:be13a9037d41 | 190 | net2->sendTime=0; |
masterkookus | 5:c656fd08007b | 191 | } |
masterkookus | 5:c656fd08007b | 192 | else |
masterkookus | 5:c656fd08007b | 193 | { |
masterkookus | 5:c656fd08007b | 194 | net2->sendRetry = true; |
masterkookus | 7:be13a9037d41 | 195 | net2->sendRetryCount++; |
masterkookus | 5:c656fd08007b | 196 | printf("Send Attempt Failed, Code: %d\r\n",ret); |
masterkookus | 7:be13a9037d41 | 197 | if (net2->sendRetryCount>3) |
masterkookus | 5:c656fd08007b | 198 | { |
masterkookus | 5:c656fd08007b | 199 | printf("Communication Failed, Closing\r\n"); |
masterkookus | 5:c656fd08007b | 200 | net2->sendRetry = false; |
masterkookus | 7:be13a9037d41 | 201 | net2->sendRetryCount = 0; |
masterkookus | 5:c656fd08007b | 202 | net2->messageFailCount++; |
masterkookus | 6:9f97716eae76 | 203 | net2->cltCloseConnection=true; |
masterkookus | 7:be13a9037d41 | 204 | net2->sendState=0; |
masterkookus | 7:be13a9037d41 | 205 | net2->sendTime=0; |
masterkookus | 5:c656fd08007b | 206 | } |
masterkookus | 5:c656fd08007b | 207 | } |
masterkookus | 5:c656fd08007b | 208 | } |
masterkookus | 6:9f97716eae76 | 209 | if (net2->cltCloseConnection==true) |
masterkookus | 5:c656fd08007b | 210 | { |
masterkookus | 6:9f97716eae76 | 211 | net2->srv_sock.close(); |
masterkookus | 6:9f97716eae76 | 212 | net2->cltIsActive=false; |
masterkookus | 5:c656fd08007b | 213 | } |
masterkookus | 0:03ab7f7596e2 | 214 | } |
masterkookus | 0:03ab7f7596e2 | 215 | } |
masterkookus | 0:03ab7f7596e2 | 216 | } |
masterkookus | 0:03ab7f7596e2 | 217 | |
masterkookus | 7:be13a9037d41 | 218 | //Ethernet receive data and send to aux devices (serial, etc...) |
masterkookus | 0:03ab7f7596e2 | 219 | void datanrx(netsys *net2) |
masterkookus | 0:03ab7f7596e2 | 220 | { |
masterkookus | 0:03ab7f7596e2 | 221 | char rxbuf[256]; |
masterkookus | 0:03ab7f7596e2 | 222 | int rxlen=0; |
masterkookus | 5:c656fd08007b | 223 | int rxc; |
masterkookus | 0:03ab7f7596e2 | 224 | while (1) |
masterkookus | 0:03ab7f7596e2 | 225 | { |
masterkookus | 6:9f97716eae76 | 226 | while (net2->srvIsActive) |
masterkookus | 0:03ab7f7596e2 | 227 | { |
masterkookus | 0:03ab7f7596e2 | 228 | rxlen=net2->clt_sock.recv(rxbuf, sizeof(rxbuf)); |
masterkookus | 4:98cdccfb17d6 | 229 | if (rxlen>0) |
masterkookus | 4:98cdccfb17d6 | 230 | { |
masterkookus | 4:98cdccfb17d6 | 231 | net2->aliveTime=0; |
masterkookus | 4:98cdccfb17d6 | 232 | sport0.write(rxbuf,rxlen); |
masterkookus | 5:c656fd08007b | 233 | for (rxc = 0;rxc<rxlen;rxc++) |
masterkookus | 5:c656fd08007b | 234 | { |
masterkookus | 7:be13a9037d41 | 235 | receiveBuffer.push(rxbuf[rxc]); |
masterkookus | 5:c656fd08007b | 236 | } |
masterkookus | 5:c656fd08007b | 237 | net2->rxMessageCount++; |
masterkookus | 4:98cdccfb17d6 | 238 | } |
masterkookus | 0:03ab7f7596e2 | 239 | } |
masterkookus | 0:03ab7f7596e2 | 240 | } |
masterkookus | 0:03ab7f7596e2 | 241 | } |
masterkookus | 0:03ab7f7596e2 | 242 | |
masterkookus | 7:be13a9037d41 | 243 | //Serial device to server connected client |
masterkookus | 0:03ab7f7596e2 | 244 | void datasrx(netsys *net2) |
masterkookus | 0:03ab7f7596e2 | 245 | { |
masterkookus | 0:03ab7f7596e2 | 246 | char rxbuf[256]; |
masterkookus | 0:03ab7f7596e2 | 247 | int rxlen=0; |
masterkookus | 0:03ab7f7596e2 | 248 | int rxc; |
masterkookus | 0:03ab7f7596e2 | 249 | while (1) |
masterkookus | 0:03ab7f7596e2 | 250 | { |
masterkookus | 6:9f97716eae76 | 251 | while (net2->srvIsActive) |
masterkookus | 0:03ab7f7596e2 | 252 | { |
masterkookus | 0:03ab7f7596e2 | 253 | rxlen=sport0.readable(); |
masterkookus | 0:03ab7f7596e2 | 254 | if (rxlen>0) |
masterkookus | 0:03ab7f7596e2 | 255 | { |
masterkookus | 0:03ab7f7596e2 | 256 | for (rxc = 0;rxc<rxlen;rxc++) |
masterkookus | 0:03ab7f7596e2 | 257 | { |
masterkookus | 0:03ab7f7596e2 | 258 | rxbuf[rxc] = sport0.getc(); |
masterkookus | 0:03ab7f7596e2 | 259 | } |
masterkookus | 4:98cdccfb17d6 | 260 | net2->aliveTime=0; |
masterkookus | 0:03ab7f7596e2 | 261 | net2->clt_sock.send(rxbuf, rxlen); |
masterkookus | 6:9f97716eae76 | 262 | net2->txMessageCount++; |
masterkookus | 0:03ab7f7596e2 | 263 | } |
masterkookus | 0:03ab7f7596e2 | 264 | } |
masterkookus | 0:03ab7f7596e2 | 265 | } |
masterkookus | 0:03ab7f7596e2 | 266 | } |
masterkookus | 0:03ab7f7596e2 | 267 | |
masterkookus | 2:ec972966689e | 268 | //Checks for a Ethernet to Serial connection |
masterkookus | 0:03ab7f7596e2 | 269 | void conchk(netsys *net2) |
masterkookus | 0:03ab7f7596e2 | 270 | { |
masterkookus | 0:03ab7f7596e2 | 271 | TCPServer *server=&(net2->srv); |
masterkookus | 0:03ab7f7596e2 | 272 | TCPSocket *client_socket=&(net2->clt_sock); |
masterkookus | 0:03ab7f7596e2 | 273 | SocketAddress *client_address=&(net2->clt_addr); |
masterkookus | 0:03ab7f7596e2 | 274 | |
masterkookus | 0:03ab7f7596e2 | 275 | while(1) |
masterkookus | 0:03ab7f7596e2 | 276 | { |
masterkookus | 5:c656fd08007b | 277 | while (server->accept(client_socket, client_address) < 0) |
masterkookus | 0:03ab7f7596e2 | 278 | { |
masterkookus | 5:c656fd08007b | 279 | //printf("Connection Failed.\r\n"); |
masterkookus | 0:03ab7f7596e2 | 280 | } |
masterkookus | 6:9f97716eae76 | 281 | printf("Server Port %d\r\n", net2->srvPort); |
masterkookus | 5:c656fd08007b | 282 | printf("accept %s:%d\r\n", client_address->get_ip_address(), client_address->get_port()); |
masterkookus | 5:c656fd08007b | 283 | net2->aliveTime=0; |
masterkookus | 6:9f97716eae76 | 284 | net2->srvIsActive=true; |
masterkookus | 0:03ab7f7596e2 | 285 | } |
masterkookus | 0:03ab7f7596e2 | 286 | } |
masterkookus | 0:03ab7f7596e2 | 287 | |
masterkookus | 0:03ab7f7596e2 | 288 | int main() |
masterkookus | 0:03ab7f7596e2 | 289 | { |
masterkookus | 0:03ab7f7596e2 | 290 | EthernetInterface eth; |
masterkookus | 7:be13a9037d41 | 291 | eth.set_network(setseveraddress,setsevermask,setsevergateway); //Use these parameters for static IP |
masterkookus | 0:03ab7f7596e2 | 292 | eth.connect(); |
masterkookus | 0:03ab7f7596e2 | 293 | |
masterkookus | 0:03ab7f7596e2 | 294 | printf("The target IP address is '%s'\r\n", eth.get_ip_address()); |
masterkookus | 4:98cdccfb17d6 | 295 | confignetdevices(ð); |
masterkookus | 2:ec972966689e | 296 | /* Setup Ethernet to Serial Connection Thread */ |
masterkookus | 0:03ab7f7596e2 | 297 | conchkthread[0].start(callback(conchk,&net1)); |
masterkookus | 2:ec972966689e | 298 | /* Setup polltick Ticker */ |
masterkookus | 7:be13a9037d41 | 299 | nettimer.attach_us(heartbeat,10000); |
masterkookus | 2:ec972966689e | 300 | /* Setup Ethernet to Serial transmit data Thread */ |
masterkookus | 0:03ab7f7596e2 | 301 | rxtxdatathread[0].start(callback(datanrx,&net1)); |
masterkookus | 2:ec972966689e | 302 | /* Setup Ethernet to Serial receive data Thread */ |
masterkookus | 0:03ab7f7596e2 | 303 | rxtxdatathread[1].start(callback(datasrx,&net1)); |
masterkookus | 7:be13a9037d41 | 304 | rxtxdatathread[2].start(callback(datantx,&net1)); |
masterkookus | 7:be13a9037d41 | 305 | rxtxdatathread[3].start(callback(dataprocess,&net1)); |
masterkookus | 7:be13a9037d41 | 306 | |
masterkookus | 7:be13a9037d41 | 307 | char* tstcmd = "Tick\r\n"; |
masterkookus | 7:be13a9037d41 | 308 | char tstlen; |
masterkookus | 7:be13a9037d41 | 309 | unsigned int txc; |
masterkookus | 7:be13a9037d41 | 310 | unsigned int sxc; |
masterkookus | 3:ac1f2af8bd0f | 311 | |
masterkookus | 0:03ab7f7596e2 | 312 | while (true) { |
masterkookus | 3:ac1f2af8bd0f | 313 | |
masterkookus | 3:ac1f2af8bd0f | 314 | polltick=getTick(); |
masterkookus | 3:ac1f2af8bd0f | 315 | |
masterkookus | 3:ac1f2af8bd0f | 316 | if (polltick) |
masterkookus | 3:ac1f2af8bd0f | 317 | { |
masterkookus | 3:ac1f2af8bd0f | 318 | setTick(false); |
masterkookus | 3:ac1f2af8bd0f | 319 | incTime(); |
masterkookus | 3:ac1f2af8bd0f | 320 | currenttime=getTime(); |
masterkookus | 6:9f97716eae76 | 321 | net1.pollTime++; |
masterkookus | 7:be13a9037d41 | 322 | net1.sendTime++; |
masterkookus | 6:9f97716eae76 | 323 | if (net1.srvIsActive) |
masterkookus | 0:03ab7f7596e2 | 324 | { |
masterkookus | 4:98cdccfb17d6 | 325 | net1.aliveTime++; |
masterkookus | 6:9f97716eae76 | 326 | if (net1.aliveTime>net1.aliveTimeout) |
masterkookus | 4:98cdccfb17d6 | 327 | { |
masterkookus | 4:98cdccfb17d6 | 328 | printf("Closed\r\n"); |
masterkookus | 4:98cdccfb17d6 | 329 | net1.clt_sock.close(); |
masterkookus | 6:9f97716eae76 | 330 | net1.srvIsActive=false; |
masterkookus | 6:9f97716eae76 | 331 | net1.srvCloseConnection=false; |
masterkookus | 4:98cdccfb17d6 | 332 | } |
masterkookus | 4:98cdccfb17d6 | 333 | |
masterkookus | 0:03ab7f7596e2 | 334 | } |
masterkookus | 7:be13a9037d41 | 335 | if (net1.pollEnabled) |
masterkookus | 4:98cdccfb17d6 | 336 | { |
masterkookus | 7:be13a9037d41 | 337 | if (net1.pollTime >= net1.pollInterval) |
masterkookus | 7:be13a9037d41 | 338 | { |
masterkookus | 7:be13a9037d41 | 339 | tstlen=strlen(tstcmd); |
masterkookus | 7:be13a9037d41 | 340 | sendLength.push(tstlen); |
masterkookus | 7:be13a9037d41 | 341 | for (txc=0;txc<tstlen;txc++) |
masterkookus | 7:be13a9037d41 | 342 | { |
masterkookus | 7:be13a9037d41 | 343 | sendBuffer.push(tstcmd[txc]); |
masterkookus | 7:be13a9037d41 | 344 | } |
masterkookus | 7:be13a9037d41 | 345 | if (net1.sendState==0) |
masterkookus | 7:be13a9037d41 | 346 | { |
masterkookus | 7:be13a9037d41 | 347 | net1.sendState=1; |
masterkookus | 7:be13a9037d41 | 348 | net1.pollRequestSent=true; |
masterkookus | 7:be13a9037d41 | 349 | } |
masterkookus | 7:be13a9037d41 | 350 | net1.pollTime=0; |
masterkookus | 7:be13a9037d41 | 351 | } |
masterkookus | 7:be13a9037d41 | 352 | if (net1.pollTime >= net1.pollTimeout) |
masterkookus | 7:be13a9037d41 | 353 | { |
masterkookus | 7:be13a9037d41 | 354 | if (net1.pollRequestSent) |
masterkookus | 7:be13a9037d41 | 355 | { |
masterkookus | 7:be13a9037d41 | 356 | if (net1.pollResponseReceived==false) |
masterkookus | 7:be13a9037d41 | 357 | { |
masterkookus | 7:be13a9037d41 | 358 | net1.pollTimeoutCount++; |
masterkookus | 7:be13a9037d41 | 359 | net1.pollRequestSent=false; |
masterkookus | 7:be13a9037d41 | 360 | } |
masterkookus | 7:be13a9037d41 | 361 | } |
masterkookus | 7:be13a9037d41 | 362 | } |
masterkookus | 7:be13a9037d41 | 363 | } |
masterkookus | 7:be13a9037d41 | 364 | if (net1.sendTime == 10) |
masterkookus | 7:be13a9037d41 | 365 | { |
masterkookus | 7:be13a9037d41 | 366 | switch (net1.sendState) |
masterkookus | 5:c656fd08007b | 367 | { |
masterkookus | 5:c656fd08007b | 368 | case 1: |
masterkookus | 7:be13a9037d41 | 369 | if (!sendLength.empty()) |
masterkookus | 7:be13a9037d41 | 370 | { |
masterkookus | 7:be13a9037d41 | 371 | sendLength.pop(net1.sendLen); |
masterkookus | 7:be13a9037d41 | 372 | for (sxc=0;sxc<net1.sendLen;sxc++) |
masterkookus | 7:be13a9037d41 | 373 | { |
masterkookus | 7:be13a9037d41 | 374 | sendBuffer.pop(net1.sendString[sxc]); |
masterkookus | 7:be13a9037d41 | 375 | } |
masterkookus | 7:be13a9037d41 | 376 | } |
masterkookus | 7:be13a9037d41 | 377 | else |
masterkookus | 7:be13a9037d41 | 378 | { |
masterkookus | 7:be13a9037d41 | 379 | net1.sendState=0; |
masterkookus | 7:be13a9037d41 | 380 | } |
masterkookus | 6:9f97716eae76 | 381 | ret=net1.srv_sock.open(ð); |
masterkookus | 5:c656fd08007b | 382 | printf("Socket%d\r\n",ret); |
masterkookus | 5:c656fd08007b | 383 | if (ret < 0) |
masterkookus | 5:c656fd08007b | 384 | { |
masterkookus | 7:be13a9037d41 | 385 | net1.attachRetry = true; |
masterkookus | 7:be13a9037d41 | 386 | net1.sendRetryCount=0; |
masterkookus | 7:be13a9037d41 | 387 | net1.sendState=2; |
masterkookus | 7:be13a9037d41 | 388 | net1.sendTime=0; |
masterkookus | 5:c656fd08007b | 389 | break; |
masterkookus | 5:c656fd08007b | 390 | } |
masterkookus | 7:be13a9037d41 | 391 | net1.sendState=3; |
masterkookus | 7:be13a9037d41 | 392 | net1.sendTime=11; |
masterkookus | 6:9f97716eae76 | 393 | net1.cltIsActive=true; |
masterkookus | 5:c656fd08007b | 394 | break; |
masterkookus | 5:c656fd08007b | 395 | case 2: |
masterkookus | 6:9f97716eae76 | 396 | ret=net1.srv_sock.open(ð); |
masterkookus | 5:c656fd08007b | 397 | printf("Socket%d\r\n",ret); |
masterkookus | 5:c656fd08007b | 398 | if (ret < 0) |
masterkookus | 5:c656fd08007b | 399 | { |
masterkookus | 7:be13a9037d41 | 400 | net1.attachRetry = true; |
masterkookus | 7:be13a9037d41 | 401 | net1.sendRetryCount++; |
masterkookus | 7:be13a9037d41 | 402 | net1.sendTime=0; |
masterkookus | 5:c656fd08007b | 403 | printf("Attach Attempt Failed, Code: %d\r\n",ret); |
masterkookus | 7:be13a9037d41 | 404 | if (net1.sendRetryCount>3) |
masterkookus | 5:c656fd08007b | 405 | { |
masterkookus | 5:c656fd08007b | 406 | printf("Communication Failed, Closing\r\n"); |
masterkookus | 7:be13a9037d41 | 407 | net1.attachRetry = false; |
masterkookus | 7:be13a9037d41 | 408 | net1.sendRetryCount = 0; |
masterkookus | 6:9f97716eae76 | 409 | net1.messageFailCount++; |
masterkookus | 7:be13a9037d41 | 410 | net1.sendState=0; |
masterkookus | 7:be13a9037d41 | 411 | net1.sendTime=0; |
masterkookus | 5:c656fd08007b | 412 | } |
masterkookus | 5:c656fd08007b | 413 | break; |
masterkookus | 5:c656fd08007b | 414 | } |
masterkookus | 7:be13a9037d41 | 415 | net1.sendState=0; |
masterkookus | 7:be13a9037d41 | 416 | net1.attachRetry = false; |
masterkookus | 7:be13a9037d41 | 417 | net1.sendTime=11; |
masterkookus | 6:9f97716eae76 | 418 | net1.cltIsActive=true; |
masterkookus | 5:c656fd08007b | 419 | break; |
masterkookus | 5:c656fd08007b | 420 | default: |
masterkookus | 7:be13a9037d41 | 421 | net1.sendTime=0; |
masterkookus | 7:be13a9037d41 | 422 | if (!sendLength.empty()) |
masterkookus | 7:be13a9037d41 | 423 | { |
masterkookus | 7:be13a9037d41 | 424 | net1.sendState=1; |
masterkookus | 7:be13a9037d41 | 425 | } |
masterkookus | 5:c656fd08007b | 426 | break; |
masterkookus | 5:c656fd08007b | 427 | } |
masterkookus | 4:98cdccfb17d6 | 428 | } |
masterkookus | 1:a57cbebba3fd | 429 | } |
masterkookus | 0:03ab7f7596e2 | 430 | } |
masterkookus | 0:03ab7f7596e2 | 431 | } |