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@4:98cdccfb17d6, 2019-09-17 (annotated)
- 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?
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 | 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(ð); |
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(ð); |
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 | } |