From 2c67fb606922b29c90168cc55d8fcb067306807b Mon Sep 17 00:00:00 2001 From: Christos Choutouridis Date: Wed, 22 Sep 2021 22:27:00 +0300 Subject: [PATCH] WIP: BG95/sequencer --- include/drv/BG95_base.h | 105 +++++++++++++++++++------------------- include/utils/sequencer.h | 3 +- test/tests/BG95_base.cpp | 11 +++- 3 files changed, 64 insertions(+), 55 deletions(-) diff --git a/include/drv/BG95_base.h b/include/drv/BG95_base.h index 1c94318..9e9e9cd 100644 --- a/include/drv/BG95_base.h +++ b/include/drv/BG95_base.h @@ -175,7 +175,33 @@ class BG95_base //! \name Private functionality //! @{ private: + template + ptrdiff_t parse (char* str, size_t n, char next, T& value) { + auto next_ptr = std::find(str, &str[n], next); + char save = *next_ptr; + *next_ptr =0; + + if constexpr (std::is_same_v, int>) { + sscanf(str, "%d", &value); + } else if (std::is_same_v, float>) { + sscanf(str, "%f", &value); + } else if (std::is_same_v, double>) { + sscanf(str, "%lf", &value); + } else if (std::is_same_v, char>) { + sscanf(str, "%c", &value); + } + *next_ptr = save; + return next_ptr - str; + } + ptrdiff_t parse (char* str, size_t n, char next, char* value) { + auto next_ptr = std::find(str, &str[n], next); + char save = *next_ptr; + *next_ptr =0; + strcpy(value, str); + *next_ptr = save; + return next_ptr - str; + } //! @} //! \name public functionality @@ -222,6 +248,33 @@ class BG95_base return 0; } + // cmd: "AT+CREG?" + // expected: "\r\n+CREG: 0,%\r\n\r\nOK\r\n" + template + bool command (const char* cmd, const str_view_t expected, T& t) { + char buffer[N]; + + transmit(cmd); + + for (size_t pos =0, i=0, j=0 ; pos < expected.size(); pos += j) { + str_view_t ex = expected.substr(pos); // get starting point of expected + size_t sz = receive(buffer, 1); // load the answer + for (i=0, j=0 ; i - bool configure (const script_t& script) { - return base_type::run (script); - } - -// // General API -// static constexpr typename base_type::handle_t error_handle_ = { -// "ERROR", match_t::CONTAINS, nullptr, action_t::EXIT_ERROR, 0 -// }; - - template - void parse (char* str, size_t n, char next, T value) { - auto next_ptr = std::find(str, &str[n], next); - char save = *next_ptr; - *next_ptr =0; - - if constexpr (std::is_same_v, int>) { - sscanf(str, "%d", &value); - } else if (std::is_same_v, float>) { - sscanf(str, "%f", &value); - } else if (std::is_same_v, double>) { - sscanf(str, "%lf", &value); - } else if (std::is_same_v, char>) { - sscanf(str, "%c", &value); - } else if (std::is_same_v, char*>) { - strcpy(value, str); - } - *next_ptr = save; - } - - // cmd: "AT+CREG?" - // expected: "\r\n+CREG: 0,%\r\nOK\r\n" - template - bool command (const str_view_t cmd, const str_view_t expected, T& t) { - char buffer[N]; - - transmit(cmd); - - for (size_t pos =0 ; pos < expected.size(); ) { - str_view_t ex = expected.substr(pos); // get starting point of expected - size_t sz = receive(buffer, 1); // load the answer - for (size_t i ; i; using range_t = typename Cont_t::range_t; //! \name Public types @@ -186,6 +185,8 @@ class sequencer { */ template using script_t = std::array, Nrecords>; + + using str_view_t = std::basic_string_view; //! @} diff --git a/test/tests/BG95_base.cpp b/test/tests/BG95_base.cpp index 2958a04..b1c0e97 100644 --- a/test/tests/BG95_base.cpp +++ b/test/tests/BG95_base.cpp @@ -262,8 +262,15 @@ namespace test_bg95_base { modem.inetd(false); while (lock.load(std::memory_order_acquire)); }); - EXPECT_EQ (modem.registered(), true); - lock.store(false, std::memory_order_acq_rel); + int status; + EXPECT_EQ (modem.command("AT+CREG?\r\n", "\r\n+CREG: 0,%\r\n\r\nOK\r\n", status), true); + EXPECT_EQ (status, 5); + + char substr[32]; + EXPECT_EQ (modem.command("AT+CREG?\r\n", "\r\n%\r\n\r\nOK\r\n", substr), true); + EXPECT_EQ (strcmp("+CREG: 0,5", substr), 0); + + lock.store(false, std::memory_order_acq_rel); // stop and join inetd th1.join(); }