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