This demonstrates the process of communicating through ethernet to a SEL-2431 Voltage Regulator Control Panel using SEL Fast Message. Basic device commands and data cna be requested and displayed over a connected serial port. This is a basic version and full testing and documentation has yet to be completed.

Dependencies:   BufferedSerial analogAverager voltageRegulator netStatReg analogMinMax CounterMinMax

Committer:
masterkookus
Date:
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?

UserRevisionLine numberNew contents of line
masterkookus 0:03ab7f7596e2 1 #if !FEATURE_LWIP
masterkookus 0:03ab7f7596e2 2 #error [NOT_SUPPORTED] LWIP not supported for this target
masterkookus 0:03ab7f7596e2 3 #endif
masterkookus 0:03ab7f7596e2 4
masterkookus 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(&eth);
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(&eth);
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 }