mirror of https://github.com/ARMmbed/mbed-os.git
Cellular: Improve ATHandler AT traces
Original AT traces had several issue: - Can be overwritten by other traces (printf/mbed-trace) - No way to know which direction message was going (TX or RX) - <cr> and <ln> characters were not visible in trace etc. This commit addresses those issues using mbed-trace and showing separately each filehandle write and read.pull/10121/head
parent
1549c5c425
commit
aff3815790
|
@ -368,7 +368,7 @@ bool ATHandler::fill_buffer(bool wait_for_timeout)
|
||||||
// Reset buffer when full
|
// Reset buffer when full
|
||||||
if (sizeof(_recv_buff) == _recv_len) {
|
if (sizeof(_recv_buff) == _recv_len) {
|
||||||
tr_error("AT overflow");
|
tr_error("AT overflow");
|
||||||
debug_print(_recv_buff, _recv_len);
|
debug_print(_recv_buff, _recv_len, AT_ERR);
|
||||||
reset_buffer();
|
reset_buffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -379,7 +379,7 @@ bool ATHandler::fill_buffer(bool wait_for_timeout)
|
||||||
if (count > 0 && (fhs.revents & POLLIN)) {
|
if (count > 0 && (fhs.revents & POLLIN)) {
|
||||||
ssize_t len = _fileHandle->read(_recv_buff + _recv_len, sizeof(_recv_buff) - _recv_len);
|
ssize_t len = _fileHandle->read(_recv_buff + _recv_len, sizeof(_recv_buff) - _recv_len);
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
debug_print(_recv_buff + _recv_len, len);
|
debug_print(_recv_buff + _recv_len, len, AT_RX);
|
||||||
_recv_len += len;
|
_recv_len += len;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -481,7 +481,6 @@ ssize_t ATHandler::read_bytes(uint8_t *buf, size_t len)
|
||||||
}
|
}
|
||||||
buf[read_len] = c;
|
buf[read_len] = c;
|
||||||
if (_debug_on && read_len >= DEBUG_MAXLEN) {
|
if (_debug_on && read_len >= DEBUG_MAXLEN) {
|
||||||
debug_print(DEBUG_END_MARK, sizeof(DEBUG_END_MARK) - 1);
|
|
||||||
_debug_on = false;
|
_debug_on = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -586,7 +585,6 @@ ssize_t ATHandler::read_hex_string(char *buf, size_t size)
|
||||||
int c = get_char();
|
int c = get_char();
|
||||||
|
|
||||||
if (_debug_on && read_idx >= DEBUG_MAXLEN) {
|
if (_debug_on && read_idx >= DEBUG_MAXLEN) {
|
||||||
debug_print(DEBUG_END_MARK, sizeof(DEBUG_END_MARK) - 1);
|
|
||||||
_debug_on = false;
|
_debug_on = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1231,9 +1229,8 @@ size_t ATHandler::write(const void *data, size_t len)
|
||||||
}
|
}
|
||||||
if (_debug_on && write_len < DEBUG_MAXLEN) {
|
if (_debug_on && write_len < DEBUG_MAXLEN) {
|
||||||
if (write_len + ret < DEBUG_MAXLEN) {
|
if (write_len + ret < DEBUG_MAXLEN) {
|
||||||
debug_print((char *)data + write_len, ret);
|
debug_print((char *)data + write_len, ret, AT_TX);
|
||||||
} else {
|
} else {
|
||||||
debug_print(DEBUG_END_MARK, sizeof(DEBUG_END_MARK) - 1);
|
|
||||||
_debug_on = false;
|
_debug_on = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1287,30 +1284,45 @@ void ATHandler::flush()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ATHandler::debug_print(const char *p, int len)
|
void ATHandler::debug_print(const char *p, int len, ATType type)
|
||||||
{
|
{
|
||||||
#if MBED_CONF_CELLULAR_DEBUG_AT
|
#if MBED_CONF_CELLULAR_DEBUG_AT
|
||||||
if (_debug_on) {
|
if (_debug_on) {
|
||||||
#if MBED_CONF_MBED_TRACE_ENABLE
|
const int buf_size = len * 4 + 1; // x4 -> reserve space for extra characters, +1 -> terminating null
|
||||||
mbed_cellular_trace::mutex_wait();
|
char *buffer = (char *)malloc(buf_size);
|
||||||
#endif
|
if (buffer) {
|
||||||
char c;
|
memset(buffer, 0, buf_size);
|
||||||
|
|
||||||
|
char *pbuf = buffer;
|
||||||
for (ssize_t i = 0; i < len; i++) {
|
for (ssize_t i = 0; i < len; i++) {
|
||||||
c = *p++;
|
const char c = *p++;
|
||||||
if (!isprint(c)) {
|
if (isprint(c)) {
|
||||||
if (c == '\r') {
|
*pbuf++ = c;
|
||||||
debug("\n");
|
} else if (c == '\r') {
|
||||||
|
sprintf(pbuf, "<cr>");
|
||||||
|
pbuf += 4;
|
||||||
} else if (c == '\n') {
|
} else if (c == '\n') {
|
||||||
|
sprintf(pbuf, "<ln>");
|
||||||
|
pbuf += 4;
|
||||||
} else {
|
} else {
|
||||||
debug("#%02x", c);
|
sprintf(pbuf, "<%02X>", c);
|
||||||
|
pbuf += 4;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
MBED_ASSERT((int)(pbuf - buffer) <= buf_size); // Check for buffer overflow
|
||||||
|
|
||||||
|
if (type == AT_RX) {
|
||||||
|
tr_info("AT RX (%2d): %s", len, buffer);
|
||||||
|
} else if (type == AT_TX) {
|
||||||
|
tr_info("AT TX (%2d): %s", len, buffer);
|
||||||
} else {
|
} else {
|
||||||
debug("%c", c);
|
tr_info("AT ERR (%2d): %s", len, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
} else {
|
||||||
|
tr_error("AT trace unable to allocate buffer!");
|
||||||
}
|
}
|
||||||
#if MBED_CONF_MBED_TRACE_ENABLE
|
|
||||||
mbed_cellular_trace::mutex_release();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif // MBED_CONF_CELLULAR_DEBUG_AT
|
#endif // MBED_CONF_CELLULAR_DEBUG_AT
|
||||||
}
|
}
|
||||||
|
|
|
@ -571,7 +571,12 @@ private:
|
||||||
bool find_urc_handler(const char *prefix);
|
bool find_urc_handler(const char *prefix);
|
||||||
|
|
||||||
// print contents of a buffer to trace log
|
// print contents of a buffer to trace log
|
||||||
void debug_print(const char *p, int len);
|
enum ATType {
|
||||||
|
AT_ERR,
|
||||||
|
AT_RX,
|
||||||
|
AT_TX
|
||||||
|
};
|
||||||
|
void debug_print(const char *p, int len, ATType type);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace mbed
|
} // namespace mbed
|
||||||
|
|
Loading…
Reference in New Issue