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 Nov 25 15:20:50 2019 +0000
Revision:
17:a69f6e51b3cb
Parent:
16:018bed9abe89
Child:
18:69846c990e04
Updates to allow control of enables outside of defines

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 17:a69f6e51b3cb 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 17:a69f6e51b3cb 23 #include "voltageRegulator.h"
masterkookus 0:03ab7f7596e2 24
masterkookus 7:be13a9037d41 25 Ticker nettimer;
masterkookus 14:3d437acb92e3 26 Timer netDevTimers[7];
masterkookus 0:03ab7f7596e2 27
masterkookus 6:9f97716eae76 28 struct netsys net1;
masterkookus 15:9ad261a27883 29 netDevStatus netStat(0,0,0,0,0,setConsFailCount);
masterkookus 13:4d533751f951 30
masterkookus 16:018bed9abe89 31 voltageRegulator myDevice;
masterkookus 11:d40adc7de05f 32
masterkookus 1:a57cbebba3fd 33 bool polltick;
masterkookus 12:4bb088c27838 34 bool sendtick;
masterkookus 0:03ab7f7596e2 35
masterkookus 7:be13a9037d41 36 BufferedSerial sport0(sport0tx, sport0rx, sport0buff, sport0mult); // UART2
masterkookus 0:03ab7f7596e2 37
masterkookus 12:4bb088c27838 38 CircularBuffer<char, 256> receiveBuffer;
masterkookus 17:a69f6e51b3cb 39 CircularBuffer<char, 256> unSolReceiveBuffer;
masterkookus 7:be13a9037d41 40 CircularBuffer<char, 64> sendLength;
masterkookus 12:4bb088c27838 41 CircularBuffer<char, 256> sendBuffer;
masterkookus 5:c656fd08007b 42
masterkookus 17:a69f6e51b3cb 43 Thread rxtxdatathread[4];
masterkookus 4:98cdccfb17d6 44
masterkookus 4:98cdccfb17d6 45 unsigned int currenttime=0;
masterkookus 0:03ab7f7596e2 46
masterkookus 5:c656fd08007b 47 nsapi_error_t ret;
masterkookus 5:c656fd08007b 48
masterkookus 2:ec972966689e 49 //Provides the deivce poll timing
masterkookus 1:a57cbebba3fd 50 void heartbeat()
masterkookus 1:a57cbebba3fd 51 {
masterkookus 12:4bb088c27838 52 setPollTick(true);
masterkookus 12:4bb088c27838 53
masterkookus 12:4bb088c27838 54 //Provide Sender Task Tick
masterkookus 12:4bb088c27838 55 if (netDevTimers[0].read_ms()>=100)
masterkookus 12:4bb088c27838 56 {
masterkookus 12:4bb088c27838 57 netDevTimers[0].reset();
masterkookus 12:4bb088c27838 58 setSendTick(true);
masterkookus 12:4bb088c27838 59 }
masterkookus 17:a69f6e51b3cb 60 if (netStat.bit_isset(pollEnabled))
masterkookus 12:4bb088c27838 61 {
masterkookus 17:a69f6e51b3cb 62 if (netStat.bit_isset(devOnline))
masterkookus 12:4bb088c27838 63 {
masterkookus 17:a69f6e51b3cb 64 //Fast Demand Poll Tick
masterkookus 17:a69f6e51b3cb 65 if (netStat.bit_isset(fmdEnabled))
masterkookus 12:4bb088c27838 66 {
masterkookus 17:a69f6e51b3cb 67 if (netStat.bit_isset(fmdOnline))
masterkookus 17:a69f6e51b3cb 68 {
masterkookus 17:a69f6e51b3cb 69 if (netDevTimers[2].read_ms()>=setfmdemandpollinterval)
masterkookus 17:a69f6e51b3cb 70 {
masterkookus 17:a69f6e51b3cb 71 netDevTimers[2].reset();
masterkookus 17:a69f6e51b3cb 72 netStat.bit_toset(fmdPollReq);
masterkookus 17:a69f6e51b3cb 73 }
masterkookus 17:a69f6e51b3cb 74 }
masterkookus 17:a69f6e51b3cb 75 else
masterkookus 17:a69f6e51b3cb 76 {
masterkookus 17:a69f6e51b3cb 77 if (netDevTimers[2].read_ms()>=8000)
masterkookus 17:a69f6e51b3cb 78 {
masterkookus 17:a69f6e51b3cb 79 netDevTimers[2].reset();
masterkookus 17:a69f6e51b3cb 80 netStat.bit_toset(fmdPollReq);
masterkookus 17:a69f6e51b3cb 81 }
masterkookus 17:a69f6e51b3cb 82 }
masterkookus 12:4bb088c27838 83 }
masterkookus 17:a69f6e51b3cb 84 //Fast Meter Poll Tick
masterkookus 17:a69f6e51b3cb 85 if (netStat.bit_isset(fmEnabled))
masterkookus 12:4bb088c27838 86 {
masterkookus 17:a69f6e51b3cb 87 if (netStat.bit_isset(fmOnline))
masterkookus 17:a69f6e51b3cb 88 {
masterkookus 17:a69f6e51b3cb 89 if (netDevTimers[3].read_ms()>=setfmpollinterval)
masterkookus 17:a69f6e51b3cb 90 {
masterkookus 17:a69f6e51b3cb 91 netDevTimers[3].reset();
masterkookus 17:a69f6e51b3cb 92 netStat.bit_toset(fmPollReq);
masterkookus 17:a69f6e51b3cb 93 }
masterkookus 17:a69f6e51b3cb 94 }
masterkookus 17:a69f6e51b3cb 95 else
masterkookus 17:a69f6e51b3cb 96 {
masterkookus 17:a69f6e51b3cb 97 if (netDevTimers[3].read_ms()>=8000)
masterkookus 17:a69f6e51b3cb 98 {
masterkookus 17:a69f6e51b3cb 99 netDevTimers[3].reset();
masterkookus 17:a69f6e51b3cb 100 netStat.bit_toset(fmPollReq);
masterkookus 17:a69f6e51b3cb 101 }
masterkookus 17:a69f6e51b3cb 102 }
masterkookus 17:a69f6e51b3cb 103 }
masterkookus 17:a69f6e51b3cb 104 if (netStat.bit_isset(recEnabled))
masterkookus 17:a69f6e51b3cb 105 {
masterkookus 17:a69f6e51b3cb 106 if (netDevTimers[6].read_ms()>=setDataRecInterval)
masterkookus 17:a69f6e51b3cb 107 {
masterkookus 17:a69f6e51b3cb 108 netStat.bit_toset(recDataFile);
masterkookus 17:a69f6e51b3cb 109 netDevTimers[6].stop();
masterkookus 17:a69f6e51b3cb 110 }
masterkookus 12:4bb088c27838 111 }
masterkookus 12:4bb088c27838 112 }
masterkookus 12:4bb088c27838 113 else
masterkookus 12:4bb088c27838 114 {
masterkookus 12:4bb088c27838 115 if (netDevTimers[3].read_ms()>=8000)
masterkookus 12:4bb088c27838 116 {
masterkookus 12:4bb088c27838 117 netDevTimers[3].reset();
masterkookus 17:a69f6e51b3cb 118 netStat.bit_toset(fmCfgReq);
masterkookus 12:4bb088c27838 119 }
masterkookus 12:4bb088c27838 120 }
masterkookus 12:4bb088c27838 121 }
masterkookus 12:4bb088c27838 122 //Fast Message Timeout
masterkookus 16:018bed9abe89 123 if ((netStat.bit_isset(fmCfgInProg)) || (netStat.bit_isset(fmPollInProg)) || (netStat.bit_isset(fmdPollInProg)))
masterkookus 12:4bb088c27838 124 {
masterkookus 12:4bb088c27838 125 if (netDevTimers[4].read_ms()>=2000)
masterkookus 12:4bb088c27838 126 {
masterkookus 12:4bb088c27838 127 netDevTimers[4].stop();
masterkookus 13:4d533751f951 128 netStat.bit_toset(fmCloseConnection);
masterkookus 13:4d533751f951 129 netStat.bit_toset(fmTimeout);
masterkookus 12:4bb088c27838 130 }
masterkookus 12:4bb088c27838 131 }
masterkookus 12:4bb088c27838 132 //Serial Message Timeout
masterkookus 13:4d533751f951 133 if (netStat.bit_isset(serPollInProg))
masterkookus 12:4bb088c27838 134 {
masterkookus 12:4bb088c27838 135 if (netDevTimers[5].read_ms()>=net1.serMsgTimeout)
masterkookus 12:4bb088c27838 136 {
masterkookus 12:4bb088c27838 137 netDevTimers[5].stop();
masterkookus 13:4d533751f951 138 netStat.bit_toset(serCloseConnection);
masterkookus 13:4d533751f951 139 netStat.bit_toset(serTimeout);
masterkookus 12:4bb088c27838 140 }
masterkookus 12:4bb088c27838 141 }
masterkookus 17:a69f6e51b3cb 142
masterkookus 1:a57cbebba3fd 143 }
masterkookus 1:a57cbebba3fd 144
masterkookus 13:4d533751f951 145 void sendCmd(char cmdNum)
masterkookus 13:4d533751f951 146 {
masterkookus 13:4d533751f951 147 sendLength.push(2);
masterkookus 13:4d533751f951 148 for (char txc=0;txc<2;txc++)
masterkookus 13:4d533751f951 149 {
masterkookus 13:4d533751f951 150 sendBuffer.push(fmCmd[cmdNum][txc]);
masterkookus 13:4d533751f951 151 }
masterkookus 13:4d533751f951 152 }
masterkookus 13:4d533751f951 153
masterkookus 13:4d533751f951 154 void sendSerCmd(char cmdNum, char cmdCnt)
masterkookus 13:4d533751f951 155 {
masterkookus 13:4d533751f951 156 sendLength.push(cmdCnt);
masterkookus 13:4d533751f951 157 for (char txc=0;txc<cmdCnt;txc++)
masterkookus 13:4d533751f951 158 {
masterkookus 13:4d533751f951 159 sendBuffer.push(serCmd[cmdNum][txc]);
masterkookus 13:4d533751f951 160 }
masterkookus 13:4d533751f951 161 }
masterkookus 13:4d533751f951 162
masterkookus 4:98cdccfb17d6 163 void confignetdevices(EthernetInterface *eth)
masterkookus 4:98cdccfb17d6 164 {
masterkookus 13:4d533751f951 165 #ifdef sportEnabled
masterkookus 13:4d533751f951 166 netStat.bit_toset(serEnabled);
masterkookus 13:4d533751f951 167 #endif
masterkookus 13:4d533751f951 168
masterkookus 13:4d533751f951 169 #ifdef setPollEnabled
masterkookus 13:4d533751f951 170 netStat.bit_toset(pollEnabled);
masterkookus 13:4d533751f951 171 #endif
masterkookus 13:4d533751f951 172
masterkookus 17:a69f6e51b3cb 173 #ifdef fastMeterEnabled
masterkookus 17:a69f6e51b3cb 174 netStat.bit_toset(fmEnabled);
masterkookus 17:a69f6e51b3cb 175 #endif
masterkookus 17:a69f6e51b3cb 176
masterkookus 17:a69f6e51b3cb 177 #ifdef fastDemandEnabled
masterkookus 17:a69f6e51b3cb 178 netStat.bit_toset(fmdEnabled);
masterkookus 17:a69f6e51b3cb 179 #endif
masterkookus 17:a69f6e51b3cb 180
masterkookus 17:a69f6e51b3cb 181 #ifdef recordDataEnabled
masterkookus 17:a69f6e51b3cb 182 netStat.bit_toset(recEnabled);
masterkookus 17:a69f6e51b3cb 183 #endif
masterkookus 17:a69f6e51b3cb 184
masterkookus 7:be13a9037d41 185 net1.cltPort=setclientport;
masterkookus 7:be13a9037d41 186 net1.srv_addr=setclientaddress;
masterkookus 15:9ad261a27883 187 net1.srv_sock.set_blocking(false);
masterkookus 8:fa2a2c3a16ce 188 net1.srv_sock.set_timeout(100);
masterkookus 8:fa2a2c3a16ce 189 net1.sendRetryCount=0;
masterkookus 8:fa2a2c3a16ce 190 net1.messageFailCount=0;
masterkookus 13:4d533751f951 191 net1.serMsgTimeout=2000;
masterkookus 4:98cdccfb17d6 192
masterkookus 4:98cdccfb17d6 193 /* Open the server on ethernet stack */
masterkookus 4:98cdccfb17d6 194 net1.srv.open(eth);
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 17:a69f6e51b3cb 328 netStat.bit_toset(fmOnline);
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 17:a69f6e51b3cb 350 if (myDevice.chkDemMeterMsg(cbuf,clen))
masterkookus 12:4bb088c27838 351 {
masterkookus 17:a69f6e51b3cb 352 netStat.bit_toset(fmdOnline);
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 8:fa2a2c3a16ce 485 //Serial device to server
masterkookus 0:03ab7f7596e2 486 void datasrx(netsys *net2)
masterkookus 0:03ab7f7596e2 487 {
masterkookus 0:03ab7f7596e2 488 char rxbuf[256];
masterkookus 0:03ab7f7596e2 489 int rxlen=0;
masterkookus 9:d6e7981dfc89 490 int rxindex=0;
masterkookus 0:03ab7f7596e2 491 int rxc;
masterkookus 9:d6e7981dfc89 492 bool crRx = false;
masterkookus 9:d6e7981dfc89 493 int4byte cmdpack;
masterkookus 9:d6e7981dfc89 494
masterkookus 0:03ab7f7596e2 495 while (1)
masterkookus 0:03ab7f7596e2 496 {
masterkookus 10:9da863a6da3e 497 //Check to see if there is any data received by serial port and store length
masterkookus 9:d6e7981dfc89 498 rxlen=sport0.readable();
masterkookus 10:9da863a6da3e 499 //If data is ready push into receive buffer
masterkookus 9:d6e7981dfc89 500 if (rxlen>0)
masterkookus 0:03ab7f7596e2 501 {
masterkookus 9:d6e7981dfc89 502 for (rxc=0;rxc<rxlen;rxc++)
masterkookus 9:d6e7981dfc89 503 {
masterkookus 9:d6e7981dfc89 504 rxbuf[rxindex+rxc]=sport0.getc();
masterkookus 10:9da863a6da3e 505 //Check to see if a carriage return has been detected
masterkookus 9:d6e7981dfc89 506 if (rxbuf[rxindex+rxc]=='\r')
masterkookus 9:d6e7981dfc89 507 {
masterkookus 9:d6e7981dfc89 508 crRx=true;
masterkookus 9:d6e7981dfc89 509 }
masterkookus 9:d6e7981dfc89 510 }
masterkookus 10:9da863a6da3e 511 //Store the current cursor location in the buffer
masterkookus 9:d6e7981dfc89 512 rxindex=rxindex+rxlen;
masterkookus 10:9da863a6da3e 513 //Set the received length to zero
masterkookus 9:d6e7981dfc89 514 rxlen=0;
masterkookus 10:9da863a6da3e 515 //If there is data in the buffer and a carriage return has been detected search for a command
masterkookus 9:d6e7981dfc89 516 if ((rxindex>2) && (crRx==true))
masterkookus 0:03ab7f7596e2 517 {
masterkookus 10:9da863a6da3e 518 //Set the carriage return flag false
masterkookus 9:d6e7981dfc89 519 crRx=false;
masterkookus 9:d6e7981dfc89 520 for (rxc=0;rxc<=rxindex-3;rxc++)
masterkookus 0:03ab7f7596e2 521 {
masterkookus 9:d6e7981dfc89 522 cmdpack.bytes[3]=rxbuf[rxc];
masterkookus 9:d6e7981dfc89 523 cmdpack.bytes[2]=rxbuf[rxc+1];
masterkookus 9:d6e7981dfc89 524 cmdpack.bytes[1]=rxbuf[rxc+2];
masterkookus 9:d6e7981dfc89 525 cmdpack.bytes[0]=rxbuf[rxc+3];
masterkookus 10:9da863a6da3e 526 //Search for the Min/Max command
masterkookus 9:d6e7981dfc89 527 if (cmdpack.cmdint==0x4d45544d)
masterkookus 9:d6e7981dfc89 528 {
masterkookus 11:d40adc7de05f 529 #ifdef netmsgdebug
masterkookus 9:d6e7981dfc89 530 printf("MIN MAX METERING\r\n");
masterkookus 11:d40adc7de05f 531 #endif
masterkookus 13:4d533751f951 532 netStat.setDevMsgReq(0);
masterkookus 13:4d533751f951 533 netStat.setDevMsgPos(2);
masterkookus 13:4d533751f951 534 netStat.bit_toset(serPollReq);
masterkookus 9:d6e7981dfc89 535 rxindex=0;
masterkookus 9:d6e7981dfc89 536 }
masterkookus 10:9da863a6da3e 537 //Search for the Tap Report Command
masterkookus 9:d6e7981dfc89 538 if (cmdpack.cmdint==0x54415052)
masterkookus 9:d6e7981dfc89 539 {
masterkookus 11:d40adc7de05f 540 #ifdef netmsgdebug
masterkookus 9:d6e7981dfc89 541 printf("TAP REPORT\r\n");
masterkookus 11:d40adc7de05f 542 #endif
masterkookus 13:4d533751f951 543 netStat.setDevMsgReq(1);
masterkookus 13:4d533751f951 544 netStat.setDevMsgPos(2);
masterkookus 13:4d533751f951 545 netStat.bit_toset(serPollReq);
masterkookus 13:4d533751f951 546 rxindex=0;
masterkookus 13:4d533751f951 547 }
masterkookus 17:a69f6e51b3cb 548 //Search for the Status Command
masterkookus 13:4d533751f951 549 if (cmdpack.cmdint==0x53544154)
masterkookus 13:4d533751f951 550 {
masterkookus 13:4d533751f951 551 #ifdef netmsgdebug
masterkookus 13:4d533751f951 552 printf("STATS\r\n");
masterkookus 13:4d533751f951 553 #endif
masterkookus 15:9ad261a27883 554 sport0.printf("\r\nStatus %08x\r\n",netStat.getStatus());
masterkookus 15:9ad261a27883 555 sport0.printf("Messages Sent: %d\r\n",netStat.getCount(1));
masterkookus 15:9ad261a27883 556 sport0.printf("Messages Received: %d\r\n",netStat.getCount(2));
masterkookus 15:9ad261a27883 557 sport0.printf("Fast Message Timeouts: %d\r\n",netStat.getCount(3));
masterkookus 15:9ad261a27883 558 sport0.printf("Serial Timeouts: %d\r\n",netStat.getCount(4));
masterkookus 15:9ad261a27883 559 sport0.printf("Messages Failed: %d\r\n\r\n",netStat.getCount(5));
masterkookus 9:d6e7981dfc89 560 rxindex=0;
masterkookus 9:d6e7981dfc89 561 }
masterkookus 17:a69f6e51b3cb 562 //Search for the Target Command
masterkookus 17:a69f6e51b3cb 563 if (cmdpack.cmdint==0x54415247)
masterkookus 17:a69f6e51b3cb 564 {
masterkookus 17:a69f6e51b3cb 565 char *dTargets;
masterkookus 17:a69f6e51b3cb 566 #ifdef netmsgdebug
masterkookus 17:a69f6e51b3cb 567 printf("Targets\r\n");
masterkookus 17:a69f6e51b3cb 568 #endif
masterkookus 17:a69f6e51b3cb 569 sport0.printf("\r\nTarget 0 %08x\r\n",dTargets[0]);
masterkookus 17:a69f6e51b3cb 570 sport0.printf("\r\nTarget 1 %08x\r\n",dTargets[1]);
masterkookus 17:a69f6e51b3cb 571 sport0.printf("\r\nTarget 2 %08x\r\n",dTargets[2]);
masterkookus 17:a69f6e51b3cb 572 sport0.printf("\r\nTarget 3 %08x\r\n",dTargets[3]);
masterkookus 17:a69f6e51b3cb 573 sport0.printf("\r\nTarget 4 %08x\r\n",dTargets[4]);
masterkookus 17:a69f6e51b3cb 574 sport0.printf("\r\nTarget 5 %08x\r\n",dTargets[5]);
masterkookus 17:a69f6e51b3cb 575 sport0.printf("\r\nTarget 6 %08x\r\n",dTargets[6]);
masterkookus 17:a69f6e51b3cb 576 sport0.printf("\r\nTarget 7 %08x\r\n",dTargets[7]);
masterkookus 17:a69f6e51b3cb 577 sport0.printf("\r\nTarget 8 %08x\r\n",dTargets[8]);
masterkookus 17:a69f6e51b3cb 578 sport0.printf("\r\nTarget 9 %08x\r\n",dTargets[9]);
masterkookus 17:a69f6e51b3cb 579 rxindex=0;
masterkookus 17:a69f6e51b3cb 580 }
masterkookus 0:03ab7f7596e2 581 }
masterkookus 10:9da863a6da3e 582 //If no command found set cursor location to zero
masterkookus 9:d6e7981dfc89 583 if (rxindex>0)
masterkookus 9:d6e7981dfc89 584 {
masterkookus 11:d40adc7de05f 585 #ifdef netmsgdebug
masterkookus 9:d6e7981dfc89 586 printf("Serial Command Not Found");
masterkookus 11:d40adc7de05f 587 #endif
masterkookus 9:d6e7981dfc89 588 rxindex=0;
masterkookus 9:d6e7981dfc89 589 }
masterkookus 0:03ab7f7596e2 590 }
masterkookus 0:03ab7f7596e2 591 }
masterkookus 0:03ab7f7596e2 592 }
masterkookus 0:03ab7f7596e2 593 }
masterkookus 0:03ab7f7596e2 594
masterkookus 0:03ab7f7596e2 595 int main()
masterkookus 0:03ab7f7596e2 596 {
masterkookus 0:03ab7f7596e2 597 EthernetInterface eth;
masterkookus 7:be13a9037d41 598 eth.set_network(setseveraddress,setsevermask,setsevergateway); //Use these parameters for static IP
masterkookus 0:03ab7f7596e2 599 eth.connect();
masterkookus 0:03ab7f7596e2 600
masterkookus 16:018bed9abe89 601 //initVoltageRegulator(&vReg1);
masterkookus 8:fa2a2c3a16ce 602
masterkookus 11:d40adc7de05f 603 #ifdef netmsgdebug
masterkookus 0:03ab7f7596e2 604 printf("The target IP address is '%s'\r\n", eth.get_ip_address());
masterkookus 11:d40adc7de05f 605 #endif
masterkookus 4:98cdccfb17d6 606 confignetdevices(&eth);
masterkookus 2:ec972966689e 607 /* Setup polltick Ticker */
masterkookus 7:be13a9037d41 608 nettimer.attach_us(heartbeat,10000);
masterkookus 2:ec972966689e 609 /* Setup Ethernet to Serial transmit data Thread */
masterkookus 17:a69f6e51b3cb 610 rxtxdatathread[0].start(callback(datancrx,&net1));
masterkookus 2:ec972966689e 611 /* Setup Ethernet to Serial receive data Thread */
masterkookus 17:a69f6e51b3cb 612 rxtxdatathread[1].start(callback(datasrx,&net1));
masterkookus 17:a69f6e51b3cb 613 rxtxdatathread[2].start(callback(datantx,&net1));
masterkookus 17:a69f6e51b3cb 614 rxtxdatathread[3].start(callback(dataprocess,&net1));
masterkookus 12:4bb088c27838 615
masterkookus 12:4bb088c27838 616 unsigned int sxc;
masterkookus 7:be13a9037d41 617
masterkookus 12:4bb088c27838 618 netDevTimers[0].start();
masterkookus 12:4bb088c27838 619 netDevTimers[2].start();
masterkookus 12:4bb088c27838 620 netDevTimers[3].start();
masterkookus 14:3d437acb92e3 621 netDevTimers[6].start();
masterkookus 3:ac1f2af8bd0f 622
masterkookus 0:03ab7f7596e2 623 while (true) {
masterkookus 3:ac1f2af8bd0f 624
masterkookus 12:4bb088c27838 625 polltick=getPollTick();
masterkookus 3:ac1f2af8bd0f 626
masterkookus 3:ac1f2af8bd0f 627 if (polltick)
masterkookus 3:ac1f2af8bd0f 628 {
masterkookus 12:4bb088c27838 629 setPollTick(false);
masterkookus 13:4d533751f951 630 if (netStat.bit_isset(serCloseConnection))
masterkookus 12:4bb088c27838 631 {
masterkookus 12:4bb088c27838 632 #ifdef netmsgdebug
masterkookus 12:4bb088c27838 633 printf("Serial Connection Closed\r\n");
masterkookus 12:4bb088c27838 634 #endif
masterkookus 13:4d533751f951 635 if (netStat.bit_isset(serRespRx))
masterkookus 12:4bb088c27838 636 {
masterkookus 13:4d533751f951 637 netStat.incCount(2);
masterkookus 12:4bb088c27838 638 }
masterkookus 12:4bb088c27838 639 else
masterkookus 12:4bb088c27838 640 {
masterkookus 13:4d533751f951 641 netStat.incCount(4);
masterkookus 12:4bb088c27838 642 }
masterkookus 13:4d533751f951 643 netStat.bit_toclear(serclose);
masterkookus 13:4d533751f951 644 netStat.bit_toset(cltCloseConnection);
masterkookus 12:4bb088c27838 645 }
masterkookus 13:4d533751f951 646 if (netStat.bit_isset(fmCloseConnection))
masterkookus 4:98cdccfb17d6 647 {
masterkookus 12:4bb088c27838 648 #ifdef netmsgdebug
masterkookus 12:4bb088c27838 649 printf("Fast Meter Connection Closed\r\n");
masterkookus 12:4bb088c27838 650 #endif
masterkookus 13:4d533751f951 651 if ((netStat.bit_isset(fmRespRx)) || (netStat.bit_isset(fmdRespRx)))
masterkookus 12:4bb088c27838 652 {
masterkookus 13:4d533751f951 653 netStat.incCount(2);
masterkookus 12:4bb088c27838 654 }
masterkookus 12:4bb088c27838 655 else
masterkookus 7:be13a9037d41 656 {
masterkookus 13:4d533751f951 657 netStat.incCount(3);
masterkookus 12:4bb088c27838 658 }
masterkookus 13:4d533751f951 659 netStat.bit_toclear(fmclose);
masterkookus 13:4d533751f951 660 netStat.bit_toset(cltCloseConnection);
masterkookus 12:4bb088c27838 661 }
masterkookus 13:4d533751f951 662 if (netStat.bit_isset(cltCloseConnection))
masterkookus 12:4bb088c27838 663 {
masterkookus 13:4d533751f951 664 sport0.printf("Status %08x\r\n",netStat.getStatus());
masterkookus 12:4bb088c27838 665 #ifdef netmsgdebug
masterkookus 12:4bb088c27838 666 printf("Connection Closed\r\n");
masterkookus 12:4bb088c27838 667 #endif
masterkookus 12:4bb088c27838 668 net1.srv_sock.close();
masterkookus 12:4bb088c27838 669 net1.sendState=0;
masterkookus 13:4d533751f951 670 netStat.bit_toclear(cltclose);
masterkookus 12:4bb088c27838 671 }
masterkookus 12:4bb088c27838 672
masterkookus 13:4d533751f951 673 if ((netStat.bit_isclear(serPollInProg)) && (netStat.bit_isclear(fmPollInProg)) && (netStat.bit_isclear(fmdPollInProg)) && (netStat.bit_isset(devOnline)))
masterkookus 12:4bb088c27838 674 {
masterkookus 14:3d437acb92e3 675 if (netStat.bit_isset(recDataFile))
masterkookus 14:3d437acb92e3 676 {
masterkookus 17:a69f6e51b3cb 677 char dataStrLen=0;
masterkookus 17:a69f6e51b3cb 678 char dataStr[256];
masterkookus 17:a69f6e51b3cb 679 dataStrLen=myDevice.getMeterReport(&dataStr[0]);
masterkookus 16:018bed9abe89 680 sport0.write(dataStr,dataStrLen);
masterkookus 14:3d437acb92e3 681
masterkookus 14:3d437acb92e3 682 netStat.bit_toclear(recDataFile);
masterkookus 14:3d437acb92e3 683 netDevTimers[6].reset();
masterkookus 14:3d437acb92e3 684 netDevTimers[6].start();
masterkookus 14:3d437acb92e3 685 }
masterkookus 15:9ad261a27883 686 if ((net1.sendState==0) || (net1.sendState==5))
masterkookus 12:4bb088c27838 687 {
masterkookus 15:9ad261a27883 688 if (netStat.bit_isset(fmdPollReq))
masterkookus 7:be13a9037d41 689 {
masterkookus 17:a69f6e51b3cb 690 if (netStat.bit_isset(fmdOnline))
masterkookus 15:9ad261a27883 691 {
masterkookus 15:9ad261a27883 692 printf("Demand Reading\r\n");
masterkookus 15:9ad261a27883 693 sendCmd(4);
masterkookus 15:9ad261a27883 694 netStat.bit_toclear(fmdPollReq);
masterkookus 15:9ad261a27883 695 netStat.bit_toset(fmdPollInProg);
masterkookus 15:9ad261a27883 696 }
masterkookus 15:9ad261a27883 697 else
masterkookus 15:9ad261a27883 698 {
masterkookus 15:9ad261a27883 699 printf("Demand Configuration\r\n");
masterkookus 15:9ad261a27883 700 sendCmd(3);
masterkookus 15:9ad261a27883 701 netStat.bit_toclear(fmdPollReq);
masterkookus 15:9ad261a27883 702 netStat.bit_toset(fmdPollInProg);
masterkookus 15:9ad261a27883 703 }
masterkookus 15:9ad261a27883 704 netDevTimers[4].reset();
masterkookus 15:9ad261a27883 705 netDevTimers[4].start();
masterkookus 12:4bb088c27838 706 }
masterkookus 15:9ad261a27883 707 else if (netStat.bit_isset(fmPollReq))
masterkookus 12:4bb088c27838 708 {
masterkookus 17:a69f6e51b3cb 709 if (netStat.bit_isset(fmOnline))
masterkookus 15:9ad261a27883 710 {
masterkookus 15:9ad261a27883 711 printf("Meter Reading\r\n");
masterkookus 15:9ad261a27883 712 sendCmd(2);
masterkookus 15:9ad261a27883 713 netStat.bit_toclear(fmPollReq);
masterkookus 15:9ad261a27883 714 netStat.bit_toset(fmPollInProg);
masterkookus 15:9ad261a27883 715 }
masterkookus 15:9ad261a27883 716 else
masterkookus 15:9ad261a27883 717 {
masterkookus 15:9ad261a27883 718 printf("Meter Configuration\r\n");
masterkookus 15:9ad261a27883 719 sendCmd(1);
masterkookus 15:9ad261a27883 720 netStat.bit_toclear(fmPollReq);
masterkookus 15:9ad261a27883 721 netStat.bit_toset(fmPollInProg);
masterkookus 15:9ad261a27883 722 }
masterkookus 15:9ad261a27883 723 netDevTimers[4].reset();
masterkookus 15:9ad261a27883 724 netDevTimers[4].start();
masterkookus 12:4bb088c27838 725 }
masterkookus 15:9ad261a27883 726 else if (netStat.bit_isset(serPollReq))
masterkookus 12:4bb088c27838 727 {
masterkookus 15:9ad261a27883 728 if (netStat.bit_isset(serEnabled))
masterkookus 15:9ad261a27883 729 {
masterkookus 15:9ad261a27883 730 sendSerCmd(serCmdSeq[netStat.getDevMsgReq()][netStat.getDevMsgPos()],serCmdlen[netStat.getDevMsgReq()][netStat.getDevMsgPos()]);
masterkookus 15:9ad261a27883 731 netStat.bit_toclear(serPollReq);
masterkookus 15:9ad261a27883 732 netStat.bit_toset(serPollInProg);
masterkookus 15:9ad261a27883 733 netDevTimers[5].reset();
masterkookus 15:9ad261a27883 734 netDevTimers[5].start();
masterkookus 15:9ad261a27883 735 }
masterkookus 15:9ad261a27883 736 else
masterkookus 15:9ad261a27883 737 {
masterkookus 15:9ad261a27883 738 netStat.bit_toclear(serPollReq);
masterkookus 15:9ad261a27883 739 }
masterkookus 13:4d533751f951 740 }
masterkookus 12:4bb088c27838 741 }
masterkookus 12:4bb088c27838 742 }
masterkookus 13:4d533751f951 743 if ((netStat.bit_isclear(devOnline)) && (netStat.bit_isclear(fmCfgInProg)) && (netStat.bit_isset(fmCfgReq)))
masterkookus 12:4bb088c27838 744 {
masterkookus 12:4bb088c27838 745 sendCmd(0);
masterkookus 13:4d533751f951 746 netStat.bit_toclear(fmCfgReq);
masterkookus 13:4d533751f951 747 netStat.bit_toset(fmCfgInProg);
masterkookus 12:4bb088c27838 748 net1.sendState=1;
masterkookus 16:018bed9abe89 749 netDevTimers[4].reset();
masterkookus 16:018bed9abe89 750 netDevTimers[4].start();
masterkookus 12:4bb088c27838 751 }
masterkookus 12:4bb088c27838 752 }
masterkookus 12:4bb088c27838 753
masterkookus 12:4bb088c27838 754
masterkookus 12:4bb088c27838 755 //Begin Sending Data
masterkookus 12:4bb088c27838 756 sendtick=getSendTick();
masterkookus 12:4bb088c27838 757
masterkookus 12:4bb088c27838 758 if (sendtick)
masterkookus 12:4bb088c27838 759 {
masterkookus 12:4bb088c27838 760 setSendTick(false);
masterkookus 12:4bb088c27838 761 switch (net1.sendState)
masterkookus 12:4bb088c27838 762 {
masterkookus 12:4bb088c27838 763 case 0:
masterkookus 12:4bb088c27838 764 if (!sendLength.empty())
masterkookus 12:4bb088c27838 765 {
masterkookus 13:4d533751f951 766 sport0.printf("Status %08x\r\n",netStat.getStatus());
masterkookus 12:4bb088c27838 767 sendLength.pop(net1.sendLen);
masterkookus 12:4bb088c27838 768 for (sxc=0;sxc<net1.sendLen;sxc++)
masterkookus 9:d6e7981dfc89 769 {
masterkookus 12:4bb088c27838 770 sendBuffer.pop(net1.sendString[sxc]);
masterkookus 10:9da863a6da3e 771 }
masterkookus 12:4bb088c27838 772 net1.sendState=1;
masterkookus 10:9da863a6da3e 773 }
masterkookus 12:4bb088c27838 774 break;
masterkookus 12:4bb088c27838 775 case 1:
masterkookus 12:4bb088c27838 776 ret=net1.srv_sock.open(&eth);
masterkookus 12:4bb088c27838 777 #ifdef netmsgdebug
masterkookus 12:4bb088c27838 778 printf("Socket%d\r\n",ret);
masterkookus 12:4bb088c27838 779 #endif
masterkookus 12:4bb088c27838 780 if (ret < 0)
masterkookus 12:4bb088c27838 781 {
masterkookus 12:4bb088c27838 782 if (ret==-3003)
masterkookus 10:9da863a6da3e 783 {
masterkookus 12:4bb088c27838 784 #ifdef netmsgdebug
masterkookus 12:4bb088c27838 785 printf("May already be attached, attempting connect.\r\n");
masterkookus 12:4bb088c27838 786 #endif
masterkookus 10:9da863a6da3e 787 }
masterkookus 10:9da863a6da3e 788 else
masterkookus 10:9da863a6da3e 789 {
masterkookus 15:9ad261a27883 790 #ifdef netmsgdebug
masterkookus 15:9ad261a27883 791 printf("Communication Failed, Closing\r\n");
masterkookus 15:9ad261a27883 792 #endif
masterkookus 15:9ad261a27883 793 net1.sendRetryCount = 0;
masterkookus 15:9ad261a27883 794 netStat.iedOnline(false);
masterkookus 15:9ad261a27883 795 net1.sendState=0;
masterkookus 12:4bb088c27838 796 break;
masterkookus 10:9da863a6da3e 797 }
masterkookus 10:9da863a6da3e 798 }
masterkookus 12:4bb088c27838 799 net1.sendState=3;
masterkookus 13:4d533751f951 800 netStat.bit_toset(cltIsActive);
masterkookus 12:4bb088c27838 801 break;
masterkookus 12:4bb088c27838 802 case 5:
masterkookus 12:4bb088c27838 803 if (!sendLength.empty())
masterkookus 12:4bb088c27838 804 {
masterkookus 13:4d533751f951 805 sport0.printf("Status %08x\r\n",netStat.getStatus());
masterkookus 12:4bb088c27838 806 sendLength.pop(net1.sendLen);
masterkookus 12:4bb088c27838 807 for (sxc=0;sxc<net1.sendLen;sxc++)
masterkookus 5:c656fd08007b 808 {
masterkookus 12:4bb088c27838 809 sendBuffer.pop(net1.sendString[sxc]);
masterkookus 5:c656fd08007b 810 }
masterkookus 12:4bb088c27838 811 net1.sendState=4;
masterkookus 12:4bb088c27838 812 }
masterkookus 12:4bb088c27838 813 break;
masterkookus 12:4bb088c27838 814 default:
masterkookus 12:4bb088c27838 815 break;
masterkookus 4:98cdccfb17d6 816 }
masterkookus 1:a57cbebba3fd 817 }
masterkookus 0:03ab7f7596e2 818 }
masterkookus 0:03ab7f7596e2 819 }