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