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:
Tue Sep 17 17:03:40 2019 +0000
Revision:
4:98cdccfb17d6
Parent:
3:ac1f2af8bd0f
Child:
5:c656fd08007b
Basic Functionality

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 0:03ab7f7596e2 12
masterkookus 0:03ab7f7596e2 13 #define HTTP_STATUS_LINE "HTTP/1.0 200 OK"
masterkookus 0:03ab7f7596e2 14 #define HTTP_HEADER_FIELDS "Content-Type: text/html; charset=utf-8"
masterkookus 0:03ab7f7596e2 15 #define HTTP_MESSAGE_BODY "" \
masterkookus 0:03ab7f7596e2 16 "<html>" "\r\n" \
masterkookus 0:03ab7f7596e2 17 " <body style=\"display:flex;text-align:center\">" "\r\n" \
masterkookus 0:03ab7f7596e2 18 " <div style=\"margin:auto\">" "\r\n" \
masterkookus 0:03ab7f7596e2 19 " <h1>Hello World</h1>" "\r\n" \
masterkookus 0:03ab7f7596e2 20 " <p>It works !</p>" "\r\n" \
masterkookus 0:03ab7f7596e2 21 " </div>" "\r\n" \
masterkookus 0:03ab7f7596e2 22 " </body>" "\r\n" \
masterkookus 0:03ab7f7596e2 23 "</html>"
masterkookus 0:03ab7f7596e2 24
masterkookus 0:03ab7f7596e2 25 #define HTTP_RESPONSE HTTP_STATUS_LINE "\r\n" \
masterkookus 0:03ab7f7596e2 26 HTTP_HEADER_FIELDS "\r\n" \
masterkookus 0:03ab7f7596e2 27 "\r\n" \
masterkookus 0:03ab7f7596e2 28 HTTP_MESSAGE_BODY "\r\n"
masterkookus 0:03ab7f7596e2 29
masterkookus 0:03ab7f7596e2 30 static const char* mbedIp = "10.150.1.241"; //IP
masterkookus 0:03ab7f7596e2 31 static const char* mbedMask = "255.255.255.0"; // Mask
masterkookus 0:03ab7f7596e2 32 static const char* mbedGateway = "10.150.1.245"; //Gateway
masterkookus 0:03ab7f7596e2 33
masterkookus 0:03ab7f7596e2 34 Ticker nettimer[2];
masterkookus 0:03ab7f7596e2 35
masterkookus 3:ac1f2af8bd0f 36 struct netsys net1,nets,http1;
masterkookus 1:a57cbebba3fd 37
masterkookus 1:a57cbebba3fd 38 bool polltick;
masterkookus 0:03ab7f7596e2 39
masterkookus 0:03ab7f7596e2 40 BufferedSerial sport0(PD_5, PD_6, 256, 4); // UART2
masterkookus 0:03ab7f7596e2 41
masterkookus 0:03ab7f7596e2 42 Thread conchkthread[2];
masterkookus 4:98cdccfb17d6 43 Thread rxtxdatathread[5];
masterkookus 4:98cdccfb17d6 44
masterkookus 4:98cdccfb17d6 45 unsigned int currenttime=0;
masterkookus 0:03ab7f7596e2 46
masterkookus 2:ec972966689e 47 //Provides the deivce poll timing
masterkookus 1:a57cbebba3fd 48 void heartbeat()
masterkookus 1:a57cbebba3fd 49 {
masterkookus 3:ac1f2af8bd0f 50 //polltick=true;
masterkookus 3:ac1f2af8bd0f 51 setTick(true);
masterkookus 1:a57cbebba3fd 52 }
masterkookus 1:a57cbebba3fd 53
masterkookus 4:98cdccfb17d6 54 void confignetdevices(EthernetInterface *eth)
masterkookus 4:98cdccfb17d6 55 {
masterkookus 4:98cdccfb17d6 56 nets.tcpport=23;
masterkookus 4:98cdccfb17d6 57 nets.eth=eth;
masterkookus 4:98cdccfb17d6 58 nets.isactive=false;
masterkookus 4:98cdccfb17d6 59 nets.closeconnection=false;
masterkookus 4:98cdccfb17d6 60 nets.pollTimeout=200;
masterkookus 4:98cdccfb17d6 61 nets.pollTime=0;
masterkookus 4:98cdccfb17d6 62 nets.pollInterval=200;
masterkookus 4:98cdccfb17d6 63 net1.pollTimeout=50;
masterkookus 4:98cdccfb17d6 64
masterkookus 4:98cdccfb17d6 65 /* Open the server on ethernet stack */
masterkookus 4:98cdccfb17d6 66 net1.srv.open(eth);
masterkookus 4:98cdccfb17d6 67 net1.isactive=false;
masterkookus 4:98cdccfb17d6 68 net1.closeconnection=false;
masterkookus 4:98cdccfb17d6 69 http1.srv.open(eth);
masterkookus 4:98cdccfb17d6 70
masterkookus 4:98cdccfb17d6 71 /* Bind the HTTP port (TCP 80) to the server */
masterkookus 4:98cdccfb17d6 72 http1.tcpport=80;
masterkookus 4:98cdccfb17d6 73 http1.srv.bind(http1.tcpport);
masterkookus 4:98cdccfb17d6 74
masterkookus 4:98cdccfb17d6 75 /* Bind port 23 to the server */
masterkookus 4:98cdccfb17d6 76 net1.tcpport=23;
masterkookus 4:98cdccfb17d6 77 net1.srv.bind(net1.tcpport);
masterkookus 4:98cdccfb17d6 78
masterkookus 4:98cdccfb17d6 79 /* Can handle 5 simultaneous connections */
masterkookus 4:98cdccfb17d6 80 net1.srv.listen(5);
masterkookus 4:98cdccfb17d6 81 http1.srv.listen(5);
masterkookus 4:98cdccfb17d6 82 sport0.baud(9600);
masterkookus 4:98cdccfb17d6 83 }
masterkookus 4:98cdccfb17d6 84
masterkookus 4:98cdccfb17d6 85 //Ethernet to Ethernet Send Command
masterkookus 4:98cdccfb17d6 86 void datapolltx(netsys *net2)
masterkookus 0:03ab7f7596e2 87 {
masterkookus 4:98cdccfb17d6 88 while(1)
masterkookus 0:03ab7f7596e2 89 {
masterkookus 4:98cdccfb17d6 90 if (net2->isactive)
masterkookus 0:03ab7f7596e2 91 {
masterkookus 4:98cdccfb17d6 92 /* Error Messages */
masterkookus 4:98cdccfb17d6 93 nsapi_error_t ret;
masterkookus 4:98cdccfb17d6 94 ret = net2->clt_sock.connect("10.150.1.242",nets.tcpport);
masterkookus 4:98cdccfb17d6 95 printf("Connected %d\r\n",ret);
masterkookus 4:98cdccfb17d6 96 ret = net2->clt_sock.send("Tick",strlen("Tick"));
masterkookus 4:98cdccfb17d6 97 printf("Send Result %d\r\n",ret);
masterkookus 4:98cdccfb17d6 98 net2->clt_sock.close();
masterkookus 4:98cdccfb17d6 99 net2->isactive=false;
masterkookus 0:03ab7f7596e2 100 }
masterkookus 0:03ab7f7596e2 101 }
masterkookus 0:03ab7f7596e2 102 }
masterkookus 0:03ab7f7596e2 103
masterkookus 2:ec972966689e 104 //Ethernet to Serial transmit data
masterkookus 0:03ab7f7596e2 105 void datanrx(netsys *net2)
masterkookus 0:03ab7f7596e2 106 {
masterkookus 0:03ab7f7596e2 107 char rxbuf[256];
masterkookus 0:03ab7f7596e2 108 int rxlen=0;
masterkookus 0:03ab7f7596e2 109 while (1)
masterkookus 0:03ab7f7596e2 110 {
masterkookus 0:03ab7f7596e2 111 while (net2->isactive)
masterkookus 0:03ab7f7596e2 112 {
masterkookus 0:03ab7f7596e2 113 rxlen=net2->clt_sock.recv(rxbuf, sizeof(rxbuf));
masterkookus 4:98cdccfb17d6 114 if (rxlen>0)
masterkookus 4:98cdccfb17d6 115 {
masterkookus 4:98cdccfb17d6 116 net2->aliveTime=0;
masterkookus 4:98cdccfb17d6 117 sport0.write(rxbuf,rxlen);
masterkookus 4:98cdccfb17d6 118 }
masterkookus 0:03ab7f7596e2 119 }
masterkookus 0:03ab7f7596e2 120 }
masterkookus 0:03ab7f7596e2 121 }
masterkookus 0:03ab7f7596e2 122
masterkookus 2:ec972966689e 123 //Ethernet to Serial receive data
masterkookus 0:03ab7f7596e2 124 void datasrx(netsys *net2)
masterkookus 0:03ab7f7596e2 125 {
masterkookus 0:03ab7f7596e2 126 char rxbuf[256];
masterkookus 0:03ab7f7596e2 127 int rxlen=0;
masterkookus 0:03ab7f7596e2 128 int rxc;
masterkookus 0:03ab7f7596e2 129 while (1)
masterkookus 0:03ab7f7596e2 130 {
masterkookus 0:03ab7f7596e2 131 while (net2->isactive)
masterkookus 0:03ab7f7596e2 132 {
masterkookus 0:03ab7f7596e2 133 rxlen=sport0.readable();
masterkookus 0:03ab7f7596e2 134 if (rxlen>0)
masterkookus 0:03ab7f7596e2 135 {
masterkookus 0:03ab7f7596e2 136 for (rxc = 0;rxc<rxlen;rxc++)
masterkookus 0:03ab7f7596e2 137 {
masterkookus 0:03ab7f7596e2 138 rxbuf[rxc] = sport0.getc();
masterkookus 0:03ab7f7596e2 139 }
masterkookus 4:98cdccfb17d6 140 net2->aliveTime=0;
masterkookus 0:03ab7f7596e2 141 net2->clt_sock.send(rxbuf, rxlen);
masterkookus 0:03ab7f7596e2 142 }
masterkookus 0:03ab7f7596e2 143 }
masterkookus 0:03ab7f7596e2 144 }
masterkookus 0:03ab7f7596e2 145 }
masterkookus 0:03ab7f7596e2 146
masterkookus 2:ec972966689e 147 //Checks for a Ethernet to Serial connection
masterkookus 0:03ab7f7596e2 148 void conchk(netsys *net2)
masterkookus 0:03ab7f7596e2 149 {
masterkookus 0:03ab7f7596e2 150 TCPServer *server=&(net2->srv);
masterkookus 0:03ab7f7596e2 151 TCPSocket *client_socket=&(net2->clt_sock);
masterkookus 0:03ab7f7596e2 152 SocketAddress *client_address=&(net2->clt_addr);
masterkookus 0:03ab7f7596e2 153
masterkookus 0:03ab7f7596e2 154 while(1)
masterkookus 0:03ab7f7596e2 155 {
masterkookus 0:03ab7f7596e2 156 if (server->accept(client_socket, client_address) < 0)
masterkookus 0:03ab7f7596e2 157 {
masterkookus 0:03ab7f7596e2 158 printf("Connection Failed.\r\n");
masterkookus 0:03ab7f7596e2 159 return;
masterkookus 0:03ab7f7596e2 160 }
masterkookus 0:03ab7f7596e2 161 printf("Server Port %d\r\n", net2->tcpport);
masterkookus 0:03ab7f7596e2 162 if (net2->tcpport==80)
masterkookus 0:03ab7f7596e2 163 {
masterkookus 0:03ab7f7596e2 164 printf("accept %s:%d\r\n", client_address->get_ip_address(), client_address->get_port());
masterkookus 0:03ab7f7596e2 165 client_socket->send(HTTP_RESPONSE, strlen(HTTP_RESPONSE));
masterkookus 0:03ab7f7596e2 166 client_socket->close();
masterkookus 0:03ab7f7596e2 167 }
masterkookus 0:03ab7f7596e2 168 else
masterkookus 0:03ab7f7596e2 169 {
masterkookus 0:03ab7f7596e2 170 printf("accept %s:%d\r\n", client_address->get_ip_address(), client_address->get_port());
masterkookus 4:98cdccfb17d6 171 net2->aliveTime=0;
masterkookus 0:03ab7f7596e2 172 net2->isactive=true;
masterkookus 0:03ab7f7596e2 173 }
masterkookus 0:03ab7f7596e2 174 }
masterkookus 0:03ab7f7596e2 175 }
masterkookus 0:03ab7f7596e2 176
masterkookus 0:03ab7f7596e2 177 int main()
masterkookus 0:03ab7f7596e2 178 {
masterkookus 0:03ab7f7596e2 179 printf("Basic HTTP server example\r\n");
masterkookus 0:03ab7f7596e2 180
masterkookus 4:98cdccfb17d6 181
masterkookus 0:03ab7f7596e2 182 EthernetInterface eth;
masterkookus 0:03ab7f7596e2 183 eth.set_network(mbedIp,mbedMask,mbedGateway); //Use these parameters for static IP
masterkookus 0:03ab7f7596e2 184 eth.connect();
masterkookus 0:03ab7f7596e2 185
masterkookus 0:03ab7f7596e2 186 printf("The target IP address is '%s'\r\n", eth.get_ip_address());
masterkookus 0:03ab7f7596e2 187
masterkookus 1:a57cbebba3fd 188
masterkookus 0:03ab7f7596e2 189
masterkookus 4:98cdccfb17d6 190 confignetdevices(&eth);
masterkookus 0:03ab7f7596e2 191
masterkookus 0:03ab7f7596e2 192
masterkookus 0:03ab7f7596e2 193
masterkookus 2:ec972966689e 194 /* Setup Ethernet to Serial Connection Thread */
masterkookus 0:03ab7f7596e2 195 conchkthread[0].start(callback(conchk,&net1));
masterkookus 2:ec972966689e 196 /* Setup Ethernet to Serial Timeout Ticker */
masterkookus 4:98cdccfb17d6 197 //nettimer[0].attach_us(callback(nettimeout,&net1),100000);
masterkookus 2:ec972966689e 198 /* Setup polltick Ticker */
masterkookus 3:ac1f2af8bd0f 199 nettimer[1].attach_us(heartbeat,10000);
masterkookus 2:ec972966689e 200 /* Setup Ethernet to Serial transmit data Thread */
masterkookus 0:03ab7f7596e2 201 rxtxdatathread[0].start(callback(datanrx,&net1));
masterkookus 2:ec972966689e 202 /* Setup Ethernet to Serial receive data Thread */
masterkookus 0:03ab7f7596e2 203 rxtxdatathread[1].start(callback(datasrx,&net1));
masterkookus 4:98cdccfb17d6 204 rxtxdatathread[2].start(callback(datapolltx,&nets));
masterkookus 2:ec972966689e 205 /* Setup Web Server Connection Thread */
masterkookus 0:03ab7f7596e2 206 conchkthread[1].start(callback(conchk,&http1));
masterkookus 4:98cdccfb17d6 207 /* Error Messages */
masterkookus 4:98cdccfb17d6 208 nsapi_error_t ret;
masterkookus 3:ac1f2af8bd0f 209
masterkookus 0:03ab7f7596e2 210 while (true) {
masterkookus 3:ac1f2af8bd0f 211
masterkookus 3:ac1f2af8bd0f 212 polltick=getTick();
masterkookus 3:ac1f2af8bd0f 213
masterkookus 3:ac1f2af8bd0f 214 if (polltick)
masterkookus 3:ac1f2af8bd0f 215 {
masterkookus 3:ac1f2af8bd0f 216 setTick(false);
masterkookus 3:ac1f2af8bd0f 217 incTime();
masterkookus 3:ac1f2af8bd0f 218 currenttime=getTime();
masterkookus 4:98cdccfb17d6 219 nets.pollTime++;
masterkookus 4:98cdccfb17d6 220 if (net1.isactive)
masterkookus 0:03ab7f7596e2 221 {
masterkookus 4:98cdccfb17d6 222 net1.aliveTime++;
masterkookus 4:98cdccfb17d6 223 if (net1.aliveTime>net1.pollTimeout)
masterkookus 4:98cdccfb17d6 224 {
masterkookus 4:98cdccfb17d6 225 printf("Closed\r\n");
masterkookus 4:98cdccfb17d6 226 net1.clt_sock.close();
masterkookus 4:98cdccfb17d6 227 net1.isactive=false;
masterkookus 4:98cdccfb17d6 228 net1.closeconnection=false;
masterkookus 4:98cdccfb17d6 229 }
masterkookus 4:98cdccfb17d6 230
masterkookus 0:03ab7f7596e2 231 }
masterkookus 4:98cdccfb17d6 232 if (nets.pollTime >= nets.pollInterval)
masterkookus 4:98cdccfb17d6 233 {
masterkookus 4:98cdccfb17d6 234 nets.pollTime=0;
masterkookus 4:98cdccfb17d6 235 ret = nets.clt_sock.open(&eth);
masterkookus 4:98cdccfb17d6 236 printf("Socket%d\r\n",ret);
masterkookus 4:98cdccfb17d6 237 nets.isactive=true;
masterkookus 4:98cdccfb17d6 238 }
masterkookus 1:a57cbebba3fd 239 }
masterkookus 0:03ab7f7596e2 240 }
masterkookus 0:03ab7f7596e2 241 }