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 Sep 16 14:17:45 2019 +0000
Revision:
3:ac1f2af8bd0f
Parent:
2:ec972966689e
Child:
4:98cdccfb17d6
Added basic system timer and moving devices to new file

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 0:03ab7f7596e2 43 Thread rxtxdatathread[2];
masterkookus 0:03ab7f7596e2 44
masterkookus 2:ec972966689e 45 //Provides the deivce poll timing
masterkookus 1:a57cbebba3fd 46 void heartbeat()
masterkookus 1:a57cbebba3fd 47 {
masterkookus 3:ac1f2af8bd0f 48 //polltick=true;
masterkookus 3:ac1f2af8bd0f 49 setTick(true);
masterkookus 1:a57cbebba3fd 50 }
masterkookus 1:a57cbebba3fd 51
masterkookus 2:ec972966689e 52 //Provides the timeout for ethernet to serial communications
masterkookus 0:03ab7f7596e2 53 void nettimeout(netsys *net2)
masterkookus 0:03ab7f7596e2 54 {
masterkookus 0:03ab7f7596e2 55 if (net2->isactive==true)
masterkookus 0:03ab7f7596e2 56 {
masterkookus 3:ac1f2af8bd0f 57 if (net2->sockalivetime==300)
masterkookus 0:03ab7f7596e2 58 {
masterkookus 0:03ab7f7596e2 59 net2->closeconnection=true;
masterkookus 0:03ab7f7596e2 60 net2->sockalivetime=0;
masterkookus 0:03ab7f7596e2 61 }
masterkookus 0:03ab7f7596e2 62 else
masterkookus 0:03ab7f7596e2 63 {
masterkookus 0:03ab7f7596e2 64 net2->sockalivetime++;
masterkookus 0:03ab7f7596e2 65 }
masterkookus 0:03ab7f7596e2 66 }
masterkookus 0:03ab7f7596e2 67 }
masterkookus 0:03ab7f7596e2 68
masterkookus 2:ec972966689e 69 //Ethernet to Serial transmit data
masterkookus 0:03ab7f7596e2 70 void datanrx(netsys *net2)
masterkookus 0:03ab7f7596e2 71 {
masterkookus 0:03ab7f7596e2 72 char rxbuf[256];
masterkookus 0:03ab7f7596e2 73 int rxlen=0;
masterkookus 0:03ab7f7596e2 74 while (1)
masterkookus 0:03ab7f7596e2 75 {
masterkookus 0:03ab7f7596e2 76 while (net2->isactive)
masterkookus 0:03ab7f7596e2 77 {
masterkookus 0:03ab7f7596e2 78 rxlen=net2->clt_sock.recv(rxbuf, sizeof(rxbuf));
masterkookus 0:03ab7f7596e2 79 net2->sockalivetime=0;
masterkookus 0:03ab7f7596e2 80 sport0.write(rxbuf,rxlen);
masterkookus 0:03ab7f7596e2 81 }
masterkookus 0:03ab7f7596e2 82 }
masterkookus 0:03ab7f7596e2 83 }
masterkookus 0:03ab7f7596e2 84
masterkookus 2:ec972966689e 85 //Ethernet to Serial receive data
masterkookus 0:03ab7f7596e2 86 void datasrx(netsys *net2)
masterkookus 0:03ab7f7596e2 87 {
masterkookus 0:03ab7f7596e2 88 char rxbuf[256];
masterkookus 0:03ab7f7596e2 89 int rxlen=0;
masterkookus 0:03ab7f7596e2 90 int rxc;
masterkookus 0:03ab7f7596e2 91 while (1)
masterkookus 0:03ab7f7596e2 92 {
masterkookus 0:03ab7f7596e2 93 while (net2->isactive)
masterkookus 0:03ab7f7596e2 94 {
masterkookus 0:03ab7f7596e2 95 rxlen=sport0.readable();
masterkookus 0:03ab7f7596e2 96 if (rxlen>0)
masterkookus 0:03ab7f7596e2 97 {
masterkookus 0:03ab7f7596e2 98 for (rxc = 0;rxc<rxlen;rxc++)
masterkookus 0:03ab7f7596e2 99 {
masterkookus 0:03ab7f7596e2 100 rxbuf[rxc] = sport0.getc();
masterkookus 0:03ab7f7596e2 101 }
masterkookus 0:03ab7f7596e2 102 net2->sockalivetime=0;
masterkookus 0:03ab7f7596e2 103 net2->clt_sock.send(rxbuf, rxlen);
masterkookus 0:03ab7f7596e2 104 }
masterkookus 0:03ab7f7596e2 105 }
masterkookus 0:03ab7f7596e2 106 }
masterkookus 0:03ab7f7596e2 107 }
masterkookus 0:03ab7f7596e2 108
masterkookus 2:ec972966689e 109 //Checks for a Ethernet to Serial connection
masterkookus 0:03ab7f7596e2 110 void conchk(netsys *net2)
masterkookus 0:03ab7f7596e2 111 {
masterkookus 0:03ab7f7596e2 112 TCPServer *server=&(net2->srv);
masterkookus 0:03ab7f7596e2 113 TCPSocket *client_socket=&(net2->clt_sock);
masterkookus 0:03ab7f7596e2 114 SocketAddress *client_address=&(net2->clt_addr);
masterkookus 0:03ab7f7596e2 115
masterkookus 0:03ab7f7596e2 116 while(1)
masterkookus 0:03ab7f7596e2 117 {
masterkookus 0:03ab7f7596e2 118 if (server->accept(client_socket, client_address) < 0)
masterkookus 0:03ab7f7596e2 119 {
masterkookus 0:03ab7f7596e2 120 printf("Connection Failed.\r\n");
masterkookus 0:03ab7f7596e2 121 return;
masterkookus 0:03ab7f7596e2 122 }
masterkookus 0:03ab7f7596e2 123 printf("Server Port %d\r\n", net2->tcpport);
masterkookus 0:03ab7f7596e2 124 if (net2->tcpport==80)
masterkookus 0:03ab7f7596e2 125 {
masterkookus 0:03ab7f7596e2 126 printf("accept %s:%d\r\n", client_address->get_ip_address(), client_address->get_port());
masterkookus 0:03ab7f7596e2 127 client_socket->send(HTTP_RESPONSE, strlen(HTTP_RESPONSE));
masterkookus 0:03ab7f7596e2 128 client_socket->close();
masterkookus 0:03ab7f7596e2 129 }
masterkookus 0:03ab7f7596e2 130 else
masterkookus 0:03ab7f7596e2 131 {
masterkookus 0:03ab7f7596e2 132 printf("accept %s:%d\r\n", client_address->get_ip_address(), client_address->get_port());
masterkookus 0:03ab7f7596e2 133 net2->isactive=true;
masterkookus 0:03ab7f7596e2 134 client_socket->send("Hello", strlen("Hello"));
masterkookus 0:03ab7f7596e2 135 }
masterkookus 0:03ab7f7596e2 136 }
masterkookus 0:03ab7f7596e2 137 }
masterkookus 0:03ab7f7596e2 138
masterkookus 0:03ab7f7596e2 139 int main()
masterkookus 0:03ab7f7596e2 140 {
masterkookus 0:03ab7f7596e2 141 printf("Basic HTTP server example\r\n");
masterkookus 0:03ab7f7596e2 142
masterkookus 0:03ab7f7596e2 143 EthernetInterface eth;
masterkookus 0:03ab7f7596e2 144 eth.set_network(mbedIp,mbedMask,mbedGateway); //Use these parameters for static IP
masterkookus 0:03ab7f7596e2 145 eth.connect();
masterkookus 0:03ab7f7596e2 146
masterkookus 0:03ab7f7596e2 147 printf("The target IP address is '%s'\r\n", eth.get_ip_address());
masterkookus 0:03ab7f7596e2 148
masterkookus 2:ec972966689e 149 /* Error Messages */
masterkookus 1:a57cbebba3fd 150 nsapi_error_t ret;
masterkookus 1:a57cbebba3fd 151
masterkookus 0:03ab7f7596e2 152 /* Open the server on ethernet stack */
masterkookus 0:03ab7f7596e2 153 net1.srv.open(&eth);
masterkookus 0:03ab7f7596e2 154 net1.isactive=false;
masterkookus 0:03ab7f7596e2 155 net1.closeconnection=false;
masterkookus 0:03ab7f7596e2 156 http1.srv.open(&eth);
masterkookus 0:03ab7f7596e2 157
masterkookus 0:03ab7f7596e2 158 /* Bind the HTTP port (TCP 80) to the server */
masterkookus 0:03ab7f7596e2 159 http1.tcpport=80;
masterkookus 0:03ab7f7596e2 160 http1.srv.bind(http1.tcpport);
masterkookus 0:03ab7f7596e2 161
masterkookus 2:ec972966689e 162 /* Bind port 23 to the server */
masterkookus 0:03ab7f7596e2 163 net1.tcpport=23;
masterkookus 0:03ab7f7596e2 164 net1.srv.bind(net1.tcpport);
masterkookus 0:03ab7f7596e2 165
masterkookus 0:03ab7f7596e2 166 /* Can handle 5 simultaneous connections */
masterkookus 1:a57cbebba3fd 167 net1.srv.listen(5);
masterkookus 0:03ab7f7596e2 168 http1.srv.listen(5);
masterkookus 0:03ab7f7596e2 169 sport0.baud(9600);
masterkookus 0:03ab7f7596e2 170
masterkookus 2:ec972966689e 171 /* Setup Ethernet to Serial Connection Thread */
masterkookus 0:03ab7f7596e2 172 conchkthread[0].start(callback(conchk,&net1));
masterkookus 2:ec972966689e 173 /* Setup Ethernet to Serial Timeout Ticker */
masterkookus 3:ac1f2af8bd0f 174 nettimer[0].attach_us(callback(nettimeout,&net1),100000);
masterkookus 2:ec972966689e 175 /* Setup polltick Ticker */
masterkookus 3:ac1f2af8bd0f 176 nettimer[1].attach_us(heartbeat,10000);
masterkookus 2:ec972966689e 177 /* Setup Ethernet to Serial transmit data Thread */
masterkookus 0:03ab7f7596e2 178 rxtxdatathread[0].start(callback(datanrx,&net1));
masterkookus 2:ec972966689e 179 /* Setup Ethernet to Serial receive data Thread */
masterkookus 0:03ab7f7596e2 180 rxtxdatathread[1].start(callback(datasrx,&net1));
masterkookus 2:ec972966689e 181 /* Setup Web Server Connection Thread */
masterkookus 0:03ab7f7596e2 182 conchkthread[1].start(callback(conchk,&http1));
masterkookus 0:03ab7f7596e2 183
masterkookus 3:ac1f2af8bd0f 184 unsigned int polltime=200;
masterkookus 3:ac1f2af8bd0f 185 unsigned int currenttime=0;
masterkookus 3:ac1f2af8bd0f 186 unsigned int polltimeout=200;
masterkookus 3:ac1f2af8bd0f 187
masterkookus 0:03ab7f7596e2 188 while (true) {
masterkookus 3:ac1f2af8bd0f 189
masterkookus 3:ac1f2af8bd0f 190 polltick=getTick();
masterkookus 3:ac1f2af8bd0f 191 //polltime=getTime();
masterkookus 3:ac1f2af8bd0f 192
masterkookus 3:ac1f2af8bd0f 193 if (polltick)
masterkookus 3:ac1f2af8bd0f 194 {
masterkookus 3:ac1f2af8bd0f 195 setTick(false);
masterkookus 3:ac1f2af8bd0f 196 incTime();
masterkookus 3:ac1f2af8bd0f 197 currenttime=getTime();
masterkookus 3:ac1f2af8bd0f 198 }
masterkookus 3:ac1f2af8bd0f 199
masterkookus 1:a57cbebba3fd 200 if (net1.isactive)
masterkookus 0:03ab7f7596e2 201 {
masterkookus 0:03ab7f7596e2 202 if (net1.closeconnection==true)
masterkookus 0:03ab7f7596e2 203 {
masterkookus 0:03ab7f7596e2 204 net1.clt_sock.send("Connection Timeout", strlen("Connection Timeout"));
masterkookus 0:03ab7f7596e2 205 net1.isactive=false;
masterkookus 0:03ab7f7596e2 206 net1.clt_sock.close();
masterkookus 0:03ab7f7596e2 207 net1.closeconnection=false;
masterkookus 0:03ab7f7596e2 208 }
masterkookus 0:03ab7f7596e2 209
masterkookus 0:03ab7f7596e2 210 }
masterkookus 3:ac1f2af8bd0f 211 //if (polltick)
masterkookus 3:ac1f2af8bd0f 212 if (polltime==currenttime)
masterkookus 1:a57cbebba3fd 213 {
masterkookus 3:ac1f2af8bd0f 214 //polltick=false;
masterkookus 3:ac1f2af8bd0f 215 polltime=getTime()+polltimeout;
masterkookus 1:a57cbebba3fd 216 printf("Enter_Tick\r\n");
masterkookus 1:a57cbebba3fd 217 ret = nets.clt_sock.open(&eth);
masterkookus 1:a57cbebba3fd 218 printf("Socket%d\r\n",ret);
masterkookus 2:ec972966689e 219 //nets.clt_sock.set_blocking(true);
masterkookus 2:ec972966689e 220 //nets.clt_sock.set_timeout(10);
masterkookus 1:a57cbebba3fd 221 ret = nets.clt_sock.connect("10.150.1.245",23000);
masterkookus 1:a57cbebba3fd 222 printf("Connected %d\r\n",ret);
masterkookus 1:a57cbebba3fd 223 ret = nets.clt_sock.send("Tick",strlen("Tick"));
masterkookus 1:a57cbebba3fd 224 printf("Send Result %d\r\n",ret);
masterkookus 1:a57cbebba3fd 225 nets.clt_sock.close();
masterkookus 1:a57cbebba3fd 226 }
masterkookus 0:03ab7f7596e2 227 }
masterkookus 0:03ab7f7596e2 228 }