From dc00afaad3fc80328fca1867eb1c793eb4f31866 Mon Sep 17 00:00:00 2001 From: breichel Date: Wed, 3 Feb 2021 09:04:33 +0100 Subject: [PATCH] [EGD-5599] Change AT and DLC channels for big return Change which allow to handle large return from at commands both via UART and DLC-Commands --- enabled_unittests | 4 + module-cellular/CMakeLists.txt | 1 + module-cellular/Modem/ATCommon.cpp | 87 +------ module-cellular/Modem/ATCommon.hpp | 6 +- module-cellular/Modem/ATParser.cpp | 4 +- module-cellular/Modem/ATParser.hpp | 2 +- module-cellular/Modem/ATStream.cpp | 214 ++++++++++++++++++ module-cellular/Modem/ATStream.hpp | 52 +++++ module-cellular/Modem/BaseChannel.hpp | 2 +- module-cellular/Modem/TS0710/DLC_channel.cpp | 4 +- module-cellular/Modem/TS0710/DLC_channel.h | 2 +- module-cellular/Modem/doc/ATStream.md | 36 +++ module-cellular/Modem/doc/Images/atstream.png | Bin 0 -> 41922 bytes .../Modem/doc/Images/class_channel.png | Bin 0 -> 11298 bytes .../Modem/doc/Images/current_volte_on.png | Bin 0 -> 13302 bytes .../Modem/doc/Images/mudita_logo.png | Bin 0 -> 2910 bytes module-cellular/Modem/doc/Images/volte_on.png | Bin 0 -> 34865 bytes module-cellular/Modem/doc/scripts/atstream.pu | 49 ++++ .../Modem/doc/scripts/class_channel.pu | 12 + module-cellular/at/Result.hpp | 4 +- module-cellular/test/CMakeLists.txt | 9 + .../test/mock/AtCommon_channel.hpp | 4 +- module-cellular/test/unittest_ATStream.cpp | 95 ++++++++ 23 files changed, 497 insertions(+), 90 deletions(-) create mode 100644 module-cellular/Modem/ATStream.cpp create mode 100644 module-cellular/Modem/ATStream.hpp create mode 100644 module-cellular/Modem/doc/ATStream.md create mode 100644 module-cellular/Modem/doc/Images/atstream.png create mode 100644 module-cellular/Modem/doc/Images/class_channel.png create mode 100644 module-cellular/Modem/doc/Images/current_volte_on.png create mode 100644 module-cellular/Modem/doc/Images/mudita_logo.png create mode 100644 module-cellular/Modem/doc/Images/volte_on.png create mode 100644 module-cellular/Modem/doc/scripts/atstream.pu create mode 100644 module-cellular/Modem/doc/scripts/class_channel.pu create mode 100644 module-cellular/test/unittest_ATStream.cpp diff --git a/enabled_unittests b/enabled_unittests index 9c4354e90b0ba0aa94e81736936ca79f491ab8c1..b288e4baa5eb31f667284375ce3993a21faacc61 100644 --- a/enabled_unittests +++ b/enabled_unittests @@ -222,6 +222,10 @@ TESTS_LIST["catch2-unittest_parse_CSCA"]=" CSCA set data; " #--------- +TESTS_LIST["catch2-unittest_ATStream"]=" + Channel Test- AT return parser; +" +#--------- TESTS_LIST["catch2-utils"]=" Split tests; toNumeric tests; diff --git a/module-cellular/CMakeLists.txt b/module-cellular/CMakeLists.txt index 0d7d2f043fa130bb1571d2128b414e3b9a21f33c..87498b8a243c604c0664aa0198e1124eafa7644b 100644 --- a/module-cellular/CMakeLists.txt +++ b/module-cellular/CMakeLists.txt @@ -7,6 +7,7 @@ include(SerialPort) set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Modem/ATParser.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/Modem/ATStream.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Modem/ATCommon.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Modem/TS0710/DLC_channel.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Modem/TS0710/TS0710.cpp diff --git a/module-cellular/Modem/ATCommon.cpp b/module-cellular/Modem/ATCommon.cpp index 4d464af08368dbdfa18a9dc07ed2f4aff62b7e87..41bd2a648d740c703d449cae385e7472a898fbdd 100644 --- a/module-cellular/Modem/ATCommon.cpp +++ b/module-cellular/Modem/ATCommon.cpp @@ -10,6 +10,7 @@ #include #include // for PRIu32 #include +#include "ATStream.hpp" using namespace at; @@ -24,37 +25,6 @@ const std::string Channel::CMS_ERROR = "+CMS ERROR:"; // const std::string Channel::RING = "RING"; // const std::string Channel::NO_DIALTONE = "NO DIALTONE"; -Result::Code Channel::at_check(const std::vector &arr) -{ - if (arr.size()) { - for (auto el : arr) { - if (el.compare(0, OK.length(), OK) == 0) { - return Result::Code::OK; - } - else if (el.compare(0, ERROR.length(), ERROR) == 0) { - return Result::Code::ERROR; - } - } - } - return Result::Code::NONE; -} - -bool Channel::at_check_cmx_error(const std::string &CMX, const std::vector &arr, uint32_t &errcode) -{ - if (arr.size()) { - for (auto cmxerr : arr) { - if (cmxerr.compare(0, CMX.length(), CMX) == 0) { - auto serr = utils::trim(cmxerr.substr(CMX.length(), cmxerr.length() - CMX.length())); - int parsedVal = 0; - auto ret = utils::toNumeric(serr, parsedVal); - errcode = parsedVal; - return ret; - } - } - } - return false; -} - void Channel::cmd_log(std::string cmd, const Result &result, uint32_t timeout) { cmd.erase(std::remove(cmd.begin(), cmd.end(), '\r'), cmd.end()); @@ -97,64 +67,29 @@ Result Channel::cmd(const std::string &cmd, std::chrono::milliseconds timeout, s cmd_init(); std::string cmdFixed = formatCommand(cmd); + cmd_send(cmdFixed); uint32_t currentTime = cpp_freertos::Ticks::GetTicks(); uint32_t timeoutNeeded = ((timeout.count() == UINT32_MAX) ? UINT32_MAX : currentTime + timeout.count()); uint32_t timeElapsed = currentTime; + ATStream atStream(rxCount); + while (true) { if (timeoutNeeded != UINT32_MAX && timeElapsed >= timeoutNeeded) { result.code = Result::Code::TIMEOUT; break; } - auto ret = ulTaskNotifyTake(pdTRUE, timeoutNeeded - timeElapsed); - timeElapsed = cpp_freertos::Ticks::GetTicks(); - if (ret != 0u) { - std::vector ret = cmd_receive(); - - result.response.insert(std::end(result.response), std::begin(ret), std::end(ret)); - - uint32_t errcode = 0; - if (at_check_cmx_error(CME_ERROR, ret, errcode)) { - result.code = - Result::Code::ERROR; // setup error but in this case error from +CME ERROR with valid errorCode - auto tmp_ec = magic_enum::enum_cast(errcode); - if (tmp_ec.has_value()) { - LOG_ERROR("%s", utils::enumToString(tmp_ec.value()).c_str()); - result.errorCode = tmp_ec.value(); - } - else { - LOG_ERROR("Unknow CME error code %" PRIu32, errcode); - result.errorCode = at::EquipmentErrorCode::Unknown; - } - break; - } - - if (at_check_cmx_error(CMS_ERROR, ret, errcode)) { - result.code = - Result::Code::ERROR; // setup error but in this case error from +CME ERROR with valid errorCode + auto taskUnlocked = ulTaskNotifyTake(pdTRUE, timeoutNeeded - timeElapsed); + timeElapsed = cpp_freertos::Ticks::GetTicks(); - auto atmp_ec = magic_enum::enum_cast(errcode); + if (taskUnlocked) { + atStream.write(cmd_receive()); - if (atmp_ec.has_value()) { - LOG_ERROR("%s", utils::enumToString(atmp_ec.value()).c_str()); - result.errorCode = atmp_ec.value(); - } - else { - LOG_ERROR("Unknow CMS error code %" PRIu32, errcode); - result.errorCode = at::NetworkErrorCode::Unknown; - } - break; - } - - result.code = at_check(ret); - if (result.code != Result::Code::NONE) { - break; - } - if (rxCount != 0 && result.response.size() >= rxCount) { - result.code = Result::Code::TOKENS; + if (atStream.isReady()) { + result = atStream.getResult(); break; } } @@ -175,7 +110,7 @@ auto Channel::cmd(const at::Cmd &at) -> Result auto Channel::cmd(const at::AT &at) -> Result { - auto cmd = at::factory(at); + auto cmd = at::factory(at); auto time = utils::time::Scoped("Time to run at command" + cmd.getCmd()); return this->cmd(cmd); } diff --git a/module-cellular/Modem/ATCommon.hpp b/module-cellular/Modem/ATCommon.hpp index 47ae65e36180dafb17c8a6bbb56bfe7fa5a4131c..3ca8a8f337da233f16f501be395ce673d20be204 100644 --- a/module-cellular/Modem/ATCommon.hpp +++ b/module-cellular/Modem/ATCommon.hpp @@ -16,6 +16,8 @@ namespace sys namespace at { + constexpr auto delimiter = "\r\n"; /// use std::strlen() + class Channel : public BaseChannel { protected: @@ -45,10 +47,6 @@ namespace at size_t rxCount = 0) -> Result final; virtual auto cmd(const at::AT &at) -> Result final; virtual auto cmd(const at::Cmd &at) -> Result final; - /// check for OK, ERROR in string in last token - virtual Result::Code at_check(const std::vector &arr); - /// check for +CME ERROR: errors if exists in last token - virtual bool at_check_cmx_error(const std::string &CMX, const std::vector &arr, uint32_t &errcode); virtual void cmd_log(std::string cmd, const Result &result, uint32_t timeout) final; virtual auto ProcessNewData(sys::Service *service) -> int { diff --git a/module-cellular/Modem/ATParser.cpp b/module-cellular/Modem/ATParser.cpp index dc335aa3911327b95055fd5da9c19391c7c85d30..6eac0d506f761054acf7131c81b48812136a1b0d 100644 --- a/module-cellular/Modem/ATParser.cpp +++ b/module-cellular/Modem/ATParser.cpp @@ -113,10 +113,10 @@ void ATParser::cmd_send(std::string cmd) cellular->Write(const_cast(cmd.c_str()), cmd.size()); } -std::vector ATParser::cmd_receive() +std::string ATParser::cmd_receive() { cpp_freertos::LockGuard lock(mutex); - return utils::split(responseBuffer, "\r\n"); + return responseBuffer; } void ATParser::cmd_post() diff --git a/module-cellular/Modem/ATParser.hpp b/module-cellular/Modem/ATParser.hpp index 352b52688c9956bba5ab435b2ab7e9347e6fe1eb..cff6a9b5fe676b986f3da7a92c2db5480de17d4b 100644 --- a/module-cellular/Modem/ATParser.hpp +++ b/module-cellular/Modem/ATParser.hpp @@ -38,7 +38,7 @@ class ATParser : public at::Channel virtual void cmd_init() override final; virtual void cmd_send(std::string cmd) override final; - virtual std::vector cmd_receive() override final; + virtual std::string cmd_receive() override final; virtual void cmd_post() override final; private: diff --git a/module-cellular/Modem/ATStream.cpp b/module-cellular/Modem/ATStream.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2921fdaf61a8fb5d4ed1e6422b4b6440a802b4a0 --- /dev/null +++ b/module-cellular/Modem/ATStream.cpp @@ -0,0 +1,214 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "ATStream.hpp" + +#include "ATCommon.hpp" +namespace at +{ + + Result::Code ATStream::parseState(const std::string &state, uint32_t &errcode) + { + const std::map convert_map = { + {Channel::OK, Result::Code::OK}, + {Channel::ERROR, Result::Code::ERROR}, + {Channel::CME_ERROR, Result::Code::CME_ERROR}, + {Channel::CMS_ERROR, Result::Code::CMS_ERROR}, + + }; + + auto it = convert_map.find(state); + if (it != convert_map.end()) { + if ((it->second == Result::Code::CME_ERROR) || (it->second == Result::Code::CMS_ERROR)) { + return Result::Code::PARSING_ERROR; + } + return it->second; + } + + auto cmxErrorTest = state.substr(0, Channel::CME_ERROR.length()); /// same length for CMS + + it = convert_map.find(cmxErrorTest); + if ((it != convert_map.end()) && + ((it->second == Result::Code::CME_ERROR) || (it->second == Result::Code::CMS_ERROR))) { + auto serr = + utils::trim(state.substr(Channel::CME_ERROR.length(), state.length() - Channel::CME_ERROR.length())); + if (serr.length() == 0) { + return Result::Code::PARSING_ERROR; + } + int parsedVal = 0; + auto ret = utils::toNumeric(serr, parsedVal); + if (!ret) { + return Result::Code::PARSING_ERROR; + } + errcode = parsedVal; + return it->second; + } + + return Result::Code::NONE; + } + + void ATStream::checkError() + { + if (result.code == Result::Code::CME_ERROR) { + result.code = + Result::Code::ERROR; // setup error but in this case error from +CME ERROR with valid errorCode + auto tmp_ec = magic_enum::enum_cast(errcode); + if (tmp_ec.has_value()) { + LOG_ERROR("%s", utils::enumToString(tmp_ec.value()).c_str()); + result.errorCode = tmp_ec.value(); + } + else { + LOG_ERROR("Unknow CME error code %" PRIu32, errcode); + result.errorCode = at::EquipmentErrorCode::Unknown; + } + } + + if (result.code == Result::Code::CMS_ERROR) { + result.code = + Result::Code::ERROR; // setup error but in this case error from +CME ERROR with valid errorCode + + auto atmp_ec = magic_enum::enum_cast(errcode); + + if (atmp_ec.has_value()) { + LOG_ERROR("%s", utils::enumToString(atmp_ec.value()).c_str()); + result.errorCode = atmp_ec.value(); + } + else { + LOG_ERROR("Unknow CMS error code %" PRIu32, errcode); + result.errorCode = at::NetworkErrorCode::Unknown; + } + } + } + + bool ATStream::checkATBegin() + { + auto pos = atBuffer.find(at::delimiter, std::strlen(at::delimiter)); + if (pos != std::string::npos) { + beginChecked = true; + std::string rr = atBuffer.substr(std::strlen(at::delimiter), pos - std::strlen(at::delimiter)).c_str(); + auto code = parseState(rr, errcode); + if (code != Result::Code::NONE) { + result.code = code; + return true; + } + } + return false; + } + + bool ATStream::checkATEnd() + { + auto pos = atBuffer.rfind(at::delimiter); + if (pos != std::string::npos) { + auto pos2 = atBuffer.rfind(at::delimiter, pos - std::strlen(at::delimiter)); + if (pos2 != std::string::npos) { + std::string rr = + atBuffer.substr(pos2 + std::strlen(at::delimiter), pos - pos2 - std::strlen(at::delimiter)).c_str(); + auto code = parseState(rr, errcode); + if (code != Result::Code::NONE) { + result.code = code; + return true; + } + } + } + + return false; + } + + void ATStream::countLines() + { + if (rxCount != 0) { + auto pos = atBuffer.find(at::delimiter, lastPos); + while (pos != std::string::npos) { + /// do not count empty lines, see implementation of utils:split + if ((lastPos) != pos) { + lineCounter++; + } + lastPos = pos + std::strlen(at::delimiter); + pos = atBuffer.find(at::delimiter, lastPos); + } + } + } + + bool ATStream::parse() + { + /// check for return at the begin eg X + if ((!beginChecked) && (atBuffer.length() > minATCmdRet) && (atBuffer[0] == '\r') && (atBuffer[1] == '\n')) { + if (checkATBegin()) { + atAtTheBegin = true; + /** + * This is a compromise between the certainty of getting all the elements and the waiting time. + * In case if we always waited, the waiting time would be equal timeout. + * In this case, we wait for a specified number of commands, + * the wrong one may result in returning incorrect / incomplete values. + * It only applies to a group of specific commands like AT + QPING, in which the result (OK) + * is returned at the beginning, followed by information. This could happen only if we not fit + * in one return of cmd_receive return. + */ + if (rxCount == 0) { + return true; + } + } + } + countLines(); + /** + * Check for pattern XXX at the end or check counted lines + * XXX must be one of AT return codes + */ + if (atAtTheBegin) { + if (rxCount <= (lineCounter)) { + return true; + } + } + else { + if (checkATEnd()) { + return true; + } + } + + return false; + } + + /** + * + * @param buffer + * @return false if could not write (mean ready). Reset to write again + */ + bool ATStream::write(const std::string &buffer) + { + if (isATReady) { + return false; + } + atBuffer += buffer; + if (parse()) { + isATReady = true; + + auto fullRet = utils::split(atBuffer, at::delimiter); + result.response.insert(std::end(result.response), std::begin(fullRet), std::end(fullRet)); + + checkError(); + + if (rxCount != 0 && result.response.size() > rxCount) { + result.code = Result::Code::TOKENS; + } + return false; + } + else { + + return true; + } + } + + void ATStream::reset() + { + result.code = Result::Code::NONE; + result.response.clear(); + result.errorCode = at::EquipmentErrorCode::NoInformation; + atAtTheBegin = false; + beginChecked = false; + lastPos = 0; + lineCounter = 0; + atBuffer = {}; + isATReady = false; + errcode = 0; + } +} // namespace at \ No newline at end of file diff --git a/module-cellular/Modem/ATStream.hpp b/module-cellular/Modem/ATStream.hpp new file mode 100644 index 0000000000000000000000000000000000000000..b5d301c5f389d4ab146c0dab3a3ec00148291131 --- /dev/null +++ b/module-cellular/Modem/ATStream.hpp @@ -0,0 +1,52 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include +#include + +namespace at +{ + constexpr auto minATCmdRet = 5; /// minimum return from AT in command mode "X" + + class ATStream + { + + private: + at::Result result; + bool atAtTheBegin = false; /// case for commands like QPING + bool beginChecked = false; + size_t lastPos = 0; + size_t lineCounter = 0; + size_t rxCount = 0; + std::string atBuffer = {}; + bool isATReady = false; + uint32_t errcode = 0; + + protected: + bool checkATBegin(); + bool checkATEnd(); + void checkError(); + bool parse(); + void countLines(); + + public: + ATStream(size_t rxCount = 0) : rxCount(rxCount) + {} + + bool write(const std::string &buffer); + bool isReady() + { + return isATReady; + } + void reset(); + at::Result getResult() + { + return result; + } + + Result::Code parseState(const std::string &state, uint32_t &errcode); + }; + +} // namespace at diff --git a/module-cellular/Modem/BaseChannel.hpp b/module-cellular/Modem/BaseChannel.hpp index 26b02d11f53c5eb0a9b35119e20ba83941b16c0f..392f6ce55558a40d6ce1b24ba5218562bd43beb8 100644 --- a/module-cellular/Modem/BaseChannel.hpp +++ b/module-cellular/Modem/BaseChannel.hpp @@ -30,7 +30,7 @@ namespace at {} virtual void cmd_init() = 0; virtual void cmd_send(std::string cmd) = 0; - virtual std::vector cmd_receive() = 0; + virtual std::string cmd_receive() = 0; virtual void cmd_post() = 0; /// } }; diff --git a/module-cellular/Modem/TS0710/DLC_channel.cpp b/module-cellular/Modem/TS0710/DLC_channel.cpp index e0992c3fd00d269878523ccb52dd8657bf414794..8420ba3af56cb9f880fc1125086627462da96299 100644 --- a/module-cellular/Modem/TS0710/DLC_channel.cpp +++ b/module-cellular/Modem/TS0710/DLC_channel.cpp @@ -99,7 +99,7 @@ void DLC_channel::cmd_send(std::string cmd) SendData(data); } -std::vector DLC_channel::cmd_receive() +std::string DLC_channel::cmd_receive() { cpp_freertos::LockGuard lock(mutex); TS0710_Frame::frame_t frame; @@ -128,7 +128,7 @@ std::vector DLC_channel::cmd_receive() deserialisedData += str; } mFrames.clear(); - return utils::split(deserialisedData, "\r\n"); + return deserialisedData; } void DLC_channel::cmd_post() diff --git a/module-cellular/Modem/TS0710/DLC_channel.h b/module-cellular/Modem/TS0710/DLC_channel.h index 36f802bb0763f53821724a09d166182c5bc6dfd7..5a9a4e11fda1b75b9bc3825e5bd55942a6936a51 100644 --- a/module-cellular/Modem/TS0710/DLC_channel.h +++ b/module-cellular/Modem/TS0710/DLC_channel.h @@ -69,7 +69,7 @@ class DLC_channel : public at::Channel virtual void cmd_init() override final; virtual void cmd_send(std::string cmd) override final; - virtual std::vector cmd_receive() override final; + virtual std::string cmd_receive() override final; virtual void cmd_post() override final; std::vector SendCommandPrompt(const char *cmd, size_t rxCount, uint32_t timeout = 300); diff --git a/module-cellular/Modem/doc/ATStream.md b/module-cellular/Modem/doc/ATStream.md new file mode 100644 index 0000000000000000000000000000000000000000..719338d8fbc04ab9ab2dfee97b7245ddcc4b532f --- /dev/null +++ b/module-cellular/Modem/doc/ATStream.md @@ -0,0 +1,36 @@ +![alt text](./Images/mudita_logo.png "MUDITA") + +# Channel implementation + +## Table of contents +1. [History](#history) +2. [Scope](#scope) +3. [Current implementation](#currentimpl) + + +## History + +| Authors | Change description | Status | Modification date | +| ----------------- | ------------------------- | ------ | ----------------- | +| Bartosz Reichel | Initial version | Draft | 2021.02.10 | + + +## Scope +Description of dependencies for channel and ATStream usage + + + +## Current implementation + + +![alt text](./Images/class_channel.png "Class diagram for channel") + +When initializing the modem, communication is direct via the UART channel through the ATParser channel (AT commands). +At CMUX configuration, the channel for AT commands is represented by DLC_Channel (see Channel::Commands and also +Channel::Notifications and Channel::Data). + +Both ATParser and DLC_Channel use ATStream (in Channel) for parsing AT command. ATStream parse AT commands in terms of correctness /return (not the selected command) + +below way of how ATStream parse command (especially such strange like QPING) + +![alt text](./Images/atstream.png "ATStream write flow") \ No newline at end of file diff --git a/module-cellular/Modem/doc/Images/atstream.png b/module-cellular/Modem/doc/Images/atstream.png new file mode 100644 index 0000000000000000000000000000000000000000..d606a4101b7344ce9ab5f0d9c14073c6f569499f GIT binary patch literal 41922 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

j@=3f=6 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 literal 0 HcmV?d00001 diff --git a/module-cellular/Modem/doc/Images/class_channel.png b/module-cellular/Modem/doc/Images/class_channel.png new file mode 100644 index 0000000000000000000000000000000000000000..5201f866b17399b27439046ccffa9428b936a0b6 GIT binary patch literal 11298 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 mf3%z=`Xj!z| z2YJ%exKNo^il1|5UQox%=c{VYT#zD=cT!baDn8n&rhzHb%^R8`e2b?P;l1o_pzZc< zY81%+V*DW4&Qnj@e^~GE7dBfz5DNK^-B}6bJK?YW72}y*)%ZSAn**sYJ*`qY;!4Bw8=3OltxQY6O<3G3D9K0V8Fin%j+khwMPJf3+cyZtMJ(7zYCWotH{+F!Wrubt9i}bpFnET(P`$TrFC6!)N(|O7v<{M zLWOL@Ab(BZK@|C>;i3@0%z(uJ&4la(23YoxO-8auu8)TXi`7ySd0WR%b3(vPMWX$- zSl~*B*lY}t!IS3ZD1S6no^_A5KF0Q=Bdv+JdyBN9jri;O;v-nwh+HHzKp;e!Ws#2# zztzgJKM8&5iJeg-M|JtfRXC6rrM#J06yb(S_)4xhc0cC|r1eBf4)vIll0Vwk?w>x^ zvO0Ucft}H~GL+;5yX}<*#qB~!cy`1ND(ILeY}VXjQpy=&#A%_&9xU%c!KVP#Q4n9d zlvD^{Zc;k{9-ge#8EX|D>jWM&rBo4NI%*tg#b1YGnT&U8zDB3@c9H-ZiTtbr!l zhtjUe`g51@wlZAPy{}B0e;_;HSWQkGv>A&C33V@>hJ;wd-x?+q_N82jz8yat@8so* zP5vcFL;`D5snTJK2?`861AlD6yD$YPhqIcandlh8fs}j{T0|T^lcJw-;uqH>Y-!0% zLF8j?HX@6}*W3dgo+zJLV%FydZN%=X%My*3Q|&<6>9$=_-^I#2il zxG|9dnk?WfAYY@0N;~+Xhequ9PP>?^S!Y?sl^*Ly7q8js4}c7lMs{B_V?cuPistsIO)sY-eZY!wa@>;v!aqhE$;NJq`zSA|3N=pWRO$RXCg}014z7uD;zMt zy4DU|{0N3K`@P#;CUslai__m1*H^+1>LAeDA2krz_m5M}{$G6jQ+_(k!6vd_>>3Vn znE2&EC9{<)pDRdU<5Tun$DAYf$VMZ8vRRrC8;_jl-R}Y{Zy-*ta?hjnd+zFdHVBPq zE!(Ify6oDG#faf^hyYD^84x$JY^viiR|J6gx}i5GhZV%}A@bo|mRHNduEgo8u&3ME zuFE`-4f*9uLx^4xSc5X~^_?R-^N-wi_%Asn&Y4exr`$nQpTaNm9X}p_sjeoeH{Df6 zIuTRg@{i1;daPavS@>ka z9Y#39y`E=HP9T95<$DM;^A*t+ecQ^QMlUM0oD|-7Dl&Nz0o?GKnq9kWxbMSy60(kM zOE{Km;k#qLN@e0cS*~7~%C~PU+<5kxT>aE^ZjS7Eb(5-XcO8$1dkMC)j3X%(crWeG zw4~TRhkTSE`_@?Fv|A4Ee#*Iz0MHz0cEdI4iS!j?_9qY1Yc zvS|qrr0+#}K=vBs#1HaxJ$>yl`uxEHmX!}_8w=dEhyy2Rq;5DM(BvWRDweDs6|(Eu znQ?;7*3*rluR0V)!d<~8j~<`&(--VXp#Lb!;u>8)=Qr@R0Lux%ct zYuq||y$7p6ejar{0M;p#s6F@{BFC~wM?|G_2nahP(p6Vtl4{=-J2Q%^jR|e|rvSMK z1Wdam-3Uw7hQ7bny-)^mBsd{f%-ZJD)ibYw9637fx)H9P>epD5?L~rn$@j2TL37J~x}Ho6bOynZwNhhT4a*1!*=S(k%q z)`C1+H6V2w6LlYFW^qsh@bBjAVcug_+6rk)$^f|!{ZRUD&$+I59S#MrDVwSr8Lhgj zLzWvQvZyE$>Pm*+222ZfVicwlhuz&=XfOV{YW9XoEjD8f5J;ned}S4KPXG^Qs|e8) z@Pszj4rAkpg=#$@i;Rw+=U*El6#S7R^Y?tNzs4UJa%4i^~6Csbu1=k!-x{={4J%5k<4GqKXx z_`+>l##eOG0e^*jziMYXWQIDw*v#97V@*=X^)5dIGN66wpk0}~8QK{R?_uGYe#|m7 zA0;K8KVcWIlGv0W-d7n=o?MT5EK~icnYY7{a=~6*T^%5Wvh%3lIP*Ay9Yq|)9VH#R zimN9 literal 0 HcmV?d00001 diff --git a/module-cellular/Modem/doc/Images/mudita_logo.png b/module-cellular/Modem/doc/Images/mudita_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0abaacd50317b3985c41a4db92510a1a6b0a301a GIT binary patch literal 2910 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

Y7H{Av2{j!|v@ z>G@A*s9eXtI(8f?ZlM^>8?iE050 zkT_2;U+-3U;d#7e2~1vv07lI7DmdKb5hXcX?q_8LFhRne9x43JseAhvH5I9eRf>L? z#G#DbR!DRqT%84DzZUqe*1S4POPZ7aMxi<6anJY(fn)DKr*!W z&ourpBQX&V))#(zP{33wXGVPp4JHNlC5!`?CiT#>WPxF8x>oHpep@vsBr(}qXKnFY z%EVmLY;^agz%4vK|EwNdaoVh~+X|7}3*-VjuF34BGzrjv)dZ;g*AC$E>KZ(V9IE##f3@c+?&G4U8=MoG7u}tXkEu0)!o{DkcW@ZWWpbKVNQ<&HuVPqWVX&2T6@ujR!~D3IXV27gzvuKQ zKbO?j&yo_V8OiBkv$!}}bLpKZAJWpWV5Yc;p`hA3*ho&P*A779@RPkgKZ)wBIZSRX zKK{4VNUUbxzMh4?-h8uic&sE12Kh^{a2mpk5Wfqn;Y|ibQd$=k4kL7$zU^)^vdrSB z+Y{mU+u4maU>9b!T=BrByw9b129ka%Mvw5nF6EiExIuSu_k{9&FmcaPK8l4$<37LP zxT{ysX+LgnMvo!BRPX9xR^8uURjhm|1L0u*ezYn7G%-Hh z1|(i$8;yc7QJalC72)z4Lw%viOds7F`Z2-yfwoW$*Hyh+2=L72)BXMUb*h(6tQNb} zJ8Ar}ONB_AtuqW9G3m~p(|_qqA~ErXep2Dcury9&P#Y{L9aoRPfS+UeR4-(?~;g@ zxwQ1MDhz$L{)J$9Mow-v92yDtgDf97tu@fT(oZY^X{#J5o8XDZU!&5UA&Z9@Ekyfh z!0iDoLbT(`MKwwP&_~YGLqyNyXEG3_;2~WWxcK=MLg4#@FIFyicMvUs&YP$9yJf1P z0R$w~)}puOE>ZqZkbYDG`K%+j=3b}2{LK0ScE9k4y%al;$?y9}S`BTeZN54LUd3sq zm#CIUSN>??U537$cM}A-5)hTK{%qy1G|u?4k@dLHFIpKsv9^6J*F-*|o^K}p8AJwy z8QdTfuaG4w5*cyO*HP=Je-|MDm~1wq?YX9JAZrHk^7ig7P?fa6eh={sq@lCKssSl0 zFQ20X4xI7RfR}0`d=4yBVs>OSIRXoNaPQGXe6FRoCeiK8ZT0S^#hB!K*%f+N?M4mssVD8OM{Bu2XGM@L#}^Awx=|$iqL@q~hO+5an$&rmL-TO@*^V zT<%IvxCfWTuF#(Y^SpjkyS1xX)#1tPR2G}DXi-~Fd%Y5+sOEJdOq4kl>Dx(M_pJf_8G``_6K4Sf88;504GUaQ_u9iJVHELCMfX;xJYoUE;~wP zHz^tY{U$iLqrH7;X{n;3LV+IN7Zx1IJx4Z;ETS7`o`tadRm;AguU`a4b-Wi6#^Yjz}D?+kNDeU)Tiy!CMb6+}E zapNbBOV%{Ot=RK*YKjtyX|R{~F4nGB3X|<+FB4(ul|+LOFE4>~`wL!@yMls(HVigw ze-EX!G-UJ^f{B)vmR^ro)K_<-tk$gIqQb*K!R_X#7@xG*H`viw6V*Isd>Iip^`2~w zOX;xQge3^?lHwit(tzfNb5&~X1#wA6#SEO=PB;56f<(#8tp093*KA&foC1y-kjva2 z(rYCxx#@_`_O=YH2UaTK*P$We-g`JWlAgG?Z%edDZA(#&3%|DW-t2sz+YKS!ev7S> zqv=Bb7Fa|lt=!z)7mtP6+3$6jF52L{6L{TfrbKHh7{Wdj>N#+IL zGp4%%l@%3$ds#5L9g0(`Re+BTzXvf}WR6@UC>1UhokG*QIfZVDGJ6pYcYT3m$)$>$ ziz`Yxr_Cg&i16pFn=tcqow~ld@w%nDt@aXWd2!#z#Q@$os*q7?DJk7ED7nk_--=yNpm10UdMqFn=q^sh@-ZGQmOT7%M^) zYb5x#nS%{0NB)Z3ybalc#b9<`^ZQOw7>dkLB|vnM*$^4kEF6vL_B?o47UO%-^){dW$4p?W-5;*yg=I6rW3P;p z7GowO;`Td#uBprlT_*v0WK?9C5Gk}ecbHcE;7{+GdnRHh2#oC#YfZqTtiYknjau=B z8kyeh@tY1No00y;Qn>S{oJu0vRiKF|JtQ<2>1=M_rU!;sga&vf5(ER+5zkl3+itf7mH*(Wyu$ag=Rz zTXC6kbN(&lL+IBq@4%NZ1y*wGQ-6rUqAq?mo3m$&u+R5>UjMb>Q><${6hFco<^Y;- z=o8pEbcfXn;Ew2dR6gNd6_cUzTD)FfTT4z%L@^*zg-E%*@+msm=*49#mZ`5_SX>F; zd%XLb9|7O?92fha@VzV=iugtK=+Wl+Igmxtq=BV}bTzi5|2z(@X|D!udy1uE)Gv^D z%-m1I>+P`3H(-ua6o4gl$O3&_sxPsG0h&pVQkg=?y+FI}DRHulMu$ukiQhtN57BF& zB*9MpDhJuxSo+Cbk-NKyiK7Dc3$41X8Rk z#_adm!oos90b|ZEHgV(U&u>Z+!6eD7@tQdDIQ2-&^~E&%XF>NF6MiqC;+C-3p17CMxj^PUAU`oS6Qq0k*TW=^@P)(26G-l3#j zVV&Fe>h>mzi~RvaDH*h%-Fv*FrxgBCfxbo!#f4@dT#Cwpx=P&FiuuLK2e!x$?3WaL zd_eUGpd_1D$pN4*#7LiJ$9A#rkp6HoG(u|okplw{+#^1ILVUccnp(S-9H1_9_DKQL z@Zq1Dz$v%H$@KBcwS-nqMrSUHsxJFTZN=qMAQ0<1e*)GWfJunt+!_n>h`kAdW@g$~ zz`y~>{vur>(YI$=T-=aWO*qXLfd2Ule3E4pHa`G)7VP|HR(^br}CZfL z-rHZUX=XF&9~tq$eYCf)ltI}&9~C9S<@f9RYhh3Jr0cD@CI_ImCCYDA4f~Kx%-#_k ztZnPJFg)$+1vp0lk`m?_%LdEtD$7lU9N@i?Ong*%m_mje8nq!dI8{A53pfZu1#VDk z_|g7;is&Wc#C}Z%&MI0v0Yr4M6gX{sA1A=tGbl^EtKEbeenjdt9Y_d*32kawTZAbmUPJMrUvl%;{)0OPy%L!%!!?)9W z`bpVu@k`)ty&th(EOA|od|7_PO>e)ferm}1dIQipHNONQ>+(wkH5c}aP|uB%xP0rD zZ{M2a^5>RxP%~V(x`cwL66t{ML9;ttfdCqYsUX%I25d?x*Rl$jc;S8g2TA zfJ}I=@fPdW$?ZNCa~j>tj&kvj>G1Atsh@rYB-+IKD z@#;-;8~m#AYE;k2`GgyV(Gnw2VFE4ielP9NB3t7wJU1q+fBxi0cwXtjhw%uiOn@?K zLJJ533Kzj_w_KeGL?5#ofb(|mcz^%v0B!>HHk?~kFc8<~XnS7Y_e$@XLt-q|yU@9^ z(+4Y~!$1t^@C+8ocWa!zuwh^Q&uRJFrC`b8#%VNnGZ<~`9|wLhy7wE9F$;)tb86I_ z#RlXlXJtxB`K&BX*RX}ylamO{6JdF78?A1N%m~5Z&&+=mP;=e-+R!K#52(56t}ZNK z#=j zH~9tBc^Y^{0+RVlI$9fF5R2r-0Tnm*al|nU{pQ62o^s0G=e?abZ(cfBSZ-D>Wcyu{ zmhq+BgJ$9l7IWPyBVuT$c&_9P_F(z#{@pp9AXbM9Kwzf&2FBdq55t;6xAwEAVM zqKSd`8kgqg2S%fZe*vw&Ja)2s9rY}FCpU&C_dGyWJe*S9JysMp-w^ueJUdbNnsdfo z)>hl!{{Eo~Bvx{xGxLzYzMO9#-W&&hRzN`DAEg2P7F^}7?}3AK24y4smtQ8^`&T<( zMzUr5WcQrt4f)K4J{-rx!&~6JqJQ!P1QlrmR(wie0$DW!PUZIc1JNo*o94L4I=aYc zt5(alm99W?Np!~U694A`vgY^omx6+V@87@2#XSfT=H)&7mck7{nL`TL=DJV-F>phuStI>{aQ%?p~g}xF2I31w``+pQI#q~25~=}Z$kO=ifXr_z0ba5-?o1$^z0e= zAnz6FAKkveJp+Oog+JplG{kkjCu%4y9TM;xbJlItEP$)#h}g3#ukzzHIR*C#WOn0P z^}U`TK1~+Soi$S8cWeo$7{?-QV70yd`Q2`b=&AD4yiHJ^0QmkNZ1+cCCpxwbh1vg|)@!Mzz;jNSe%T|TR)$XesUVm*+Z5azBvXijWfO#>zXeCV= zN_haDWFv!+iHQlXHzqQ&Lx3W{c&CNn$W+ChV?K=dTDiA*=y`#U?YuP}Y*1qJozny} z3ESIsDY_geMzQMY9|Q-b>f|C-U?DpZo-d+Kctg^rjh0AQjLE}-EN;Lku z%Jl&Yr)Ud*XE&(b(15uVsV)|Hv;)6b5Tbs*vD@x7RQsO(7P-<;cB-`P?{HWX)pew8 z4|k=k9eA!(=@sw%>k;3Pud$*{e!uOb#^np>)i&K`lNu8+&kaQkpQ`~+Jf`DM=%nzA zcUN!AR!fTex1CR>>p~hpH#(qBM2goSU)%5fkL_xGVmV#H0Tk)xs@_==uPI@quF-Uu zz3#MiK=|8;8_H5z$)_h?tElZ_fAPxsS4;uyb*Fn|8%t?WElTKO~z>7l)pc|xKu0CB1#S!Bpm-?RfyjyzY#ewbo z;FMPS7$Kn*&bVw}X)c!sbC z>SE#FBu4uQ(Fv`vM-BOvk;CGB zzRuQVT!+w6)%YD*H2VBeknt&yRUu9=#e9=K&!HQ66Ehwo|Zt&v0}Y|S@xfGH|G$^-f9r(vs05}Uu@{X5tA{U71LDyw$>ClT(O5m zdfJ)1<;+uAVC>QU8_9k+=)Nn!2R~rki3E3|d$E0TqE;)Uf1Zmi1Npy<6gItoxK3KMK`D zsmAKv);dDdR)V=+&J2E}m5zE!a+l~e$g^T6%gR!Bh>D65vm3+#T=1FH!{~5&y4s#i zYbPY*ht?U;D16<&j&sZevj}~4AzJovTtP_*b8koc0!PK;_Xwy{%jcc83B4!2U!q@o zbv=ApqMw3V+bypmZs*I27GHcN2Y(j!HA(c>FTh3|7-BP zRoWkA008Z>mqwL3Pi|%MUf5e=$IZ3`UXQOFPF34`ZcfojmNogEzS1f&S<`;o9m@yGbMO7?N4FxlJ~3gPzM zWbT(W%o64>h@(!r#v!8xVTwBh5*-%yJ*cs?1G~l#>;hkq+CQ8ilV3;n4P=Vw2XQbn z+s(nf_u{%DiO~}uQwV&fP|qI?pS|kj-QD*w?-MfjCrAUs} z7nXM@iV28_@}3>_#?uA_1Wdte*xQSBE1y4qek;;?Ful-FOh7K3hnH7#CXNR+Bs)h& zWjkcSKpH>oHFkNDTPK5JbLFGe@W9WEDNm@Y^Yh`}Cq=Bn}=btX*8yp1ude24ljVV=?7Va?R zW9O#nGHh(b-sT^tG?L7bj(&5Wg`vW6mz1*9{drQOR;fX~^$;ac`_f=rKf1@k=rH7m zXBKcYX)WS=RF(f%H+#8InYLjfx5=Ff$CVv$elPrP0GgOiq@W=Un0+Ain2Ipj6`gMj z#@dDXnOhufOuA^4e;WM_hr@YHv|%4*Vkx`2KS_r2tinEl!(`@rd3Hz&4?%Bs|2-lV zNmRIX6S=u|81;y|Gm*zma?tqa_!qxQl{SZ?&tfaBM0d*dmTPC&bo*>~!F*2-)@yKHK{3r(P{t+aA_=JO zyUi)`>{$$zSm}*X7VT1#^CDRD$VZ)^K+*>f9s^t&1hfu`mvABu!^h@7dt#GYbi6MQ z5i1svYFU9-f_wAj<}xcd@l#3J4cgUwi44_{L>SB&WJb)*%rtPkuE#SbdIG*GGl1M% zTKowwZA;&;x6DJ&Zd|7x0_Wr?eaelva6A+p55`~L=*BJ`l0jYMS2BLsX8h{HB{?^=r%>#PD^O53ucgk6RmP8p943s+f(4)z;*X0n)B+F3np5 zECu2B7JyXGUTNmYz(m&$i-V#ptx zjK;g569QePk2F~YAsAMj2ok74xjEK(Q_KTUgUHfjn{>HO695H42)Rfy$qwbZ>A-WwkGwy>$!&0-0&*Go8r&sst+k1fZOSAWkg)Tk^D_3Cag_~OQCAA& zdYmF4F9_U$iYE^5$3EMY9=h~l0WfAbYG+VpG7_jK;V}0Pu zE0od=x{%N7Lhgc*er6s@U26ETC)C^n11nPgyujRNXbH*rUkL-T_rbibl8yda5<%3H@V-bWI5}N->X01&F}p-CddNieyy;q z%G&Z+*G%*n^^#xD%?IO?@7T71KlQAy_xH|Fd~w;)F)=`luP&}s$m>3_vh9IPQS@rM zhw0h}AR3dsq|a6-nL!c8;gYJ2K(M?7q0UVk-6bvAnIMb&&iEHh3as;l=dC`8mc~Dt z{n~;ya~9h4&`0s4CVN7{2eP+NOToacfwN0mCd#!N8w43{zrQv6&2lYwSOb^R6MlYj zS;~=q`lJ*j&>9*V2pbQ;f|^mC(;2sV3K`)Hoki01Pg2|RIQ}P>TuW08d$M)`IS9ma z9PC2=;gl;`Mr@8IfGm#kz)x}B+x@DoB~>9WA|gUd;;7KF(ey={+wRmqsO9H5lg^-& z-~7t$;5G4;GH{Zzva&^w&*P4LFCM46?Vh0+<}rcj#f{e}{qyoj(l24z#^*r6t4BEr zc(TY$VPaUI-_TU3bMSW?+>eCAVq9EP$H$;znJv}?6HVQpmhtZY zUX2g6m5}|O0f6+OC%Dg2;x~R?-6qxd3pxk^z}VFW2$imY3#;l&obHB6yrJX zlb?`;KY8MiL_HBHKx9qMY4+4i?^bs=CiRSvJg5gcIf-IrI*ptmd{kevTRrTw5!ot! zkR7Ku4G}W5v$Hcb{WR&|^oUs4@uU$PspVAsT~Y*DNeL_4i0%0_DB=0^sfg-XLB>63 z=^#3;=|G#kzKrhM;K4|uCSmKrv?XH;+k;=$gZ7&@wT6_7+98qQ(oY*5I2y2;Y zxi7-#KGt1UR#sP6S6p2D{{4F*m+~TD*dSy*W9}J|2(#U6@ZJEW>G_2!y@d*(e^_a8 zscrP||29^=f4+S!oumTAYpnx%B}A+N|)q~Dm4<=(raXM#r!>dW_5 zD$8DXGAJK?Sj@KbII@-tCH0lUWE~_S5iq{(GgGcreA2`Wd-sX;74f|n7JGVEewZSR z|4FTX#-N8)8XLYSh(`=s24h}2%r=OW3H>3@?f0;)rI z$brJ^t07=(2^a}NY>3`g5Z;*42th<5lG*8;r>dR;v5W7xehAQD2m)@3&!yu5H}we_ zP zB&55u)55|cF)@+HUb)%GOVoR3`U$D`K<$=UZW`;UeI&ew=0`HZ3_YL}$U{*~ol)IR zpQqH@+2)L&zbBO)f;WJ)N=qqf!5LLg?K0*~=_(CgH$eVI{i6bwBd9t*dhBUR{&X z2rZ3CSefnUb6lewrPc$f$T`hfR35|0)JR*~fFEF6UX8Ez4Ar34s)H7@enINyyj*U3 z^yWy{7!c^3lr4S1!LcfoM(fQ}@-GBQ5)ojR7*Ez3H<9C)c*DhOIVIj$G_jBNap;I# zKLE*D*S2Ml5?yiEH_V54|EI984v1>|zeN-f5l~X;P&!1qMFBAYk&+q&B!})sL_t76 z6i`V4sexe#ha5sWq$Gy!k`a)hhkASP-uwN$6Tdle9tb zr3Fn}ou1e3kL)n6yi5He$Mxh7Yn>fp$G}4~??JYSn=P#1q^7@Q4WxjoZtf84=rpot z)PMf6flO5gx}9WZZhVm9MA(WY-q~bG6-UpXniRmve=`&v`vwsks6tBD`)nw>Fe?!l ze9T5kgI9b;EiR)J>ZB8$LZ!qJUEw1(4tP1?2yiFBG2k==5g!Vi&Oo>+0}o1OZYV9H zz_$CXgLa^3hV$WiT}7o22vh{q(aOgUTPlw*Uoye&l1>6W1Apz`xrYYPKm?uR^=7G{ zu6-y&SKkr>02Inj$dPi{!%{C+IqzOjYSYt$K=Qb)j*1WdzRan5p6EO<7w#LRgYYYbgt?MUk+Hn7>(Zy%mM3)-Sg(lTdw9wTTs~`=A&ND&E#*rX*i09WYBZZ(b z00UHo>Z1Yy99uY60isdNuN_x~Z|3VD|CaQ@KAU!`e||<<`o#G4c9K)=RmDKL!;NB# z)(&>L=n0TEOw|Smmc_n6AcQ&aiTapcN!d*{&j65(gEXc{PeewHoMkn=9xNHg#xT+U(ECWY zqPSZVV|RcqweHdQPiCz=4btYf)@Kl(M6Ej-J!Dco`aE*vB>L6?P+*_UMcZrnGp2Lv zMP`i`$jFK}n(0lS$J0rdKYH@yBX*ecZgiWEj{_tmW_EaBK*y!7`0YPE0NfzTM|ADp zd3J>DSI=h5_YF71LaO6M#Kib`f%VsFkR}sulta;lSm&$Sl~FXu`-Wz^@zvGUswJbS z&`zdHm!3ySyDj?f&4iV?Mn9YJYp_KQ6M;%853Fy)OVa*q^|O)dQ+0^MtApoZmT|Tc z1;jcrD}9+^A6pRx1=kQ`p$0+Ev-hJjkS35R2@??t|I%)BA<`!*xNhe=@1Z*8R-{9- z*L~U1PX!)(Xw#t8m6Z$L9zTC99PV$9N_)Au6c4{@1cd1*s@8Kg@#D%jgO{>SM;F38 zz$J!No$R2WuV|H&CD|VX{i{6H4~*m!;itk`eXslfh4`aOQ@Sc)|F)UenI>al;Z^5v zAgU~*+v@=?B|9v@Kcy2$;pVFjhOQ>e0Ghk$uB*%In-*ns+xmi5?+bc`74AW%2IjT4 zJ8r;Nu{fvvU0MWL@kw#K-ANd~1M~SbL+=m2F9i!aKpv2wx}PC^$fFpuXBfq|xZk!gdW6+Z-@1UEg@}JT2SN@(9`j?*8(BG=MHkXg@$L`8@ zzeVfqrkuw>FpiyXxAE~lIj(7Lt=pjQE2vWuJn^oFf6lzVgGT3_;Mq!*k~U5!AZ|UafjkD^qqC|KlpBC_4BvUE6e69DHm@ton2JRWTVqpq3w!tgm1 z@x8uPr+>Iivi~cWiEGK9r)Zc_=3i&J$we6J9W~4O1h^FpwQsan~nqJ5TWDLnsNVmL?@ZHbA8YLZ-cX@_Ug>J@H($x3@Qw zVxaMU0wG~*3@gH4Q8^y{dU|dyr0p+ALv3dpZTeyJ3QQX1x^SVa4!6P|MM|;<2iO(% z6*Tg;ii(QuCT_Dw@os{Q=daf&QXwNX@fUVieG%0rVOzZ(HmTLrN;c=$g1GV1nciUL;h|fpe2ddt z2D1NMDSY_&sD=O8M&H`MD24Bbyys8do~VcwjBy3DD`!QuV!BIMJ-m5HO~w98)+$w@ z$ZHQMuzNTJickQ z6Mh3hR~a|+pmzT#H3GlA!$8a8wf9U{Glc~})MTo@B&C1ll;YOA>3cHTAd zw(S*?0s~R{K^veAnX049x)asT>pkfHRZ|@*iK5eF013urqj@A9;v3mMLz;JS&(ul0 zuk@E3jpnUi`}6-!_zGXe6TXQ5P52UK^76_SnHc-m_m`&m8x(c#-T{VcW=8vaT4MmN z<68VcFX*c;9WKB^m5~5=;)VB*X;4)%n$rDINz`jbU^W4d{y3jNw%5)Y+~k3h!i`7j zcUiK0?F_4Dw)JOPnCd9o1h9sY=qvGOc{)fh*`KYr+0;$?5(o)qk1(LR!n;X38U=gK5vL|(+C{#PoS5<1D<5In0@_DcG(hKld%^B^;Ql5ZS8Ff@l@YvZReriN+ z+t$X_@Gs8!_2hRH;LKvn*1v;XjNXX|Lmo2S_)NL>82g2-;>w*iDf|eyUo`{!*_Nqu zdKEQx6I}pI^_>HO37j0Bw>l!g8%8<&^qtwC|K_xLkJD#D29*t5oets^-N*q5^(P7| zEUaKbJB$PLh*SViD)#|Z{O^LzL&a-wAl$P2~*_@PsHmFOq*7(i^ z%MEgtAIvt?MA}}xHk+T?&GG1ytB1$r%Ani4u;ru1+=muPt~D&IYcLvsg$+!8tu4giwBP1aAe{Lf3}oacxXZaP2vh(~tEuHb`texZFl1NREvqaaL;L8N(IF20WYvEG9kJ@>vgn0zEt+wV|8 zwXv5d1re`I`82N2ZP3CT!&V*2&ul{i5AThz2Wb~p<>u|Y%V8kPA40p4#ED>gAr=oN zSFqTI=8_wG{DHMElWh*8?{Vsv-H#%RFnVnqufm!AEz@WKiW4Xy1takMtFjFcMky!FBpei9~FWTKt053Kn2dwG;z zHx{pI_?&LXk>Og;Sxh_xGWMM{6CpibgEIT5M{c zDx}RmbIOxO74YRl0XQ*Fx$E$%oC5*y%sHsP4l}B-P3Sh1|3T!uFKkp#E0(l}W`faD zOQY3D*bY`RZ)<^NvoPOV2f3kvXQT-Eis?`#@O%5!Fro2XZM-5j%HlGI{y<58U0Izm zd8C2x{f5Z$TBXr6d+NXi>^e>p>Qgh*1K>OmmID;~+7}+dQ{ZPvkEtRUlQ+7#66sAh z3Q~QB(-R$4J28~Lnvra)Lf+{V6Ha>FU?~XK@8puUxg7wJ*1I*xZtUmz1X;Ku;E^K! znV~=M#L(k-R8P<7Ia-C0urI`2R?*=iK6|lkoVuQ#E8|W6M+iw$m;-YFXv9P1vX5y< z$bgO?Qa9?AE=D#eY7B;okC5rU4La=K}-aQXGL3kj{KZCNL2>AFaX?qxV*3ll%~d- zx_;qGK=me)t6v-S89#dL^6{f**N68JkClYL3SJS0C8vuek2Gpn9g{w_jm_!%pJJ72RmdHw<0H7Jc-BtY=c$5l3INd-vCD&eAUpoLG_G!}qlD*RV zDQX6|OSsrCe&;PX*IGXJKyN?;Lb7Ue5uw>Vr2`x_H0yXqk#Gp4^vXQUoxuo z*Xv9^Us!`g`ff0b>eB&5s_x0~l^V4BQHpIs1waDi^fb#=@OIPm7{)^Iu*G6pV>wly!GAa-CohBGJx6&`) ze{xq@nTPvMZ+LI~%C9Kk2ioev=moI!7vXm25&8M~BGDmUZxa(?K-D9{8B}@_UW}}p z$mmNRGe357|8=q%>bP^lb5GEW8Jk%Y6&!4!f#w-~*Ir;I2+qq?k*ZRko#D5RItvPr?yB+`Q{4&il!!p}4*RsG)BTi{>!rN;K z$U?%e!HQ7{Z7pquK#2pY&Dq)6xwusKXnu3u&hz}-^CDAj>b38T$&hluD21rSuNEdvz9;5>=q2jC+{@g{`_d@N z@kO^ecR_lbb+)Ml6IV>GW?J-gCIP+bbio#-BbKtMT&Wdf7pRHgA{#t>*<30_HOl>9t?z z?t_THMW4w`S)3l|De#0ASjt!Nn)!%DJ)cEVArHK|GE?XGBo1WC29#ZJU=DDE=L63I z28>)EJRH;F`dvO6bK|+V6b0?kL%F2+t2KzUB zH9!Ox8dLzeOtj1ZWeV6KyU()G%sfjPG~?TC43w^eO)^M(uPXG#+Q#0OK=Wed?Dy$G z4hTmEw>maY01NV9FDW|v@$q-@vMpQArZXer;y0CK$lN^I}xSq!?{ zjjVxNPJPD%Fq$oZGBTjV)1KKSrY7es%-ZUdpxp0Ys`M@X{;;ka02X=~ zAb6)|?J5;e3_J?fccpgd8{nPOJJ_gxdV|x=Gk|1fe*RFsfMgkv={HW#ngVuEz6L1X zn)x0P4G87zZdx)kD4pm?-wv?#0g)1ry(Cvsf$leL>*BA**(!hlPfpMWrIhZ0e!Kzw zms0>E!{H7vk4V||ZCWS(-o)+i+v}-a94!b~OF(kffbL<_zf z^)RV5dws-shZHQ(`?mEt=xz zlkvhTAzEN(5+{0J;61R(#`N)?2!Hh6TOc6$KF_{Bf(uLS^f?H6hpXWVS`SH{k_w2` zWIkBtxaV2pdxdF_@i}3c&$|q02V;lHs^~5z$t7?J098zN(g4_U)*xZvzM@l2 z>;D6g^F-?f4na#I(Pd9|z?$)~Tln>_X3veulewMa6Q)MZAW*=xK!dCOdI;75bJie{ z$qD_b4e5619y+>=Yana+>r2Rc8m~C|hpW&*K5&+~Re)bkiL9QbI^N}XiScQblY30C z@i8PIs~nK9Ujh-~s4Ty(iq4oo{E@!{(Mqz+uX2$T)s>UE%8weEOngpY@@bu6DKn1DxVrR>^?eJom_^gWIeYjtm2w8DBaJ$_=@dT(~n<5%-FpK0)iASFnuMH?53wFX(Z0nM@O?*^< zhm-UzNckBP^`5bl<;|90#JIpcOUZ2M_!Lm}_$=qxu5iS@5MZ6ic4*kpf2;KL6Ye5a z_Z}HZdI6lAREU@zu%p58|G2U{*=op&ypx%Q4^L8K-4um^?{rB!<^)kwdM0xA{$>rM zn6VIp$L%+fa*!~af!3lHn~Q;$TSUylU5s0An1w?tT3WBRToUUGyV$7`wGqh{*mTK6 zyiI>hytZnSx^j;`*AeOYKI zF~XH6!2yNRym&4DMAuHtGqbv?W^v+PS|pn0?%uRSb{`^ zsUn}GxC9HMG}g?3jf?9hKXiX}jJqkjsp-iT#-f_l*{~Ka2zOyycejv$0AO?r;P9+S zb%ICFfm*0s-ekZ;1160`C#+9E}%@5QEATINA&) zk^KdDq2Ft=D!qK#)+!287wGc%#{;!5Il?a_;R0;G+G6eP6D0&MPHU)})D!=@0!d0J zz!Mul&kS@2K7b=|5Ik*ivKv}mBX;9=@L0L#8wT<3R{Wj|+f#vpM+OSx4iapj!~xWB zZ)-L}pLp+GsTfXAXV=&dIGE&Sp@>~vUvDM82An7WGIHGRoe~>6Kj)_Di{r>SY-$?* z`c=Pf--`7I8o_D;dgt#i#`qTK>cQ4H?zwHRDP{u1>dxaF|6y=b?}T1#8hZX*pS-K7e5Gwxopu2dN>;pL6>Ad$n!Fge5mJ-1{;4 z;4q`q9##{SXB=(BMq{iZ)bV|d*+T5H+$NDPU4!E;a7HaIga+RNP5_HI@u-$<(Bl8Q zDX;-(5w!bP|LkZHUTek^a3jh0wowpQygP%|=o!rJIGjO@Kxde#K1?!o-a$UEexsUjxS<4e@4XW(NKZ zqI(0r_adSP2R^=d!6N7HP4a`y{^|7DH2)H9dl{dSr_=Svbe-AY-VLBX+*Q@U57Qj0 zxO3SX;ai0!P`_;~{UD6ten(HW7#y~;($Nyb>LV$727mGL%I3G>My$=DY_OE?g{cWyHjuHAj4ynK(Q2 z^lLJ0Nl5}{anOk@4$5qP=CnuyJF4w153bS+)8DURhtA~kiCrg&cPts=8ieUkE_GK` z(jgEK`D^{yXeGLjG9FZG1O(8Wq;MP}Hg#{1E%(xTRWCA_;C69r^|_&a^-mJf>d zZ18`a{=ydrrb0Wot-)6+5WjPXG2T?Z9V*2vt;J+HgG)49pS8)qeLEY?+^Hp>akCZF z#R~i??$7CRR8{qm;xmrPvMebYXa3N?_;I+}D-*F^v$=G#=*aP{D%B429hnO3W7@6f z&5|U!ftJ@e6ch3KO4$3|-QC80*&|n^16*asa*J~o82WhV&w0o;Yd5a}!Ds) z(=F6@Iq%={N-b7*Z7t@C7dn^1LPIOAUPXRpQ$HRqF>n(cXVHXIE9g%~WPV+)8qd2c z?Q`+!%}2_5-?)!UU8xh9d0OR3j>+2F-R9;p<-^eM^M!aTo|Jd!ReDX@>oH92dKzcV zO>^oW7Z=x2DWu4TofUQuj9aF;x{X91JM?FxRj%jdkr9($h^t_dalgc*daXNUjFsx< za9)viecpPl?4_&HXAT;^DUWv5!)3Gzb%LfdeQD6kh{BxFDxMOK5^0Ap)GtjtuSB5-`_VNcX5mYlE z#)MO0JfwFYz6tsiVvrtma?ngJzDUZZs{F=v$@!`LxSM21#LKXl%ZiiVhQP{c`E>9V zndv2A&0DYT-4m9k^^|cpHl`^O8s%eWZvj1YJf_e-;eqv;>S`iswVvr>l!}`pO_do0 zL%H51S$*FlV&D^YTFBF`PRvTziszb1#lo);&b0l_j;6>=h%rYG5VswlcRP^#w!NA%J3MYD-$ngG0eu}J@>XTs$ z=O1Sbu3lFi{A&2HECl0hPE$AGWsu-!0XG7o z;)~?g`}6IDUKC+tZsVQRC*mKxJ-+C%T{h0XvcvK0vz^)Cx|~uz9TA~>8X9)jCF&R! z1Y5fsJD7*RC4+7uz13di&x{q#{+Hr^gvR*jfT;YXmwP!rQ{B~mb zpVcgLjY?)YZ$KR134_NK#T`ubgy+H3ptVaGCQGnDR=l0r^yA{uA&_`HBh!pqmo0W#S! zJ$GcJUt3xY! zWgHO&8uE;iTrb{%=O8Z0Iqc>BUPpY$(`A@0f+xpka2qOV1Zw5!xz)Xg?+jxi@!>DbW3d-4^Au^x;n#TxKd#l{Z}1KOhlJ#e`3jq z?bOkv_5XZdDXXQzPp(FGY1VW-*qzkqKLxIn! zqu(SyzuJ%zY8N|E>0$0Q-QUt`0sLCPZ0Pr2BkK(v+ev%Vn({o`4H*|85Qq4Ejs9*( zNPp15OGe^Q&5-;^f6mhPMLnKPQ>F{lRT}@p;aU{LQ(RlcU!jL!+`k3!OI8@G#T*?pkR7~4$1l2E>_>g8t%G<7l(m;igere>C4Ye?4mpGB zZf_S!>e9;}bS$T)m`Ap@&p0!Q)6pJUoU2-oHQ1nl&ZHQ@_XxK z7w;yM41LRhB1Q_*Jpj2>3(*X|Nl-p-2Zd6`#naaoEgvb&EVud*s}PQZXl~lY^srYg z)8mY6QZY+S)pF308+9Iua)&td3}$@Xc)|R<>bbuU!pP`?AqmR>?`ZmH-4^~}a@*TI z5W$_aMrZp~=vj8E**?fke)iR{rV?v4__k8sX2>M4IKxRe_rjSCAwSSuHewGnM-|k{ zA5>ajA!4hA8s8?{J-jC>Xz&24NF5t$vkHYyN?6%zn;X6zeR|`y<)t&wt)MrAZ-`{@ zm%4hGBJAw$bG>|BHb%+N4C+kDOij*KWn@gEx4MUO(utbgOycKqvL~4*7Bo)**WoTk6{+g<`ATvolJDfHVjA zL;#(@{{DUgdGOhHD#)06sKjj&vLl0Wsf@79w9N9%p3Eicp?MGPJDzv$giJWnM|=AC zNIOyiV_l}V{;+^^kkZRCPnLU@2baf|XMm?n+T9*dvWV$cci3ar%crGKlm5F8Th?24 zTMq9MQEQI}T9`Rx#2jg%c{`WAyHuB-rYmOZXF9zf04q82*0eZdFz^5XAOb*>K-Q19 zRQcz_pKt%?zrnYEw)=nYbZT+;pM(C(UjMbt|9?}t(KFlon@gD)8HeEK=m?a72tiQ8 z-=%&ouBpXdkBp2A2nfi`%rug|S&j6zhg7-eStPpr8ZNdf9pNnnH)h$49RgLHo2XC( zN%^QPb+W?sN5td|*O;DhX9IK1Euf_`SFxOLi#6N`t9@%mxK zPHb#!Tg>a%ZyjsL^*#8h`g1f%&bcUnfxYzFP=DS~5LV?pLr7&BxPRSK+IK6r;ye4D z&m+f%d-?61P&!% zp56ENNB!nkx<%9P;;Jk1@&cHOV!;cyNGT}jK7o2bLI`mPpc}r~dJV$c1o-*ym;;Ga zV;CixByEMZQZMpBXIGcX>}vTG#l?%j?M?j0See6}+7)s0(EP$e)!BYc#pbO!_f-ul zeZkJ@W7Wc6cq=j$OS5c~GX*zoaVszb*wpsX#NS84l}^CzMXPzH9= z!sujUBHK;fPmt`Dqb`;3B%T9=_7Okk#hD)GY`;yCbh<#ptM+7S<$}6=Jj*U@}ZYie$85Brd`ux;d2Lo^KDEC;7W zg+fh@jo-ZNe|$5!E4yEm;m(~qe=euU0$xSvdc;7>msZ@r1lq0mIz9c=pQFZi+wMD0 zeYwUf@Mf!9h6V0W6IrI;z;z20Bj!62V(@uahL{hz3CjC&box4FqP$<3w-9*WkiM?& zjOK#S+9qzfFB6oN{@&O)V?VlK>pFQAsBU1RYO3iARd{4H1K%|f~ZkOh=c#y`&yvdPt z>Ht2s^%JxHe8BI8_4&JgyNU{%9?`G5PCdX~aG2flO}{tvMM4a}?X`MK+ssM1#cS{8o~j1`n|#UDnDsS6L|ykpPqy>avHuQJEAVhdKBnJcRyZ7oswl;pizlc; zo%olf^UOQekNHcNccPM*o&&5qp*x9RpwUV~e&!O5S=8|n2);eCeCQR$e%P#9TZ;~{ zMw%3P{nl}pbE}W*`EW>*2Zo4m!+Gh$ar28GOL~`96Ov`iH4e8CX}vbgwjUJt38p1H zCInQwE(y*AH_bh z-N{^cBWToKBCJvA*?aUrkWpxt09in4C!3gNX+HA${)yXc;k}b;7z|ccmH>d;8WV6$ z93u$r+S!?HSZva+396ioAFNU258em+8&?Lxd3auEhV;sL>NdHrSER(&3G(rA026R0 z^xCneQD%^)(0CNkvnnvA9~FpUuivTT4NW$VY<{e(Ygsx1LOm(hb|~V#_r^51kSPIb zUfQ{LW7cYX_gkA)Olo{{M`}jrmq990wmaw}icnNnR}r3wt!=jvONfip(bpea^{g76 zN21$ZiikPW3&jv*zj5oeIaR(k8?*FFJtyj|&P6poD+{P&+|lZCmO0A9>P3b3F3B>+N#B5~#JhF8KoyE0ymCjhs>?eD9qY5>un)25!exxfWZ zMLGYA9n16lCVuGB(JJxlY@ao!YIj%1D`fyCCUxw5BAB3#BWY;2C{dcJuP4D`_4uGe zRd1~*2l9dxLLiArUu8r^`=8!;B0yIG0>+TJ)Aaj1!t5RT>eYJyb0a$EG$BKA2shl0 z80Qxg`%+kVG3mmEALbT8*RkKKqZp}UNgHbkssd{hP9psW!b5;{5d}et86o{o}*jh#C{tJg%8_HM4JL|bZu)&@^)}Ach4;BMq$vxbPJLWz5#7-gK_)7+E0km+&f&xMCU4+9pmzkj#HtzUO8 z;n%0=C=V@nhelFdGi_qIEYgkMg#-oF?QaITZLhGWH2Cd0D&M2QvpQ&ECAU|vzfp3o4Vio}i~vN4`Bm71*_gYVK_#jA89ZYP z$c|+vhm=>Lq0gROo4L=(7;~MwCn_dph<7~mu9sNkP^7O`BX(g^%S^V$ISeE(7@;0Sn09L_I= zH&wbF+__E6Px+Giin!gCM`MVo9sp}sb3CcU_U3=6Q+pcy>E;5deTv+^OIYUZZIHbLZW5cr+)r5GhFFoxx4OM^ktJP6t zSr&@8wBC0&MIit(N38+X>La#{9-4jg#IJ8Qu6qa%;7OkOX#4IRC&D&F$& zr~!OFr#~7%!h{Q(SiO$j0lJ;BrqsZirr>Yu;JKor*6Ga`zre#DI|WFEhIL1KIWAuCz60K`jLX7P z`;3=*f!Y{Alq%*c1NTHkVxJ?iwRe%%@Q<2F8v64^re~y=!IZvmR4Yq!Rw238^F2V^ z);hdCadtM=(LHEfZGswSex7{Gel{gSnu)gaLk~%7utiGZw}q`O6;4&Tc>t_-x~Tt} zs1~{Qtf*unj;Hk*o2IHj>2%OmJGZRIecaeGNN?c2Pzt7x zr_Ho4G)zarkrtJcg6MN`3$K>)>sWr+K_YSeKOi0^c45#u^X5()x+M6phpDr+blN^{ zlAr2#o{9pKS!FJ~j^%}_cHuyEVGWNpJq^W0|64hKpBX{If0zNS&)F?6t6j%SIRjP( zges!I>LF9DuVbGgA^1>0C{4CJXz{x#i`-r+6x0p4N~W#ZFe94vV_jU@&Th4 zcfs`7;$iB2)S1w1Qt5i>q6u<^R(de~YI9=s3QnBq+28{6FCpvJiV7Z)s2Ni>R)*jh zN=+uxNXz%`W4aGI?%=1)32`6t<#QyIk7VAcQ8Li*xQ%a(5@2FES&45>pUut@wo8a7 zBC_QPhl9zN&zcO4m^1tam8@B>s=Aq6WK5sXOz`LtmBO!KpI2)+LsC zGG}OfTo`ZehI3QkGuTxU^ z3-ij6a`+fO5#_nLzp(Rqcx15-3!c-D{y4@mA2%#0T}uh18wQgCjjX3Y&Y+U9tW@F8 zi2+`ON{;0?DHVpsMSmo9__DP(;BAeN-1uX`=RK;AUlev>lwSdwlSWf_PLyX^2|Yy@ zkwymQgj^4B5Pg1LVblE6BQUt=`{)@Mbc(Qk)%C-_fM8G#5v!(da>M4)=ZoXN7}$Gk z@4f+*yM8;Xep7(rd+=b2h$!x$O7&{IqTt5nW>>q9wq7oS`qvSh?gp@|N@G|9Bbkfq zF~092)p zsm{%2fY>MF3zlTcP~`SDMt?y(8tJ_esWxZmj7In#OXUM{csrzmPhGqXMknu4IKkVY z`@ka0j`{L-rlqsgufj&?-<{C+sVlMV$6!BftbIMbo(}a;{q=ik=#EGJg$FRztFI#Y zZX%4Oc^=p`pC3e+#-npIlfcV0mB$y+10QuPKHbK8Z3>dljtYQwOl;w=<6$1k8>QZZ zXL%!Sk#F?gJ~?__-LZa_OT%BMq}D^p1)pNNCd@r0SG{dw3*jgDLS0@p5)iMY8b4Xg z_fXg3<;vY&&(W8>>0sfITsP!)JM?Dhs9l>DBV$T0hqug@By_EZ*dNa&khy-nY_ zmL|ZLfLP;eAqDp(7KN5SL#0_Vjco!1#T8}mR*@?D6iaKk7+@cE|$v@y5pJBdx> zBF`3z+&20;nekmZP>wRZqhl5JKuGGsQ*zCbKkXA)&m{9rt?-`?*Hmd++X9_IPLAN8 zBt+Sol=RVM6bM}-RerUCz$Ozf@72IZ#)_Tm7tcDI+0h-zn%&)Gs`lCMO}#Ao=GZKo+z9{w$A#wHgd?T}#`hlf%6%&gFsfZj z&r?l%)SrYQDu`0Gu(Go9^z;Pp6ap?oT~>2N*AX>32xR}_$&`<(uU*lW7^^KJ;OvvJ1u5XTww(;77mgTX3*S#2T|4Ewk{6_4}xv>mN&8m4>ojnb(jnx1(8K zipg+S@yPI1@wW>2tgZ@`by?-ZU=4!YEvo&O?oGudeI5M=YtKa1zX>6LX0os?vm{BFIRe_O_-i_X)UeZ3=K6U`GCqBL_ zu_gn=;D88;jEKN)ZoaBJtH~XiF>0`EH5*95OgTZBatXZo=^fsk(Bqk;nAq^D=ZwvV z4-41b()7+)0Gkgo z*v;wDaFXnPLDCF%- ATStream: Channel use ATStream + +Channel <|-- DLC_channel +Channel <|-- ATParser + +@enduml \ No newline at end of file diff --git a/module-cellular/at/Result.hpp b/module-cellular/at/Result.hpp index b8825a9565332e519af0805dc2034f93c8cca7a1..7b8b6f946221ca3f141f728bc6f1aad655af8ac4 100644 --- a/module-cellular/at/Result.hpp +++ b/module-cellular/at/Result.hpp @@ -17,7 +17,9 @@ namespace at enum class Code { OK, /// at OK - ERROR, /// at ERROR + ERROR, /// at ERROR For compatibility also for CME_ERROR and CMS_ERROR (details in errorCode) + CME_ERROR, /// In case CME error see errorCode + CMS_ERROR, /// In case CMS error see errorCode TIMEOUT, /// at Timeout TOKENS, /// at numbers of tokens needed met NONE, /// no code diff --git a/module-cellular/test/CMakeLists.txt b/module-cellular/test/CMakeLists.txt index a8f026e104e1e14595be4fd37ceb8515027ca8af..4ac978a9cf9ec37827ad4245a49900e24c61edf1 100644 --- a/module-cellular/test/CMakeLists.txt +++ b/module-cellular/test/CMakeLists.txt @@ -28,3 +28,12 @@ add_catch2_executable( module-cellular ) + +add_catch2_executable( + NAME + unittest_ATStream + SRCS + unittest_ATStream.cpp + LIBS + module-cellular +) diff --git a/module-cellular/test/mock/AtCommon_channel.hpp b/module-cellular/test/mock/AtCommon_channel.hpp index 2cc7b27db787decee6c432a2b01aae492efd0b6b..94ae99b00c0dd7a38db2d550cd1a846d9f66082e 100644 --- a/module-cellular/test/mock/AtCommon_channel.hpp +++ b/module-cellular/test/mock/AtCommon_channel.hpp @@ -3,11 +3,11 @@ #pragma once +#include "Modem/ATCommon.hpp" #include "Modem/BaseChannel.hpp" namespace at { - class ChannelMock : public BaseChannel { public: @@ -40,7 +40,7 @@ namespace at void cmd_post() override {} - std::vector cmd_receive() override + std::string cmd_receive() override { return {}; } diff --git a/module-cellular/test/unittest_ATStream.cpp b/module-cellular/test/unittest_ATStream.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5e870ade5b4a64d5d76c0d33d376c3fd27035842 --- /dev/null +++ b/module-cellular/test/unittest_ATStream.cpp @@ -0,0 +1,95 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include +#define CATCH_CONFIG_MAIN + +#include +#include "Modem/ATStream.hpp" +#include "Result.hpp" + +TEST_CASE("Channel Test- AT return parser") +{ + SECTION("Parse AT - OK") + { + at::ATStream stream; + uint32_t errcode = 0; + auto code = stream.parseState("OK", errcode); + REQUIRE(code == at::Result::Code::OK); + } + + SECTION("Parse AT - ERROR") + { + at::ATStream stream; + uint32_t errcode = 0; + auto code = stream.parseState("ERROR", errcode); + REQUIRE(code == at::Result::Code::ERROR); + } + + SECTION("Parse AT - +CME ERROR: Valid") + { + at::ATStream stream; + uint32_t errcode = 0; + auto code = stream.parseState("+CME ERROR: 33", errcode); + REQUIRE(code == at::Result::Code::CME_ERROR); + REQUIRE(errcode == 33); + } + + SECTION("Parse AT - +CMS ERROR: Valid") + { + at::ATStream stream; + uint32_t errcode = 0; + auto code = stream.parseState("+CMS ERROR: 33", errcode); + REQUIRE(code == at::Result::Code::CMS_ERROR); + REQUIRE(errcode == 33); + } + + SECTION("Parse AT - +CMS ERROR: Invalid") + { + at::ATStream stream; + uint32_t errcode = 0; + auto code = stream.parseState("+CMS ERROR: ssss", errcode); + REQUIRE(code == at::Result::Code::PARSING_ERROR); + } + + SECTION("Parse AT - +CMS ERROR: Invalid empty") + { + at::ATStream stream; + uint32_t errcode = 0; + auto code = stream.parseState("+CMS ERROR:", errcode); + REQUIRE(code == at::Result::Code::PARSING_ERROR); + } + + SECTION("Parse AT - +CME ERROR: Valid") + { + at::ATStream stream; + uint32_t errcode = 0; + auto code = stream.parseState("+CME ERROR: 33", errcode); + REQUIRE(code == at::Result::Code::CME_ERROR); + REQUIRE(errcode == 33); + } + + SECTION("Parse AT - +CME ERROR: Invalid") + { + at::ATStream stream; + uint32_t errcode = 0; + auto code = stream.parseState("+CME ERROR: ssss", errcode); + REQUIRE(code == at::Result::Code::PARSING_ERROR); + } + + SECTION("Parse AT - +CME ERROR: Invalid empty") + { + at::ATStream stream; + uint32_t errcode = 0; + auto code = stream.parseState("+CME ERROR:", errcode); + REQUIRE(code == at::Result::Code::PARSING_ERROR); + } + + SECTION("Parse AT - Wrong data") + { + at::ATStream stream; + uint32_t errcode = 0; + auto code = stream.parseState("+XME ERROR:", errcode); + REQUIRE(code == at::Result::Code::NONE); + } +}