Webserver only w/o any other functions, single thread. Running on STM32F013+W5500

Dependencies:   NTPClient W5500Interface Watchdog device_configuration eeprom_flash mbed-rpc-nucleo mbed-rtos mbed

Fork of F103-Serial-to-Ethernet by Chau Vo

Committer:
olympux
Date:
Sun Sep 28 17:35:54 2014 +0000
Revision:
12:7c152c0ca4d8
Parent:
11:709f90a3b599
Child:
13:bcf840da68fd
Added eeprom variables and functions for TCP server info when the device is in TCP client mode

Who changed what in which revision?

UserRevisionLine numberNew contents of line
olympux 0:c2eac797face 1 /*
olympux 0:c2eac797face 2 *
olympux 2:18f10e7209f4 3 * Alarm and Monitoring application
olympux 0:c2eac797face 4
olympux 0:c2eac797face 5 */
olympux 0:c2eac797face 6 #include "mbed.h"
olympux 12:7c152c0ca4d8 7 #include "eeprom.h"
olympux 0:c2eac797face 8 #include "EthernetInterface.h"
olympux 9:d2534ecf88c6 9 #include "NTPClient.h"
olympux 0:c2eac797face 10 #include "rtos.h"
olympux 0:c2eac797face 11
olympux 12:7c152c0ca4d8 12 #include "my_eeprom_funcs.h"
olympux 12:7c152c0ca4d8 13
olympux 0:c2eac797face 14
olympux 2:18f10e7209f4 15 /*
olympux 2:18f10e7209f4 16 * Hardware defines
olympux 0:c2eac797face 17 */
olympux 2:18f10e7209f4 18 #define ST_NUCLEO // hardware pin mapping
olympux 0:c2eac797face 19
olympux 0:c2eac797face 20 #ifdef ST_NUCLEO
olympux 9:d2534ecf88c6 21 // Ethernet
olympux 0:c2eac797face 22 SPI spi(PA_7, PA_6, PA_5); // mosi, miso, sclk
olympux 11:709f90a3b599 23 EthernetInterface eth(&spi, PA_4, PC_9); // spi, cs, reset
olympux 0:c2eac797face 24 #endif
olympux 0:c2eac797face 25
olympux 9:d2534ecf88c6 26 // Serial
olympux 2:18f10e7209f4 27 Serial uart(USBTX,USBRX);
olympux 2:18f10e7209f4 28
olympux 9:d2534ecf88c6 29 // Digital inputs
olympux 11:709f90a3b599 30 DigitalIn din0(PB_14);
olympux 11:709f90a3b599 31 DigitalIn din1(PB_12);
olympux 11:709f90a3b599 32 DigitalIn din2(PB_10);
olympux 11:709f90a3b599 33 DigitalIn din3(PB_1);
olympux 11:709f90a3b599 34 DigitalIn din4(PB_15);
olympux 11:709f90a3b599 35 DigitalIn din5(PB_13);
olympux 11:709f90a3b599 36 DigitalIn din6(PB_11);
olympux 11:709f90a3b599 37 DigitalIn din7(PB_2);
olympux 9:d2534ecf88c6 38 // Digital outputs
olympux 11:709f90a3b599 39 DigitalOut dout0(PB_3);
olympux 11:709f90a3b599 40 DigitalOut dout1(PB_5);
olympux 11:709f90a3b599 41 DigitalOut dout2(PB_7);
olympux 11:709f90a3b599 42 DigitalOut dout3(PB_9);
olympux 11:709f90a3b599 43 DigitalOut dout4(PD_2);
olympux 11:709f90a3b599 44 DigitalOut dout5(PB_4);
olympux 11:709f90a3b599 45 DigitalOut dout6(PB_6);
olympux 11:709f90a3b599 46 DigitalOut dout7(PB_8);
olympux 9:d2534ecf88c6 47 // Analog inputs
olympux 11:709f90a3b599 48 AnalogIn ain0(PC_0);
olympux 11:709f90a3b599 49 AnalogIn ain1(PC_1);
olympux 9:d2534ecf88c6 50 // Analog outputs
olympux 11:709f90a3b599 51 //AnalogOut ano0(PA_8);
olympux 11:709f90a3b599 52 //AnalogOut ano1(PA_15);
olympux 11:709f90a3b599 53
olympux 12:7c152c0ca4d8 54 void update_digital_outputs(char* buf);
olympux 12:7c152c0ca4d8 55 void update_sending_frame(char* buf);
olympux 11:709f90a3b599 56
olympux 9:d2534ecf88c6 57
olympux 9:d2534ecf88c6 58
olympux 12:7c152c0ca4d8 59 // EEPROM: device network configuration
olympux 12:7c152c0ca4d8 60 //#define NumbOfVar ((uint8_t)0x80) // REMEMBER: update this variable in eeprom.h too
olympux 6:d054e394fba3 61 // Virtual address defined by the user: 0xFFFF value is prohibited
olympux 6:d054e394fba3 62 uint16_t VirtAddVarTab[NumbOfVar] = {0x1212, 0x1313, 0x1414, 0x1515, // IP_Addr
olympux 6:d054e394fba3 63 0x2212, 0x2313, 0x2414, 0x2515, // IP_Subnet
olympux 6:d054e394fba3 64 0x3212, 0x3313, 0x3414, 0x3515, // IP_Gateway
olympux 6:d054e394fba3 65 0x4212, // TCP server port, not used
olympux 8:64848959adb9 66 0x5212, // UDP server port, not used
olympux 12:7c152c0ca4d8 67 0x8888, // 1st run?
olympux 12:7c152c0ca4d8 68 0x6212, 0x6313, 0x6414, // MAC
olympux 12:7c152c0ca4d8 69
olympux 12:7c152c0ca4d8 70 // this section is for the TCP server that this device connects to in TCP client mode
olympux 12:7c152c0ca4d8 71 0x7212, 0x7313, // auto transmit status, time period
olympux 12:7c152c0ca4d8 72 0x8212, 0x8313,0x8414, 0x8515, // TCP server IP address
olympux 12:7c152c0ca4d8 73 0x9212 // TCP server port
olympux 6:d054e394fba3 74 };
olympux 0:c2eac797face 75
olympux 2:18f10e7209f4 76 /*
olympux 2:18f10e7209f4 77 * Network configuration
olympux 2:18f10e7209f4 78 */
olympux 4:568c97f2a407 79 #define TCP_SERVER
olympux 4:568c97f2a407 80 //#define TCP_CLIENT
olympux 4:568c97f2a407 81 #define UDP_SERVER
olympux 4:568c97f2a407 82 //#define UDP_CLIENT
olympux 10:4cd965d79de0 83 #define NTP
olympux 4:568c97f2a407 84
olympux 4:568c97f2a407 85 #define TCP_SERVER_WAIT_CLIENT_TIMEOUT 200
olympux 4:568c97f2a407 86 #define TCP_SERVER_RECEIVE_TIMEOUT 3000
olympux 4:568c97f2a407 87 #define UDP_SERVER_RECEIVE_TIMEOUT 200
olympux 4:568c97f2a407 88
olympux 0:c2eac797face 89 // for static IP setting
olympux 11:709f90a3b599 90 uint8_t u8mac[6], u8ip_addr[4];// keep mac and ip address in 8-bits
olympux 12:7c152c0ca4d8 91 char * IP_Addr; // pointers to str_ip_xxx[16]
olympux 7:d45bd480e90f 92 char * IP_Subnet;
olympux 7:d45bd480e90f 93 char * IP_Gateway;
olympux 6:d054e394fba3 94
olympux 11:709f90a3b599 95 uint16_t u16mac_addr[3], u16ip_addr[4], u16ip_subnet[4], u16ip_gateway[4]; // 16-bits, directly loaded from eeprom
olympux 11:709f90a3b599 96 char str_ip_addr[16], str_ip_subnet[16], str_ip_gateway[16]; // for printf, converted from 16-bits u16ip_xxx
olympux 9:d2534ecf88c6 97 uint16_t first_run = 0; // first run flag
olympux 9:d2534ecf88c6 98
olympux 12:7c152c0ca4d8 99 const uint16_t tcp_server_local_port = 10000; // fixed
olympux 12:7c152c0ca4d8 100 const uint16_t udp_server_local_port = 11000; // fixed
olympux 12:7c152c0ca4d8 101
olympux 12:7c152c0ca4d8 102 // TCP client: this section is used for the TCP server that this device connects to in TCP client mode
olympux 12:7c152c0ca4d8 103 // this device will transmit status every transmit_time_period
olympux 12:7c152c0ca4d8 104 uint16_t auto_transmit_flag = 0, transmit_time_period = 1000; // auto transmit status, time period = 1s
olympux 12:7c152c0ca4d8 105 uint16_t u16server_ip_addr[4]; // directly loaded from eeprom
olympux 12:7c152c0ca4d8 106 uint16_t u16tcp_server_port; // directly loaded from eeprom
olympux 12:7c152c0ca4d8 107 uint8_t u8server_ip_addr[4]; // server ip address in 8-bits
olympux 12:7c152c0ca4d8 108 char * server_ip_addr; // pointer to str_server_ip_addr
olympux 12:7c152c0ca4d8 109 char str_server_ip_addr[16];// for printf, converted from 16-bits u16server_ip_addr
olympux 12:7c152c0ca4d8 110
olympux 12:7c152c0ca4d8 111 extern void load_eeprom_network(void);
olympux 12:7c152c0ca4d8 112
olympux 0:c2eac797face 113
olympux 3:972ed747474c 114 char buffer[256]; // socket buffer
olympux 3:972ed747474c 115
olympux 9:d2534ecf88c6 116 NTPClient ntp;
olympux 9:d2534ecf88c6 117
olympux 9:d2534ecf88c6 118 // Commands
olympux 9:d2534ecf88c6 119 #define DEVICE_ID "NNIO"
olympux 9:d2534ecf88c6 120 #define DISCOVERY_COMMAND "NNIODS"
olympux 9:d2534ecf88c6 121 #define TCP_SERVER_PORT_COMAMND "NNIOTP"
olympux 9:d2534ecf88c6 122 #define UDP_SERVER_PORT_COMAMND "NNIOUP"
olympux 11:709f90a3b599 123 #define RECEIVING_PROTOCOL_ENABLE_OUTPUT 'O'
olympux 11:709f90a3b599 124 #define QUERY_STATUS_COMMAND 'Q'
olympux 11:709f90a3b599 125 #define DIGITAL_HIGH 'H'
olympux 11:709f90a3b599 126 #define DIGITAL_LOW 'L'
olympux 9:d2534ecf88c6 127
olympux 9:d2534ecf88c6 128
olympux 9:d2534ecf88c6 129 // Positions
olympux 11:709f90a3b599 130 #define RECEIVING_PROTOCOL_LENGTH 58
olympux 11:709f90a3b599 131 #define RECEIVING_PROTOCOL_ID_POS 0
olympux 9:d2534ecf88c6 132 #define RECEIVING_PROTOCOL_OP_POS 4
olympux 9:d2534ecf88c6 133 #define RECEIVING_PROTOCOL_EN_DO_POS RECEIVING_PROTOCOL_OP_POS + 0
olympux 9:d2534ecf88c6 134 #define RECEIVING_PROTOCOL_EN_A0O_POS RECEIVING_PROTOCOL_OP_POS + 1
olympux 9:d2534ecf88c6 135 #define RECEIVING_PROTOCOL_EN_A1O_POS RECEIVING_PROTOCOL_OP_POS + 2
olympux 9:d2534ecf88c6 136 #define RECEIVING_PROTOCOL_EN_UART_POS RECEIVING_PROTOCOL_OP_POS + 3
olympux 9:d2534ecf88c6 137 #define RECEIVING_PROTOCOL_COMMAND_POS RECEIVING_PROTOCOL_OP_POS + 4
olympux 11:709f90a3b599 138
olympux 11:709f90a3b599 139 #define RECEIVING_PROTOCOL_IP_POS 9
olympux 11:709f90a3b599 140 #define RECEIVING_PROTOCOL_DO_POS 13
olympux 11:709f90a3b599 141 #define RECEIVING_PROTOCOL_A0O_POS 21
olympux 11:709f90a3b599 142 #define RECEIVING_PROTOCOL_A01_POS 23
olympux 11:709f90a3b599 143 #define RECEIVING_PROTOCOL_UART_POS 25
olympux 9:d2534ecf88c6 144
olympux 9:d2534ecf88c6 145
olympux 11:709f90a3b599 146 #define SENDING_PROTOCOL_LENGTH 39
olympux 11:709f90a3b599 147 #define SENDING_PROTOCOL_ID_POS 0
olympux 11:709f90a3b599 148 #define SENDING_PROTOCOL_MAC_POS 4
olympux 11:709f90a3b599 149 #define SENDING_PROTOCOL_IP_POS 10
olympux 11:709f90a3b599 150 #define SENDING_PROTOCOL_DI_POS 14
olympux 11:709f90a3b599 151 #define SENDING_PROTOCOL_DO_POS 22
olympux 11:709f90a3b599 152 #define SENDING_PROTOCOL_AI0_POS 30
olympux 11:709f90a3b599 153 #define SENDING_PROTOCOL_AI1_POS 32
olympux 11:709f90a3b599 154 #define SENDING_PROTOCOL_AO0_POS 34
olympux 11:709f90a3b599 155 #define SENDING_PROTOCOL_AO1_POS 36
olympux 11:709f90a3b599 156 #define SENDING_PROTOCOL_CR_POS 38
olympux 0:c2eac797face 157
olympux 2:18f10e7209f4 158
olympux 2:18f10e7209f4 159 /*
olympux 2:18f10e7209f4 160 * RTOS
olympux 2:18f10e7209f4 161 */
olympux 2:18f10e7209f4 162 struct message_t {
olympux 2:18f10e7209f4 163 int len;
olympux 2:18f10e7209f4 164 char *msg;
olympux 2:18f10e7209f4 165 };
olympux 3:972ed747474c 166 Queue<message_t, 16> uart_queue;
olympux 2:18f10e7209f4 167
olympux 3:972ed747474c 168 Mutex uart_mutex;
olympux 2:18f10e7209f4 169
olympux 2:18f10e7209f4 170
olympux 2:18f10e7209f4 171 /*
olympux 2:18f10e7209f4 172 * Threads
olympux 2:18f10e7209f4 173 */
olympux 0:c2eac797face 174 void uart_thread(void const *args) {
olympux 2:18f10e7209f4 175 message_t *p_message;
olympux 0:c2eac797face 176
olympux 0:c2eac797face 177 while (true) {
olympux 3:972ed747474c 178 osEvent evt = uart_queue.get();
olympux 2:18f10e7209f4 179 if (evt.status == osEventMessage) {
olympux 2:18f10e7209f4 180 p_message = (message_t*)evt.value.p;
olympux 11:709f90a3b599 181 uart_mutex.lock(); // mutex for stdio is not neccessary
olympux 3:972ed747474c 182 //uart.printf("len=%d\n", p_message->len);
olympux 3:972ed747474c 183 uart.printf("%s\n", p_message->msg);
olympux 3:972ed747474c 184 uart_mutex.unlock();
olympux 2:18f10e7209f4 185 }
olympux 0:c2eac797face 186 }
olympux 0:c2eac797face 187 }
olympux 0:c2eac797face 188
olympux 0:c2eac797face 189
olympux 6:d054e394fba3 190 /*
olympux 6:d054e394fba3 191 * Ethernet init
olympux 6:d054e394fba3 192 */
olympux 4:568c97f2a407 193 int ethernet_init(void) {
olympux 11:709f90a3b599 194 printf("Start initialising ethernet\n");
olympux 11:709f90a3b599 195 int ret = eth.init(u8mac, IP_Addr, IP_Subnet, IP_Gateway); // static
olympux 0:c2eac797face 196
olympux 0:c2eac797face 197 if (!ret) {
olympux 11:709f90a3b599 198 printf("Initialized, MAC: %s\n", eth.getMACAddress());
olympux 0:c2eac797face 199 } else {
olympux 11:709f90a3b599 200 printf("Error eth.init() - ret = %d\n", ret);
olympux 0:c2eac797face 201 return -1;
olympux 0:c2eac797face 202 }
olympux 0:c2eac797face 203
olympux 0:c2eac797face 204 ret = eth.connect();
olympux 0:c2eac797face 205 if (!ret) {
olympux 11:709f90a3b599 206 printf("IP: %s, MASK: %s, GW: %s\n", eth.getIPAddress(), eth.getNetworkMask(), eth.getGateway());
olympux 0:c2eac797face 207 } else {
olympux 11:709f90a3b599 208 printf("Error eth.connect() - ret = %d\n", ret);
olympux 0:c2eac797face 209 return -1;
olympux 0:c2eac797face 210 }
olympux 3:972ed747474c 211
olympux 4:568c97f2a407 212 return 0;
olympux 4:568c97f2a407 213 }
olympux 4:568c97f2a407 214
olympux 4:568c97f2a407 215
olympux 6:d054e394fba3 216
olympux 6:d054e394fba3 217
olympux 4:568c97f2a407 218
olympux 4:568c97f2a407 219 int main()
olympux 4:568c97f2a407 220 {
olympux 4:568c97f2a407 221 message_t message;
olympux 9:d2534ecf88c6 222 int n, ret;
olympux 4:568c97f2a407 223
olympux 4:568c97f2a407 224 /*
olympux 9:d2534ecf88c6 225 * Configure
olympux 4:568c97f2a407 226 */
olympux 11:709f90a3b599 227 uart.baud(115200);
olympux 4:568c97f2a407 228
olympux 4:568c97f2a407 229
olympux 4:568c97f2a407 230 /*
olympux 4:568c97f2a407 231 * UI threads
olympux 4:568c97f2a407 232 */
olympux 4:568c97f2a407 233 Thread t1(uart_thread);
olympux 4:568c97f2a407 234
olympux 6:d054e394fba3 235
olympux 6:d054e394fba3 236 /*
olympux 6:d054e394fba3 237 * FLASH
olympux 6:d054e394fba3 238 */
olympux 12:7c152c0ca4d8 239 load_eeprom_network();
olympux 11:709f90a3b599 240 IP_Addr = str_ip_addr;
olympux 11:709f90a3b599 241 IP_Subnet = str_ip_subnet;
olympux 11:709f90a3b599 242 IP_Gateway = str_ip_gateway;
olympux 6:d054e394fba3 243
olympux 4:568c97f2a407 244
olympux 4:568c97f2a407 245 /*
olympux 4:568c97f2a407 246 * Ethernet
olympux 4:568c97f2a407 247 */
olympux 6:d054e394fba3 248 ret = ethernet_init();
olympux 4:568c97f2a407 249 if (ret) {
olympux 11:709f90a3b599 250 printf("Ethernet initialisation failed. App halted\r\n");
olympux 4:568c97f2a407 251 while (true) {};
olympux 4:568c97f2a407 252 }
olympux 4:568c97f2a407 253
olympux 12:7c152c0ca4d8 254
olympux 12:7c152c0ca4d8 255 /*
olympux 12:7c152c0ca4d8 256 * TCP/UDP setup
olympux 12:7c152c0ca4d8 257 */
olympux 3:972ed747474c 258 #ifdef TCP_SERVER
olympux 3:972ed747474c 259 TCPSocketServer tcp_server;
olympux 3:972ed747474c 260 TCPSocketConnection tcp_client;
olympux 3:972ed747474c 261
olympux 12:7c152c0ca4d8 262 tcp_server.bind(tcp_server_local_port);
olympux 3:972ed747474c 263 tcp_server.listen();
olympux 11:709f90a3b599 264 printf("TCP server started...\r\n");
olympux 4:568c97f2a407 265 tcp_server.set_blocking(false, TCP_SERVER_WAIT_CLIENT_TIMEOUT);
olympux 3:972ed747474c 266 #endif
olympux 3:972ed747474c 267
olympux 3:972ed747474c 268 #ifdef UDP_SERVER
olympux 3:972ed747474c 269 UDPSocket udp_server;
olympux 3:972ed747474c 270 Endpoint ep_udp_client;
olympux 3:972ed747474c 271
olympux 12:7c152c0ca4d8 272 ret = udp_server.bind(udp_server_local_port);
olympux 11:709f90a3b599 273 printf("UDP started (sock.bind = %d)\r\n", ret);
olympux 4:568c97f2a407 274 udp_server.set_blocking(false, UDP_SERVER_RECEIVE_TIMEOUT);
olympux 3:972ed747474c 275 #endif
olympux 3:972ed747474c 276
olympux 3:972ed747474c 277
olympux 12:7c152c0ca4d8 278 /*
olympux 12:7c152c0ca4d8 279 * Network processor
olympux 12:7c152c0ca4d8 280 */
olympux 0:c2eac797face 281 while (true) {
olympux 9:d2534ecf88c6 282 // FOR INTERFACING
olympux 4:568c97f2a407 283 #ifdef TCP_SERVER
olympux 4:568c97f2a407 284 // no tcp client connected
olympux 4:568c97f2a407 285 if (!tcp_client.is_connected())
olympux 4:568c97f2a407 286 {
olympux 4:568c97f2a407 287 // wait for client within timeout
olympux 4:568c97f2a407 288 ret = tcp_server.accept(tcp_client);
olympux 2:18f10e7209f4 289
olympux 4:568c97f2a407 290 // tcp client connected
olympux 4:568c97f2a407 291 if (ret > -1) {
olympux 11:709f90a3b599 292 printf("Connection from: %s\r\n", tcp_client.get_address());
olympux 4:568c97f2a407 293
olympux 4:568c97f2a407 294 // loop waiting and receiving data within timeout
olympux 4:568c97f2a407 295 tcp_client.set_blocking(false, TCP_SERVER_RECEIVE_TIMEOUT); // Timeout after x seconds
olympux 4:568c97f2a407 296 while (true) {
olympux 9:d2534ecf88c6 297 n = tcp_client.receive(buffer, sizeof(buffer));
olympux 4:568c97f2a407 298 if (n <= 0) break;
olympux 4:568c97f2a407 299
olympux 9:d2534ecf88c6 300 // got some data, test it
olympux 11:709f90a3b599 301 printf("TCP server received: %s\r\n", buffer);
olympux 11:709f90a3b599 302
olympux 9:d2534ecf88c6 303 //// send to uart
olympux 9:d2534ecf88c6 304 //buffer[n] = '\0';
olympux 9:d2534ecf88c6 305 //message.len = n;
olympux 9:d2534ecf88c6 306 //message.msg = buffer;
olympux 9:d2534ecf88c6 307 //uart_queue.put(&message);
olympux 9:d2534ecf88c6 308 //// echo to tcp client
olympux 9:d2534ecf88c6 309 //tcp_client.send_all(buffer, n);
olympux 9:d2534ecf88c6 310 //if (n <= 0) break;
olympux 4:568c97f2a407 311
olympux 9:d2534ecf88c6 312 // process received data
olympux 9:d2534ecf88c6 313 switch (n) {
olympux 9:d2534ecf88c6 314 // length 58-bytes, Receiving protocol
olympux 11:709f90a3b599 315 case RECEIVING_PROTOCOL_LENGTH: {
olympux 11:709f90a3b599 316 printf("Checking device ID...");
olympux 9:d2534ecf88c6 317 // check device id
olympux 9:d2534ecf88c6 318 char* id = strstr(buffer, DEVICE_ID);
olympux 9:d2534ecf88c6 319 if (id == NULL)
olympux 9:d2534ecf88c6 320 break;
olympux 9:d2534ecf88c6 321 else if ((id - buffer) > 0)
olympux 9:d2534ecf88c6 322 break;
olympux 11:709f90a3b599 323 printf("Correct.\r\n");
olympux 9:d2534ecf88c6 324
olympux 9:d2534ecf88c6 325 // firstly, update outputs if required
olympux 9:d2534ecf88c6 326 // digital outputs
olympux 11:709f90a3b599 327 if (buffer[RECEIVING_PROTOCOL_EN_DO_POS] == RECEIVING_PROTOCOL_ENABLE_OUTPUT) {
olympux 11:709f90a3b599 328 printf("Update digital outputs\r\n");
olympux 12:7c152c0ca4d8 329 char str_dout[9];
olympux 12:7c152c0ca4d8 330 memcpy(str_dout, &buffer[RECEIVING_PROTOCOL_DO_POS], 8);
olympux 12:7c152c0ca4d8 331 str_dout[8] = '\0';
olympux 12:7c152c0ca4d8 332 update_digital_outputs(str_dout);
olympux 9:d2534ecf88c6 333 }
olympux 9:d2534ecf88c6 334 // analog output 0
olympux 11:709f90a3b599 335 if (buffer[RECEIVING_PROTOCOL_EN_A0O_POS] == RECEIVING_PROTOCOL_ENABLE_OUTPUT) {
olympux 11:709f90a3b599 336 printf("Update analog output 0\r\n");
olympux 9:d2534ecf88c6 337 }
olympux 11:709f90a3b599 338 // analog output 1
olympux 11:709f90a3b599 339 if (buffer[RECEIVING_PROTOCOL_EN_A1O_POS] == RECEIVING_PROTOCOL_ENABLE_OUTPUT) {
olympux 11:709f90a3b599 340 printf("Update analog output 1\r\n");
olympux 9:d2534ecf88c6 341 }
olympux 9:d2534ecf88c6 342 // UART
olympux 11:709f90a3b599 343 if (buffer[RECEIVING_PROTOCOL_EN_UART_POS] == RECEIVING_PROTOCOL_ENABLE_OUTPUT) {
olympux 11:709f90a3b599 344 printf("UART data: ");
olympux 11:709f90a3b599 345 char str_uart[33];
olympux 11:709f90a3b599 346 memcpy(str_uart, &buffer[RECEIVING_PROTOCOL_UART_POS], 32);
olympux 11:709f90a3b599 347 str_uart[32] = '\0';
olympux 11:709f90a3b599 348 printf("%s\r\n", str_uart);
olympux 9:d2534ecf88c6 349 }
olympux 9:d2534ecf88c6 350
olympux 9:d2534ecf88c6 351 // then, check query status command and sending protocol if required
olympux 11:709f90a3b599 352 if (buffer[RECEIVING_PROTOCOL_COMMAND_POS] == QUERY_STATUS_COMMAND) {
olympux 11:709f90a3b599 353 printf("Sent device status through TCP\r\n");
olympux 9:d2534ecf88c6 354 // sending protocol
olympux 12:7c152c0ca4d8 355 update_sending_frame(buffer);
olympux 11:709f90a3b599 356 tcp_client.send_all(buffer, SENDING_PROTOCOL_LENGTH);
olympux 9:d2534ecf88c6 357 }
olympux 9:d2534ecf88c6 358
olympux 9:d2534ecf88c6 359 break;
olympux 9:d2534ecf88c6 360 }
olympux 9:d2534ecf88c6 361 default:
olympux 9:d2534ecf88c6 362 break;
olympux 9:d2534ecf88c6 363 }
olympux 9:d2534ecf88c6 364
olympux 4:568c97f2a407 365 } // end loop if no data received within timeout
olympux 4:568c97f2a407 366 tcp_client.close();
olympux 4:568c97f2a407 367 } // if client connected
olympux 4:568c97f2a407 368 } // if no client connected
olympux 3:972ed747474c 369 #endif
olympux 3:972ed747474c 370
olympux 9:d2534ecf88c6 371
olympux 9:d2534ecf88c6 372
olympux 9:d2534ecf88c6 373 // ONLY FOR CONFIGRATION
olympux 9:d2534ecf88c6 374 #ifdef UDP_SERVER
olympux 4:568c97f2a407 375 // wait for udp packet within timeout
olympux 9:d2534ecf88c6 376 n = udp_server.receiveFrom(ep_udp_client, buffer, sizeof(buffer));
olympux 9:d2534ecf88c6 377 if (n <= 0) continue;
olympux 3:972ed747474c 378
olympux 9:d2534ecf88c6 379 // got some data, test it
olympux 11:709f90a3b599 380 printf("UDP received: %s\r\n", buffer);
olympux 11:709f90a3b599 381
olympux 9:d2534ecf88c6 382 //// send to uart
olympux 7:d45bd480e90f 383 //buffer[n] = '\0';
olympux 7:d45bd480e90f 384 //message.len = n;
olympux 7:d45bd480e90f 385 //message.msg = buffer;
olympux 7:d45bd480e90f 386 //uart_queue.put(&message);
olympux 9:d2534ecf88c6 387 //// echo
olympux 11:709f90a3b599 388 //printf("Received packet from: %s\r\n", client.get_address());
olympux 7:d45bd480e90f 389 //udp_server.sendTo(ep_udp_client, buffer, n);
olympux 4:568c97f2a407 390
olympux 6:d054e394fba3 391 // process received data
olympux 6:d054e394fba3 392 switch (n) {
olympux 9:d2534ecf88c6 393 // length = 6, a CONFIGURATION command (discovery command, TCP port, or UDP port)
olympux 9:d2534ecf88c6 394 // Format: NNIODS, NNIOTP or NNIOUP
olympux 9:d2534ecf88c6 395 case 6:
olympux 7:d45bd480e90f 396 // discovery command
olympux 9:d2534ecf88c6 397 if (strstr(buffer, "NNIODS") != NULL) {
olympux 11:709f90a3b599 398 udp_server.sendTo(ep_udp_client, str_ip_addr, strlen(str_ip_addr));
olympux 10:4cd965d79de0 399 } // NNIODS
olympux 7:d45bd480e90f 400 // ask for TCP server port
olympux 9:d2534ecf88c6 401 else if (strstr(buffer, "NNIOTP") != NULL) {
olympux 7:d45bd480e90f 402 char port[5];
olympux 12:7c152c0ca4d8 403 sprintf(port, "%5d", tcp_server_local_port);
olympux 7:d45bd480e90f 404 udp_server.sendTo(ep_udp_client, port, strlen(port));
olympux 10:4cd965d79de0 405 } // NNIOTP
olympux 7:d45bd480e90f 406 // ask for UDP server port
olympux 9:d2534ecf88c6 407 else if (strstr(buffer, "NNIOUP") != NULL) {
olympux 7:d45bd480e90f 408 char port[5];
olympux 12:7c152c0ca4d8 409 sprintf(port, "%5d", udp_server_local_port);
olympux 7:d45bd480e90f 410 udp_server.sendTo(ep_udp_client, port, strlen(port));
olympux 10:4cd965d79de0 411 } // NNIOUP
olympux 10:4cd965d79de0 412 else if (strstr(buffer, "NNIOTM") != NULL) {
olympux 10:4cd965d79de0 413 #ifdef NTP
olympux 10:4cd965d79de0 414 char str_time[50];
olympux 10:4cd965d79de0 415
olympux 11:709f90a3b599 416 printf("Trying to update time...\r\n");
olympux 10:4cd965d79de0 417 if (ntp.setTime("0.pool.ntp.org") == 0) {
olympux 11:709f90a3b599 418 printf("Set time successfully\r\n");
olympux 10:4cd965d79de0 419 time_t ctTime;
olympux 10:4cd965d79de0 420 ctTime = time(NULL);
olympux 10:4cd965d79de0 421
olympux 11:709f90a3b599 422 printf("Time is set to (UTC): %s\r\n", ctime(&ctTime));
olympux 10:4cd965d79de0 423 sprintf(str_time, "%s", ctime(&ctTime));
olympux 10:4cd965d79de0 424 udp_server.sendTo(ep_udp_client, str_time, strlen(str_time));
olympux 10:4cd965d79de0 425 }
olympux 10:4cd965d79de0 426 else {
olympux 11:709f90a3b599 427 printf("Error\r\n");
olympux 10:4cd965d79de0 428 sprintf(str_time, "ERR");
olympux 10:4cd965d79de0 429 udp_server.sendTo(ep_udp_client, str_time, strlen(str_time));
olympux 10:4cd965d79de0 430 }
olympux 10:4cd965d79de0 431 #elif
olympux 11:709f90a3b599 432 printf("NTP disabled\r\n");
olympux 10:4cd965d79de0 433 sprintf(str_time, "DIS");
olympux 10:4cd965d79de0 434 udp_server.sendTo(ep_udp_client, str_time, strlen(str_time));
olympux 10:4cd965d79de0 435 #endif
olympux 10:4cd965d79de0 436 } // NNIOTM
olympux 10:4cd965d79de0 437
olympux 7:d45bd480e90f 438 break;
olympux 9:d2534ecf88c6 439 // length = 19, SET NETWORK CONFIGURATION
olympux 9:d2534ecf88c6 440 // Format: 4E 4E 49 4F C0 A8 00 78 FF FF FF 00 C0 A8 00 01 00 00 01
olympux 9:d2534ecf88c6 441 // (NNIO; IP: 192.168.0.120; Subnet: 255.255.255.0; GW: 192.168.0.1; MAC: 0 0 1)
olympux 9:d2534ecf88c6 442 case 19:{
olympux 9:d2534ecf88c6 443 // check device id
olympux 9:d2534ecf88c6 444 char* id = strstr(buffer, DEVICE_ID);
olympux 9:d2534ecf88c6 445 if (id == NULL)
olympux 9:d2534ecf88c6 446 break;
olympux 9:d2534ecf88c6 447 else if ((id - buffer) > 0)
olympux 9:d2534ecf88c6 448 break;
olympux 9:d2534ecf88c6 449
olympux 11:709f90a3b599 450 printf("Received user configuration\r\n");
olympux 12:7c152c0ca4d8 451 write_eeprom_network(&buffer[4]); // parameters from 3rd char, 15-bytes
olympux 6:d054e394fba3 452 break;
olympux 9:d2534ecf88c6 453 }
olympux 6:d054e394fba3 454 default:
olympux 6:d054e394fba3 455 break;
olympux 4:568c97f2a407 456 }
olympux 3:972ed747474c 457 #endif
olympux 4:568c97f2a407 458 } // network processor
olympux 11:709f90a3b599 459 }
olympux 11:709f90a3b599 460
olympux 12:7c152c0ca4d8 461 /*
olympux 12:7c152c0ca4d8 462 * Update digital outputs following receiving frame from TCP client
olympux 12:7c152c0ca4d8 463 */
olympux 12:7c152c0ca4d8 464 void update_digital_outputs(char* buf) {
olympux 12:7c152c0ca4d8 465 printf("Digital outputs: %s\n", buf);
olympux 11:709f90a3b599 466
olympux 12:7c152c0ca4d8 467 dout0 = (buf[0] == DIGITAL_HIGH)? 1 : 0;
olympux 12:7c152c0ca4d8 468 dout1 = (buf[1] == DIGITAL_HIGH)? 1 : 0;
olympux 12:7c152c0ca4d8 469 dout2 = (buf[2] == DIGITAL_HIGH)? 1 : 0;
olympux 12:7c152c0ca4d8 470 dout3 = (buf[3] == DIGITAL_HIGH)? 1 : 0;
olympux 12:7c152c0ca4d8 471 dout4 = (buf[4] == DIGITAL_HIGH)? 1 : 0;
olympux 12:7c152c0ca4d8 472 dout5 = (buf[5] == DIGITAL_HIGH)? 1 : 0;
olympux 12:7c152c0ca4d8 473 dout6 = (buf[6] == DIGITAL_HIGH)? 1 : 0;
olympux 12:7c152c0ca4d8 474 dout7 = (buf[7] == DIGITAL_HIGH)? 1 : 0;
olympux 12:7c152c0ca4d8 475 }
olympux 12:7c152c0ca4d8 476
olympux 12:7c152c0ca4d8 477 void update_sending_frame(char* buf) {
olympux 12:7c152c0ca4d8 478 memcpy(&buf[SENDING_PROTOCOL_ID_POS], DEVICE_ID, 4); // device id
olympux 12:7c152c0ca4d8 479 memcpy(&buf[SENDING_PROTOCOL_MAC_POS], &u8mac, 6);
olympux 12:7c152c0ca4d8 480 memcpy(&buf[SENDING_PROTOCOL_IP_POS], &u8ip_addr, 4);
olympux 11:709f90a3b599 481
olympux 12:7c152c0ca4d8 482 buf[SENDING_PROTOCOL_DI_POS+0] = (din0 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 483 buf[SENDING_PROTOCOL_DI_POS+1] = (din1 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 484 buf[SENDING_PROTOCOL_DI_POS+2] = (din2 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 485 buf[SENDING_PROTOCOL_DI_POS+3] = (din3 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 486 buf[SENDING_PROTOCOL_DI_POS+4] = (din4 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 487 buf[SENDING_PROTOCOL_DI_POS+5] = (din5 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 488 buf[SENDING_PROTOCOL_DI_POS+6] = (din6 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 489 buf[SENDING_PROTOCOL_DI_POS+7] = (din7 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 11:709f90a3b599 490
olympux 12:7c152c0ca4d8 491 buf[SENDING_PROTOCOL_DO_POS+0] = (dout0 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 492 buf[SENDING_PROTOCOL_DO_POS+1] = (dout1 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 493 buf[SENDING_PROTOCOL_DO_POS+2] = (dout2 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 494 buf[SENDING_PROTOCOL_DO_POS+3] = (dout3 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 495 buf[SENDING_PROTOCOL_DO_POS+4] = (dout4 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 496 buf[SENDING_PROTOCOL_DO_POS+5] = (dout5 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 497 buf[SENDING_PROTOCOL_DO_POS+6] = (dout6 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 498 buf[SENDING_PROTOCOL_DO_POS+7] = (dout7 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 11:709f90a3b599 499
olympux 12:7c152c0ca4d8 500 uint16_t val = ain0.read_u16();
olympux 12:7c152c0ca4d8 501 memcpy(&buf[SENDING_PROTOCOL_AI0_POS], &val, 2);
olympux 12:7c152c0ca4d8 502 val = ain1.read_u16();
olympux 12:7c152c0ca4d8 503 memcpy(&buf[SENDING_PROTOCOL_AI1_POS], &val, 2);
olympux 12:7c152c0ca4d8 504 val = 0;
olympux 12:7c152c0ca4d8 505 memcpy(&buf[SENDING_PROTOCOL_AO0_POS], &val, 2);
olympux 12:7c152c0ca4d8 506 val = 0;
olympux 12:7c152c0ca4d8 507 memcpy(&buf[SENDING_PROTOCOL_AO1_POS], &val, 2);
olympux 12:7c152c0ca4d8 508 buf[SENDING_PROTOCOL_CR_POS] = 0x0D;
olympux 12:7c152c0ca4d8 509 buf[SENDING_PROTOCOL_CR_POS+1] = '\0';
olympux 4:568c97f2a407 510 }