Sample to show hanging during socket initialization

Dependencies:   EthernetInterface NTPClient mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "rtos.h"
00003 
00004 #include "EthernetInterface.h"
00005 #include "NTPClient.h"
00006 
00007 // XXX: Change this to a valid IP of your network.
00008 const char *server_ip = "10.0.1.253";
00009 const unsigned short server_port = 8080;
00010 
00011 const char *newline = "\r\n";
00012 const unsigned int connection_timeout = 6000;
00013 const unsigned int network_ticker_period = 60000;
00014 const unsigned int producer_ticker_period = 15000;
00015 
00016 
00017 BusOut leds(LED1, LED2, LED3, LED4);
00018 
00019 typedef struct {
00020     uint16_t count;
00021 } tMessage;
00022 
00023 Mail<tMessage, 64> mailbox;
00024 
00025 EthernetInterface ethernet;
00026 TCPSocketConnection socket;
00027 
00028 static bool timeset = false;
00029 NTPClient ntp;
00030 
00031 
00032 
00033 void connection_callback()
00034 {
00035     printf("%s:%d%s", __FILE__, __LINE__, newline);
00036 
00037     leds = (leds ^ 1);
00038     char data[512];
00039     char *p = data;
00040 
00041     uint16_t nmessages = 0;
00042     osEvent evt;
00043     do {
00044         evt = mailbox.get(0);
00045         if (osEventMail == evt.status) {
00046             tMessage *message = (tMessage *)evt.value.p;
00047             if (message) {
00048                 nmessages += 1;
00049                 p += snprintf(p, sizeof(data) - (p-data), "%d%s", message->count, newline);
00050                 mailbox.free(message);
00051             }
00052         }
00053     } while (osEventMail == evt.status && (p-data) < 384);
00054 
00055     printf("%s:%d nmessages:%d%s", __FILE__, __LINE__, nmessages, newline);
00056     if (!socket.is_connected()) {
00057         socket.connect(server_ip, server_port);
00058     }
00059 
00060     printf("%s:%d%s", __FILE__, __LINE__, newline);
00061     if (socket.is_connected()) {
00062         if (p > data) {
00063             printf(data);
00064             printf(newline);
00065             printf("%s:%d%s", __FILE__, __LINE__, newline);
00066             int nsent = socket.send_all(data, (p-data)-1);
00067             printf("%s:%d: nmessages:%d, length:%d, nsent:%d, %s", __FILE__, __LINE__, nmessages, (p-data)-1, nsent, newline);
00068         }
00069         socket.close();
00070     } else {
00071         printf("%s:%d: nmessages:%d, discarded_length:%d%s", __FILE__, __LINE__, nmessages, (p-data)-1, newline);
00072     }
00073 
00074     printf("%s:%d%s", __FILE__, __LINE__, newline);
00075 }
00076 
00077 
00078 void network_callback (const void *context)
00079 {
00080     printf("%s:%d%s", __FILE__, __LINE__, newline);
00081 
00082     if (!ethernet.getIPAddress()) {
00083         printf("%s:%d%s", __FILE__, __LINE__, newline);
00084         ethernet.connect(connection_timeout);
00085         printf("%s:%d%s", __FILE__, __LINE__, newline);
00086     }
00087 
00088     if (ethernet.getIPAddress()) {
00089         printf("%s:%d%s", __FILE__, __LINE__, newline);
00090         leds = (leds ^ 2);
00091         if (false == timeset) {
00092             printf("%s:%d%s", __FILE__, __LINE__, newline);
00093             if (NTP_OK == ntp.setTime("0.pool.ntp.org")) {
00094                 printf("%s:%d timeset%s", __FILE__, __LINE__, newline);
00095                 timeset = true;
00096             }
00097             printf("%s:%d%s", __FILE__, __LINE__, newline);
00098         }
00099 
00100         connection_callback();
00101 
00102         ethernet.disconnect();
00103         printf("%s:%d%s", __FILE__, __LINE__, newline);
00104     }
00105 
00106     printf("%s:%d%s", __FILE__, __LINE__, newline);
00107 }
00108 
00109 
00110 void producer_ticker(const void *context)
00111 {
00112     printf("%s:%d%s", __FILE__, __LINE__, newline);
00113     static uint16_t counter = 0;
00114 
00115     tMessage *message = mailbox.alloc();
00116     if (message) {
00117         leds = (leds ^ 4);
00118         memset(message, 0, sizeof(*message));
00119         message->count = ++counter;
00120         mailbox.put(message);
00121     }
00122     printf("%s:%d%s", __FILE__, __LINE__, newline);
00123 }
00124 
00125 
00126 int main()
00127 {
00128     printf("%s:%d%s", __FILE__, __LINE__, newline);
00129     ethernet.init();
00130     printf("%s:%d%s", __FILE__, __LINE__, newline);
00131 
00132     RtosTimer producer(producer_ticker);
00133     RtosTimer network(network_callback);
00134     printf("%s:%d%s", __FILE__, __LINE__, newline);
00135 
00136     producer.start(producer_ticker_period);
00137     network.start(network_ticker_period);
00138     printf("%s:%d%s", __FILE__, __LINE__, newline);
00139 
00140     while (true) {
00141         Thread::wait(500);
00142         leds = (leds ^ 8);
00143     }
00144 }