diff options
| author | rodion.shyshkin <rodion.shyshkin@globallogic.com> | 2021-03-31 20:49:08 +0300 | 
|---|---|---|
| committer | rodion.shyshkin <rodion.shyshkin@globallogic.com> | 2021-03-31 20:49:08 +0300 | 
| commit | 285cee922e229cb1bbd704e6227dbbb3756bd889 (patch) | |
| tree | 2c0547033ed3e6a030594476ee37c3bb2fb15beb | |
| parent | ad6b4d51ac469d4e7300fd74d1ada87b1caece93 (diff) | |
| download | libmts-io-285cee922e229cb1bbd704e6227dbbb3756bd889.tar.gz libmts-io-285cee922e229cb1bbd704e6227dbbb3756bd889.tar.bz2 libmts-io-285cee922e229cb1bbd704e6227dbbb3756bd889.zip | |
[GP-1111] mPower R. Apr 2021: +CEMODE shall be set to CEMODE=2 - libmts-io for Telit
Adding an ability to set UE mode of operation to libmts-io.
There was added two clear virtual methods in iCellularRadio,
correct implementation for them for Telit LTE modems and implementation
with error messages for all other.
| -rw-r--r-- | include/mts/MTS_IO_CellularRadio.h | 4 | ||||
| -rw-r--r-- | include/mts/MTS_IO_ICellularRadio.h | 12 | ||||
| -rw-r--r-- | include/mts/MTS_IO_LE910Radio.h | 3 | ||||
| -rw-r--r-- | src/MTS_IO_CellularRadio.cpp | 39 | ||||
| -rw-r--r-- | src/MTS_IO_LE910Radio.cpp | 85 | 
5 files changed, 143 insertions, 0 deletions
| diff --git a/include/mts/MTS_IO_CellularRadio.h b/include/mts/MTS_IO_CellularRadio.h index 2b03d8f..d0f7a14 100644 --- a/include/mts/MTS_IO_CellularRadio.h +++ b/include/mts/MTS_IO_CellularRadio.h @@ -134,6 +134,10 @@ namespace MTS {                  virtual std::string waitResponse(IsNeedMoreData& isNeedMoreData,                                                   int32_t timeoutMillis = 100) override; +                CODE setUeModeOfOperation(UE_MODES_OF_OPERATION newmode) override; +                CODE getUeModeOfOperation(UE_MODES_OF_OPERATION& newmode) override; +                CODE convertUeModeToString(UE_MODES_OF_OPERATION mode, std::string &string) override; +              protected:                  CellularRadio(const std::string& sName, const std::string& sRadioPort); diff --git a/include/mts/MTS_IO_ICellularRadio.h b/include/mts/MTS_IO_ICellularRadio.h index 61ffd20..b84d4b8 100644 --- a/include/mts/MTS_IO_ICellularRadio.h +++ b/include/mts/MTS_IO_ICellularRadio.h @@ -68,6 +68,14 @@ namespace MTS {                      CELLULAR_MODE_5G = 1 << 3  // 5G                  }; +                enum UE_MODES_OF_OPERATION : uint8_t { +                    UNKNOWN_MODE = 0, // current mode of operation is not available +                    PS_MODE1, // only EPS (LTE) services are allowed, the usage is “voice centric” +                    PS_MODE2, // only EPS (LTE) services are allowed, the usage is “data centric” +                    CS_PS_MODE1, // both EPS and non-EPS services are allowed, the usage is “voice centric” +                    CS_PS_MODE2 // both EPS and non-EPS services are allowed, the usage is “data centric” +                }; +                  static CODE convertModelToType(const std::string& sModel, std::string& sType);                  static CODE convertModelToMtsShortCode(const std::string& sModel, std::string& sCode, ICellularRadio *radioObj = NULL);                  static CODE convertServiceDomainToString(SERVICEDOMAIN eSd, std::string& sSd); @@ -562,6 +570,10 @@ namespace MTS {                  virtual std::string waitResponse(IsNeedMoreData& isNeedMoreData,                                                   int32_t timeoutMillis = 100) = 0; + +                virtual CODE setUeModeOfOperation(UE_MODES_OF_OPERATION newmode) = 0; +                virtual CODE getUeModeOfOperation(UE_MODES_OF_OPERATION& newmode) = 0; +                virtual CODE convertUeModeToString(UE_MODES_OF_OPERATION mode, std::string& string) = 0;          };      }  } diff --git a/include/mts/MTS_IO_LE910Radio.h b/include/mts/MTS_IO_LE910Radio.h index 35e704d..e8a0dec 100644 --- a/include/mts/MTS_IO_LE910Radio.h +++ b/include/mts/MTS_IO_LE910Radio.h @@ -45,6 +45,9 @@ namespace MTS {                  CODE setRxDiversity(const Json::Value& jArgs);                  CODE getModemLocation(std::string& sLocation); +                CODE setUeModeOfOperation(UE_MODES_OF_OPERATION newmode) override; +                CODE getUeModeOfOperation(UE_MODES_OF_OPERATION &newmode) override; +              protected:              private: diff --git a/src/MTS_IO_CellularRadio.cpp b/src/MTS_IO_CellularRadio.cpp index fe252c0..ee45ace 100644 --- a/src/MTS_IO_CellularRadio.cpp +++ b/src/MTS_IO_CellularRadio.cpp @@ -1378,3 +1378,42 @@ ICellularRadio::CODE CellularRadio::readChunk(int fd, char* pChunk, size_t dChun      return rc;  } + +ICellularRadio::CODE CellularRadio::setUeModeOfOperation(UE_MODES_OF_OPERATION newmode) { +    printTrace("%s| Set UE Mode Of Operation: not applicable", m_sName.c_str()); +    return CODE::NOT_APPLICABLE; +} + +ICellularRadio::CODE CellularRadio::getUeModeOfOperation(UE_MODES_OF_OPERATION &newmode) { +    printTrace("%s| Get UE Mode Of Operation: not applicable", m_sName.c_str()); +    newmode = UE_MODES_OF_OPERATION::UNKNOWN_MODE; +    return CODE::NOT_APPLICABLE; +} + +ICellularRadio::CODE CellularRadio::convertUeModeToString(ICellularRadio::UE_MODES_OF_OPERATION mode, std::string& string) { +    CODE rc; +    switch (mode) { +        case ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE1: +            string = "ps_1"; +            rc = CODE::SUCCESS; +            break; +        case ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE2: +            string = "ps_2"; +            rc = CODE::SUCCESS; +            break; +        case ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE1: +            string = "csps_1"; +            rc = CODE::SUCCESS; +            break; +        case ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE2: +            string = "csps_2"; +            rc = CODE::SUCCESS; +            break; +        default: +            string = "unknown"; +            rc = CODE::FAILURE; +            break; +    } +    return rc; +} + diff --git a/src/MTS_IO_LE910Radio.cpp b/src/MTS_IO_LE910Radio.cpp index ea905a8..764ac5e 100644 --- a/src/MTS_IO_LE910Radio.cpp +++ b/src/MTS_IO_LE910Radio.cpp @@ -29,6 +29,7 @@  #include <mts/MTS_IO_LE910Radio.h>  #include <mts/MTS_Logger.h> +#include <mts/MTS_Text.h>  using namespace MTS::IO; @@ -76,3 +77,87 @@ ICellularRadio::CODE LE910Radio::getModemLocation(std::string& sLocation) {      return SUCCESS;  } + +ICellularRadio::CODE LE910Radio::setUeModeOfOperation(ICellularRadio::UE_MODES_OF_OPERATION newmode) { +    uint8_t iValue; + +    switch (newmode) { +        case UE_MODES_OF_OPERATION::PS_MODE1: +            iValue = 3; +            break; +        case UE_MODES_OF_OPERATION::PS_MODE2: +            iValue = 0; +            break; +        case UE_MODES_OF_OPERATION::CS_PS_MODE1: +            iValue = 1; +            break; +        case UE_MODES_OF_OPERATION::CS_PS_MODE2: +            iValue = 2; +            break; +        default: +            printTrace("Set UE Mode Of Operation: invalid argument"); +            return CODE::INVALID_ARGS; +    } + +    const int dTimeout = 1000; // ms +    const std::string sCommand = "AT+CEMODE=" + MTS::Text::format(iValue); + +    return sendBasicCommand(sCommand, dTimeout); +} + +ICellularRadio::CODE LE910Radio::getUeModeOfOperation(ICellularRadio::UE_MODES_OF_OPERATION& newmode) { +    const std::string sCommand = "AT+CEMODE?"; +    const int dTimeout = 1000; // ms + +    std::string sResult = sendCommand(sCommand, ICellularRadio::DEFAULT_BAIL_STRINGS, dTimeout); +    printTrace("Got response from the radio: %s", sResult.c_str()); + +    size_t end = sResult.rfind(ICellularRadio::RSP_OK); +    if (std::string::npos == end) { +        printWarning("Unable to get UE Mode Of Operation from radio using command [%s]", sCommand.c_str()); +        return CODE::FAILURE; +    } + +    const std::string sLabel = "+CEMODE: "; +    size_t start = sResult.find(sLabel); +    if (std::string::npos == start) { +        printWarning("Unable to get UE Mode Of Operation from radio using command [%s]", sCommand.c_str()); +        return CODE::FAILURE; +    } + +    start += sLabel.length(); +    const std::string sValue = MTS::Text::trim(sResult.substr(start, end - start)); +    uint8_t uiValue; + +    if (!MTS::Text::parse(uiValue, sValue)) { +        printWarning("Unable to parse CEMODE from response [%s]", sResult.c_str()); +        return CODE::FAILURE; +    } + +    CODE rc; +    switch (uiValue) { +        case 0: +            newmode = ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE2; +            rc = CODE::SUCCESS; +            break; +        case 1: +            newmode = ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE1; +            rc = CODE::SUCCESS; +            break; +        case 2: +            newmode = ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE2; +            rc = CODE::SUCCESS; +            break; +        case 3: +            newmode = ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE1; +            rc = CODE::SUCCESS; +            break; +        default: +            printWarning("Unable to parse CEMODE from response [%s]", sResult.c_str()); +            newmode = ICellularRadio::UE_MODES_OF_OPERATION::UNKNOWN_MODE; +            rc = CODE::FAILURE; +            break; +    } +    return rc; +} + | 
