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:
Thu Sep 19 18:14:31 2019 +0000
Revision:
6:9f97716eae76
Parent:
5:c656fd08007b
Child:
7:be13a9037d41
Single struct for Server/Client Device

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 0:03ab7f7596e2 5 #include "mbed.h"
masterkookus 0:03ab7f7596e2 6 #include "EthernetInterface.h"
masterkookus 0:03ab7f7596e2 7 #include "TCPServer.h"
masterkookus 0:03ab7f7596e2 8 #include "TCPSocket.h"
masterkookus 0:03ab7f7596e2 9 #include "BufferedSerial.h"
masterkookus 3:ac1f2af8bd0f 10 #include "nettime.h"
masterkookus 3:ac1f2af8bd0f 11 #include "netdevices.h"
masterkookus 5:c656fd08007b 12 #include "platform/CircularBuffer.h"
masterkookus 0:03ab7f7596e2 13
masterkookus 5:c656fd08007b 14 static const char* mbedIp = "10.150.1.242"; //IP
masterkookus 0:03ab7f7596e2 15 static const char* mbedMask = "255.255.255.0"; // Mask
masterkookus 0:03ab7f7596e2 16 static const char* mbedGateway = "10.150.1.245"; //Gateway
masterkookus 0:03ab7f7596e2 17
masterkookus 0:03ab7f7596e2 18 Ticker nettimer[2];
masterkookus 0:03ab7f7596e2 19
masterkookus 6:9f97716eae76 20 struct netsys net1;
masterkookus 1:a57cbebba3fd 21
masterkookus 1:a57cbebba3fd 22 bool polltick;
masterkookus 0:03ab7f7596e2 23
masterkookus 0:03ab7f7596e2 24 BufferedSerial sport0(PD_5, PD_6, 256, 4); // UART2
masterkookus 0:03ab7f7596e2 25
masterkookus 5:c656fd08007b 26 CircularBuffer<char, 256> cmdbuf;
masterkookus 5:c656fd08007b 27
masterkookus 0:03ab7f7596e2 28 Thread conchkthread[2];
masterkookus 4:98cdccfb17d6 29 Thread rxtxdatathread[5];
masterkookus 4:98cdccfb17d6 30
masterkookus 4:98cdccfb17d6 31 unsigned int currenttime=0;
masterkookus 0:03ab7f7596e2 32
masterkookus 5:c656fd08007b 33 nsapi_error_t ret;
masterkookus 5:c656fd08007b 34
masterkookus 2:ec972966689e 35 //Provides the deivce poll timing
masterkookus 1:a57cbebba3fd 36 void heartbeat()
masterkookus 1:a57cbebba3fd 37 {
masterkookus 3:ac1f2af8bd0f 38 //polltick=true;
masterkookus 3:ac1f2af8bd0f 39 setTick(true);
masterkookus 1:a57cbebba3fd 40 }
masterkookus 1:a57cbebba3fd 41
masterkookus 4:98cdccfb17d6 42 void confignetdevices(EthernetInterface *eth)
masterkookus 4:98cdccfb17d6 43 {
masterkookus 6:9f97716eae76 44 net1.cltPort=23;
masterkookus 6:9f97716eae76 45 net1.srv_addr="10.150.1.241";
masterkookus 6:9f97716eae76 46 net1.cltIsActive=false;
masterkookus 6:9f97716eae76 47 net1.cltCloseConnection=false;
masterkookus 6:9f97716eae76 48 net1.pollTimeout=200;
masterkookus 6:9f97716eae76 49 net1.pollTime=0;
masterkookus 6:9f97716eae76 50 net1.pollInterval=200;
masterkookus 6:9f97716eae76 51 net1.srv_sock.set_blocking(false);
masterkookus 6:9f97716eae76 52 net1.aliveTimeout=50;
masterkookus 5:c656fd08007b 53 net1.srv.set_blocking(false);
masterkookus 4:98cdccfb17d6 54
masterkookus 4:98cdccfb17d6 55 /* Open the server on ethernet stack */
masterkookus 4:98cdccfb17d6 56 net1.srv.open(eth);
masterkookus 6:9f97716eae76 57 net1.srvIsActive=false;
masterkookus 6:9f97716eae76 58 net1.srvCloseConnection=false;
masterkookus 4:98cdccfb17d6 59
masterkookus 4:98cdccfb17d6 60 /* Bind port 23 to the server */
masterkookus 6:9f97716eae76 61 net1.srvPort=23;
masterkookus 6:9f97716eae76 62 net1.srv.bind(net1.srvPort);
masterkookus 4:98cdccfb17d6 63
masterkookus 4:98cdccfb17d6 64 /* Can handle 5 simultaneous connections */
masterkookus 4:98cdccfb17d6 65 net1.srv.listen(5);
masterkookus 4:98cdccfb17d6 66 sport0.baud(9600);
masterkookus 4:98cdccfb17d6 67 }
masterkookus 4:98cdccfb17d6 68
masterkookus 4:98cdccfb17d6 69 //Ethernet to Ethernet Send Command
masterkookus 4:98cdccfb17d6 70 void datapolltx(netsys *net2)
masterkookus 0:03ab7f7596e2 71 {
masterkookus 5:c656fd08007b 72 char cchar;
masterkookus 5:c656fd08007b 73 char cbuf[256];
masterkookus 5:c656fd08007b 74 unsigned int clen=0;
masterkookus 5:c656fd08007b 75 unsigned int cbc;
masterkookus 5:c656fd08007b 76 union packer4byte
masterkookus 5:c656fd08007b 77 {
masterkookus 5:c656fd08007b 78 unsigned int cmdint;
masterkookus 5:c656fd08007b 79 char bytes[4];
masterkookus 5:c656fd08007b 80 };
masterkookus 5:c656fd08007b 81 packer4byte cmdpack;
masterkookus 5:c656fd08007b 82
masterkookus 4:98cdccfb17d6 83 while(1)
masterkookus 0:03ab7f7596e2 84 {
masterkookus 5:c656fd08007b 85 while (!cmdbuf.empty())
masterkookus 5:c656fd08007b 86 {
masterkookus 5:c656fd08007b 87 cmdbuf.pop(cchar);
masterkookus 5:c656fd08007b 88 clen++;
masterkookus 5:c656fd08007b 89 cbuf[clen]=cchar;
masterkookus 5:c656fd08007b 90 }
masterkookus 5:c656fd08007b 91 if (clen>3)
masterkookus 5:c656fd08007b 92 {
masterkookus 5:c656fd08007b 93 printf("%d\r\n",clen);
masterkookus 5:c656fd08007b 94 //clen=0;
masterkookus 5:c656fd08007b 95 for (cbc=0;cbc<clen-5;cbc++)
masterkookus 5:c656fd08007b 96 {
masterkookus 5:c656fd08007b 97 cmdpack.bytes[3]=cbuf[cbc];
masterkookus 5:c656fd08007b 98 cmdpack.bytes[2]=cbuf[cbc+1];
masterkookus 5:c656fd08007b 99 cmdpack.bytes[1]=cbuf[cbc+2];
masterkookus 5:c656fd08007b 100 cmdpack.bytes[0]=cbuf[cbc+3];
masterkookus 5:c656fd08007b 101 if (cmdpack.cmdint==0x5469636b)
masterkookus 5:c656fd08007b 102 {
masterkookus 6:9f97716eae76 103 printf("Tock");
masterkookus 5:c656fd08007b 104 net2->pollTime=net2->pollInterval;
masterkookus 5:c656fd08007b 105 net2->pollState=1;
masterkookus 5:c656fd08007b 106 clen=0;
masterkookus 5:c656fd08007b 107 break;
masterkookus 5:c656fd08007b 108 }
masterkookus 5:c656fd08007b 109 }
masterkookus 5:c656fd08007b 110 }
masterkookus 6:9f97716eae76 111 if (net2->cltIsActive)
masterkookus 0:03ab7f7596e2 112 {
masterkookus 5:c656fd08007b 113 while (net2->pollState==3)
masterkookus 5:c656fd08007b 114 {
masterkookus 5:c656fd08007b 115 if (net2->connectRetry == true)
masterkookus 5:c656fd08007b 116 {
masterkookus 5:c656fd08007b 117 wait_ms(100);
masterkookus 5:c656fd08007b 118 }
masterkookus 6:9f97716eae76 119 ret = net2->srv_sock.connect(net2->srv_addr,net2->cltPort);
masterkookus 5:c656fd08007b 120 if (ret==0)
masterkookus 5:c656fd08007b 121 {
masterkookus 5:c656fd08007b 122 net2->connectRetry = false;
masterkookus 5:c656fd08007b 123 printf("Connected %d\r\n",ret);
masterkookus 6:9f97716eae76 124 net2->cltCloseConnection=true;
masterkookus 5:c656fd08007b 125 net2->pollState=4;
masterkookus 5:c656fd08007b 126 }
masterkookus 5:c656fd08007b 127 else
masterkookus 5:c656fd08007b 128 {
masterkookus 5:c656fd08007b 129 net2->connectRetry = true;
masterkookus 5:c656fd08007b 130 net2->pollRetryCount++;
masterkookus 5:c656fd08007b 131 printf("Connect Attempt Failed, Code: %d\r\n",ret);
masterkookus 5:c656fd08007b 132 if (net2->pollRetryCount>3)
masterkookus 5:c656fd08007b 133 {
masterkookus 5:c656fd08007b 134 printf("Communication Failed, Closing\r\n");
masterkookus 5:c656fd08007b 135 net2->connectRetry = false;
masterkookus 5:c656fd08007b 136 net2->pollRetryCount = 0;
masterkookus 5:c656fd08007b 137 net2->messageFailCount++;
masterkookus 6:9f97716eae76 138 net2->cltCloseConnection=true;
masterkookus 5:c656fd08007b 139 net2->pollState=0;
masterkookus 5:c656fd08007b 140 }
masterkookus 5:c656fd08007b 141 }
masterkookus 5:c656fd08007b 142 }
masterkookus 5:c656fd08007b 143 while (net2->pollState==4)
masterkookus 5:c656fd08007b 144 {
masterkookus 5:c656fd08007b 145 if (net2->sendRetry == true)
masterkookus 5:c656fd08007b 146 {
masterkookus 5:c656fd08007b 147 wait_ms(100);
masterkookus 5:c656fd08007b 148 }
masterkookus 6:9f97716eae76 149 ret = net2->srv_sock.send("Tock\r\n",strlen("Tock\r\n"));
masterkookus 5:c656fd08007b 150 if (ret>=0)
masterkookus 5:c656fd08007b 151 {
masterkookus 5:c656fd08007b 152 printf("Send Result %d\r\n",ret);
masterkookus 5:c656fd08007b 153 net2->sendRetry = false;
masterkookus 5:c656fd08007b 154 net2->txMessageCount++;
masterkookus 6:9f97716eae76 155 net2->cltCloseConnection=true;
masterkookus 5:c656fd08007b 156 net2->pollState=0;
masterkookus 5:c656fd08007b 157 }
masterkookus 5:c656fd08007b 158 else
masterkookus 5:c656fd08007b 159 {
masterkookus 5:c656fd08007b 160 net2->sendRetry = true;
masterkookus 5:c656fd08007b 161 net2->pollRetryCount++;
masterkookus 5:c656fd08007b 162 printf("Send Attempt Failed, Code: %d\r\n",ret);
masterkookus 5:c656fd08007b 163 if (net2->pollRetryCount>3)
masterkookus 5:c656fd08007b 164 {
masterkookus 5:c656fd08007b 165 printf("Communication Failed, Closing\r\n");
masterkookus 5:c656fd08007b 166 net2->sendRetry = false;
masterkookus 5:c656fd08007b 167 net2->pollRetryCount = 0;
masterkookus 5:c656fd08007b 168 net2->messageFailCount++;
masterkookus 6:9f97716eae76 169 net2->cltCloseConnection=true;
masterkookus 5:c656fd08007b 170 net2->pollState=0;
masterkookus 5:c656fd08007b 171 }
masterkookus 5:c656fd08007b 172 }
masterkookus 5:c656fd08007b 173 }
masterkookus 6:9f97716eae76 174 if (net2->cltCloseConnection==true)
masterkookus 5:c656fd08007b 175 {
masterkookus 6:9f97716eae76 176 net2->srv_sock.close();
masterkookus 6:9f97716eae76 177 net2->cltIsActive=false;
masterkookus 5:c656fd08007b 178 }
masterkookus 0:03ab7f7596e2 179 }
masterkookus 0:03ab7f7596e2 180 }
masterkookus 0:03ab7f7596e2 181 }
masterkookus 0:03ab7f7596e2 182
masterkookus 2:ec972966689e 183 //Ethernet to Serial transmit data
masterkookus 0:03ab7f7596e2 184 void datanrx(netsys *net2)
masterkookus 0:03ab7f7596e2 185 {
masterkookus 0:03ab7f7596e2 186 char rxbuf[256];
masterkookus 0:03ab7f7596e2 187 int rxlen=0;
masterkookus 5:c656fd08007b 188 int rxc;
masterkookus 0:03ab7f7596e2 189 while (1)
masterkookus 0:03ab7f7596e2 190 {
masterkookus 6:9f97716eae76 191 while (net2->srvIsActive)
masterkookus 0:03ab7f7596e2 192 {
masterkookus 0:03ab7f7596e2 193 rxlen=net2->clt_sock.recv(rxbuf, sizeof(rxbuf));
masterkookus 4:98cdccfb17d6 194 if (rxlen>0)
masterkookus 4:98cdccfb17d6 195 {
masterkookus 4:98cdccfb17d6 196 net2->aliveTime=0;
masterkookus 4:98cdccfb17d6 197 sport0.write(rxbuf,rxlen);
masterkookus 5:c656fd08007b 198 for (rxc = 0;rxc<rxlen;rxc++)
masterkookus 5:c656fd08007b 199 {
masterkookus 5:c656fd08007b 200 cmdbuf.push(rxbuf[rxc]);
masterkookus 5:c656fd08007b 201 }
masterkookus 5:c656fd08007b 202 net2->rxMessageCount++;
masterkookus 4:98cdccfb17d6 203 }
masterkookus 0:03ab7f7596e2 204 }
masterkookus 0:03ab7f7596e2 205 }
masterkookus 0:03ab7f7596e2 206 }
masterkookus 0:03ab7f7596e2 207
masterkookus 2:ec972966689e 208 //Ethernet to Serial receive data
masterkookus 0:03ab7f7596e2 209 void datasrx(netsys *net2)
masterkookus 0:03ab7f7596e2 210 {
masterkookus 0:03ab7f7596e2 211 char rxbuf[256];
masterkookus 0:03ab7f7596e2 212 int rxlen=0;
masterkookus 0:03ab7f7596e2 213 int rxc;
masterkookus 0:03ab7f7596e2 214 while (1)
masterkookus 0:03ab7f7596e2 215 {
masterkookus 6:9f97716eae76 216 while (net2->srvIsActive)
masterkookus 0:03ab7f7596e2 217 {
masterkookus 0:03ab7f7596e2 218 rxlen=sport0.readable();
masterkookus 0:03ab7f7596e2 219 if (rxlen>0)
masterkookus 0:03ab7f7596e2 220 {
masterkookus 0:03ab7f7596e2 221 for (rxc = 0;rxc<rxlen;rxc++)
masterkookus 0:03ab7f7596e2 222 {
masterkookus 0:03ab7f7596e2 223 rxbuf[rxc] = sport0.getc();
masterkookus 0:03ab7f7596e2 224 }
masterkookus 4:98cdccfb17d6 225 net2->aliveTime=0;
masterkookus 0:03ab7f7596e2 226 net2->clt_sock.send(rxbuf, rxlen);
masterkookus 6:9f97716eae76 227 net2->txMessageCount++;
masterkookus 0:03ab7f7596e2 228 }
masterkookus 0:03ab7f7596e2 229 }
masterkookus 0:03ab7f7596e2 230 }
masterkookus 0:03ab7f7596e2 231 }
masterkookus 0:03ab7f7596e2 232
masterkookus 2:ec972966689e 233 //Checks for a Ethernet to Serial connection
masterkookus 0:03ab7f7596e2 234 void conchk(netsys *net2)
masterkookus 0:03ab7f7596e2 235 {
masterkookus 0:03ab7f7596e2 236 TCPServer *server=&(net2->srv);
masterkookus 0:03ab7f7596e2 237 TCPSocket *client_socket=&(net2->clt_sock);
masterkookus 0:03ab7f7596e2 238 SocketAddress *client_address=&(net2->clt_addr);
masterkookus 0:03ab7f7596e2 239
masterkookus 0:03ab7f7596e2 240 while(1)
masterkookus 0:03ab7f7596e2 241 {
masterkookus 5:c656fd08007b 242 while (server->accept(client_socket, client_address) < 0)
masterkookus 0:03ab7f7596e2 243 {
masterkookus 5:c656fd08007b 244 //printf("Connection Failed.\r\n");
masterkookus 0:03ab7f7596e2 245 }
masterkookus 6:9f97716eae76 246 printf("Server Port %d\r\n", net2->srvPort);
masterkookus 5:c656fd08007b 247 printf("accept %s:%d\r\n", client_address->get_ip_address(), client_address->get_port());
masterkookus 5:c656fd08007b 248 net2->aliveTime=0;
masterkookus 6:9f97716eae76 249 net2->srvIsActive=true;
masterkookus 0:03ab7f7596e2 250 }
masterkookus 0:03ab7f7596e2 251 }
masterkookus 0:03ab7f7596e2 252
masterkookus 0:03ab7f7596e2 253 int main()
masterkookus 0:03ab7f7596e2 254 {
masterkookus 0:03ab7f7596e2 255 EthernetInterface eth;
masterkookus 0:03ab7f7596e2 256 eth.set_network(mbedIp,mbedMask,mbedGateway); //Use these parameters for static IP
masterkookus 0:03ab7f7596e2 257 eth.connect();
masterkookus 0:03ab7f7596e2 258
masterkookus 0:03ab7f7596e2 259 printf("The target IP address is '%s'\r\n", eth.get_ip_address());
masterkookus 4:98cdccfb17d6 260 confignetdevices(&eth);
masterkookus 2:ec972966689e 261 /* Setup Ethernet to Serial Connection Thread */
masterkookus 0:03ab7f7596e2 262 conchkthread[0].start(callback(conchk,&net1));
masterkookus 2:ec972966689e 263 /* Setup polltick Ticker */
masterkookus 3:ac1f2af8bd0f 264 nettimer[1].attach_us(heartbeat,10000);
masterkookus 2:ec972966689e 265 /* Setup Ethernet to Serial transmit data Thread */
masterkookus 0:03ab7f7596e2 266 rxtxdatathread[0].start(callback(datanrx,&net1));
masterkookus 2:ec972966689e 267 /* Setup Ethernet to Serial receive data Thread */
masterkookus 0:03ab7f7596e2 268 rxtxdatathread[1].start(callback(datasrx,&net1));
masterkookus 6:9f97716eae76 269 rxtxdatathread[2].start(callback(datapolltx,&net1));
masterkookus 3:ac1f2af8bd0f 270
masterkookus 0:03ab7f7596e2 271 while (true) {
masterkookus 3:ac1f2af8bd0f 272
masterkookus 3:ac1f2af8bd0f 273 polltick=getTick();
masterkookus 3:ac1f2af8bd0f 274
masterkookus 3:ac1f2af8bd0f 275 if (polltick)
masterkookus 3:ac1f2af8bd0f 276 {
masterkookus 3:ac1f2af8bd0f 277 setTick(false);
masterkookus 3:ac1f2af8bd0f 278 incTime();
masterkookus 3:ac1f2af8bd0f 279 currenttime=getTime();
masterkookus 6:9f97716eae76 280 net1.pollTime++;
masterkookus 6:9f97716eae76 281 if (net1.srvIsActive)
masterkookus 0:03ab7f7596e2 282 {
masterkookus 4:98cdccfb17d6 283 net1.aliveTime++;
masterkookus 6:9f97716eae76 284 if (net1.aliveTime>net1.aliveTimeout)
masterkookus 4:98cdccfb17d6 285 {
masterkookus 4:98cdccfb17d6 286 printf("Closed\r\n");
masterkookus 4:98cdccfb17d6 287 net1.clt_sock.close();
masterkookus 6:9f97716eae76 288 net1.srvIsActive=false;
masterkookus 6:9f97716eae76 289 net1.srvCloseConnection=false;
masterkookus 4:98cdccfb17d6 290 }
masterkookus 4:98cdccfb17d6 291
masterkookus 0:03ab7f7596e2 292 }
masterkookus 6:9f97716eae76 293 if (net1.pollTime >= net1.pollInterval)
masterkookus 4:98cdccfb17d6 294 {
masterkookus 6:9f97716eae76 295 switch (net1.pollState)
masterkookus 5:c656fd08007b 296 {
masterkookus 5:c656fd08007b 297 case 1:
masterkookus 5:c656fd08007b 298
masterkookus 6:9f97716eae76 299 ret=net1.srv_sock.open(&eth);
masterkookus 5:c656fd08007b 300 printf("Socket%d\r\n",ret);
masterkookus 5:c656fd08007b 301 if (ret < 0)
masterkookus 5:c656fd08007b 302 {
masterkookus 6:9f97716eae76 303 net1.pollRetry = true;
masterkookus 6:9f97716eae76 304 net1.pollRetryCount=0;
masterkookus 6:9f97716eae76 305 net1.pollState=2;
masterkookus 6:9f97716eae76 306 net1.pollTime=net1.pollInterval-10;
masterkookus 5:c656fd08007b 307 break;
masterkookus 5:c656fd08007b 308 }
masterkookus 6:9f97716eae76 309 net1.pollState=3;
masterkookus 6:9f97716eae76 310 net1.pollTime=0;
masterkookus 6:9f97716eae76 311 net1.cltIsActive=true;
masterkookus 5:c656fd08007b 312 break;
masterkookus 5:c656fd08007b 313 case 2:
masterkookus 6:9f97716eae76 314 ret=net1.srv_sock.open(&eth);
masterkookus 5:c656fd08007b 315 printf("Socket%d\r\n",ret);
masterkookus 5:c656fd08007b 316 if (ret < 0)
masterkookus 5:c656fd08007b 317 {
masterkookus 6:9f97716eae76 318 net1.pollRetry = true;
masterkookus 6:9f97716eae76 319 net1.pollRetryCount++;
masterkookus 6:9f97716eae76 320 net1.pollTime=net1.pollInterval-10;
masterkookus 5:c656fd08007b 321 printf("Attach Attempt Failed, Code: %d\r\n",ret);
masterkookus 6:9f97716eae76 322 if (net1.pollRetryCount>3)
masterkookus 5:c656fd08007b 323 {
masterkookus 5:c656fd08007b 324 printf("Communication Failed, Closing\r\n");
masterkookus 6:9f97716eae76 325 net1.pollRetry = false;
masterkookus 6:9f97716eae76 326 net1.pollRetryCount = 0;
masterkookus 6:9f97716eae76 327 net1.messageFailCount++;
masterkookus 6:9f97716eae76 328 net1.pollState=0;
masterkookus 6:9f97716eae76 329 net1.pollTime=0;
masterkookus 5:c656fd08007b 330 }
masterkookus 5:c656fd08007b 331 break;
masterkookus 5:c656fd08007b 332 }
masterkookus 6:9f97716eae76 333 net1.pollState=0;
masterkookus 6:9f97716eae76 334 net1.pollRetry = false;
masterkookus 6:9f97716eae76 335 net1.pollTime=0;
masterkookus 6:9f97716eae76 336 net1.cltIsActive=true;
masterkookus 5:c656fd08007b 337 break;
masterkookus 5:c656fd08007b 338 default:
masterkookus 5:c656fd08007b 339 break;
masterkookus 5:c656fd08007b 340 }
masterkookus 4:98cdccfb17d6 341 }
masterkookus 1:a57cbebba3fd 342 }
masterkookus 0:03ab7f7596e2 343 }
masterkookus 0:03ab7f7596e2 344 }