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
main.cpp@3:ac1f2af8bd0f, 2019-09-16 (annotated)
- 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?
User | Revision | Line number | New 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(ð); |
masterkookus | 0:03ab7f7596e2 | 154 | net1.isactive=false; |
masterkookus | 0:03ab7f7596e2 | 155 | net1.closeconnection=false; |
masterkookus | 0:03ab7f7596e2 | 156 | http1.srv.open(ð); |
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(ð); |
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 | } |