Skip to content

Commit 1998173

Browse files
author
Mirela Chirica
committed
Cellular: Added read hex string support to AT handler
1 parent 928082b commit 1998173

File tree

3 files changed

+77
-7
lines changed

3 files changed

+77
-7
lines changed

features/cellular/framework/AT/ATHandler.cpp

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@
2525
#include "rtos/Thread.h"
2626
#endif
2727
#include "Kernel.h"
28+
#include "CellularUtil.h"
2829

2930
using namespace mbed;
3031
using namespace events;
32+
using namespace mbed_cellular_util;
3133

3234
//#define MBED_TRACE_MAX_LEVEL TRACE_LEVEL_DEBUG
3335
#include "CellularLog.h"
@@ -511,6 +513,67 @@ ssize_t ATHandler::read_string(char *buf, size_t size, bool read_even_stop_tag)
511513
return len;
512514
}
513515

516+
ssize_t ATHandler::read_hex_string(char *buf, size_t size)
517+
{
518+
tr_debug("%s", __func__);
519+
at_debug("\n----------read_hex_string buff:----------\n");
520+
for (size_t i = _recv_pos; i < _recv_len; i++) {
521+
at_debug("%c", _recv_buff[i]);
522+
}
523+
at_debug("\n----------read_hex_string end----------\n");
524+
525+
if (_last_err || !_stop_tag || _stop_tag->found) {
526+
return -1;
527+
}
528+
529+
size_t match_pos = 0, str_len = 0;
530+
size_t upper = 0, lower = 0;
531+
size_t hex_size = size*2;
532+
533+
uint8_t *pbuf = (uint8_t*)buf;
534+
535+
consume_char('\"');
536+
537+
for (size_t hex_len = 0; hex_len < (hex_size + match_pos); hex_len++) {
538+
char c = get_char();
539+
if (c == -1) {
540+
pbuf[str_len] = '\0';
541+
set_error(NSAPI_ERROR_DEVICE_ERROR);
542+
return -1;
543+
} else if (c == _delimiter) {
544+
pbuf[str_len] = '\0';
545+
break;
546+
} else if (c == '\"') {
547+
match_pos = 0;
548+
if (str_len > 0) {
549+
str_len--;
550+
}
551+
continue;
552+
} else if (_stop_tag->len && c == _stop_tag->tag[match_pos]) {
553+
match_pos++;
554+
if (match_pos == _stop_tag->len) {
555+
_stop_tag->found = true;
556+
// remove tag from string if it was matched
557+
str_len -= (_stop_tag->len - 1);
558+
pbuf[str_len] = '\0';
559+
break;
560+
}
561+
} else if (match_pos) {
562+
match_pos = 0;
563+
}
564+
565+
if (hex_len % 2 == 0) {
566+
upper = hex_str_to_int(&c, 1);
567+
} else {
568+
lower = hex_str_to_int(&c, 1);
569+
pbuf[str_len] = ((upper<<4) & 0xF0) | (lower & 0x0F);
570+
str_len++;
571+
}
572+
}
573+
574+
return str_len;
575+
}
576+
514577
int32_t ATHandler::read_int()
515578
{
516579
tr_debug("%s", __func__);

features/cellular/framework/AT/ATHandler.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,17 @@ class ATHandler
303303
*/
304304
ssize_t read_string(char *str, size_t size, bool read_even_stop_tag = false);
305305

306+
/** Reads chars representing hex ascii values and converts them to the corresponding chars.
307+
* For example: "4156" to "AV".
308+
* Terminates with null. Skips the quotation marks.
309+
* Stops on delimiter or stop tag.
310+
*
311+
* @param str output buffer for the read
312+
* @param size maximum number of chars to output
313+
* @return length of output string or -1 in case of read timeout before delimiter or stop tag is found
314+
*/
315+
ssize_t read_hex_string(char *str, size_t size);
316+
306317
/** Reads as string and converts result to integer. Supports only positive integers.
307318
*
308319
* @return the positive integer or -1 in case of error.

features/cellular/framework/targets/QUECTEL/BC95/QUECTEL_BC95_CellularStack.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,6 @@ nsapi_size_or_error_t QUECTEL_BC95_CellularStack::socket_recvfrom_impl(CellularS
178178
nsapi_size_or_error_t recv_len=0;
179179
int port;
180180
char ip_address[NSAPI_IP_SIZE];
181-
char *hexstr = new char[BC95_MAX_PACKET_SIZE*2+1];
182181

183182
_at.cmd_start("AT+NSORF=");
184183
_at.write_int(socket->id);
@@ -190,13 +189,12 @@ nsapi_size_or_error_t QUECTEL_BC95_CellularStack::socket_recvfrom_impl(CellularS
190189
_at.read_string(ip_address, sizeof(ip_address));
191190
port = _at.read_int();
192191
recv_len = _at.read_int();
193-
int hexlen = _at.read_string(hexstr, BC95_MAX_PACKET_SIZE*2+1);
192+
int hexlen = _at.read_hex_string((char*)buffer, size);
194193
// remaining length
195194
_at.skip_param();
196195
_at.resp_stop();
197196

198197
if (!recv_len || (recv_len == -1) || (_at.get_last_error() != NSAPI_ERROR_OK)) {
199-
delete hexstr;
200198
return NSAPI_ERROR_WOULD_BLOCK;
201199
}
202200

@@ -205,10 +203,8 @@ nsapi_size_or_error_t QUECTEL_BC95_CellularStack::socket_recvfrom_impl(CellularS
205203
address->set_port(port);
206204
}
207205

208-
if (hexlen > 0) {
209-
hex_str_to_char_str((const char*) hexstr, hexlen, (char*)buffer);
206+
if (recv_len != hexlen) {
207+
tr_error("Not received as much data as expected. Should receive: %d bytes, received: %d bytes", recv_len, hexlen);
210208
}
211-
212-
delete hexstr;
213209
return recv_len;
214210
}

0 commit comments

Comments
 (0)