From 723e913bccdc579b471903aee8f2e43cfc9f52ab Mon Sep 17 00:00:00 2001 From: Mirela Chirica Date: Wed, 26 Sep 2018 13:00:32 +0300 Subject: [PATCH] Cellular: AT handler read string up to delimiter or stop tag --- .../framework/AT/athandler/athandlertest.cpp | 27 +++++++++++----- features/cellular/framework/AT/ATHandler.cpp | 31 ++++++++++++++----- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/UNITTESTS/features/cellular/framework/AT/athandler/athandlertest.cpp b/UNITTESTS/features/cellular/framework/AT/athandler/athandlertest.cpp index 7a49a70c42..cd08f2759c 100644 --- a/UNITTESTS/features/cellular/framework/AT/athandler/athandlertest.cpp +++ b/UNITTESTS/features/cellular/framework/AT/athandler/athandlertest.cpp @@ -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"; diff --git a/features/cellular/framework/AT/ATHandler.cpp b/features/cellular/framework/AT/ATHandler.cpp index e3c6cdd39d..34db1ee665 100644 --- a/features/cellular/framework/AT/ATHandler.cpp +++ b/features/cellular/framework/AT/ATHandler.cpp @@ -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);