mirror of https://github.com/ARMmbed/mbed-os.git
Cellular: AT handler read string up to delimiter or stop tag
parent
fd4f47d18f
commit
723e913bcc
|
|
@ -579,7 +579,7 @@ TEST_F(TestATHandler, test_ATHandler_read_string)
|
|||
EXPECT_TRUE(NSAPI_ERROR_DEVICE_ERROR == at.get_last_error());
|
||||
at.clear_error();
|
||||
// Device error because empty buffer and attempt to fill_buffer by consume_char('\"')
|
||||
EXPECT_TRUE(-1 == at.read_string(buf1, 1));
|
||||
EXPECT_TRUE(0 == at.read_string(buf1, 1));
|
||||
|
||||
// *** 1 BYTE ***
|
||||
at.clear_error();
|
||||
|
|
@ -599,7 +599,7 @@ TEST_F(TestATHandler, test_ATHandler_read_string)
|
|||
|
||||
// *** CRLF ***
|
||||
at.clear_error();
|
||||
char table3[] = "\r\ns\r\n\0";
|
||||
char table3[] = "\r\n,s\r\n\0";
|
||||
at.flush();
|
||||
filehandle_stub_table = table3;
|
||||
filehandle_stub_table_pos = 0;
|
||||
|
|
@ -670,13 +670,9 @@ TEST_F(TestATHandler, test_ATHandler_read_string)
|
|||
at.resp_start();
|
||||
// TO read 1 byte from: "s"OK\r\n -> read "
|
||||
at.read_bytes(buf5, 1);
|
||||
// TO read max 1 byte from: s"OK\r\n -> read s
|
||||
// TO read max 1 byte from: s"OK\r\n -> read s + read to stop_tag(OKCRLF)
|
||||
EXPECT_TRUE(1 == at.read_string(buf4, 1 + 1/*for NULL*/));
|
||||
|
||||
// *** Consume " and run into OKCRLF ***
|
||||
// TO read max 1 byte from: "OK\r\n -> consume " and find stop tag OKCRLF
|
||||
EXPECT_TRUE(0 == at.read_string(buf4, 1 + 1/*for NULL*/));
|
||||
|
||||
// *** Try to read after stop tag was found ***
|
||||
// stop tag found do not read further
|
||||
EXPECT_TRUE(-1 == at.read_string(buf4, 1 + 1/*for NULL*/));
|
||||
|
|
@ -706,7 +702,7 @@ TEST_F(TestATHandler, test_ATHandler_read_string)
|
|||
mbed_poll_stub::revents_value = POLLIN;
|
||||
mbed_poll_stub::int_value = 1;
|
||||
at.resp_start("s");
|
||||
// TO read from buffer having only " -> consume " -> trying to read when nothing in buffer
|
||||
// TO read from buffer having only " -> trying to find delimiter or stop_tag(OKCRLF)
|
||||
EXPECT_TRUE(-1 == at.read_string(buf4, 5));
|
||||
EXPECT_TRUE(NSAPI_ERROR_DEVICE_ERROR == at.get_last_error());
|
||||
|
||||
|
|
@ -739,6 +735,21 @@ TEST_F(TestATHandler, test_ATHandler_read_string)
|
|||
// TO read from
|
||||
EXPECT_TRUE(6 == at.read_string(buf9, 6 + 1/*for NULL*/));
|
||||
|
||||
at.clear_error();
|
||||
char table11[] = "\"1016\",\"39AB\",9\r\n\0";
|
||||
mbed_poll_stub::int_value = 0;
|
||||
at.flush();
|
||||
filehandle_stub_table = table11;
|
||||
filehandle_stub_table_pos = 0;
|
||||
mbed_poll_stub::revents_value = POLLIN;
|
||||
mbed_poll_stub::int_value = 1;
|
||||
at.resp_start();
|
||||
EXPECT_TRUE(4 == at.read_string(buf4, 4 + 1/*for NULL*/));
|
||||
EXPECT_TRUE(!strncmp(buf4, "1016", 4));
|
||||
EXPECT_TRUE(4 == at.read_string(buf4, 4 + 1/*for NULL*/));
|
||||
EXPECT_TRUE(!strncmp(buf4, "39AB", 4));
|
||||
EXPECT_TRUE(9 == at.read_int());
|
||||
|
||||
// *** CRLF part of the string ***
|
||||
at.clear_error();
|
||||
char table10[] = "\"s\"\r\nOK\r\n\0";
|
||||
|
|
|
|||
|
|
@ -460,14 +460,9 @@ ssize_t ATHandler::read_string(char *buf, size_t size, bool read_even_stop_tag)
|
|||
return -1;
|
||||
}
|
||||
|
||||
consume_char('\"');
|
||||
|
||||
if (_last_err) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
size_t len = 0;
|
||||
int len = 0;
|
||||
size_t match_pos = 0;
|
||||
bool delimiter_found = false;
|
||||
|
||||
for (; len < (size - 1 + match_pos); len++) {
|
||||
int c = get_char();
|
||||
|
|
@ -476,6 +471,7 @@ ssize_t ATHandler::read_string(char *buf, size_t size, bool read_even_stop_tag)
|
|||
return -1;
|
||||
} else if (c == _delimiter) {
|
||||
buf[len] = '\0';
|
||||
delimiter_found = true;
|
||||
break;
|
||||
} else if (c == '\"') {
|
||||
match_pos = 0;
|
||||
|
|
@ -501,6 +497,26 @@ ssize_t ATHandler::read_string(char *buf, size_t size, bool read_even_stop_tag)
|
|||
buf[len] = '\0';
|
||||
}
|
||||
|
||||
// Consume to delimiter or stop_tag
|
||||
if (!delimiter_found && !_stop_tag->found) {
|
||||
match_pos = 0;
|
||||
while(1) {
|
||||
int c = get_char();
|
||||
if (c == -1) {
|
||||
set_error(NSAPI_ERROR_DEVICE_ERROR);
|
||||
break;
|
||||
} else if (c == _delimiter) {
|
||||
break;
|
||||
} else if (_stop_tag->len && c == _stop_tag->tag[match_pos]) {
|
||||
match_pos++;
|
||||
if (match_pos == _stop_tag->len) {
|
||||
_stop_tag->found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
|
|
@ -830,6 +846,7 @@ void ATHandler::resp_start(const char *prefix, bool stop)
|
|||
return;
|
||||
}
|
||||
|
||||
set_scope(NotSet);
|
||||
// Try get as much data as possible
|
||||
rewind_buffer();
|
||||
(void)fill_buffer(false);
|
||||
|
|
|
|||
Loading…
Reference in New Issue