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