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