@@ -55,11 +55,56 @@ static UARTSerial cellular_serial(MDMTXD, MDMRXD, MBED_CONF_PLATFORM_DEFAULT_SER
55
55
static rtos::Semaphore network_semaphore (0 );
56
56
static CellularConnectionFSM cellular;
57
57
58
+ #if MBED_CONF_MBED_TRACE_ENABLE
59
+
60
+ static rtos::Mutex trace_mutex;
61
+
62
+ void trace_wait ()
63
+ {
64
+ trace_mutex.lock ();
65
+ }
66
+
67
+ void trace_release ()
68
+ {
69
+ trace_mutex.unlock ();
70
+ }
71
+
72
+ static char time_st[sizeof (" [12345678]" ) + 1 ];
73
+
74
+ static char * trace_time (size_t ss)
75
+ {
76
+ snprintf (time_st, sizeof (" [12345678]" ), " [%08llu]" , rtos::Kernel::get_ms_count ());
77
+ return time_st;
78
+ }
79
+
80
+ static void trace_open ()
81
+ {
82
+ mbed_trace_init ();
83
+ mbed_trace_prefix_function_set ( &trace_time );
84
+ mbed_trace_mutex_wait_function_set (trace_wait);
85
+ mbed_trace_mutex_release_function_set (trace_release);
86
+
87
+ mbed_cellular_trace::mutex_wait_function_set (trace_wait);
88
+ mbed_cellular_trace::mutex_release_function_set (trace_release);
89
+ }
90
+
91
+ static void trace_close ()
92
+ {
93
+ mbed_cellular_trace::mutex_wait_function_set (NULL );
94
+ mbed_cellular_trace::mutex_release_function_set (NULL );
95
+
96
+ mbed_trace_free ();
97
+ }
98
+
99
+ #endif // MBED_CONF_MBED_TRACE_ENABLE
100
+
58
101
static SocketAddress echo_server_addr;
59
102
103
+ static rtos::EventFlags eventFlags;
104
+
60
105
class EchoSocket : public UDPSocket {
61
106
public:
62
- EchoSocket (int size) : UDPSocket(), _async_flag (0 ), _data( 0 ), _size(size ) {
107
+ EchoSocket (int size) : UDPSocket(), _data (0 ), _size(size), _async_flag( 0 ), _tx_pending( false ), _rx_pending( false ) {
63
108
}
64
109
virtual ~EchoSocket () {
65
110
delete _data;
@@ -69,54 +114,70 @@ class EchoSocket : public UDPSocket {
69
114
if (_async_flag) {
70
115
set_blocking (false );
71
116
sigio (callback (this , &EchoSocket::async_callback));
72
- } else {
73
- set_blocking (true );
74
- set_timeout (SOCKET_TIMEOUT);
75
- sigio (NULL );
76
117
}
77
-
78
118
}
119
+
79
120
void test_sendto (const char *const hostname = NULL ) {
80
- _data = new uint8_t [_size];
81
- for (int i=0 ; i<_size; i++) {
82
- _data[i] = (uint8_t )rand ();
83
- }
84
- // clear pending events
85
- TEST_ASSERT (!(EchoSocket::eventFlags.clear (_async_flag) & osFlagsError));
121
+ if (!_data) {
122
+ _data = new uint8_t [_size];
123
+ for (int i=0 ; i<_size; i++) {
124
+ _data[i] = (uint8_t )rand ();
125
+ }
126
+ }
127
+ nsapi_size_or_error_t ret;
86
128
if (hostname) {
87
- TEST_ASSERT ( sendto (hostname, ECHO_SERVER_UDP_PORT, _data, _size) == _size);
129
+ ret = sendto (hostname, ECHO_SERVER_UDP_PORT, _data, _size);
88
130
} else {
89
- TEST_ASSERT (sendto (echo_server_addr, _data, _size) == _size);
131
+ ret = sendto (echo_server_addr, _data, _size);
132
+ }
133
+ if (ret == _size) { // send successful
134
+ _tx_pending = false ;
135
+ } else {
136
+ TEST_ASSERT (_async_flag && ret == NSAPI_ERROR_WOULD_BLOCK);
137
+ _tx_pending = true ;
90
138
}
91
139
}
140
+
92
141
void test_recvfrom () {
93
- if (_async_flag) {
94
- TEST_ASSERT ((EchoSocket::eventFlags.wait_any (_async_flag, SOCKET_TIMEOUT) & (osFlagsError | _async_flag)) == _async_flag);
95
- }
96
142
uint8_t *buf = new uint8_t [_size];
97
143
memset (buf, 0 , _size);
98
144
SocketAddress recv_address;
145
+ nsapi_size_or_error_t ret = recvfrom (&recv_address, buf, _size);
146
+ if (ret == _size) { // recv successful
147
+ _rx_pending = false ;
148
+ TEST_ASSERT (recv_address == echo_server_addr);
149
+ TEST_ASSERT (memcmp (_data, buf, _size) == 0 );
150
+ delete _data;
151
+ _data = NULL ;
152
+ _rx_pending = false ;
153
+ } else {
154
+ TEST_ASSERT (_async_flag && ret == NSAPI_ERROR_WOULD_BLOCK);
155
+ _rx_pending = true ;
156
+ }
157
+ delete buf;
158
+ }
99
159
100
- TEST_ASSERT (recvfrom (&recv_address, buf, _size) == _size);
101
-
102
- TEST_ASSERT (recv_address == echo_server_addr);
103
- TEST_ASSERT (memcmp (_data, buf, _size) == 0 );
104
- delete buf;
105
- delete _data;
106
- _data = 0 ;
160
+ bool async_process () {
161
+ if (_tx_pending) {
162
+ test_sendto ();
163
+ }
164
+ if (_rx_pending) {
165
+ test_recvfrom ();
166
+ }
167
+ return _tx_pending | _rx_pending;
107
168
}
169
+
108
170
private:
109
171
void async_callback () {
110
- EchoSocket:: eventFlags.set (_async_flag);
172
+ eventFlags.set (_async_flag);
111
173
}
112
174
uint8_t *_data;
113
175
int _size;
114
176
uint32_t _async_flag; // 0 for blocking socket, signal bit for async
115
- static rtos::EventFlags eventFlags;
177
+ bool _tx_pending;
178
+ bool _rx_pending;
116
179
};
117
180
118
- rtos::EventFlags EchoSocket::eventFlags;
119
-
120
181
static void network_callback (nsapi_event_t ev, intptr_t ptr)
121
182
{
122
183
if (ev == NSAPI_EVENT_CONNECTION_STATUS_CHANGE) {
@@ -136,6 +197,10 @@ static void udp_network_stack()
136
197
cellular.attach (&network_callback);
137
198
TEST_ASSERT (cellular.start_dispatch () == NSAPI_ERROR_OK);
138
199
cellular.set_sim_pin (MBED_CONF_APP_CELLULAR_SIM_PIN);
200
+ #ifdef MBED_CONF_APP_APN
201
+ CellularNetwork * network = cellular.get_network ();
202
+ TEST_ASSERT (network->set_credentials (MBED_CONF_APP_APN) == NSAPI_ERROR_OK);
203
+ #endif
139
204
cellular_target_state = CellularConnectionFSM::STATE_CONNECTED;
140
205
TEST_ASSERT (cellular.continue_to_state (cellular_target_state) == NSAPI_ERROR_OK);
141
206
TEST_ASSERT (network_semaphore.wait (NETWORK_TIMEOUT) == 1 );
@@ -144,37 +209,48 @@ static void udp_network_stack()
144
209
static void udp_gethostbyname ()
145
210
{
146
211
TEST_ASSERT (cellular.get_network ()->gethostbyname (ECHO_SERVER_NAME, &echo_server_addr) == 0 );
147
- tr_info (" HOST : %s" , echo_server_addr.get_ip_address ());
212
+ tr_info (" Echo server IP : %s" , echo_server_addr.get_ip_address ());
148
213
echo_server_addr.set_port (7 );
149
- wait (1 );
150
214
}
151
215
152
216
static void udp_socket_send_receive ()
153
217
{
154
218
EchoSocket echo_socket (4 );
155
219
TEST_ASSERT (echo_socket.open (cellular.get_network ()) == NSAPI_ERROR_OK);
156
- echo_socket.set_async (0 );
220
+ echo_socket.set_blocking (true );
221
+ echo_socket.set_timeout (SOCKET_TIMEOUT);
157
222
echo_socket.test_sendto ();
158
223
echo_socket.test_recvfrom ();
159
224
TEST_ASSERT (echo_socket.close () == NSAPI_ERROR_OK);
160
- wait (1 );
161
225
}
162
226
163
227
static void udp_socket_send_receive_async ()
164
228
{
229
+ int async_flag = 1 ;
230
+ TEST_ASSERT (!(eventFlags.clear (async_flag) & osFlagsError));
231
+
165
232
EchoSocket echo_socket (4 );
166
233
TEST_ASSERT (echo_socket.open (cellular.get_network ()) == NSAPI_ERROR_OK);
167
- echo_socket.set_async (1 );
234
+ echo_socket.set_async (async_flag );
168
235
echo_socket.test_sendto ();
169
236
echo_socket.test_recvfrom ();
237
+
238
+ while (true ) {
239
+ TEST_ASSERT ((eventFlags.wait_any (async_flag, SOCKET_TIMEOUT) & (osFlagsError)) != osFlagsError);
240
+ if (!echo_socket.async_process ()) {
241
+ break ;
242
+ }
243
+ }
170
244
TEST_ASSERT (echo_socket.close () == NSAPI_ERROR_OK);
171
- wait (1 );
172
245
}
173
246
174
247
using namespace utest ::v1;
175
248
176
249
static utest::v1::status_t greentea_failure_handler (const Case *const source, const failure_t reason)
177
250
{
251
+ #if MBED_CONF_MBED_TRACE_ENABLE
252
+ trace_close ();
253
+ #endif
178
254
greentea_case_failure_abort_handler (source, reason);
179
255
return STATUS_ABORT;
180
256
}
@@ -184,7 +260,6 @@ static Case cases[] = {
184
260
Case (" UDP gethostbyname" , udp_gethostbyname, greentea_failure_handler),
185
261
Case (" UDP socket send/receive" , udp_socket_send_receive, greentea_failure_handler),
186
262
Case (" UDP socket send/receive async" , udp_socket_send_receive_async, greentea_failure_handler),
187
- // Case("UDP socket multiple simultaneous", udp_socket_multiple_simultaneous, greentea_failure_handler),
188
263
};
189
264
190
265
static utest::v1::status_t test_setup (const size_t number_of_cases)
@@ -197,7 +272,12 @@ static Specification specification(test_setup, cases);
197
272
198
273
int main ()
199
274
{
200
- mbed_trace_init ();
201
-
202
- return Harness::run (specification);
275
+ #if MBED_CONF_MBED_TRACE_ENABLE
276
+ trace_open ();
277
+ #endif
278
+ int ret = Harness::run (specification);
279
+ #if MBED_CONF_MBED_TRACE_ENABLE
280
+ trace_close ();
281
+ #endif
282
+ return ret;
203
283
}
0 commit comments