Skip to content

Commit a146e0e

Browse files
author
Ari Parkkila
committed
Cellular: AT debugging improved
1 parent 8be2e34 commit a146e0e

File tree

11 files changed

+259
-128
lines changed

11 files changed

+259
-128
lines changed

features/cellular/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ You can define the debug tracing level in the `mbed_app.json` configuration file
7272

7373
The `TESTS` folder contains Greentea tests for cellular specific classes. You need to give relevant configuration file with `--app-config` parameter, e.g.:
7474

75-
mbed test -n features-cellular-tests-* --app-config features\cellular\TESTS\socket\udp\template_mbed_app.json -vv
75+
mbed test -n features-cellular-tests-* --app-config features\cellular\TESTS\socket\udp\template_mbed_app.json.txt -v
7676

7777
Note that Greentea tests use SIM PIN so you need to change that or your SIM card may get locked.
7878

features/cellular/TESTS/socket/udp/main.cpp

Lines changed: 118 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,56 @@ static UARTSerial cellular_serial(MDMTXD, MDMRXD, MBED_CONF_PLATFORM_DEFAULT_SER
5555
static rtos::Semaphore network_semaphore(0);
5656
static CellularConnectionFSM cellular;
5757

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+
58101
static SocketAddress echo_server_addr;
59102

103+
static rtos::EventFlags eventFlags;
104+
60105
class EchoSocket : public UDPSocket {
61106
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) {
63108
}
64109
virtual ~EchoSocket() {
65110
delete _data;
@@ -69,54 +114,70 @@ class EchoSocket : public UDPSocket {
69114
if (_async_flag) {
70115
set_blocking(false);
71116
sigio(callback(this, &EchoSocket::async_callback));
72-
} else {
73-
set_blocking(true);
74-
set_timeout(SOCKET_TIMEOUT);
75-
sigio(NULL);
76117
}
77-
78118
}
119+
79120
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;
86128
if (hostname) {
87-
TEST_ASSERT(sendto(hostname, ECHO_SERVER_UDP_PORT, _data, _size) == _size);
129+
ret = sendto(hostname, ECHO_SERVER_UDP_PORT, _data, _size);
88130
} 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;
90138
}
91139
}
140+
92141
void test_recvfrom() {
93-
if (_async_flag) {
94-
TEST_ASSERT((EchoSocket::eventFlags.wait_any(_async_flag, SOCKET_TIMEOUT) & (osFlagsError | _async_flag)) == _async_flag);
95-
}
96142
uint8_t *buf = new uint8_t[_size];
97143
memset(buf, 0, _size);
98144
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+
}
99159

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;
107168
}
169+
108170
private:
109171
void async_callback() {
110-
EchoSocket::eventFlags.set(_async_flag);
172+
eventFlags.set(_async_flag);
111173
}
112174
uint8_t *_data;
113175
int _size;
114176
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;
116179
};
117180

118-
rtos::EventFlags EchoSocket::eventFlags;
119-
120181
static void network_callback(nsapi_event_t ev, intptr_t ptr)
121182
{
122183
if (ev == NSAPI_EVENT_CONNECTION_STATUS_CHANGE) {
@@ -136,6 +197,10 @@ static void udp_network_stack()
136197
cellular.attach(&network_callback);
137198
TEST_ASSERT(cellular.start_dispatch() == NSAPI_ERROR_OK);
138199
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
139204
cellular_target_state = CellularConnectionFSM::STATE_CONNECTED;
140205
TEST_ASSERT(cellular.continue_to_state(cellular_target_state) == NSAPI_ERROR_OK);
141206
TEST_ASSERT(network_semaphore.wait(NETWORK_TIMEOUT) == 1);
@@ -144,37 +209,48 @@ static void udp_network_stack()
144209
static void udp_gethostbyname()
145210
{
146211
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());
148213
echo_server_addr.set_port(7);
149-
wait(1);
150214
}
151215

152216
static void udp_socket_send_receive()
153217
{
154218
EchoSocket echo_socket(4);
155219
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);
157222
echo_socket.test_sendto();
158223
echo_socket.test_recvfrom();
159224
TEST_ASSERT(echo_socket.close() == NSAPI_ERROR_OK);
160-
wait(1);
161225
}
162226

163227
static void udp_socket_send_receive_async()
164228
{
229+
int async_flag = 1;
230+
TEST_ASSERT(!(eventFlags.clear(async_flag) & osFlagsError));
231+
165232
EchoSocket echo_socket(4);
166233
TEST_ASSERT(echo_socket.open(cellular.get_network()) == NSAPI_ERROR_OK);
167-
echo_socket.set_async(1);
234+
echo_socket.set_async(async_flag);
168235
echo_socket.test_sendto();
169236
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+
}
170244
TEST_ASSERT(echo_socket.close() == NSAPI_ERROR_OK);
171-
wait(1);
172245
}
173246

174247
using namespace utest::v1;
175248

176249
static utest::v1::status_t greentea_failure_handler(const Case *const source, const failure_t reason)
177250
{
251+
#if MBED_CONF_MBED_TRACE_ENABLE
252+
trace_close();
253+
#endif
178254
greentea_case_failure_abort_handler(source, reason);
179255
return STATUS_ABORT;
180256
}
@@ -184,7 +260,6 @@ static Case cases[] = {
184260
Case("UDP gethostbyname", udp_gethostbyname, greentea_failure_handler),
185261
Case("UDP socket send/receive", udp_socket_send_receive, greentea_failure_handler),
186262
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),
188263
};
189264

190265
static utest::v1::status_t test_setup(const size_t number_of_cases)
@@ -197,7 +272,12 @@ static Specification specification(test_setup, cases);
197272

198273
int main()
199274
{
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;
203283
}

features/cellular/TESTS/socket/udp/template_mbed_app.json.txt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,27 @@
1717
"value": 0
1818
},
1919
"trace-level": {
20-
"help": "Options are TRACE_LEVEL_ERROR,TRACE_LEVEL_WARN,TRACE_LEVEL_INFO,TRACE_LEVEL_DEBUG",
20+
"help": "Note that excessive trace prints may mess up with Greentea parsing",
2121
"macro_name": "MBED_TRACE_MAX_LEVEL",
22-
"value": "TRACE_LEVEL_INFO"
22+
"value": "TRACE_LEVEL_ERROR"
2323
}
2424
},
2525
"target_overrides": {
2626
"*": {
2727
"ppp-cell-iface.apn-lookup": false,
2828
"cellular.use-apn-lookup": false,
2929
"target.features_add": ["LWIP", "COMMON_PAL"],
30-
"mbed-trace.enable": false,
30+
"mbed-trace.enable": true,
3131
"lwip.ipv4-enabled": true,
3232
"lwip.ipv6-enabled": true,
3333
"lwip.tcp-enabled": false,
3434
"lwip.ppp-enabled": true,
3535
"lwip.ethernet-enabled": false,
3636
"platform.stdio-convert-newlines": true,
37-
"platform.default-serial-baud-rate": 115200
37+
"platform.default-serial-baud-rate": 115200,
38+
"drivers.uart-serial-txbuf-size": 512,
39+
"drivers.uart-serial-rxbuf-size": 1024,
40+
"cellular.debug-at": false
3841
}
3942
}
4043
}

0 commit comments

Comments
 (0)