Enhanced test program using watchdog timer to recover from lock-up

Dependencies:   EthernetInterface mbed-rtos mbed

Fork of TCPSocket_HelloWorldTest by Daniel Peter

Revision:
12:9bef73198a53
Parent:
11:59dcefdda506
Child:
14:5ee75b072c69
--- a/main.cpp	Fri Aug 10 09:41:51 2012 +0000
+++ b/main.cpp	Tue Feb 26 21:39:22 2013 +0000
@@ -1,31 +1,90 @@
 #include "mbed.h"
 #include "EthernetInterface.h"
 
-int main() {
-    EthernetInterface eth;
-    eth.init(); //Use DHCP
-    eth.connect();
+#define RETRIES_ALLOWED 5
+
+Serial pc(USBTX, USBRX);
+EthernetInterface eth;
+DigitalOut led1(LED1);
+
+int main()
+{
+
+    pc.baud(115200);
+    printf("Initialising...\n");
+    set_time(0);
+
+    // use DHCP
+    eth.init();
+
+    // attempt DHCP and if timing out then try again
+    while (eth.connect()) {
+        printf("DHCP timeout\n");
+    };
+
+    // successful DHCP
     printf("IP Address is %s\n", eth.getIPAddress());
-    
-    TCPSocketConnection sock;
-    sock.connect("mbed.org", 80);
-    
-    char http_cmd[] = "GET /media/uploads/mbed_official/hello.txt HTTP/1.0\n\n";
-    sock.send_all(http_cmd, sizeof(http_cmd)-1);
-    
-    char buffer[300];
-    int ret;
+
+    // loop forever
     while (true) {
-        ret = sock.receive(buffer, sizeof(buffer)-1);
-        if (ret <= 0)
-            break;
-        buffer[ret] = '\0';
-        printf("Received %d chars from server:\n%s\n", ret, buffer);
+
+        // new non blocking socket
+        TCPSocketConnection sock;
+        sock.set_blocking(false);
+
+        // toggle led to indicate activity
+        led1 = !led1;
+
+        // attempt socket connection and if failure then loop again
+        if (sock.connect("mbed.org", 80)) {
+            printf("Socket connect timeout\n");
+            continue;
+        }
+
+        // send command
+        printf("Sending at %d seconds\n", time(NULL));
+        char http_cmd[] = "GET /media/uploads/mbed_official/hello.txt HTTP/1.0\n\n";
+        sock.send_all(http_cmd, sizeof(http_cmd) - 1);
+
+        // receive response
+        int received = 0;
+        int retries = 0;
+        while (true) {
+
+            int result;
+            char buffer[256];
+
+            result = sock.receive(buffer, sizeof(buffer) - 1);
+            printf("Received: %d %d %d\n", result, received, retries);
+
+            // if timeout or no data
+            if (result <= 0) {
+
+                // if data previously received then stop receiving
+                if (received > 0)
+                    break;
+
+                // if incremented retries exceeded then no response and stop receiving
+                if (++retries > RETRIES_ALLOWED) {
+                    break;
+                }
+
+            } else {
+
+                // zero terminate the buffer
+                buffer[result] = '\0';
+
+                // total size of data received
+                received += result;
+            }
+
+        }
+
+        // close socket at end of send and receive
+        sock.close();
+        
+        // wait before repeating
+        Thread::wait(1000);
+
     }
-      
-    sock.close();
-    
-    eth.disconnect();
-    
-    while(1) {}
-}
+}
\ No newline at end of file