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:
Mon Dec 29 21:40:55 2014 +0000
Revision:
27:22f289beceb8
Parent:
26:09e0dd020900
Child:
28:00c0c20d03c1
Added and tested Rpc with TCP/UDP

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 #include "mbed.h"
olympux 27:22f289beceb8 6 #include "rtos.h"
olympux 27:22f289beceb8 7 #include "mbed_rpc.h"
olympux 27:22f289beceb8 8 #include "Arguments.h"
olympux 27:22f289beceb8 9
olympux 12:7c152c0ca4d8 10 #include "eeprom.h"
olympux 0:c2eac797face 11 #include "EthernetInterface.h"
olympux 9:d2534ecf88c6 12 #include "NTPClient.h"
olympux 0:c2eac797face 13
olympux 12:7c152c0ca4d8 14 #include "my_eeprom_funcs.h"
olympux 20:71c7950fdd91 15 #include "Watchdog.h"
olympux 12:7c152c0ca4d8 16
olympux 0:c2eac797face 17
olympux 16:84a5bf7285d0 18 //Debug is disabled by default
olympux 25:48dd18cc147c 19 #if 1
olympux 16:84a5bf7285d0 20 //Enable debug
olympux 16:84a5bf7285d0 21 #include <cstdio>
olympux 16:84a5bf7285d0 22 #define DBG(x, ...) std::printf("[main : DBG]"x"\r\n", ##__VA_ARGS__);
olympux 16:84a5bf7285d0 23 #define WARN(x, ...) std::printf("[main : WARN]"x"\r\n", ##__VA_ARGS__);
olympux 16:84a5bf7285d0 24 #define ERR(x, ...) std::printf("[main : ERR]"x"\r\n", ##__VA_ARGS__);
olympux 16:84a5bf7285d0 25
olympux 16:84a5bf7285d0 26 #else
olympux 16:84a5bf7285d0 27 //Disable debug
olympux 16:84a5bf7285d0 28 #define DBG(x, ...)
olympux 16:84a5bf7285d0 29 #define WARN(x, ...)
olympux 16:84a5bf7285d0 30 #define ERR(x, ...)
olympux 16:84a5bf7285d0 31
olympux 16:84a5bf7285d0 32 #endif
olympux 16:84a5bf7285d0 33
olympux 16:84a5bf7285d0 34
olympux 2:18f10e7209f4 35 /*
olympux 2:18f10e7209f4 36 * Hardware defines
olympux 0:c2eac797face 37 */
olympux 2:18f10e7209f4 38 #define ST_NUCLEO // hardware pin mapping
olympux 0:c2eac797face 39
olympux 0:c2eac797face 40 #ifdef ST_NUCLEO
olympux 9:d2534ecf88c6 41 // Ethernet
olympux 0:c2eac797face 42 SPI spi(PA_7, PA_6, PA_5); // mosi, miso, sclk
olympux 11:709f90a3b599 43 EthernetInterface eth(&spi, PA_4, PC_9); // spi, cs, reset
olympux 0:c2eac797face 44 #endif
olympux 0:c2eac797face 45
olympux 27:22f289beceb8 46 //Use the RPC enabled wrapped class - see RpcClasses.h for more info
olympux 27:22f289beceb8 47 // DigitalIn
olympux 27:22f289beceb8 48 RpcDigitalIn di0(PB_14, "din0");
olympux 27:22f289beceb8 49 RpcDigitalIn di1(PB_12, "din1");
olympux 27:22f289beceb8 50 RpcDigitalIn di2(PB_10, "din2");
olympux 27:22f289beceb8 51 RpcDigitalIn di3(PB_1, "din3");
olympux 27:22f289beceb8 52 RpcDigitalIn di4(PB_15, "din4");
olympux 27:22f289beceb8 53 RpcDigitalIn di5(PB_13, "din5");
olympux 27:22f289beceb8 54 RpcDigitalIn di6(PB_11, "din6");
olympux 27:22f289beceb8 55 RpcDigitalIn di7(PB_2, "din7");
olympux 11:709f90a3b599 56 DigitalIn din0(PB_14);
olympux 11:709f90a3b599 57 DigitalIn din1(PB_12);
olympux 11:709f90a3b599 58 DigitalIn din2(PB_10);
olympux 11:709f90a3b599 59 DigitalIn din3(PB_1);
olympux 11:709f90a3b599 60 DigitalIn din4(PB_15);
olympux 11:709f90a3b599 61 DigitalIn din5(PB_13);
olympux 11:709f90a3b599 62 DigitalIn din6(PB_11);
olympux 11:709f90a3b599 63 DigitalIn din7(PB_2);
olympux 27:22f289beceb8 64 // DigitalOut
olympux 27:22f289beceb8 65 RpcDigitalOut do0(PB_3, "dout0");
olympux 27:22f289beceb8 66 RpcDigitalOut do1(PB_5, "dout1");
olympux 27:22f289beceb8 67 RpcDigitalOut do2(PB_7, "dout2");
olympux 27:22f289beceb8 68 RpcDigitalOut do3(PB_9, "dout3");
olympux 27:22f289beceb8 69 RpcDigitalOut do4(PD_2, "dout4");
olympux 27:22f289beceb8 70 RpcDigitalOut do5(PB_4, "dout5");
olympux 27:22f289beceb8 71 RpcDigitalOut do6(PB_6, "dout6");
olympux 27:22f289beceb8 72 RpcDigitalOut do7(PB_8, "dout7");
olympux 11:709f90a3b599 73 DigitalOut dout0(PB_3);
olympux 11:709f90a3b599 74 DigitalOut dout1(PB_5);
olympux 11:709f90a3b599 75 DigitalOut dout2(PB_7);
olympux 11:709f90a3b599 76 DigitalOut dout3(PB_9);
olympux 11:709f90a3b599 77 DigitalOut dout4(PD_2);
olympux 11:709f90a3b599 78 DigitalOut dout5(PB_4);
olympux 11:709f90a3b599 79 DigitalOut dout6(PB_6);
olympux 11:709f90a3b599 80 DigitalOut dout7(PB_8);
olympux 27:22f289beceb8 81 // AnalogIn
olympux 27:22f289beceb8 82 RpcAnalogIn adc10(PC_0, "ain0"); // adc10
olympux 27:22f289beceb8 83 RpcAnalogIn adc11(PC_1, "ain1"); // adc11
olympux 11:709f90a3b599 84 AnalogIn ain0(PC_0);
olympux 11:709f90a3b599 85 AnalogIn ain1(PC_1);
olympux 27:22f289beceb8 86 // AnalogOut, PWM
olympux 27:22f289beceb8 87 RpcPwmOut pwm11(PA_8, "pwm0"); // pwm11
olympux 27:22f289beceb8 88 RpcPwmOut pwm21(PA_15, "pwm1"); // pwm21
olympux 27:22f289beceb8 89 // Serial
olympux 27:22f289beceb8 90 RpcSerial usart2(USBTX, USBRX, "uart"); // usart2
olympux 27:22f289beceb8 91 Serial uart(USBTX,USBRX);
olympux 27:22f289beceb8 92 // Timer
olympux 27:22f289beceb8 93 RpcTimer timer1("timer1");
olympux 20:71c7950fdd91 94 // Watchdog
olympux 20:71c7950fdd91 95 Watchdog wdt;
olympux 20:71c7950fdd91 96
olympux 20:71c7950fdd91 97
olympux 13:bcf840da68fd 98 /*
olympux 13:bcf840da68fd 99 * EEPROM section
olympux 13:bcf840da68fd 100 */
olympux 6:d054e394fba3 101 // Virtual address defined by the user: 0xFFFF value is prohibited
olympux 6:d054e394fba3 102 uint16_t VirtAddVarTab[NumbOfVar] = {0x1212, 0x1313, 0x1414, 0x1515, // IP_Addr
olympux 6:d054e394fba3 103 0x2212, 0x2313, 0x2414, 0x2515, // IP_Subnet
olympux 6:d054e394fba3 104 0x3212, 0x3313, 0x3414, 0x3515, // IP_Gateway
olympux 6:d054e394fba3 105 0x4212, // TCP server port, not used
olympux 8:64848959adb9 106 0x5212, // UDP server port, not used
olympux 16:84a5bf7285d0 107 0x8888, // 1st run? 0xA5A5 = configured
olympux 12:7c152c0ca4d8 108 0x6212, 0x6313, 0x6414, // MAC
olympux 12:7c152c0ca4d8 109
olympux 12:7c152c0ca4d8 110 // this section is for the TCP server that this device connects to in TCP client mode
olympux 16:84a5bf7285d0 111 0x7212, 0x7313, // 0xA5 = auto transmit status, time period
olympux 12:7c152c0ca4d8 112 0x8212, 0x8313,0x8414, 0x8515, // TCP server IP address
olympux 16:84a5bf7285d0 113 0x9212, // TCP server port
olympux 16:84a5bf7285d0 114
olympux 16:84a5bf7285d0 115 // this section is for selecting protocol
olympux 16:84a5bf7285d0 116 0xA212, // 0xA5A5 = enable TCP server
olympux 16:84a5bf7285d0 117 0xA313, // 0xA5A5 = eanble TCP client
olympux 18:ca499a2e7da6 118 0xA414 // 0xA5A5 = enable UDP server
olympux 6:d054e394fba3 119 };
olympux 0:c2eac797face 120
olympux 2:18f10e7209f4 121 /*
olympux 2:18f10e7209f4 122 * Network configuration
olympux 2:18f10e7209f4 123 */
olympux 4:568c97f2a407 124 #define TCP_SERVER
olympux 15:edeb0aed160d 125 #define TCP_CLIENT
olympux 4:568c97f2a407 126 #define UDP_SERVER
olympux 4:568c97f2a407 127 //#define UDP_CLIENT
olympux 10:4cd965d79de0 128 #define NTP
olympux 4:568c97f2a407 129
olympux 20:71c7950fdd91 130 #define TCP_SERVER_WAIT_CLIENT_TIMEOUT 200 // timeout for local tcp server wait for a remote client
olympux 20:71c7950fdd91 131 #define TCP_SERVER_RECEIVE_TIMEOUT 2000 // timeout for local tcp server wait to receive from remote client
olympux 20:71c7950fdd91 132 #define TCP_CLIENT_RECEIVE_TIMEOUT 200 // timeout for local tcp client try to connect remote server
olympux 20:71c7950fdd91 133 #define UDP_SERVER_RECEIVE_TIMEOUT 100 // timeout for checking config command
olympux 4:568c97f2a407 134
olympux 15:edeb0aed160d 135
olympux 15:edeb0aed160d 136 // TCP server function
olympux 15:edeb0aed160d 137 TCPSocketServer tcp_server;
olympux 15:edeb0aed160d 138 TCPSocketConnection tcp_client;
olympux 15:edeb0aed160d 139 // TCP client function
olympux 15:edeb0aed160d 140 TCPSocketConnection tcp_sock;
olympux 15:edeb0aed160d 141 // UDP server
olympux 15:edeb0aed160d 142 UDPSocket udp_server;
olympux 15:edeb0aed160d 143 Endpoint ep_udp_client;
olympux 15:edeb0aed160d 144 // NTP
olympux 13:bcf840da68fd 145 NTPClient ntp;
olympux 13:bcf840da68fd 146
olympux 13:bcf840da68fd 147
olympux 15:edeb0aed160d 148
olympux 13:bcf840da68fd 149 /*
olympux 13:bcf840da68fd 150 * Variables for network configuration, server
olympux 13:bcf840da68fd 151 */
olympux 11:709f90a3b599 152 uint8_t u8mac[6], u8ip_addr[4];// keep mac and ip address in 8-bits
olympux 11:709f90a3b599 153 uint16_t u16mac_addr[3], u16ip_addr[4], u16ip_subnet[4], u16ip_gateway[4]; // 16-bits, directly loaded from eeprom
olympux 11:709f90a3b599 154 char str_ip_addr[16], str_ip_subnet[16], str_ip_gateway[16]; // for printf, converted from 16-bits u16ip_xxx
olympux 25:48dd18cc147c 155 uint16_t configured_ip = 0; // static ip configured flag
olympux 9:d2534ecf88c6 156
olympux 22:e5f0aa929c44 157 const uint16_t tcp_server_local_port = 10000; // fixed, change to 7000 if internet required
olympux 12:7c152c0ca4d8 158 const uint16_t udp_server_local_port = 11000; // fixed
olympux 12:7c152c0ca4d8 159
olympux 12:7c152c0ca4d8 160 // TCP client: this section is used for the TCP server that this device connects to in TCP client mode
olympux 12:7c152c0ca4d8 161 // this device will transmit status every transmit_time_period
olympux 12:7c152c0ca4d8 162 uint16_t auto_transmit_flag = 0, transmit_time_period = 1000; // auto transmit status, time period = 1s
olympux 12:7c152c0ca4d8 163 uint16_t u16server_ip_addr[4]; // directly loaded from eeprom
olympux 14:18eda020a589 164 uint8_t u8server_ip_addr[4]; // server ip address in 8-bits
olympux 14:18eda020a589 165 char str_server_ip_addr[16];// for printf, converted from 16-bits u16server_ip_addr
olympux 12:7c152c0ca4d8 166 uint16_t u16tcp_server_port; // directly loaded from eeprom
olympux 18:ca499a2e7da6 167 uint16_t u16enable_tcp_client, u16enable_tcp_server;// flags for enabling TCP client or TCP server
olympux 12:7c152c0ca4d8 168
olympux 19:05934ee9ee67 169 char tcp_receiving_buffer[256];
olympux 19:05934ee9ee67 170 char tcp_sending_buffer[256]; // socket buffer
olympux 19:05934ee9ee67 171 char udp_receiving_buffer[256];
olympux 12:7c152c0ca4d8 172
olympux 0:c2eac797face 173
olympux 13:bcf840da68fd 174 /*
olympux 13:bcf840da68fd 175 * Protocol
olympux 13:bcf840da68fd 176 */
olympux 9:d2534ecf88c6 177 // Commands
olympux 27:22f289beceb8 178 #define DEVICE_CONFIG_CODE "NNCF"
olympux 27:22f289beceb8 179 #define DEVICE_CONTROL_CODE "NNIO"
olympux 17:88ef7a078095 180
olympux 17:88ef7a078095 181 #define RECEIVING_PROTOCOL_LENGTH 58
olympux 17:88ef7a078095 182 #define SENDING_PROTOCOL_LENGTH 39
olympux 26:09e0dd020900 183 #define QUERY_NETWORK_CONFIG_CMD_LENGTH 6
olympux 17:88ef7a078095 184 #define SET_NETWORK_CONFIG_CMD_LENGTH 19
olympux 26:09e0dd020900 185 #define UPDATE_TCP_SERVER_INFO_COMMAND_LENGTH 12
olympux 17:88ef7a078095 186
olympux 27:22f289beceb8 187 #define QUERY_DISCOVERY_CMD "NNCFDS"
olympux 27:22f289beceb8 188 #define QUERY_IP_CMD "NNCFIP"
olympux 27:22f289beceb8 189 #define QUERY_SUBNET_CMD "NNCFSN"
olympux 27:22f289beceb8 190 #define QUERY_GATEWAY_CMD "NNCFGW"
olympux 27:22f289beceb8 191 #define QUERY_MAC_CMD "NNCFMC"
olympux 27:22f289beceb8 192 #define QUERY_UDP_PORT_CMD "NNCFUP"
olympux 27:22f289beceb8 193 #define QUERY_TCP_PORT_CMD "NNCFTP"
olympux 27:22f289beceb8 194 #define QUERY_UPDATE_TIME_CMD "NNCFTM"
olympux 11:709f90a3b599 195 #define RECEIVING_PROTOCOL_ENABLE_OUTPUT 'O'
olympux 11:709f90a3b599 196 #define QUERY_STATUS_COMMAND 'Q'
olympux 11:709f90a3b599 197 #define DIGITAL_HIGH 'H'
olympux 11:709f90a3b599 198 #define DIGITAL_LOW 'L'
olympux 9:d2534ecf88c6 199
olympux 9:d2534ecf88c6 200
olympux 9:d2534ecf88c6 201 // Positions
olympux 11:709f90a3b599 202 #define RECEIVING_PROTOCOL_ID_POS 0
olympux 9:d2534ecf88c6 203 #define RECEIVING_PROTOCOL_OP_POS 4
olympux 9:d2534ecf88c6 204 #define RECEIVING_PROTOCOL_EN_DO_POS RECEIVING_PROTOCOL_OP_POS + 0
olympux 9:d2534ecf88c6 205 #define RECEIVING_PROTOCOL_EN_A0O_POS RECEIVING_PROTOCOL_OP_POS + 1
olympux 9:d2534ecf88c6 206 #define RECEIVING_PROTOCOL_EN_A1O_POS RECEIVING_PROTOCOL_OP_POS + 2
olympux 9:d2534ecf88c6 207 #define RECEIVING_PROTOCOL_EN_UART_POS RECEIVING_PROTOCOL_OP_POS + 3
olympux 9:d2534ecf88c6 208 #define RECEIVING_PROTOCOL_COMMAND_POS RECEIVING_PROTOCOL_OP_POS + 4
olympux 11:709f90a3b599 209
olympux 11:709f90a3b599 210 #define RECEIVING_PROTOCOL_IP_POS 9
olympux 11:709f90a3b599 211 #define RECEIVING_PROTOCOL_DO_POS 13
olympux 11:709f90a3b599 212 #define RECEIVING_PROTOCOL_A0O_POS 21
olympux 11:709f90a3b599 213 #define RECEIVING_PROTOCOL_A01_POS 23
olympux 11:709f90a3b599 214 #define RECEIVING_PROTOCOL_UART_POS 25
olympux 9:d2534ecf88c6 215
olympux 9:d2534ecf88c6 216
olympux 11:709f90a3b599 217 #define SENDING_PROTOCOL_ID_POS 0
olympux 11:709f90a3b599 218 #define SENDING_PROTOCOL_MAC_POS 4
olympux 11:709f90a3b599 219 #define SENDING_PROTOCOL_IP_POS 10
olympux 11:709f90a3b599 220 #define SENDING_PROTOCOL_DI_POS 14
olympux 11:709f90a3b599 221 #define SENDING_PROTOCOL_DO_POS 22
olympux 11:709f90a3b599 222 #define SENDING_PROTOCOL_AI0_POS 30
olympux 11:709f90a3b599 223 #define SENDING_PROTOCOL_AI1_POS 32
olympux 11:709f90a3b599 224 #define SENDING_PROTOCOL_AO0_POS 34
olympux 11:709f90a3b599 225 #define SENDING_PROTOCOL_AO1_POS 36
olympux 11:709f90a3b599 226 #define SENDING_PROTOCOL_CR_POS 38
olympux 0:c2eac797face 227
olympux 2:18f10e7209f4 228
olympux 2:18f10e7209f4 229 /*
olympux 2:18f10e7209f4 230 * RTOS
olympux 2:18f10e7209f4 231 */
olympux 2:18f10e7209f4 232 struct message_t {
olympux 2:18f10e7209f4 233 int len;
olympux 2:18f10e7209f4 234 char *msg;
olympux 2:18f10e7209f4 235 };
olympux 3:972ed747474c 236 Queue<message_t, 16> uart_queue;
olympux 15:edeb0aed160d 237 Queue<bool, 1> auto_update_queue;
olympux 2:18f10e7209f4 238
olympux 2:18f10e7209f4 239
olympux 26:09e0dd020900 240
olympux 26:09e0dd020900 241 // Prototypes
olympux 26:09e0dd020900 242 int ethernet_init(void);
olympux 26:09e0dd020900 243 void process_control_command(char* received_buffer, int len);
olympux 26:09e0dd020900 244 void process_config_command(char* received_buffer, int len);
olympux 26:09e0dd020900 245 void update_digital_outputs(char* buf);
olympux 26:09e0dd020900 246 void update_sending_frame(char* buf);
olympux 26:09e0dd020900 247
olympux 26:09e0dd020900 248
olympux 2:18f10e7209f4 249 /*
olympux 2:18f10e7209f4 250 * Threads
olympux 2:18f10e7209f4 251 */
olympux 15:edeb0aed160d 252 // Timer thread for auto update
olympux 15:edeb0aed160d 253 void auto_update_timer_thread(void const* args) {
olympux 18:ca499a2e7da6 254 bool update_flag = true;
olympux 15:edeb0aed160d 255
olympux 15:edeb0aed160d 256 Thread::wait(500);
olympux 15:edeb0aed160d 257 while(true) {
olympux 15:edeb0aed160d 258 auto_update_queue.put(&update_flag);
olympux 18:ca499a2e7da6 259 Thread::wait(1000*transmit_time_period); // Thread::wait() in ms
olympux 15:edeb0aed160d 260 }
olympux 15:edeb0aed160d 261 }
olympux 15:edeb0aed160d 262
olympux 15:edeb0aed160d 263
olympux 20:71c7950fdd91 264 // WDT reset
olympux 20:71c7950fdd91 265 void wdt_reset_thread(void const* args) {
olympux 20:71c7950fdd91 266 while (true)
olympux 20:71c7950fdd91 267 wdt.Service();
olympux 20:71c7950fdd91 268 }
olympux 20:71c7950fdd91 269
olympux 20:71c7950fdd91 270
olympux 4:568c97f2a407 271 int main()
olympux 4:568c97f2a407 272 {
olympux 9:d2534ecf88c6 273 int n, ret;
olympux 4:568c97f2a407 274
olympux 20:71c7950fdd91 275 Thread::wait(500); // turn on delay
olympux 20:71c7950fdd91 276
olympux 4:568c97f2a407 277 /*
olympux 9:d2534ecf88c6 278 * Configure
olympux 4:568c97f2a407 279 */
olympux 11:709f90a3b599 280 uart.baud(115200);
olympux 18:ca499a2e7da6 281 DBG("\r\nStarting...");
olympux 20:71c7950fdd91 282
olympux 20:71c7950fdd91 283 if (wdt.WatchdogCausedReset())
olympux 20:71c7950fdd91 284 DBG("Watchdog caused reset.");
olympux 20:71c7950fdd91 285 wdt.Configure(4);
olympux 6:d054e394fba3 286
olympux 6:d054e394fba3 287 /*
olympux 6:d054e394fba3 288 * FLASH
olympux 6:d054e394fba3 289 */
olympux 12:7c152c0ca4d8 290 load_eeprom_network();
olympux 15:edeb0aed160d 291 load_eeprom_tcpserver();
olympux 20:71c7950fdd91 292
olympux 20:71c7950fdd91 293 /*
olympux 20:71c7950fdd91 294 * UI threads
olympux 20:71c7950fdd91 295 */
olympux 20:71c7950fdd91 296 Thread t2(auto_update_timer_thread);
olympux 20:71c7950fdd91 297 Thread t3(wdt_reset_thread);
olympux 20:71c7950fdd91 298
olympux 4:568c97f2a407 299 /*
olympux 4:568c97f2a407 300 * Ethernet
olympux 4:568c97f2a407 301 */
olympux 6:d054e394fba3 302 ret = ethernet_init();
olympux 4:568c97f2a407 303 if (ret) {
olympux 18:ca499a2e7da6 304 ERR("Ethernet initialisation failed. App halted.");
olympux 4:568c97f2a407 305 while (true) {};
olympux 4:568c97f2a407 306 }
olympux 4:568c97f2a407 307
olympux 23:47ee805435b1 308 Thread::wait(2000); // TCP/UDP stack delay
olympux 12:7c152c0ca4d8 309
olympux 12:7c152c0ca4d8 310 /*
olympux 20:71c7950fdd91 311 * UDP server
olympux 20:71c7950fdd91 312 * TCP server/client
olympux 12:7c152c0ca4d8 313 */
olympux 20:71c7950fdd91 314 #ifdef UDP_SERVER
olympux 20:71c7950fdd91 315 ret = udp_server.bind(udp_server_local_port);
olympux 20:71c7950fdd91 316 DBG("UDP server started (sock.bind = %d)...", ret);
olympux 20:71c7950fdd91 317 udp_server.set_blocking(false, UDP_SERVER_RECEIVE_TIMEOUT);
olympux 20:71c7950fdd91 318 #endif
olympux 20:71c7950fdd91 319
olympux 3:972ed747474c 320 #ifdef TCP_SERVER
olympux 12:7c152c0ca4d8 321 tcp_server.bind(tcp_server_local_port);
olympux 3:972ed747474c 322 tcp_server.listen();
olympux 18:ca499a2e7da6 323 DBG("TCP server started...");
olympux 4:568c97f2a407 324 tcp_server.set_blocking(false, TCP_SERVER_WAIT_CLIENT_TIMEOUT);
olympux 3:972ed747474c 325 #endif
olympux 14:18eda020a589 326
olympux 14:18eda020a589 327 #ifdef TCP_CLIENT
olympux 18:ca499a2e7da6 328
olympux 14:18eda020a589 329 #endif
olympux 3:972ed747474c 330
olympux 12:7c152c0ca4d8 331 /*
olympux 19:05934ee9ee67 332 * Network loop processor
olympux 12:7c152c0ca4d8 333 */
olympux 0:c2eac797face 334 while (true) {
olympux 15:edeb0aed160d 335 #ifdef TCP_CLIENT
olympux 18:ca499a2e7da6 336 // FOR AUTO TRANSMIT DEVICE STATUS
olympux 18:ca499a2e7da6 337 //if ((u16enable_tcp_client == 0xA5A5) && (auto_transmit_flag == 0xA5A5)) {
olympux 18:ca499a2e7da6 338 if (auto_transmit_flag == 0xA5A5) {
olympux 18:ca499a2e7da6 339 // connect to TCP server if required
olympux 18:ca499a2e7da6 340 if (!tcp_sock.is_connected()) {
olympux 20:71c7950fdd91 341 ret = tcp_sock.connect(str_server_ip_addr, u16tcp_server_port); // timeout is default in connect() in W5500.h
olympux 18:ca499a2e7da6 342 if (ret > -1) {
olympux 18:ca499a2e7da6 343 DBG("Successfully connected to %s on port %d", str_server_ip_addr, u16tcp_server_port);
olympux 18:ca499a2e7da6 344 }
olympux 18:ca499a2e7da6 345 else {
olympux 18:ca499a2e7da6 346 ERR("Unable to connect to %s on port %d", str_server_ip_addr, u16tcp_server_port);
olympux 18:ca499a2e7da6 347 }
olympux 16:84a5bf7285d0 348 }
olympux 18:ca499a2e7da6 349
olympux 18:ca499a2e7da6 350 // transmit data if connected
olympux 18:ca499a2e7da6 351 if (tcp_sock.is_connected()) {
olympux 18:ca499a2e7da6 352 osEvent evt = auto_update_queue.get(1); // timeout after 1ms
olympux 18:ca499a2e7da6 353 if (evt.status == osEventMessage) {
olympux 18:ca499a2e7da6 354 DBG("Updating...");
olympux 19:05934ee9ee67 355 update_sending_frame(tcp_sending_buffer);
olympux 19:05934ee9ee67 356 tcp_sock.send_all(tcp_sending_buffer, SENDING_PROTOCOL_LENGTH);
olympux 19:05934ee9ee67 357 }
olympux 19:05934ee9ee67 358
olympux 19:05934ee9ee67 359 // check to receive or timeout
olympux 19:05934ee9ee67 360 tcp_sock.set_blocking(false, TCP_CLIENT_RECEIVE_TIMEOUT);
olympux 19:05934ee9ee67 361 n = tcp_sock.receive(tcp_receiving_buffer, sizeof(tcp_receiving_buffer));
olympux 19:05934ee9ee67 362 if (n > 0) {
olympux 19:05934ee9ee67 363 // got some data, test it
olympux 19:05934ee9ee67 364 DBG("TCP client received %d bytes: %s", n, tcp_receiving_buffer);
olympux 26:09e0dd020900 365 process_control_command(tcp_receiving_buffer, n);
olympux 18:ca499a2e7da6 366 }
olympux 16:84a5bf7285d0 367 }
olympux 18:ca499a2e7da6 368 } // if tcp client enabled && auto transmit
olympux 15:edeb0aed160d 369 #endif
olympux 15:edeb0aed160d 370
olympux 15:edeb0aed160d 371
olympux 9:d2534ecf88c6 372 // FOR INTERFACING
olympux 4:568c97f2a407 373 #ifdef TCP_SERVER
olympux 4:568c97f2a407 374 // no tcp client connected
olympux 18:ca499a2e7da6 375 //if ((u16enable_tcp_server == 0xA5A5) && (!tcp_client.is_connected())) {
olympux 20:71c7950fdd91 376 //if (!tcp_client.is_connected()) {
olympux 20:71c7950fdd91 377 if (1) {
olympux 4:568c97f2a407 378 // wait for client within timeout
olympux 4:568c97f2a407 379 ret = tcp_server.accept(tcp_client);
olympux 2:18f10e7209f4 380
olympux 4:568c97f2a407 381 // tcp client connected
olympux 4:568c97f2a407 382 if (ret > -1) {
olympux 18:ca499a2e7da6 383 DBG("Connection from: %s", tcp_client.get_address());
olympux 4:568c97f2a407 384
olympux 4:568c97f2a407 385 // loop waiting and receiving data within timeout
olympux 4:568c97f2a407 386 tcp_client.set_blocking(false, TCP_SERVER_RECEIVE_TIMEOUT); // Timeout after x seconds
olympux 4:568c97f2a407 387 while (true) {
olympux 19:05934ee9ee67 388 n = tcp_client.receive(tcp_receiving_buffer, sizeof(tcp_receiving_buffer));
olympux 4:568c97f2a407 389 if (n <= 0) break;
olympux 4:568c97f2a407 390
olympux 9:d2534ecf88c6 391 // got some data, test it
olympux 27:22f289beceb8 392 tcp_receiving_buffer[n] = '\0'; // for debugging purpose
olympux 19:05934ee9ee67 393 DBG("TCP server received: %s", tcp_receiving_buffer);
olympux 26:09e0dd020900 394 process_control_command(tcp_receiving_buffer, n);
olympux 4:568c97f2a407 395 } // end loop if no data received within timeout
olympux 4:568c97f2a407 396 } // if client connected
olympux 20:71c7950fdd91 397 tcp_client.close();
olympux 18:ca499a2e7da6 398 } // if tcp server enabled && no client connected
olympux 3:972ed747474c 399 #endif
olympux 20:71c7950fdd91 400
olympux 9:d2534ecf88c6 401 #ifdef UDP_SERVER
olympux 27:22f289beceb8 402 bool discovery_mode_flag, config_mode_flag;
olympux 25:48dd18cc147c 403
olympux 19:05934ee9ee67 404 n = udp_server.receiveFrom(ep_udp_client, udp_receiving_buffer, sizeof(udp_receiving_buffer));
olympux 25:48dd18cc147c 405
olympux 25:48dd18cc147c 406 // check to see if it is a query command
olympux 25:48dd18cc147c 407 // if yes, is it a discovery command or an ip query to enter config mode
olympux 27:22f289beceb8 408 discovery_mode_flag = false;
olympux 25:48dd18cc147c 409 config_mode_flag = false;
olympux 26:09e0dd020900 410 if ((n == QUERY_NETWORK_CONFIG_CMD_LENGTH) && (strstr(udp_receiving_buffer, QUERY_DISCOVERY_CMD) != NULL)) {
olympux 27:22f289beceb8 411 discovery_mode_flag = true;
olympux 25:48dd18cc147c 412 DBG("Received discovery command");
olympux 25:48dd18cc147c 413 char str[50];
olympux 27:22f289beceb8 414 sprintf(str, "%s%s%s", DEVICE_CONFIG_CODE, eth.getMACAddress(), eth.getIPAddress());
olympux 25:48dd18cc147c 415 udp_server.sendTo(ep_udp_client, str, strlen(str));
olympux 27:22f289beceb8 416 } // NNCFDS
olympux 26:09e0dd020900 417 else if ((n == QUERY_NETWORK_CONFIG_CMD_LENGTH) && (strstr(udp_receiving_buffer, QUERY_IP_CMD) != NULL)) {
olympux 25:48dd18cc147c 418 config_mode_flag = true;
olympux 27:22f289beceb8 419 DBG("Entered configuration mode...");
olympux 20:71c7950fdd91 420 DBG("!!! RESET when finished");
olympux 27:22f289beceb8 421 } // NNCFIP
olympux 25:48dd18cc147c 422
olympux 27:22f289beceb8 423 // if received NNCFIP, enter config mode
olympux 25:48dd18cc147c 424 if (config_mode_flag) {
olympux 26:09e0dd020900 425 while (n > 0)
olympux 26:09e0dd020900 426 {
olympux 20:71c7950fdd91 427 // got some data, test it
olympux 27:22f289beceb8 428 DBG("UDP received (%s) from (%s:%d)", udp_receiving_buffer, ep_udp_client.get_address(), ep_udp_client.get_port());
olympux 26:09e0dd020900 429 process_config_command(udp_receiving_buffer, n);
olympux 20:71c7950fdd91 430 // wait to receive new config command
olympux 20:71c7950fdd91 431 udp_server.set_blocking(true);
olympux 20:71c7950fdd91 432 n = udp_server.receiveFrom(ep_udp_client, udp_receiving_buffer, sizeof(udp_receiving_buffer));
olympux 26:09e0dd020900 433 } // while (n > 0), config loop
olympux 25:48dd18cc147c 434 } // if (config_mode_flag)
olympux 27:22f289beceb8 435 else if ((n > 0) && (!discovery_mode_flag)) { // process control packages sent using UDP
olympux 26:09e0dd020900 436 process_control_command(udp_receiving_buffer, n);
olympux 25:48dd18cc147c 437 }
olympux 3:972ed747474c 438 #endif
olympux 4:568c97f2a407 439 } // network processor
olympux 11:709f90a3b599 440 }
olympux 11:709f90a3b599 441
olympux 26:09e0dd020900 442
olympux 26:09e0dd020900 443 void process_config_command(char* received_buffer, int len)
olympux 26:09e0dd020900 444 {
olympux 27:22f289beceb8 445 DBG("Processing configuration command");
olympux 27:22f289beceb8 446
olympux 26:09e0dd020900 447 // process received data
olympux 26:09e0dd020900 448 // a configuration command always starts with NN
olympux 27:22f289beceb8 449 if ((received_buffer[0] == 'N') && (received_buffer[1] == 'N') &&
olympux 27:22f289beceb8 450 (received_buffer[2] == 'C') && (received_buffer[3] == 'F')) {
olympux 26:09e0dd020900 451 switch (len) {
olympux 26:09e0dd020900 452 // length = 6, a QUERY command (discovery command, TCP port, or UDP port)
olympux 27:22f289beceb8 453 // Format: NNCFDS, NNCFTP, NNCFUP, NNCFTM
olympux 26:09e0dd020900 454 case QUERY_NETWORK_CONFIG_CMD_LENGTH:
olympux 26:09e0dd020900 455 if (strstr(received_buffer, QUERY_IP_CMD) != NULL) {
olympux 26:09e0dd020900 456 udp_server.sendTo(ep_udp_client, eth.getIPAddress(), strlen(eth.getIPAddress()));
olympux 27:22f289beceb8 457 } // NNCFIP
olympux 26:09e0dd020900 458 else if (strstr(received_buffer, QUERY_SUBNET_CMD) != NULL) {
olympux 26:09e0dd020900 459 udp_server.sendTo(ep_udp_client, eth.getNetworkMask(), strlen(eth.getNetworkMask()));
olympux 27:22f289beceb8 460 } // NNCFSN
olympux 26:09e0dd020900 461 else if (strstr(received_buffer, QUERY_GATEWAY_CMD) != NULL) {
olympux 26:09e0dd020900 462 udp_server.sendTo(ep_udp_client, eth.getGateway(), strlen(eth.getGateway()));
olympux 27:22f289beceb8 463 } // NNCFGW
olympux 26:09e0dd020900 464 else if (strstr(received_buffer, QUERY_MAC_CMD) != NULL) {
olympux 26:09e0dd020900 465 udp_server.sendTo(ep_udp_client, eth.getMACAddress(), strlen(eth.getMACAddress()));
olympux 27:22f289beceb8 466 } // NNCFMC
olympux 26:09e0dd020900 467 // ask for TCP server port
olympux 26:09e0dd020900 468 else if (strstr(received_buffer, QUERY_TCP_PORT_CMD) != NULL) {
olympux 26:09e0dd020900 469 char port[5];
olympux 26:09e0dd020900 470 sprintf(port, "%5d", tcp_server_local_port);
olympux 26:09e0dd020900 471 udp_server.sendTo(ep_udp_client, port, strlen(port));
olympux 27:22f289beceb8 472 } // NNCFTP
olympux 26:09e0dd020900 473 // ask for UDP server port
olympux 26:09e0dd020900 474 else if (strstr(received_buffer, QUERY_UDP_PORT_CMD) != NULL) {
olympux 26:09e0dd020900 475 char port[5];
olympux 26:09e0dd020900 476 sprintf(port, "%5d", udp_server_local_port);
olympux 26:09e0dd020900 477 udp_server.sendTo(ep_udp_client, port, strlen(port));
olympux 27:22f289beceb8 478 } // NNCFUP
olympux 26:09e0dd020900 479 else if (strstr(received_buffer, QUERY_UPDATE_TIME_CMD) != NULL) {
olympux 26:09e0dd020900 480 #ifdef NTP
olympux 26:09e0dd020900 481 char str_time[50];
olympux 26:09e0dd020900 482
olympux 26:09e0dd020900 483 DBG("Trying to update time...");
olympux 26:09e0dd020900 484 if (ntp.setTime("0.pool.ntp.org") == 0) {
olympux 26:09e0dd020900 485 DBG("Set time successfully");
olympux 26:09e0dd020900 486 time_t ctTime;
olympux 26:09e0dd020900 487 ctTime = time(NULL);
olympux 26:09e0dd020900 488
olympux 26:09e0dd020900 489 DBG("Time is set to (UTC): %s", ctime(&ctTime));
olympux 26:09e0dd020900 490 sprintf(str_time, "%s", ctime(&ctTime));
olympux 26:09e0dd020900 491 udp_server.sendTo(ep_udp_client, str_time, strlen(str_time));
olympux 26:09e0dd020900 492 } else {
olympux 26:09e0dd020900 493 WARN("Error");
olympux 26:09e0dd020900 494 sprintf(str_time, "ERR");
olympux 26:09e0dd020900 495 udp_server.sendTo(ep_udp_client, str_time, strlen(str_time));
olympux 26:09e0dd020900 496 }
olympux 26:09e0dd020900 497 #elif
olympux 26:09e0dd020900 498 WARN("NTP disabled");
olympux 26:09e0dd020900 499 sprintf(str_time, "DIS");
olympux 26:09e0dd020900 500 udp_server.sendTo(ep_udp_client, str_time, strlen(str_time));
olympux 26:09e0dd020900 501 #endif
olympux 27:22f289beceb8 502 } // NNCFTM
olympux 26:09e0dd020900 503
olympux 26:09e0dd020900 504 break;
olympux 26:09e0dd020900 505 // length = 19, SET NETWORK CONFIGURATION
olympux 27:22f289beceb8 506 // Format: 4E 4E 43 46 C0 A8 00 78 FF FF FF 00 C0 A8 00 01 00 00 01
olympux 27:22f289beceb8 507 // (NNCF; IP: 192.168.0.120; Subnet: 255.255.255.0; GW: 192.168.0.1; MAC: 0 0 1)
olympux 26:09e0dd020900 508 case SET_NETWORK_CONFIG_CMD_LENGTH: {
olympux 26:09e0dd020900 509 // check device id
olympux 27:22f289beceb8 510 char* id = strstr(received_buffer, DEVICE_CONFIG_CODE);
olympux 26:09e0dd020900 511 if (id == NULL)
olympux 26:09e0dd020900 512 break;
olympux 26:09e0dd020900 513 else if ((id - received_buffer) > 0)
olympux 26:09e0dd020900 514 break;
olympux 26:09e0dd020900 515
olympux 26:09e0dd020900 516 DBG("Received user configuration");
olympux 27:22f289beceb8 517 write_eeprom_network(&received_buffer[strlen(DEVICE_CONFIG_CODE)]); // parameters from 5th char, 15-bytes
olympux 26:09e0dd020900 518 break;
olympux 26:09e0dd020900 519 }
olympux 26:09e0dd020900 520 // length = 12, SET TCP SERVER CONFIGURATION
olympux 26:09e0dd020900 521 // auto update & its time period, TCP server configuration (IP & port)
olympux 27:22f289beceb8 522 // Format: 4E 4E 43 46 'Y' 01 C0 A8 00 09 E0 2E (LSB MSB)
olympux 27:22f289beceb8 523 // NNCF Auto 1s 192.168.0.9 12000
olympux 26:09e0dd020900 524 case UPDATE_TCP_SERVER_INFO_COMMAND_LENGTH: {
olympux 27:22f289beceb8 525 char* id = strstr(received_buffer, DEVICE_CONFIG_CODE);
olympux 26:09e0dd020900 526 if (id == NULL)
olympux 26:09e0dd020900 527 break;
olympux 26:09e0dd020900 528 else if ((id - received_buffer) > 0)
olympux 26:09e0dd020900 529 break;
olympux 26:09e0dd020900 530
olympux 26:09e0dd020900 531 DBG("Received TCP server configuration");
olympux 27:22f289beceb8 532 write_eeprom_tcpserver(&received_buffer[strlen(DEVICE_CONFIG_CODE)]); // parameters from 5th char
olympux 26:09e0dd020900 533 break;
olympux 26:09e0dd020900 534 }
olympux 26:09e0dd020900 535 default:
olympux 26:09e0dd020900 536 break;
olympux 26:09e0dd020900 537 } // switch (n), check configuration command length
olympux 27:22f289beceb8 538 } // if starts with NNCF, a config command
olympux 26:09e0dd020900 539 else { // if not a command, check to see if it is a 6-byte data package
olympux 26:09e0dd020900 540 // process 6-byte data package
olympux 26:09e0dd020900 541 }
olympux 26:09e0dd020900 542 }
olympux 26:09e0dd020900 543
olympux 12:7c152c0ca4d8 544 /*
olympux 26:09e0dd020900 545 * Procedure to process receiving protocol, which includes command to control outputs
olympux 26:09e0dd020900 546 */
olympux 26:09e0dd020900 547 void process_control_command(char* received_buffer, int len)
olympux 26:09e0dd020900 548 {
olympux 26:09e0dd020900 549 char* received_frame;
olympux 26:09e0dd020900 550 int pos;
olympux 27:22f289beceb8 551 char inbuf[256], outbuf[256];
olympux 26:09e0dd020900 552
olympux 27:22f289beceb8 553 DBG("Processing control command");
olympux 27:22f289beceb8 554
olympux 27:22f289beceb8 555 // check RPC protocol
olympux 27:22f289beceb8 556 strncpy(inbuf, received_buffer, len);
olympux 27:22f289beceb8 557 inbuf[len] = '\r'; // use inbuf for RPC protocol
olympux 27:22f289beceb8 558 inbuf[len+1] = '\n';
olympux 27:22f289beceb8 559 inbuf[len+2] = '\0'; // add CR-LF
olympux 27:22f289beceb8 560 DBG("inbuf = %s", inbuf);
olympux 27:22f289beceb8 561 if ((len > 0) && (inbuf[0] == '/')) {
olympux 27:22f289beceb8 562 bool result;
olympux 27:22f289beceb8 563 result = RPC::call(inbuf, outbuf);
olympux 27:22f289beceb8 564 if (result) {
olympux 27:22f289beceb8 565 DBG("I: %s O: %s\n", inbuf, outbuf);
olympux 27:22f289beceb8 566 }
olympux 27:22f289beceb8 567 else {
olympux 27:22f289beceb8 568 ERR("Failed: %s", inbuf);
olympux 27:22f289beceb8 569 }
olympux 27:22f289beceb8 570 }
olympux 27:22f289beceb8 571
olympux 27:22f289beceb8 572 // NNIO protocol
olympux 26:09e0dd020900 573 while (len >= RECEIVING_PROTOCOL_LENGTH) {
olympux 26:09e0dd020900 574 // find device ID
olympux 26:09e0dd020900 575 DBG("Checking device ID...");
olympux 27:22f289beceb8 576 char* id = strstr(received_buffer, DEVICE_CONTROL_CODE);
olympux 26:09e0dd020900 577 if (id == NULL) {
olympux 26:09e0dd020900 578 DBG("No device ID found");
olympux 26:09e0dd020900 579 break;
olympux 26:09e0dd020900 580 }
olympux 26:09e0dd020900 581 pos = id - received_buffer;
olympux 26:09e0dd020900 582 DBG("Found a frame at %d", pos);
olympux 26:09e0dd020900 583
olympux 26:09e0dd020900 584 // extract this frame
olympux 26:09e0dd020900 585 received_frame = &received_buffer[pos];
olympux 26:09e0dd020900 586 // calculate the rest
olympux 26:09e0dd020900 587 received_buffer = &received_buffer[pos + RECEIVING_PROTOCOL_LENGTH];
olympux 26:09e0dd020900 588 len -= RECEIVING_PROTOCOL_LENGTH;
olympux 26:09e0dd020900 589
olympux 26:09e0dd020900 590 // process this received frame
olympux 26:09e0dd020900 591 // firstly, update outputs if required
olympux 26:09e0dd020900 592 // digital outputs
olympux 26:09e0dd020900 593 if (received_frame[RECEIVING_PROTOCOL_EN_DO_POS] == RECEIVING_PROTOCOL_ENABLE_OUTPUT) {
olympux 26:09e0dd020900 594 DBG("Update digital outputs");
olympux 26:09e0dd020900 595 char str_dout[9];
olympux 26:09e0dd020900 596 memcpy(str_dout, &received_frame[RECEIVING_PROTOCOL_DO_POS], 8);
olympux 26:09e0dd020900 597 str_dout[8] = '\0';
olympux 26:09e0dd020900 598 update_digital_outputs(str_dout);
olympux 26:09e0dd020900 599 }
olympux 26:09e0dd020900 600 // analog output 0
olympux 26:09e0dd020900 601 if (received_frame[RECEIVING_PROTOCOL_EN_A0O_POS] == RECEIVING_PROTOCOL_ENABLE_OUTPUT) {
olympux 26:09e0dd020900 602 DBG("Update analog output 0");
olympux 26:09e0dd020900 603 //TODO Update analog output
olympux 26:09e0dd020900 604 }
olympux 26:09e0dd020900 605 // analog output 1
olympux 26:09e0dd020900 606 if (received_buffer[RECEIVING_PROTOCOL_EN_A1O_POS] == RECEIVING_PROTOCOL_ENABLE_OUTPUT) {
olympux 26:09e0dd020900 607 DBG("Update analog output 1");
olympux 26:09e0dd020900 608 //TODO Update analog output
olympux 26:09e0dd020900 609 }
olympux 26:09e0dd020900 610 // UART
olympux 26:09e0dd020900 611 if (received_frame[RECEIVING_PROTOCOL_EN_UART_POS] == RECEIVING_PROTOCOL_ENABLE_OUTPUT) {
olympux 26:09e0dd020900 612 DBG("UART data: ");
olympux 26:09e0dd020900 613 char str_uart[33];
olympux 26:09e0dd020900 614 memcpy(str_uart, &received_frame[RECEIVING_PROTOCOL_UART_POS], 32);
olympux 26:09e0dd020900 615 str_uart[32] = '\0';
olympux 26:09e0dd020900 616 uart.printf("%s\r\n", str_uart);
olympux 26:09e0dd020900 617 }
olympux 26:09e0dd020900 618
olympux 26:09e0dd020900 619 // then, check query status command and sending protocol if required
olympux 26:09e0dd020900 620 if (received_frame[RECEIVING_PROTOCOL_COMMAND_POS] == QUERY_STATUS_COMMAND) {
olympux 26:09e0dd020900 621 DBG("Requested to send device status through TCP");
olympux 26:09e0dd020900 622 // sending protocol
olympux 26:09e0dd020900 623 update_sending_frame(tcp_sending_buffer);
olympux 26:09e0dd020900 624 tcp_client.send_all(tcp_sending_buffer, SENDING_PROTOCOL_LENGTH);
olympux 26:09e0dd020900 625 DBG("Sent");
olympux 26:09e0dd020900 626 }
olympux 26:09e0dd020900 627 }
olympux 27:22f289beceb8 628 DBG("Successfully processed.");
olympux 26:09e0dd020900 629 }
olympux 26:09e0dd020900 630
olympux 26:09e0dd020900 631
olympux 26:09e0dd020900 632 /*
olympux 26:09e0dd020900 633 * W5500 Ethernet init
olympux 26:09e0dd020900 634 */
olympux 26:09e0dd020900 635 int ethernet_init(void) {
olympux 26:09e0dd020900 636 int dhcp_ret, ret;
olympux 26:09e0dd020900 637
olympux 27:22f289beceb8 638 DBG("Initialising ethernet...");
olympux 26:09e0dd020900 639
olympux 26:09e0dd020900 640 // if not configured, try dhcp
olympux 26:09e0dd020900 641 dhcp_ret = -1;
olympux 26:09e0dd020900 642 if (configured_ip != DEFAULT_ENABLE_FLAG_VALUE) {
olympux 27:22f289beceb8 643 DBG("Connecting to DHCP server...");
olympux 26:09e0dd020900 644 dhcp_ret = eth.init(u8mac);
olympux 26:09e0dd020900 645 if (dhcp_ret == 0)
olympux 26:09e0dd020900 646 dhcp_ret = eth.connect();
olympux 26:09e0dd020900 647 }
olympux 26:09e0dd020900 648
olympux 26:09e0dd020900 649 if (dhcp_ret != 0) {
olympux 26:09e0dd020900 650 DBG("No DHCP, load static IP configuration");
olympux 26:09e0dd020900 651 ret = eth.init(u8mac, str_ip_addr, str_ip_subnet, str_ip_gateway); // static
olympux 26:09e0dd020900 652 } else {
olympux 26:09e0dd020900 653 snprintf(str_ip_addr, 16, "%s", eth.getIPAddress());
olympux 26:09e0dd020900 654 snprintf(str_ip_subnet, 16, "%s", eth.getNetworkMask());
olympux 26:09e0dd020900 655 snprintf(str_ip_gateway, 16, "%s", eth.getGateway());
olympux 26:09e0dd020900 656 ret = 0;
olympux 26:09e0dd020900 657 }
olympux 26:09e0dd020900 658
olympux 26:09e0dd020900 659 if (ret == 0) {
olympux 26:09e0dd020900 660 DBG("Initialized, MAC: %s", eth.getMACAddress());
olympux 26:09e0dd020900 661 } else {
olympux 26:09e0dd020900 662 ERR("Error eth.init() - ret = %d", ret);
olympux 26:09e0dd020900 663 return -1;
olympux 26:09e0dd020900 664 }
olympux 26:09e0dd020900 665
olympux 26:09e0dd020900 666 ret = eth.connect();
olympux 26:09e0dd020900 667 if (!ret) {
olympux 26:09e0dd020900 668 DBG("IP: %s, MASK: %s, GW: %s", eth.getIPAddress(), eth.getNetworkMask(), eth.getGateway());
olympux 26:09e0dd020900 669 } else {
olympux 26:09e0dd020900 670 ERR("Error eth.connect() - ret = %d", ret);
olympux 26:09e0dd020900 671 return -1;
olympux 26:09e0dd020900 672 }
olympux 26:09e0dd020900 673
olympux 26:09e0dd020900 674 return 0;
olympux 26:09e0dd020900 675 }
olympux 26:09e0dd020900 676
olympux 26:09e0dd020900 677
olympux 26:09e0dd020900 678 /*
olympux 26:09e0dd020900 679 * Update digital outputs according to receiving protocol
olympux 12:7c152c0ca4d8 680 */
olympux 12:7c152c0ca4d8 681 void update_digital_outputs(char* buf) {
olympux 18:ca499a2e7da6 682 DBG("Digital outputs: %s", buf);
olympux 11:709f90a3b599 683
olympux 12:7c152c0ca4d8 684 dout0 = (buf[0] == DIGITAL_HIGH)? 1 : 0;
olympux 12:7c152c0ca4d8 685 dout1 = (buf[1] == DIGITAL_HIGH)? 1 : 0;
olympux 12:7c152c0ca4d8 686 dout2 = (buf[2] == DIGITAL_HIGH)? 1 : 0;
olympux 12:7c152c0ca4d8 687 dout3 = (buf[3] == DIGITAL_HIGH)? 1 : 0;
olympux 12:7c152c0ca4d8 688 dout4 = (buf[4] == DIGITAL_HIGH)? 1 : 0;
olympux 12:7c152c0ca4d8 689 dout5 = (buf[5] == DIGITAL_HIGH)? 1 : 0;
olympux 12:7c152c0ca4d8 690 dout6 = (buf[6] == DIGITAL_HIGH)? 1 : 0;
olympux 12:7c152c0ca4d8 691 dout7 = (buf[7] == DIGITAL_HIGH)? 1 : 0;
olympux 12:7c152c0ca4d8 692 }
olympux 12:7c152c0ca4d8 693
olympux 26:09e0dd020900 694 /*
olympux 26:09e0dd020900 695 * Prepare a frame for sending protocol, which includes status of I/Os
olympux 26:09e0dd020900 696 */
olympux 12:7c152c0ca4d8 697 void update_sending_frame(char* buf) {
olympux 27:22f289beceb8 698 memcpy(&buf[SENDING_PROTOCOL_ID_POS], DEVICE_CONTROL_CODE, 4); // device id
olympux 12:7c152c0ca4d8 699 memcpy(&buf[SENDING_PROTOCOL_MAC_POS], &u8mac, 6);
olympux 12:7c152c0ca4d8 700 memcpy(&buf[SENDING_PROTOCOL_IP_POS], &u8ip_addr, 4);
olympux 11:709f90a3b599 701
olympux 12:7c152c0ca4d8 702 buf[SENDING_PROTOCOL_DI_POS+0] = (din0 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 703 buf[SENDING_PROTOCOL_DI_POS+1] = (din1 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 704 buf[SENDING_PROTOCOL_DI_POS+2] = (din2 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 705 buf[SENDING_PROTOCOL_DI_POS+3] = (din3 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 706 buf[SENDING_PROTOCOL_DI_POS+4] = (din4 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 707 buf[SENDING_PROTOCOL_DI_POS+5] = (din5 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 708 buf[SENDING_PROTOCOL_DI_POS+6] = (din6 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 709 buf[SENDING_PROTOCOL_DI_POS+7] = (din7 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 11:709f90a3b599 710
olympux 12:7c152c0ca4d8 711 buf[SENDING_PROTOCOL_DO_POS+0] = (dout0 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 712 buf[SENDING_PROTOCOL_DO_POS+1] = (dout1 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 713 buf[SENDING_PROTOCOL_DO_POS+2] = (dout2 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 714 buf[SENDING_PROTOCOL_DO_POS+3] = (dout3 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 715 buf[SENDING_PROTOCOL_DO_POS+4] = (dout4 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 716 buf[SENDING_PROTOCOL_DO_POS+5] = (dout5 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 717 buf[SENDING_PROTOCOL_DO_POS+6] = (dout6 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 12:7c152c0ca4d8 718 buf[SENDING_PROTOCOL_DO_POS+7] = (dout7 == 1) ? DIGITAL_HIGH : DIGITAL_LOW;
olympux 11:709f90a3b599 719
olympux 15:edeb0aed160d 720 uint16_t val = ain0.read_u16(); // 16-bits normalised
olympux 15:edeb0aed160d 721 memcpy(&buf[SENDING_PROTOCOL_AI0_POS], &val, 2); // LSB MSB
olympux 15:edeb0aed160d 722 val = ain1.read_u16(); // 16-bits normalised
olympux 15:edeb0aed160d 723 memcpy(&buf[SENDING_PROTOCOL_AI1_POS], &val, 2); // LSB MSB
olympux 23:47ee805435b1 724 val = 0x1234;
olympux 15:edeb0aed160d 725 memcpy(&buf[SENDING_PROTOCOL_AO0_POS], &val, 2); // LSB MSB
olympux 23:47ee805435b1 726 val = 0x5678;
olympux 15:edeb0aed160d 727 memcpy(&buf[SENDING_PROTOCOL_AO1_POS], &val, 2); // LSB MSB
olympux 12:7c152c0ca4d8 728 buf[SENDING_PROTOCOL_CR_POS] = 0x0D;
olympux 12:7c152c0ca4d8 729 buf[SENDING_PROTOCOL_CR_POS+1] = '\0';
olympux 4:568c97f2a407 730 }