Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: NTPClient W5500Interface Watchdog device_configuration eeprom_flash mbed-rpc-nucleo mbed-rtos mbed
Fork of F103-Serial-to-Ethernet by
Revision 20:71c7950fdd91, committed 2014-11-15
- Comitter:
- olympux
- Date:
- Sat Nov 15 11:46:12 2014 +0000
- Parent:
- 19:05934ee9ee67
- Child:
- 21:fae96e0d6bb1
- Commit message:
- Added watchdog timer.; Config mode is looped forever.
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Watchdog.lib Sat Nov 15 11:46:12 2014 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/olympux/code/Watchdog/#38379e44fae3
--- a/main.cpp Sat Oct 25 10:47:05 2014 +0000
+++ b/main.cpp Sat Nov 15 11:46:12 2014 +0000
@@ -10,6 +10,7 @@
#include "rtos.h"
#include "my_eeprom_funcs.h"
+#include "Watchdog.h"
//Debug is disabled by default
@@ -68,6 +69,10 @@
//AnalogOut ano0(PA_8);
//AnalogOut ano1(PA_15);
+// Watchdog
+Watchdog wdt;
+
+
void update_digital_outputs(char* buf);
void update_sending_frame(char* buf);
@@ -105,10 +110,10 @@
//#define UDP_CLIENT
#define NTP
-#define TCP_SERVER_WAIT_CLIENT_TIMEOUT 200
-#define TCP_SERVER_RECEIVE_TIMEOUT 2000
-#define TCP_CLIENT_RECEIVE_TIMEOUT 100
-#define UDP_SERVER_RECEIVE_TIMEOUT 200
+#define TCP_SERVER_WAIT_CLIENT_TIMEOUT 200 // timeout for local tcp server wait for a remote client
+#define TCP_SERVER_RECEIVE_TIMEOUT 2000 // timeout for local tcp server wait to receive from remote client
+#define TCP_CLIENT_RECEIVE_TIMEOUT 200 // timeout for local tcp client try to connect remote server
+#define UDP_SERVER_RECEIVE_TIMEOUT 100 // timeout for checking config command
// TCP server function
@@ -219,22 +224,6 @@
/*
* Threads
*/
-void uart_thread(void const *args) {
- message_t *p_message;
-
- while (true) {
- osEvent evt = uart_queue.get();
- if (evt.status == osEventMessage) {
- p_message = (message_t*)evt.value.p;
- uart_mutex.lock(); // mutex for stdio is not neccessary
- //DBG("len=%d\n", p_message->len);
- DBG("%s\n", p_message->msg);
- uart_mutex.unlock();
- }
- }
-}
-
-
// Timer thread for auto update
void auto_update_timer_thread(void const* args) {
bool update_flag = true;
@@ -247,6 +236,13 @@
}
+// WDT reset
+void wdt_reset_thread(void const* args) {
+ while (true)
+ wdt.Service();
+}
+
+
/*
* Ethernet init
*/
@@ -341,29 +337,32 @@
int main()
{
- message_t message;
int n, ret;
- Thread::wait(2000); // turn on delay
-
+ Thread::wait(500); // turn on delay
+
/*
* Configure
*/
uart.baud(115200);
DBG("\r\nStarting...");
-
- /*
- * UI threads
- */
- Thread t1(uart_thread);
- Thread t2(auto_update_timer_thread);
+
+ if (wdt.WatchdogCausedReset())
+ DBG("Watchdog caused reset.");
+ wdt.Configure(4);
/*
* FLASH
*/
load_eeprom_network();
load_eeprom_tcpserver();
-
+
+ /*
+ * UI threads
+ */
+ Thread t2(auto_update_timer_thread);
+ Thread t3(wdt_reset_thread);
+
/*
* Ethernet
*/
@@ -373,10 +372,18 @@
while (true) {};
}
+ Thread::wait(2000); // turn on delay
/*
-* TCP/UDP setup
+* UDP server
+* TCP server/client
*/
+#ifdef UDP_SERVER
+ ret = udp_server.bind(udp_server_local_port);
+ DBG("UDP server started (sock.bind = %d)...", ret);
+ udp_server.set_blocking(false, UDP_SERVER_RECEIVE_TIMEOUT);
+#endif
+
#ifdef TCP_SERVER
tcp_server.bind(tcp_server_local_port);
tcp_server.listen();
@@ -388,13 +395,6 @@
#endif
-#ifdef UDP_SERVER
- ret = udp_server.bind(udp_server_local_port);
- DBG("UDP started (sock.bind = %d)", ret);
- udp_server.set_blocking(false, UDP_SERVER_RECEIVE_TIMEOUT);
-#endif
-
-
/*
* Network loop processor
*/
@@ -405,7 +405,7 @@
if (auto_transmit_flag == 0xA5A5) {
// connect to TCP server if required
if (!tcp_sock.is_connected()) {
- ret = tcp_sock.connect(str_server_ip_addr, u16tcp_server_port);
+ ret = tcp_sock.connect(str_server_ip_addr, u16tcp_server_port); // timeout is default in connect() in W5500.h
if (ret > -1) {
DBG("Successfully connected to %s on port %d", str_server_ip_addr, u16tcp_server_port);
}
@@ -440,7 +440,8 @@
#ifdef TCP_SERVER
// no tcp client connected
//if ((u16enable_tcp_server == 0xA5A5) && (!tcp_client.is_connected())) {
- if (!tcp_client.is_connected()) {
+ //if (!tcp_client.is_connected()) {
+ if (1) {
// wait for client within timeout
ret = tcp_server.accept(tcp_client);
@@ -458,116 +459,121 @@
DBG("TCP server received: %s", tcp_receiving_buffer);
process_received_tcp_data(tcp_receiving_buffer, n);
} // end loop if no data received within timeout
- tcp_client.close();
} // if client connected
+ tcp_client.close();
} // if tcp server enabled && no client connected
#endif
-
-
-
-// ALWAYS ENABLED, ONLY FOR CONFIGRATION
+
#ifdef UDP_SERVER
- // wait for udp packet within timeout
n = udp_server.receiveFrom(ep_udp_client, udp_receiving_buffer, sizeof(udp_receiving_buffer));
- if (n <= 0) continue;
-
- // got some data, test it
- DBG("UDP received (%s) from (%s) and port (%d)", udp_receiving_buffer, ep_udp_client.get_address(), ep_udp_client.get_port());
- // process received data
- switch (n) {
- // length = 6, a QUERY command (discovery command, TCP port, or UDP port)
- // Format: NNIODS, NNIOTP, NNIOUP, NNIOTM
- case QUERY_CMD_LENGTH:
- // discovery command
- if (strstr(udp_receiving_buffer, QUERY_DISCOVERY_CMD) != NULL) {
- char str[30];
- sprintf(str, "%s%s", DEVICE_ID, eth.getIPAddress());
- udp_server.sendTo(ep_udp_client, str, strlen(str));
- } // NNIODS
- else if (strstr(udp_receiving_buffer, QUERY_IP_CMD) != NULL) {
- udp_server.sendTo(ep_udp_client, eth.getIPAddress(), strlen(eth.getIPAddress()));
- } // NNIOIP
- else if (strstr(udp_receiving_buffer, QUERY_SUBNET_CMD) != NULL) {
- udp_server.sendTo(ep_udp_client, eth.getNetworkMask(), strlen(eth.getNetworkMask()));
- } // NNIOSN
- else if (strstr(udp_receiving_buffer, QUERY_GATEWAY_CMD) != NULL) {
- udp_server.sendTo(ep_udp_client, eth.getGateway(), strlen(eth.getGateway()));
- } // NNIOGW
- else if (strstr(udp_receiving_buffer, QUERY_MAC_CMD) != NULL) {
- udp_server.sendTo(ep_udp_client, eth.getMACAddress(), strlen(eth.getMACAddress()));
- } // NNIOMC
- // ask for TCP server port
- else if (strstr(udp_receiving_buffer, QUERY_TCP_PORT_CMD) != NULL) {
- char port[5];
- sprintf(port, "%5d", tcp_server_local_port);
- udp_server.sendTo(ep_udp_client, port, strlen(port));
- } // NNIOTP
- // ask for UDP server port
- else if (strstr(udp_receiving_buffer, QUERY_UDP_PORT_CMD) != NULL) {
- char port[5];
- sprintf(port, "%5d", udp_server_local_port);
- udp_server.sendTo(ep_udp_client, port, strlen(port));
- } // NNIOUP
- else if (strstr(udp_receiving_buffer, QUERY_UPDATE_TIME_CMD) != NULL) {
+ if (n > 0) {
+ // if receive any config command, stay in config mode forever
+ DBG("Enabled configuration mode...");
+ DBG("!!! RESET when finished");
+ while (n > 0) {
+ // got some data, test it
+ DBG("UDP received (%s) from (%s) and port (%d)", udp_receiving_buffer, ep_udp_client.get_address(), ep_udp_client.get_port());
+ // process received data
+ switch (n) {
+ // length = 6, a QUERY command (discovery command, TCP port, or UDP port)
+ // Format: NNIODS, NNIOTP, NNIOUP, NNIOTM
+ case QUERY_CMD_LENGTH:
+ // discovery command
+ if (strstr(udp_receiving_buffer, QUERY_DISCOVERY_CMD) != NULL) {
+ char str[30];
+ sprintf(str, "%s%s", DEVICE_ID, eth.getIPAddress());
+ udp_server.sendTo(ep_udp_client, str, strlen(str));
+ } // NNIODS
+ else if (strstr(udp_receiving_buffer, QUERY_IP_CMD) != NULL) {
+ udp_server.sendTo(ep_udp_client, eth.getIPAddress(), strlen(eth.getIPAddress()));
+ } // NNIOIP
+ else if (strstr(udp_receiving_buffer, QUERY_SUBNET_CMD) != NULL) {
+ udp_server.sendTo(ep_udp_client, eth.getNetworkMask(), strlen(eth.getNetworkMask()));
+ } // NNIOSN
+ else if (strstr(udp_receiving_buffer, QUERY_GATEWAY_CMD) != NULL) {
+ udp_server.sendTo(ep_udp_client, eth.getGateway(), strlen(eth.getGateway()));
+ } // NNIOGW
+ else if (strstr(udp_receiving_buffer, QUERY_MAC_CMD) != NULL) {
+ udp_server.sendTo(ep_udp_client, eth.getMACAddress(), strlen(eth.getMACAddress()));
+ } // NNIOMC
+ // ask for TCP server port
+ else if (strstr(udp_receiving_buffer, QUERY_TCP_PORT_CMD) != NULL) {
+ char port[5];
+ sprintf(port, "%5d", tcp_server_local_port);
+ udp_server.sendTo(ep_udp_client, port, strlen(port));
+ } // NNIOTP
+ // ask for UDP server port
+ else if (strstr(udp_receiving_buffer, QUERY_UDP_PORT_CMD) != NULL) {
+ char port[5];
+ sprintf(port, "%5d", udp_server_local_port);
+ udp_server.sendTo(ep_udp_client, port, strlen(port));
+ } // NNIOUP
+ else if (strstr(udp_receiving_buffer, QUERY_UPDATE_TIME_CMD) != NULL) {
#ifdef NTP
- char str_time[50];
-
- DBG("Trying to update time...");
- if (ntp.setTime("0.pool.ntp.org") == 0) {
- DBG("Set time successfully");
- time_t ctTime;
- ctTime = time(NULL);
-
- DBG("Time is set to (UTC): %s", ctime(&ctTime));
- sprintf(str_time, "%s", ctime(&ctTime));
- udp_server.sendTo(ep_udp_client, str_time, strlen(str_time));
- }
- else {
- WARN("Error");
- sprintf(str_time, "ERR");
- udp_server.sendTo(ep_udp_client, str_time, strlen(str_time));
- }
+ char str_time[50];
+
+ DBG("Trying to update time...");
+ if (ntp.setTime("0.pool.ntp.org") == 0) {
+ DBG("Set time successfully");
+ time_t ctTime;
+ ctTime = time(NULL);
+
+ DBG("Time is set to (UTC): %s", ctime(&ctTime));
+ sprintf(str_time, "%s", ctime(&ctTime));
+ udp_server.sendTo(ep_udp_client, str_time, strlen(str_time));
+ }
+ else {
+ WARN("Error");
+ sprintf(str_time, "ERR");
+ udp_server.sendTo(ep_udp_client, str_time, strlen(str_time));
+ }
#elif
- WARN("NTP disabled");
- sprintf(str_time, "DIS");
- udp_server.sendTo(ep_udp_client, str_time, strlen(str_time));
+ WARN("NTP disabled");
+ sprintf(str_time, "DIS");
+ udp_server.sendTo(ep_udp_client, str_time, strlen(str_time));
#endif
- } // NNIOTM
-
- break;
- // length = 19, SET NETWORK CONFIGURATION
- // Format: 4E 4E 49 4F C0 A8 00 78 FF FF FF 00 C0 A8 00 01 00 00 01
- // (NNIO; IP: 192.168.0.120; Subnet: 255.255.255.0; GW: 192.168.0.1; MAC: 0 0 1)
- case SET_NETWORK_CONFIG_CMD_LENGTH: {
- // check device id
- char* id = strstr(udp_receiving_buffer, DEVICE_ID);
- if (id == NULL)
- break;
- else if ((id - udp_receiving_buffer) > 0)
- break;
-
- DBG("Received user configuration");
- write_eeprom_network(&udp_receiving_buffer[strlen(DEVICE_ID)]); // parameters from 5th char, 15-bytes
- break;
- }
- // length = 12, SET TCP SERVER CONFIGURATION
- // auto update & its time period, TCP server configuration (IP & port)
- // Format: 4E 4E 49 4F 'Y' 01 C0 A8 00 09 E0 2E (LSB MSB)
- // NNIO Auto 1s 192.168.0.9 12000
- case UPDATE_TCP_SERVER_INFO_CMD_LENGTH: {
- char* id = strstr(udp_receiving_buffer, DEVICE_ID);
- if (id == NULL)
- break;
- else if ((id - udp_receiving_buffer) > 0)
- break;
+ } // NNIOTM
+
+ break;
+ // length = 19, SET NETWORK CONFIGURATION
+ // Format: 4E 4E 49 4F C0 A8 00 78 FF FF FF 00 C0 A8 00 01 00 00 01
+ // (NNIO; IP: 192.168.0.120; Subnet: 255.255.255.0; GW: 192.168.0.1; MAC: 0 0 1)
+ case SET_NETWORK_CONFIG_CMD_LENGTH: {
+ // check device id
+ char* id = strstr(udp_receiving_buffer, DEVICE_ID);
+ if (id == NULL)
+ break;
+ else if ((id - udp_receiving_buffer) > 0)
+ break;
+
+ DBG("Received user configuration");
+ write_eeprom_network(&udp_receiving_buffer[strlen(DEVICE_ID)]); // parameters from 5th char, 15-bytes
+ break;
+ }
+ // length = 12, SET TCP SERVER CONFIGURATION
+ // auto update & its time period, TCP server configuration (IP & port)
+ // Format: 4E 4E 49 4F 'Y' 01 C0 A8 00 09 E0 2E (LSB MSB)
+ // NNIO Auto 1s 192.168.0.9 12000
+ case UPDATE_TCP_SERVER_INFO_CMD_LENGTH: {
+ char* id = strstr(udp_receiving_buffer, DEVICE_ID);
+ if (id == NULL)
+ break;
+ else if ((id - udp_receiving_buffer) > 0)
+ break;
+
+ DBG("Received TCP server configuration");
+ write_eeprom_tcpserver(&udp_receiving_buffer[strlen(DEVICE_ID)]); // parameters from 5th char
+ break;
+ }
+ default:
+ break;
+ } // switch (n)
- DBG("Received TCP server configuration");
- write_eeprom_tcpserver(&udp_receiving_buffer[strlen(DEVICE_ID)]); // parameters from 5th char
- break;
- }
- default:
- break;
- }
+ // wait to receive new config command
+ udp_server.set_blocking(true);
+ n = udp_server.receiveFrom(ep_udp_client, udp_receiving_buffer, sizeof(udp_receiving_buffer));
+ } // while (1): config commands processor
+ } // udp config timeout?
#endif
} // network processor
}
--- a/mbed.bld Sat Oct 25 10:47:05 2014 +0000 +++ b/mbed.bld Sat Nov 15 11:46:12 2014 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/552587b429a1 \ No newline at end of file +http://mbed.org/users/mbed_official/code/mbed/builds/031413cf7a89 \ No newline at end of file
--- a/readme.txt Sat Oct 25 10:47:05 2014 +0000
+++ b/readme.txt Sat Nov 15 11:46:12 2014 +0000
@@ -8,3 +8,8 @@
v1.0 25/10/2014
+ Added: process many receiving frames in one tcp packet
+ + Bug: TCP server will reply with error #10061 if a previous tcp client connects and quickly disconnects.
+
+v1.1 15/11/2014
+ + Added: watchdog timer
+ + Modified: when received config data from udp, enter config mode forever
