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:
Thu Sep 26 18:40:53 2019 +0000
Revision:
8:fa2a2c3a16ce
Parent:
7:be13a9037d41
Child:
9:d6e7981dfc89
Command Response and Data Storage;

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 5:c656fd08007b 30
masterkookus 0:03ab7f7596e2 31 Thread conchkthread[2];
masterkookus 4:98cdccfb17d6 32 Thread rxtxdatathread[5];
masterkookus 4:98cdccfb17d6 33
masterkookus 4:98cdccfb17d6 34 unsigned int currenttime=0;
masterkookus 0:03ab7f7596e2 35
masterkookus 5:c656fd08007b 36 nsapi_error_t ret;
masterkookus 5:c656fd08007b 37
masterkookus 2:ec972966689e 38 //Provides the deivce poll timing
masterkookus 1:a57cbebba3fd 39 void heartbeat()
masterkookus 1:a57cbebba3fd 40 {
masterkookus 3:ac1f2af8bd0f 41 //polltick=true;
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 6:9f97716eae76 50 net1.cltCloseConnection=false;
masterkookus 6:9f97716eae76 51 net1.pollTime=0;
masterkookus 8:fa2a2c3a16ce 52 net1.pollTimeout=0;
masterkookus 7:be13a9037d41 53 net1.pollInterval=setpollinterval;
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 8:fa2a2c3a16ce 63 net1.pollState=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 4:98cdccfb17d6 69
masterkookus 4:98cdccfb17d6 70 /* Open the server on ethernet stack */
masterkookus 4:98cdccfb17d6 71 net1.srv.open(eth);
masterkookus 6:9f97716eae76 72 net1.srvIsActive=false;
masterkookus 6:9f97716eae76 73 net1.srvCloseConnection=false;
masterkookus 4:98cdccfb17d6 74
masterkookus 4:98cdccfb17d6 75 /* Bind port 23 to the server */
masterkookus 7:be13a9037d41 76 net1.srvPort=setserverport;
masterkookus 6:9f97716eae76 77 net1.srv.bind(net1.srvPort);
masterkookus 4:98cdccfb17d6 78
masterkookus 4:98cdccfb17d6 79 /* Can handle 5 simultaneous connections */
masterkookus 4:98cdccfb17d6 80 net1.srv.listen(5);
masterkookus 7:be13a9037d41 81 sport0.baud(sport0baud);
masterkookus 4:98cdccfb17d6 82 }
masterkookus 4:98cdccfb17d6 83
masterkookus 7:be13a9037d41 84 void dataprocess(netsys *net2)
masterkookus 0:03ab7f7596e2 85 {
masterkookus 7:be13a9037d41 86 int txc;
masterkookus 5:c656fd08007b 87 char cchar;
masterkookus 5:c656fd08007b 88 char cbuf[256];
masterkookus 5:c656fd08007b 89 unsigned int clen=0;
masterkookus 5:c656fd08007b 90 unsigned int cbc;
masterkookus 8:fa2a2c3a16ce 91 int4byte cmdpack;
masterkookus 8:fa2a2c3a16ce 92 float4byte valpack;
masterkookus 8:fa2a2c3a16ce 93 short2byte timepack;
masterkookus 5:c656fd08007b 94
masterkookus 4:98cdccfb17d6 95 while(1)
masterkookus 0:03ab7f7596e2 96 {
masterkookus 7:be13a9037d41 97 while (!receiveBuffer.empty())
masterkookus 5:c656fd08007b 98 {
masterkookus 7:be13a9037d41 99 receiveBuffer.pop(cchar);
masterkookus 8:fa2a2c3a16ce 100 cbuf[clen]=cchar;
masterkookus 5:c656fd08007b 101 clen++;
masterkookus 5:c656fd08007b 102 }
masterkookus 7:be13a9037d41 103 if (net2->pollRequestSent)
masterkookus 7:be13a9037d41 104 {
masterkookus 7:be13a9037d41 105 if (clen>0)
masterkookus 7:be13a9037d41 106 {
masterkookus 7:be13a9037d41 107 net2->pollResponseReceived=true;
masterkookus 7:be13a9037d41 108 }
masterkookus 7:be13a9037d41 109 }
masterkookus 5:c656fd08007b 110 if (clen>3)
masterkookus 5:c656fd08007b 111 {
masterkookus 7:be13a9037d41 112 for (cbc=0;cbc<clen-3;cbc++)
masterkookus 5:c656fd08007b 113 {
masterkookus 8:fa2a2c3a16ce 114 //printf("Length: %d\r\n",clen);
masterkookus 8:fa2a2c3a16ce 115 //printf("%c%c%c%c\r\n",cbuf[cbc],cbuf[cbc+1],cbuf[cbc+2],cbuf[cbc+3]);
masterkookus 8:fa2a2c3a16ce 116 if (net2->sendState==3)
masterkookus 8:fa2a2c3a16ce 117 {
masterkookus 8:fa2a2c3a16ce 118 cmdpack.bytes[3]=cbuf[cbc];
masterkookus 8:fa2a2c3a16ce 119 cmdpack.bytes[2]=cbuf[cbc+1];
masterkookus 8:fa2a2c3a16ce 120 cmdpack.bytes[1]=cbuf[cbc+2];
masterkookus 8:fa2a2c3a16ce 121 cmdpack.bytes[0]=0x00;
masterkookus 8:fa2a2c3a16ce 122 //printf("%08x\r\n",cmdpack.cmdint);
masterkookus 8:fa2a2c3a16ce 123 if (cmdpack.cmdint&0xF0000000)
masterkookus 8:fa2a2c3a16ce 124 {
masterkookus 8:fa2a2c3a16ce 125 printf("Telnet Command Received\r\n");
masterkookus 8:fa2a2c3a16ce 126 cbc=cbc+3;
masterkookus 8:fa2a2c3a16ce 127 if (cbc>=clen)
masterkookus 8:fa2a2c3a16ce 128 {
masterkookus 8:fa2a2c3a16ce 129 clen=0;
masterkookus 8:fa2a2c3a16ce 130 }
masterkookus 8:fa2a2c3a16ce 131 }
masterkookus 8:fa2a2c3a16ce 132 }
masterkookus 8:fa2a2c3a16ce 133 else
masterkookus 5:c656fd08007b 134 {
masterkookus 8:fa2a2c3a16ce 135 //printf("%c%c%c%c\r\n",cbuf[cbc],cbuf[cbc+1],cbuf[cbc+2],cbuf[cbc+3]);
masterkookus 8:fa2a2c3a16ce 136 cmdpack.bytes[3]=cbuf[cbc];
masterkookus 8:fa2a2c3a16ce 137 cmdpack.bytes[2]=cbuf[cbc+1];
masterkookus 8:fa2a2c3a16ce 138 cmdpack.bytes[1]=0x00;
masterkookus 8:fa2a2c3a16ce 139 cmdpack.bytes[0]=0x00;
masterkookus 8:fa2a2c3a16ce 140 if (cmdpack.cmdint==0xA5C00000)
masterkookus 7:be13a9037d41 141 {
masterkookus 8:fa2a2c3a16ce 142 sport0.write(cbuf,clen);
masterkookus 8:fa2a2c3a16ce 143 /*sendLength.push(tstlen);
masterkookus 8:fa2a2c3a16ce 144 for (txc=0;txc<2;txc++)
masterkookus 8:fa2a2c3a16ce 145 {
masterkookus 8:fa2a2c3a16ce 146 sendBuffer.push(tstcmd[txc]);
masterkookus 8:fa2a2c3a16ce 147 }*/
masterkookus 8:fa2a2c3a16ce 148 net2->pollState=1;
masterkookus 8:fa2a2c3a16ce 149 clen=0;
masterkookus 8:fa2a2c3a16ce 150 break;
masterkookus 7:be13a9037d41 151 }
masterkookus 8:fa2a2c3a16ce 152 if (cmdpack.cmdint==0xA5C10000)
masterkookus 7:be13a9037d41 153 {
masterkookus 8:fa2a2c3a16ce 154 sport0.write(cbuf,clen);
masterkookus 8:fa2a2c3a16ce 155 if (vReg1.numAnalog!=cbuf[6])
masterkookus 8:fa2a2c3a16ce 156 {
masterkookus 8:fa2a2c3a16ce 157 printf("\r\nAnalog Channel Count Off\r\n");
masterkookus 8:fa2a2c3a16ce 158 net2->pollState=0;
masterkookus 8:fa2a2c3a16ce 159 break;
masterkookus 8:fa2a2c3a16ce 160 }
masterkookus 8:fa2a2c3a16ce 161 if (vReg1.numDigital!=cbuf[8])
masterkookus 8:fa2a2c3a16ce 162 {
masterkookus 8:fa2a2c3a16ce 163 printf("\r\nDigital Channel Count Off\r\n");
masterkookus 8:fa2a2c3a16ce 164 net2->pollState=0;
masterkookus 8:fa2a2c3a16ce 165 break;
masterkookus 8:fa2a2c3a16ce 166 }
masterkookus 8:fa2a2c3a16ce 167 char anum=16;
masterkookus 8:fa2a2c3a16ce 168 char nxc;
masterkookus 8:fa2a2c3a16ce 169 for (txc=0;txc<vReg1.numAnalog;txc++)
masterkookus 8:fa2a2c3a16ce 170 {
masterkookus 8:fa2a2c3a16ce 171 for (nxc=0;nxc<6;nxc++)
masterkookus 8:fa2a2c3a16ce 172 {
masterkookus 8:fa2a2c3a16ce 173 //printf("%c %c",vReg1.analogs[txc].analogName[nxc],cbuf[anum+nxc]);
masterkookus 8:fa2a2c3a16ce 174 if(vReg1.analogs[txc].analogName[nxc]!=cbuf[anum+nxc])
masterkookus 8:fa2a2c3a16ce 175 {
masterkookus 8:fa2a2c3a16ce 176 printf("\r\nPoint %d Failed\r\n",txc);
masterkookus 8:fa2a2c3a16ce 177 break;
masterkookus 8:fa2a2c3a16ce 178 }
masterkookus 8:fa2a2c3a16ce 179 }
masterkookus 8:fa2a2c3a16ce 180 anum = anum + 11;
masterkookus 8:fa2a2c3a16ce 181 //printf("\r\n");
masterkookus 8:fa2a2c3a16ce 182 }
masterkookus 8:fa2a2c3a16ce 183 net2->pollState=2;
masterkookus 8:fa2a2c3a16ce 184 clen=0;
masterkookus 8:fa2a2c3a16ce 185 break;
masterkookus 7:be13a9037d41 186 }
masterkookus 8:fa2a2c3a16ce 187 if (cmdpack.cmdint==0xA5D10000)
masterkookus 8:fa2a2c3a16ce 188 {
masterkookus 8:fa2a2c3a16ce 189 char anum=4;
masterkookus 8:fa2a2c3a16ce 190 for (txc=0;txc<vReg1.numAnalog;txc++)
masterkookus 8:fa2a2c3a16ce 191 {
masterkookus 8:fa2a2c3a16ce 192 valpack.bytes[3]=cbuf[anum];
masterkookus 8:fa2a2c3a16ce 193 valpack.bytes[2]=cbuf[anum+1];
masterkookus 8:fa2a2c3a16ce 194 valpack.bytes[1]=cbuf[anum+2];
masterkookus 8:fa2a2c3a16ce 195 valpack.bytes[0]=cbuf[anum+3];
masterkookus 8:fa2a2c3a16ce 196 vReg1.analogs[txc].analog1Value = valpack.cmdflt;
masterkookus 8:fa2a2c3a16ce 197 anum = anum + 4;
masterkookus 8:fa2a2c3a16ce 198 //printf("%02x, %02x %02x %02x\r\n",cbuf[anum],cbuf[anum+1],cbuf[anum+2],cbuf[anum+3]);
masterkookus 8:fa2a2c3a16ce 199 //printf("%02x, %02x %02x %02x\r\n",valpack.bytes[3],valpack.bytes[2],valpack.bytes[1],valpack.bytes[0]);
masterkookus 8:fa2a2c3a16ce 200 //printf("%f\r\n",valpack.cmdflt);
masterkookus 8:fa2a2c3a16ce 201 printf("%.2f\r\n",vReg1.analogs[txc].analog1Value);
masterkookus 8:fa2a2c3a16ce 202 }
masterkookus 8:fa2a2c3a16ce 203 printf("%d\r\n",anum);
masterkookus 8:fa2a2c3a16ce 204 vReg1.timeStamp.month=cbuf[anum];
masterkookus 8:fa2a2c3a16ce 205 vReg1.timeStamp.day=cbuf[anum+1];
masterkookus 8:fa2a2c3a16ce 206 vReg1.timeStamp.year=cbuf[anum+2];
masterkookus 8:fa2a2c3a16ce 207 vReg1.timeStamp.hour=cbuf[anum+3];
masterkookus 8:fa2a2c3a16ce 208 vReg1.timeStamp.min=cbuf[anum+4];
masterkookus 8:fa2a2c3a16ce 209 vReg1.timeStamp.sec=cbuf[anum+5];
masterkookus 8:fa2a2c3a16ce 210 timepack.bytes[1]=cbuf[anum+6];
masterkookus 8:fa2a2c3a16ce 211 timepack.bytes[0]=cbuf[anum+7];
masterkookus 8:fa2a2c3a16ce 212 vReg1.timeStamp.msec=timepack.cmdshort;
masterkookus 8:fa2a2c3a16ce 213 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 8:fa2a2c3a16ce 214 anum=anum+8;
masterkookus 8:fa2a2c3a16ce 215 for (txc=0;txc<vReg1.numDigital;txc++)
masterkookus 8:fa2a2c3a16ce 216 {
masterkookus 8:fa2a2c3a16ce 217 vReg1.digitalTargets[txc]=cbuf[anum+txc];
masterkookus 8:fa2a2c3a16ce 218 }
masterkookus 8:fa2a2c3a16ce 219 clen=0;
masterkookus 8:fa2a2c3a16ce 220 break;
masterkookus 8:fa2a2c3a16ce 221 }
masterkookus 5:c656fd08007b 222 }
masterkookus 5:c656fd08007b 223 }
masterkookus 7:be13a9037d41 224 if (clen>0)
masterkookus 7:be13a9037d41 225 {
masterkookus 7:be13a9037d41 226 printf("Command not Received\r\n");
masterkookus 7:be13a9037d41 227 clen=0;
masterkookus 7:be13a9037d41 228 }
masterkookus 7:be13a9037d41 229 }
masterkookus 7:be13a9037d41 230 }
masterkookus 7:be13a9037d41 231 }
masterkookus 7:be13a9037d41 232
masterkookus 7:be13a9037d41 233 //Ethernet to Ethernet Send Data
masterkookus 7:be13a9037d41 234 void datantx(netsys *net2)
masterkookus 7:be13a9037d41 235 {
masterkookus 7:be13a9037d41 236 while(1)
masterkookus 7:be13a9037d41 237 {
masterkookus 6:9f97716eae76 238 if (net2->cltIsActive)
masterkookus 0:03ab7f7596e2 239 {
masterkookus 7:be13a9037d41 240 while (net2->sendState==3)
masterkookus 5:c656fd08007b 241 {
masterkookus 5:c656fd08007b 242 if (net2->connectRetry == true)
masterkookus 5:c656fd08007b 243 {
masterkookus 5:c656fd08007b 244 wait_ms(100);
masterkookus 5:c656fd08007b 245 }
masterkookus 6:9f97716eae76 246 ret = net2->srv_sock.connect(net2->srv_addr,net2->cltPort);
masterkookus 5:c656fd08007b 247 if (ret==0)
masterkookus 5:c656fd08007b 248 {
masterkookus 5:c656fd08007b 249 net2->connectRetry = false;
masterkookus 5:c656fd08007b 250 printf("Connected %d\r\n",ret);
masterkookus 8:fa2a2c3a16ce 251 //net2->cltCloseConnection=true;
masterkookus 8:fa2a2c3a16ce 252 net2->sendState=4;
masterkookus 8:fa2a2c3a16ce 253 }
masterkookus 8:fa2a2c3a16ce 254 else if (ret==-3015)
masterkookus 8:fa2a2c3a16ce 255 {
masterkookus 8:fa2a2c3a16ce 256 printf("May already be connected, attempting send.\r\n");
masterkookus 8:fa2a2c3a16ce 257 net2->connectRetry = false;
masterkookus 7:be13a9037d41 258 net2->sendState=4;
masterkookus 5:c656fd08007b 259 }
masterkookus 5:c656fd08007b 260 else
masterkookus 5:c656fd08007b 261 {
masterkookus 5:c656fd08007b 262 net2->connectRetry = true;
masterkookus 7:be13a9037d41 263 net2->sendRetryCount++;
masterkookus 5:c656fd08007b 264 printf("Connect Attempt Failed, Code: %d\r\n",ret);
masterkookus 7:be13a9037d41 265 if (net2->sendRetryCount>3)
masterkookus 5:c656fd08007b 266 {
masterkookus 5:c656fd08007b 267 printf("Communication Failed, Closing\r\n");
masterkookus 5:c656fd08007b 268 net2->connectRetry = false;
masterkookus 7:be13a9037d41 269 net2->sendRetryCount = 0;
masterkookus 5:c656fd08007b 270 net2->messageFailCount++;
masterkookus 6:9f97716eae76 271 net2->cltCloseConnection=true;
masterkookus 7:be13a9037d41 272 net2->sendState=0;
masterkookus 7:be13a9037d41 273 net2->sendTime=0;
masterkookus 5:c656fd08007b 274 }
masterkookus 5:c656fd08007b 275 }
masterkookus 5:c656fd08007b 276 }
masterkookus 7:be13a9037d41 277 while (net2->sendState==4)
masterkookus 5:c656fd08007b 278 {
masterkookus 5:c656fd08007b 279 if (net2->sendRetry == true)
masterkookus 5:c656fd08007b 280 {
masterkookus 5:c656fd08007b 281 wait_ms(100);
masterkookus 5:c656fd08007b 282 }
masterkookus 7:be13a9037d41 283 ret = net2->srv_sock.send(net2->sendString,net2->sendLen);
masterkookus 5:c656fd08007b 284 if (ret>=0)
masterkookus 5:c656fd08007b 285 {
masterkookus 5:c656fd08007b 286 printf("Send Result %d\r\n",ret);
masterkookus 5:c656fd08007b 287 net2->sendRetry = false;
masterkookus 5:c656fd08007b 288 net2->txMessageCount++;
masterkookus 8:fa2a2c3a16ce 289 //net2->cltCloseConnection=true;
masterkookus 8:fa2a2c3a16ce 290 net2->sendState=5;
masterkookus 7:be13a9037d41 291 net2->sendTime=0;
masterkookus 5:c656fd08007b 292 }
masterkookus 5:c656fd08007b 293 else
masterkookus 5:c656fd08007b 294 {
masterkookus 5:c656fd08007b 295 net2->sendRetry = true;
masterkookus 7:be13a9037d41 296 net2->sendRetryCount++;
masterkookus 5:c656fd08007b 297 printf("Send Attempt Failed, Code: %d\r\n",ret);
masterkookus 7:be13a9037d41 298 if (net2->sendRetryCount>3)
masterkookus 5:c656fd08007b 299 {
masterkookus 5:c656fd08007b 300 printf("Communication Failed, Closing\r\n");
masterkookus 5:c656fd08007b 301 net2->sendRetry = false;
masterkookus 7:be13a9037d41 302 net2->sendRetryCount = 0;
masterkookus 5:c656fd08007b 303 net2->messageFailCount++;
masterkookus 6:9f97716eae76 304 net2->cltCloseConnection=true;
masterkookus 7:be13a9037d41 305 net2->sendState=0;
masterkookus 7:be13a9037d41 306 net2->sendTime=0;
masterkookus 5:c656fd08007b 307 }
masterkookus 5:c656fd08007b 308 }
masterkookus 5:c656fd08007b 309 }
masterkookus 8:fa2a2c3a16ce 310 }
masterkookus 8:fa2a2c3a16ce 311 }
masterkookus 8:fa2a2c3a16ce 312 }
masterkookus 8:fa2a2c3a16ce 313
masterkookus 8:fa2a2c3a16ce 314 //Ethernet receive data and send to aux devices (serial, etc...)
masterkookus 8:fa2a2c3a16ce 315 void datancrx(netsys *net2)
masterkookus 8:fa2a2c3a16ce 316 {
masterkookus 8:fa2a2c3a16ce 317 char rxbuf[256];
masterkookus 8:fa2a2c3a16ce 318 int rxlen=0;
masterkookus 8:fa2a2c3a16ce 319 int rxc;
masterkookus 8:fa2a2c3a16ce 320 while (1)
masterkookus 8:fa2a2c3a16ce 321 {
masterkookus 8:fa2a2c3a16ce 322 while (net2->cltIsActive)
masterkookus 8:fa2a2c3a16ce 323 {
masterkookus 8:fa2a2c3a16ce 324 rxlen=net2->srv_sock.recv(rxbuf, sizeof(rxbuf));
masterkookus 8:fa2a2c3a16ce 325 if (rxlen>0)
masterkookus 5:c656fd08007b 326 {
masterkookus 8:fa2a2c3a16ce 327 net2->aliveTime=0;
masterkookus 8:fa2a2c3a16ce 328 for (rxc = 0;rxc<rxlen;rxc++)
masterkookus 8:fa2a2c3a16ce 329 {
masterkookus 8:fa2a2c3a16ce 330 receiveBuffer.push(rxbuf[rxc]);
masterkookus 8:fa2a2c3a16ce 331 }
masterkookus 8:fa2a2c3a16ce 332 printf("Client Received Data\r\n");
masterkookus 8:fa2a2c3a16ce 333 net2->rxMessageCount++;
masterkookus 5:c656fd08007b 334 }
masterkookus 0:03ab7f7596e2 335 }
masterkookus 0:03ab7f7596e2 336 }
masterkookus 0:03ab7f7596e2 337 }
masterkookus 0:03ab7f7596e2 338
masterkookus 7:be13a9037d41 339 //Ethernet receive data and send to aux devices (serial, etc...)
masterkookus 8:fa2a2c3a16ce 340 void datansrx(netsys *net2)
masterkookus 0:03ab7f7596e2 341 {
masterkookus 0:03ab7f7596e2 342 char rxbuf[256];
masterkookus 0:03ab7f7596e2 343 int rxlen=0;
masterkookus 5:c656fd08007b 344 int rxc;
masterkookus 0:03ab7f7596e2 345 while (1)
masterkookus 0:03ab7f7596e2 346 {
masterkookus 6:9f97716eae76 347 while (net2->srvIsActive)
masterkookus 0:03ab7f7596e2 348 {
masterkookus 0:03ab7f7596e2 349 rxlen=net2->clt_sock.recv(rxbuf, sizeof(rxbuf));
masterkookus 4:98cdccfb17d6 350 if (rxlen>0)
masterkookus 4:98cdccfb17d6 351 {
masterkookus 4:98cdccfb17d6 352 net2->aliveTime=0;
masterkookus 5:c656fd08007b 353 for (rxc = 0;rxc<rxlen;rxc++)
masterkookus 5:c656fd08007b 354 {
masterkookus 7:be13a9037d41 355 receiveBuffer.push(rxbuf[rxc]);
masterkookus 5:c656fd08007b 356 }
masterkookus 8:fa2a2c3a16ce 357 printf("Server Received Data\r\n");
masterkookus 5:c656fd08007b 358 net2->rxMessageCount++;
masterkookus 4:98cdccfb17d6 359 }
masterkookus 0:03ab7f7596e2 360 }
masterkookus 0:03ab7f7596e2 361 }
masterkookus 0:03ab7f7596e2 362 }
masterkookus 0:03ab7f7596e2 363
masterkookus 8:fa2a2c3a16ce 364 //Serial device to server
masterkookus 0:03ab7f7596e2 365 void datasrx(netsys *net2)
masterkookus 0:03ab7f7596e2 366 {
masterkookus 0:03ab7f7596e2 367 char rxbuf[256];
masterkookus 0:03ab7f7596e2 368 int rxlen=0;
masterkookus 0:03ab7f7596e2 369 int rxc;
masterkookus 0:03ab7f7596e2 370 while (1)
masterkookus 0:03ab7f7596e2 371 {
masterkookus 6:9f97716eae76 372 while (net2->srvIsActive)
masterkookus 0:03ab7f7596e2 373 {
masterkookus 0:03ab7f7596e2 374 rxlen=sport0.readable();
masterkookus 0:03ab7f7596e2 375 if (rxlen>0)
masterkookus 0:03ab7f7596e2 376 {
masterkookus 0:03ab7f7596e2 377 for (rxc = 0;rxc<rxlen;rxc++)
masterkookus 0:03ab7f7596e2 378 {
masterkookus 0:03ab7f7596e2 379 rxbuf[rxc] = sport0.getc();
masterkookus 0:03ab7f7596e2 380 }
masterkookus 4:98cdccfb17d6 381 net2->aliveTime=0;
masterkookus 0:03ab7f7596e2 382 net2->clt_sock.send(rxbuf, rxlen);
masterkookus 6:9f97716eae76 383 net2->txMessageCount++;
masterkookus 0:03ab7f7596e2 384 }
masterkookus 0:03ab7f7596e2 385 }
masterkookus 0:03ab7f7596e2 386 }
masterkookus 0:03ab7f7596e2 387 }
masterkookus 0:03ab7f7596e2 388
masterkookus 2:ec972966689e 389 //Checks for a Ethernet to Serial connection
masterkookus 0:03ab7f7596e2 390 void conchk(netsys *net2)
masterkookus 0:03ab7f7596e2 391 {
masterkookus 0:03ab7f7596e2 392 TCPServer *server=&(net2->srv);
masterkookus 0:03ab7f7596e2 393 TCPSocket *client_socket=&(net2->clt_sock);
masterkookus 0:03ab7f7596e2 394 SocketAddress *client_address=&(net2->clt_addr);
masterkookus 0:03ab7f7596e2 395
masterkookus 0:03ab7f7596e2 396 while(1)
masterkookus 0:03ab7f7596e2 397 {
masterkookus 5:c656fd08007b 398 while (server->accept(client_socket, client_address) < 0)
masterkookus 0:03ab7f7596e2 399 {
masterkookus 5:c656fd08007b 400 //printf("Connection Failed.\r\n");
masterkookus 0:03ab7f7596e2 401 }
masterkookus 6:9f97716eae76 402 printf("Server Port %d\r\n", net2->srvPort);
masterkookus 5:c656fd08007b 403 printf("accept %s:%d\r\n", client_address->get_ip_address(), client_address->get_port());
masterkookus 5:c656fd08007b 404 net2->aliveTime=0;
masterkookus 6:9f97716eae76 405 net2->srvIsActive=true;
masterkookus 0:03ab7f7596e2 406 }
masterkookus 0:03ab7f7596e2 407 }
masterkookus 0:03ab7f7596e2 408
masterkookus 0:03ab7f7596e2 409 int main()
masterkookus 0:03ab7f7596e2 410 {
masterkookus 0:03ab7f7596e2 411 EthernetInterface eth;
masterkookus 7:be13a9037d41 412 eth.set_network(setseveraddress,setsevermask,setsevergateway); //Use these parameters for static IP
masterkookus 0:03ab7f7596e2 413 eth.connect();
masterkookus 0:03ab7f7596e2 414
masterkookus 8:fa2a2c3a16ce 415 initVoltageRegulator(&vReg1);
masterkookus 8:fa2a2c3a16ce 416
masterkookus 0:03ab7f7596e2 417 printf("The target IP address is '%s'\r\n", eth.get_ip_address());
masterkookus 8:fa2a2c3a16ce 418 printf("%s\r\n",vReg1.analogs[0].analogName);
masterkookus 4:98cdccfb17d6 419 confignetdevices(&eth);
masterkookus 2:ec972966689e 420 /* Setup Ethernet to Serial Connection Thread */
masterkookus 0:03ab7f7596e2 421 conchkthread[0].start(callback(conchk,&net1));
masterkookus 2:ec972966689e 422 /* Setup polltick Ticker */
masterkookus 7:be13a9037d41 423 nettimer.attach_us(heartbeat,10000);
masterkookus 2:ec972966689e 424 /* Setup Ethernet to Serial transmit data Thread */
masterkookus 8:fa2a2c3a16ce 425 rxtxdatathread[0].start(callback(datansrx,&net1));
masterkookus 8:fa2a2c3a16ce 426 rxtxdatathread[1].start(callback(datancrx,&net1));
masterkookus 2:ec972966689e 427 /* Setup Ethernet to Serial receive data Thread */
masterkookus 8:fa2a2c3a16ce 428 rxtxdatathread[2].start(callback(datasrx,&net1));
masterkookus 8:fa2a2c3a16ce 429 rxtxdatathread[3].start(callback(datantx,&net1));
masterkookus 8:fa2a2c3a16ce 430 rxtxdatathread[4].start(callback(dataprocess,&net1));
masterkookus 7:be13a9037d41 431
masterkookus 7:be13a9037d41 432 unsigned int txc;
masterkookus 7:be13a9037d41 433 unsigned int sxc;
masterkookus 3:ac1f2af8bd0f 434
masterkookus 0:03ab7f7596e2 435 while (true) {
masterkookus 3:ac1f2af8bd0f 436
masterkookus 3:ac1f2af8bd0f 437 polltick=getTick();
masterkookus 3:ac1f2af8bd0f 438
masterkookus 3:ac1f2af8bd0f 439 if (polltick)
masterkookus 3:ac1f2af8bd0f 440 {
masterkookus 3:ac1f2af8bd0f 441 setTick(false);
masterkookus 3:ac1f2af8bd0f 442 incTime();
masterkookus 3:ac1f2af8bd0f 443 currenttime=getTime();
masterkookus 6:9f97716eae76 444 net1.pollTime++;
masterkookus 7:be13a9037d41 445 net1.sendTime++;
masterkookus 6:9f97716eae76 446 if (net1.srvIsActive)
masterkookus 0:03ab7f7596e2 447 {
masterkookus 4:98cdccfb17d6 448 net1.aliveTime++;
masterkookus 6:9f97716eae76 449 if (net1.aliveTime>net1.aliveTimeout)
masterkookus 4:98cdccfb17d6 450 {
masterkookus 4:98cdccfb17d6 451 printf("Closed\r\n");
masterkookus 4:98cdccfb17d6 452 net1.clt_sock.close();
masterkookus 6:9f97716eae76 453 net1.srvIsActive=false;
masterkookus 6:9f97716eae76 454 net1.srvCloseConnection=false;
masterkookus 4:98cdccfb17d6 455 }
masterkookus 4:98cdccfb17d6 456
masterkookus 0:03ab7f7596e2 457 }
masterkookus 7:be13a9037d41 458 if (net1.pollEnabled)
masterkookus 4:98cdccfb17d6 459 {
masterkookus 7:be13a9037d41 460 if (net1.pollTime >= net1.pollInterval)
masterkookus 7:be13a9037d41 461 {
masterkookus 8:fa2a2c3a16ce 462 sendLength.push(2);
masterkookus 8:fa2a2c3a16ce 463 for (txc=0;txc<2;txc++)
masterkookus 7:be13a9037d41 464 {
masterkookus 8:fa2a2c3a16ce 465 sendBuffer.push(fmCmd[net1.pollState][txc]);
masterkookus 7:be13a9037d41 466 }
masterkookus 7:be13a9037d41 467 if (net1.sendState==0)
masterkookus 7:be13a9037d41 468 {
masterkookus 7:be13a9037d41 469 net1.sendState=1;
masterkookus 7:be13a9037d41 470 net1.pollRequestSent=true;
masterkookus 7:be13a9037d41 471 }
masterkookus 7:be13a9037d41 472 net1.pollTime=0;
masterkookus 7:be13a9037d41 473 }
masterkookus 8:fa2a2c3a16ce 474 if (net1.sendState==5)
masterkookus 7:be13a9037d41 475 {
masterkookus 8:fa2a2c3a16ce 476 net1.pollTimeout++;
masterkookus 8:fa2a2c3a16ce 477 if (net1.pollTimeout==setpolltimeout)
masterkookus 7:be13a9037d41 478 {
masterkookus 8:fa2a2c3a16ce 479 if (net1.pollRequestSent)
masterkookus 7:be13a9037d41 480 {
masterkookus 8:fa2a2c3a16ce 481 printf("Poll Request Sent\r\n");
masterkookus 8:fa2a2c3a16ce 482 if (net1.pollResponseReceived==false)
masterkookus 8:fa2a2c3a16ce 483 {
masterkookus 8:fa2a2c3a16ce 484 printf("Poll Response Not Received\r\n");
masterkookus 8:fa2a2c3a16ce 485 }
masterkookus 8:fa2a2c3a16ce 486 else
masterkookus 8:fa2a2c3a16ce 487 {
masterkookus 8:fa2a2c3a16ce 488 printf("Poll Response Received\r\n");
masterkookus 8:fa2a2c3a16ce 489 }
masterkookus 7:be13a9037d41 490 net1.pollRequestSent=false;
masterkookus 8:fa2a2c3a16ce 491 net1.pollResponseReceived=false;
masterkookus 8:fa2a2c3a16ce 492 net1.cltCloseConnection=true;
masterkookus 8:fa2a2c3a16ce 493 net1.sendState=0;
masterkookus 7:be13a9037d41 494 }
masterkookus 7:be13a9037d41 495 }
masterkookus 7:be13a9037d41 496 }
masterkookus 8:fa2a2c3a16ce 497 else
masterkookus 8:fa2a2c3a16ce 498 {
masterkookus 8:fa2a2c3a16ce 499 net1.pollTimeout=0;
masterkookus 8:fa2a2c3a16ce 500 }
masterkookus 7:be13a9037d41 501 }
masterkookus 7:be13a9037d41 502 if (net1.sendTime == 10)
masterkookus 7:be13a9037d41 503 {
masterkookus 7:be13a9037d41 504 switch (net1.sendState)
masterkookus 5:c656fd08007b 505 {
masterkookus 5:c656fd08007b 506 case 1:
masterkookus 7:be13a9037d41 507 if (!sendLength.empty())
masterkookus 7:be13a9037d41 508 {
masterkookus 7:be13a9037d41 509 sendLength.pop(net1.sendLen);
masterkookus 7:be13a9037d41 510 for (sxc=0;sxc<net1.sendLen;sxc++)
masterkookus 7:be13a9037d41 511 {
masterkookus 7:be13a9037d41 512 sendBuffer.pop(net1.sendString[sxc]);
masterkookus 7:be13a9037d41 513 }
masterkookus 7:be13a9037d41 514 }
masterkookus 7:be13a9037d41 515 else
masterkookus 7:be13a9037d41 516 {
masterkookus 7:be13a9037d41 517 net1.sendState=0;
masterkookus 7:be13a9037d41 518 }
masterkookus 6:9f97716eae76 519 ret=net1.srv_sock.open(&eth);
masterkookus 5:c656fd08007b 520 printf("Socket%d\r\n",ret);
masterkookus 5:c656fd08007b 521 if (ret < 0)
masterkookus 5:c656fd08007b 522 {
masterkookus 8:fa2a2c3a16ce 523 if (ret==-3003)
masterkookus 8:fa2a2c3a16ce 524 {
masterkookus 8:fa2a2c3a16ce 525 printf("May already be attached, attempting connect.\r\n");
masterkookus 8:fa2a2c3a16ce 526 }
masterkookus 8:fa2a2c3a16ce 527 else
masterkookus 8:fa2a2c3a16ce 528 {
masterkookus 8:fa2a2c3a16ce 529 net1.attachRetry = true;
masterkookus 8:fa2a2c3a16ce 530 net1.sendRetryCount=0;
masterkookus 8:fa2a2c3a16ce 531 net1.sendState=2;
masterkookus 8:fa2a2c3a16ce 532 net1.sendTime=0;
masterkookus 8:fa2a2c3a16ce 533 break;
masterkookus 8:fa2a2c3a16ce 534 }
masterkookus 5:c656fd08007b 535 }
masterkookus 7:be13a9037d41 536 net1.sendState=3;
masterkookus 7:be13a9037d41 537 net1.sendTime=11;
masterkookus 6:9f97716eae76 538 net1.cltIsActive=true;
masterkookus 5:c656fd08007b 539 break;
masterkookus 5:c656fd08007b 540 case 2:
masterkookus 6:9f97716eae76 541 ret=net1.srv_sock.open(&eth);
masterkookus 5:c656fd08007b 542 printf("Socket%d\r\n",ret);
masterkookus 5:c656fd08007b 543 if (ret < 0)
masterkookus 5:c656fd08007b 544 {
masterkookus 7:be13a9037d41 545 net1.attachRetry = true;
masterkookus 7:be13a9037d41 546 net1.sendRetryCount++;
masterkookus 7:be13a9037d41 547 net1.sendTime=0;
masterkookus 5:c656fd08007b 548 printf("Attach Attempt Failed, Code: %d\r\n",ret);
masterkookus 7:be13a9037d41 549 if (net1.sendRetryCount>3)
masterkookus 5:c656fd08007b 550 {
masterkookus 5:c656fd08007b 551 printf("Communication Failed, Closing\r\n");
masterkookus 7:be13a9037d41 552 net1.attachRetry = false;
masterkookus 7:be13a9037d41 553 net1.sendRetryCount = 0;
masterkookus 6:9f97716eae76 554 net1.messageFailCount++;
masterkookus 7:be13a9037d41 555 net1.sendState=0;
masterkookus 7:be13a9037d41 556 net1.sendTime=0;
masterkookus 5:c656fd08007b 557 }
masterkookus 5:c656fd08007b 558 break;
masterkookus 5:c656fd08007b 559 }
masterkookus 7:be13a9037d41 560 net1.sendState=0;
masterkookus 7:be13a9037d41 561 net1.attachRetry = false;
masterkookus 7:be13a9037d41 562 net1.sendTime=11;
masterkookus 6:9f97716eae76 563 net1.cltIsActive=true;
masterkookus 5:c656fd08007b 564 break;
masterkookus 5:c656fd08007b 565 default:
masterkookus 7:be13a9037d41 566 net1.sendTime=0;
masterkookus 7:be13a9037d41 567 if (!sendLength.empty())
masterkookus 7:be13a9037d41 568 {
masterkookus 8:fa2a2c3a16ce 569 if (net1.sendState==5)
masterkookus 8:fa2a2c3a16ce 570 {
masterkookus 8:fa2a2c3a16ce 571 if (!sendLength.empty())
masterkookus 8:fa2a2c3a16ce 572 {
masterkookus 8:fa2a2c3a16ce 573 sendLength.pop(net1.sendLen);
masterkookus 8:fa2a2c3a16ce 574 for (sxc=0;sxc<net1.sendLen;sxc++)
masterkookus 8:fa2a2c3a16ce 575 {
masterkookus 8:fa2a2c3a16ce 576 sendBuffer.pop(net1.sendString[sxc]);
masterkookus 8:fa2a2c3a16ce 577 }
masterkookus 8:fa2a2c3a16ce 578 }
masterkookus 8:fa2a2c3a16ce 579 net1.sendState=4;
masterkookus 8:fa2a2c3a16ce 580 }
masterkookus 8:fa2a2c3a16ce 581 else
masterkookus 8:fa2a2c3a16ce 582 {
masterkookus 8:fa2a2c3a16ce 583 net1.sendState=1;
masterkookus 8:fa2a2c3a16ce 584 }
masterkookus 7:be13a9037d41 585 }
masterkookus 5:c656fd08007b 586 break;
masterkookus 5:c656fd08007b 587 }
masterkookus 4:98cdccfb17d6 588 }
masterkookus 1:a57cbebba3fd 589 }
masterkookus 8:fa2a2c3a16ce 590 if (net1.cltCloseConnection==true)
masterkookus 8:fa2a2c3a16ce 591 {
masterkookus 8:fa2a2c3a16ce 592 printf("Client Socket Closed\r\n");
masterkookus 8:fa2a2c3a16ce 593 net1.srv_sock.close();
masterkookus 8:fa2a2c3a16ce 594 net1.cltIsActive=false;
masterkookus 8:fa2a2c3a16ce 595 net1.cltCloseConnection=false;
masterkookus 8:fa2a2c3a16ce 596 net1.sendState=0;
masterkookus 8:fa2a2c3a16ce 597 }
masterkookus 0:03ab7f7596e2 598 }
masterkookus 0:03ab7f7596e2 599 }