Sample to show hanging during socket initialization
Dependencies: EthernetInterface NTPClient mbed-rtos mbed
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 }
Generated on Mon Aug 1 2022 11:54:45 by 1.7.2