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:
Wed Sep 11 11:40:34 2019 +0000
Revision:
0:03ab7f7596e2
Child:
1:a57cbebba3fd
Telnet Initiate and Basic Webpage

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 0:03ab7f7596e2 10
masterkookus 0:03ab7f7596e2 11 #define HTTP_STATUS_LINE "HTTP/1.0 200 OK"
masterkookus 0:03ab7f7596e2 12 #define HTTP_HEADER_FIELDS "Content-Type: text/html; charset=utf-8"
masterkookus 0:03ab7f7596e2 13 #define HTTP_MESSAGE_BODY "" \
masterkookus 0:03ab7f7596e2 14 "<html>" "\r\n" \
masterkookus 0:03ab7f7596e2 15 " <body style=\"display:flex;text-align:center\">" "\r\n" \
masterkookus 0:03ab7f7596e2 16 " <div style=\"margin:auto\">" "\r\n" \
masterkookus 0:03ab7f7596e2 17 " <h1>Hello World</h1>" "\r\n" \
masterkookus 0:03ab7f7596e2 18 " <p>It works !</p>" "\r\n" \
masterkookus 0:03ab7f7596e2 19 " </div>" "\r\n" \
masterkookus 0:03ab7f7596e2 20 " </body>" "\r\n" \
masterkookus 0:03ab7f7596e2 21 "</html>"
masterkookus 0:03ab7f7596e2 22
masterkookus 0:03ab7f7596e2 23 #define HTTP_RESPONSE HTTP_STATUS_LINE "\r\n" \
masterkookus 0:03ab7f7596e2 24 HTTP_HEADER_FIELDS "\r\n" \
masterkookus 0:03ab7f7596e2 25 "\r\n" \
masterkookus 0:03ab7f7596e2 26 HTTP_MESSAGE_BODY "\r\n"
masterkookus 0:03ab7f7596e2 27
masterkookus 0:03ab7f7596e2 28 static const char* mbedIp = "10.150.1.241"; //IP
masterkookus 0:03ab7f7596e2 29 static const char* mbedMask = "255.255.255.0"; // Mask
masterkookus 0:03ab7f7596e2 30 static const char* mbedGateway = "10.150.1.245"; //Gateway
masterkookus 0:03ab7f7596e2 31
masterkookus 0:03ab7f7596e2 32 Ticker nettimer[2];
masterkookus 0:03ab7f7596e2 33
masterkookus 0:03ab7f7596e2 34 struct netsys
masterkookus 0:03ab7f7596e2 35 {
masterkookus 0:03ab7f7596e2 36 TCPServer srv;
masterkookus 0:03ab7f7596e2 37 TCPSocket clt_sock;
masterkookus 0:03ab7f7596e2 38 SocketAddress clt_addr;
masterkookus 0:03ab7f7596e2 39 int tcpport;
masterkookus 0:03ab7f7596e2 40 bool isactive;
masterkookus 0:03ab7f7596e2 41 bool closeconnection;
masterkookus 0:03ab7f7596e2 42 int sockalivetime;
masterkookus 0:03ab7f7596e2 43 } net1,http1;
masterkookus 0:03ab7f7596e2 44
masterkookus 0:03ab7f7596e2 45 BufferedSerial sport0(PD_5, PD_6, 256, 4); // UART2
masterkookus 0:03ab7f7596e2 46
masterkookus 0:03ab7f7596e2 47 Thread conchkthread[2];
masterkookus 0:03ab7f7596e2 48 Thread rxtxdatathread[2];
masterkookus 0:03ab7f7596e2 49
masterkookus 0:03ab7f7596e2 50 void nettimeout(netsys *net2)
masterkookus 0:03ab7f7596e2 51 {
masterkookus 0:03ab7f7596e2 52 if (net2->isactive==true)
masterkookus 0:03ab7f7596e2 53 {
masterkookus 0:03ab7f7596e2 54 if (net2->sockalivetime==30)
masterkookus 0:03ab7f7596e2 55 {
masterkookus 0:03ab7f7596e2 56 net2->closeconnection=true;
masterkookus 0:03ab7f7596e2 57 net2->sockalivetime=0;
masterkookus 0:03ab7f7596e2 58 }
masterkookus 0:03ab7f7596e2 59 else
masterkookus 0:03ab7f7596e2 60 {
masterkookus 0:03ab7f7596e2 61 net2->sockalivetime++;
masterkookus 0:03ab7f7596e2 62 }
masterkookus 0:03ab7f7596e2 63 }
masterkookus 0:03ab7f7596e2 64 }
masterkookus 0:03ab7f7596e2 65
masterkookus 0:03ab7f7596e2 66 void datanrx(netsys *net2)
masterkookus 0:03ab7f7596e2 67 {
masterkookus 0:03ab7f7596e2 68 char rxbuf[256];
masterkookus 0:03ab7f7596e2 69 int rxlen=0;
masterkookus 0:03ab7f7596e2 70 while (1)
masterkookus 0:03ab7f7596e2 71 {
masterkookus 0:03ab7f7596e2 72 while (net2->isactive)
masterkookus 0:03ab7f7596e2 73 {
masterkookus 0:03ab7f7596e2 74 rxlen=net2->clt_sock.recv(rxbuf, sizeof(rxbuf));
masterkookus 0:03ab7f7596e2 75 net2->sockalivetime=0;
masterkookus 0:03ab7f7596e2 76 sport0.write(rxbuf,rxlen);
masterkookus 0:03ab7f7596e2 77 }
masterkookus 0:03ab7f7596e2 78 }
masterkookus 0:03ab7f7596e2 79 }
masterkookus 0:03ab7f7596e2 80
masterkookus 0:03ab7f7596e2 81 void datasrx(netsys *net2)
masterkookus 0:03ab7f7596e2 82 {
masterkookus 0:03ab7f7596e2 83 char rxbuf[256];
masterkookus 0:03ab7f7596e2 84 int rxlen=0;
masterkookus 0:03ab7f7596e2 85 int rxc;
masterkookus 0:03ab7f7596e2 86 while (1)
masterkookus 0:03ab7f7596e2 87 {
masterkookus 0:03ab7f7596e2 88 while (net2->isactive)
masterkookus 0:03ab7f7596e2 89 {
masterkookus 0:03ab7f7596e2 90 rxlen=sport0.readable();
masterkookus 0:03ab7f7596e2 91 if (rxlen>0)
masterkookus 0:03ab7f7596e2 92 {
masterkookus 0:03ab7f7596e2 93 for (rxc = 0;rxc<rxlen;rxc++)
masterkookus 0:03ab7f7596e2 94 {
masterkookus 0:03ab7f7596e2 95 rxbuf[rxc] = sport0.getc();
masterkookus 0:03ab7f7596e2 96 }
masterkookus 0:03ab7f7596e2 97 net2->sockalivetime=0;
masterkookus 0:03ab7f7596e2 98 net2->clt_sock.send(rxbuf, rxlen);
masterkookus 0:03ab7f7596e2 99 }
masterkookus 0:03ab7f7596e2 100 }
masterkookus 0:03ab7f7596e2 101 }
masterkookus 0:03ab7f7596e2 102 }
masterkookus 0:03ab7f7596e2 103
masterkookus 0:03ab7f7596e2 104 void conchk(netsys *net2)
masterkookus 0:03ab7f7596e2 105 {
masterkookus 0:03ab7f7596e2 106 TCPServer *server=&(net2->srv);
masterkookus 0:03ab7f7596e2 107 TCPSocket *client_socket=&(net2->clt_sock);
masterkookus 0:03ab7f7596e2 108 SocketAddress *client_address=&(net2->clt_addr);
masterkookus 0:03ab7f7596e2 109
masterkookus 0:03ab7f7596e2 110 while(1)
masterkookus 0:03ab7f7596e2 111 {
masterkookus 0:03ab7f7596e2 112 if (server->accept(client_socket, client_address) < 0)
masterkookus 0:03ab7f7596e2 113 {
masterkookus 0:03ab7f7596e2 114 printf("Connection Failed.\r\n");
masterkookus 0:03ab7f7596e2 115 return;
masterkookus 0:03ab7f7596e2 116 }
masterkookus 0:03ab7f7596e2 117 printf("Server Port %d\r\n", net2->tcpport);
masterkookus 0:03ab7f7596e2 118 if (net2->tcpport==80)
masterkookus 0:03ab7f7596e2 119 {
masterkookus 0:03ab7f7596e2 120 printf("accept %s:%d\r\n", client_address->get_ip_address(), client_address->get_port());
masterkookus 0:03ab7f7596e2 121 client_socket->send(HTTP_RESPONSE, strlen(HTTP_RESPONSE));
masterkookus 0:03ab7f7596e2 122 client_socket->close();
masterkookus 0:03ab7f7596e2 123 }
masterkookus 0:03ab7f7596e2 124 else
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 net2->isactive=true;
masterkookus 0:03ab7f7596e2 128 client_socket->send("Hello", strlen("Hello"));
masterkookus 0:03ab7f7596e2 129 }
masterkookus 0:03ab7f7596e2 130 }
masterkookus 0:03ab7f7596e2 131 }
masterkookus 0:03ab7f7596e2 132
masterkookus 0:03ab7f7596e2 133 int main()
masterkookus 0:03ab7f7596e2 134 {
masterkookus 0:03ab7f7596e2 135 printf("Basic HTTP server example\r\n");
masterkookus 0:03ab7f7596e2 136
masterkookus 0:03ab7f7596e2 137 EthernetInterface eth;
masterkookus 0:03ab7f7596e2 138 eth.set_network(mbedIp,mbedMask,mbedGateway); //Use these parameters for static IP
masterkookus 0:03ab7f7596e2 139 eth.connect();
masterkookus 0:03ab7f7596e2 140
masterkookus 0:03ab7f7596e2 141 printf("The target IP address is '%s'\r\n", eth.get_ip_address());
masterkookus 0:03ab7f7596e2 142
masterkookus 0:03ab7f7596e2 143 /* Open the server on ethernet stack */
masterkookus 0:03ab7f7596e2 144 net1.srv.open(&eth);
masterkookus 0:03ab7f7596e2 145 net1.isactive=false;
masterkookus 0:03ab7f7596e2 146 net1.closeconnection=false;
masterkookus 0:03ab7f7596e2 147 http1.srv.open(&eth);
masterkookus 0:03ab7f7596e2 148
masterkookus 0:03ab7f7596e2 149 /* Bind the HTTP port (TCP 80) to the server */
masterkookus 0:03ab7f7596e2 150 http1.tcpport=80;
masterkookus 0:03ab7f7596e2 151 http1.srv.bind(http1.tcpport);
masterkookus 0:03ab7f7596e2 152
masterkookus 0:03ab7f7596e2 153 /* Bind port 23000 to the server */
masterkookus 0:03ab7f7596e2 154 net1.tcpport=23;
masterkookus 0:03ab7f7596e2 155 net1.srv.bind(net1.tcpport);
masterkookus 0:03ab7f7596e2 156
masterkookus 0:03ab7f7596e2 157 /* Can handle 5 simultaneous connections */
masterkookus 0:03ab7f7596e2 158 net1.srv.listen(1);
masterkookus 0:03ab7f7596e2 159 http1.srv.listen(5);
masterkookus 0:03ab7f7596e2 160
masterkookus 0:03ab7f7596e2 161 sport0.baud(9600);
masterkookus 0:03ab7f7596e2 162
masterkookus 0:03ab7f7596e2 163 conchkthread[0].start(callback(conchk,&net1));
masterkookus 0:03ab7f7596e2 164 nettimer[0].attach(callback(nettimeout,&net1),1);
masterkookus 0:03ab7f7596e2 165 rxtxdatathread[0].start(callback(datanrx,&net1));
masterkookus 0:03ab7f7596e2 166 rxtxdatathread[1].start(callback(datasrx,&net1));
masterkookus 0:03ab7f7596e2 167
masterkookus 0:03ab7f7596e2 168 conchkthread[1].start(callback(conchk,&http1));
masterkookus 0:03ab7f7596e2 169
masterkookus 0:03ab7f7596e2 170 while (true) {
masterkookus 0:03ab7f7596e2 171 while (net1.isactive)
masterkookus 0:03ab7f7596e2 172 {
masterkookus 0:03ab7f7596e2 173 if (net1.closeconnection==true)
masterkookus 0:03ab7f7596e2 174 {
masterkookus 0:03ab7f7596e2 175 net1.clt_sock.send("Connection Timeout", strlen("Connection Timeout"));
masterkookus 0:03ab7f7596e2 176 net1.isactive=false;
masterkookus 0:03ab7f7596e2 177 net1.clt_sock.close();
masterkookus 0:03ab7f7596e2 178 net1.closeconnection=false;
masterkookus 0:03ab7f7596e2 179 }
masterkookus 0:03ab7f7596e2 180
masterkookus 0:03ab7f7596e2 181 }
masterkookus 0:03ab7f7596e2 182 }
masterkookus 0:03ab7f7596e2 183 }