diff options
| author | Jeff Hatch <jhatch@multitech.com> | 2021-04-16 10:57:54 -0500 | 
|---|---|---|
| committer | Jeff Hatch <jhatch@multitech.com> | 2021-04-16 10:57:54 -0500 | 
| commit | bcd5443bcfff3e17ee120c305bbfd0ce2c812b21 (patch) | |
| tree | 8baa012e02a30fb5eeb64e006db516da101cc8c8 /src | |
| parent | b7f7d95092b87d0b278b1a74af53bfbc837b7acd (diff) | |
| parent | ac88b70987f59e89ce5257941e61ad4f1021d65f (diff) | |
| download | libmts-io-bcd5443bcfff3e17ee120c305bbfd0ce2c812b21.tar.gz libmts-io-bcd5443bcfff3e17ee120c305bbfd0ce2c812b21.tar.bz2 libmts-io-bcd5443bcfff3e17ee120c305bbfd0ce2c812b21.zip | |
Merge branch 'ms/MTX-3998_quectel_set_cemode_2' into 'master'
1.0.25
[MTX-3998] mPower R. Apr 2021: +CEMODE shall be set to CEMODE=2 - Quectel - GP-1111
See merge request !38
Diffstat (limited to 'src')
| -rw-r--r-- | src/MTS_IO_CellularRadio.cpp | 10 | ||||
| -rw-r--r-- | src/MTS_IO_ICellularRadio.cpp | 51 | ||||
| -rw-r--r-- | src/MTS_IO_LE910Radio.cpp | 70 | ||||
| -rw-r--r-- | src/MTS_IO_QuectelRadio.cpp | 155 | 
4 files changed, 229 insertions, 57 deletions
| diff --git a/src/MTS_IO_CellularRadio.cpp b/src/MTS_IO_CellularRadio.cpp index 49bdcb4..c2fcfad 100644 --- a/src/MTS_IO_CellularRadio.cpp +++ b/src/MTS_IO_CellularRadio.cpp @@ -1379,13 +1379,13 @@ ICellularRadio::CODE CellularRadio::readChunk(int fd, char* pChunk, size_t dChun      return rc;  } -ICellularRadio::CODE CellularRadio::setUeModeOfOperation(UE_MODES_OF_OPERATION newmode) { +ICellularRadio::CODE CellularRadio::setUeModeOfOperation(ICellularRadio::UE_MODES_OF_OPERATION mode) {      printTrace("%s| Set UE Mode Of Operation: not applicable", m_sName.c_str()); -    return CODE::NOT_APPLICABLE; +    return NOT_APPLICABLE;  } -ICellularRadio::CODE CellularRadio::getUeModeOfOperation(UE_MODES_OF_OPERATION &newmode) { +ICellularRadio::CODE CellularRadio::getUeModeOfOperation(ICellularRadio::UE_MODES_OF_OPERATION& mode) {      printTrace("%s| Get UE Mode Of Operation: not applicable", m_sName.c_str()); -    newmode = UE_MODES_OF_OPERATION::UNKNOWN_MODE; -    return CODE::NOT_APPLICABLE; +    mode = ICellularRadio::UE_MODES_OF_OPERATION::UNKNOWN_MODE; +    return NOT_APPLICABLE;  } diff --git a/src/MTS_IO_ICellularRadio.cpp b/src/MTS_IO_ICellularRadio.cpp index 9f63408..0483dc8 100644 --- a/src/MTS_IO_ICellularRadio.cpp +++ b/src/MTS_IO_ICellularRadio.cpp @@ -513,51 +513,64 @@ std::string MTS::IO::ICellularRadio::getCodeAsString(CODE eCode) {      }  } -MTS::IO::ICellularRadio::CODE MTS::IO::ICellularRadio::convertUeModeToString(MTS::IO::ICellularRadio::UE_MODES_OF_OPERATION mode, std::string &string) { +MTS::IO::ICellularRadio::CODE MTS::IO::ICellularRadio::convertUeModeToString(ICellularRadio::UE_MODES_OF_OPERATION mode, std::string& sMode) {      CODE rc;      switch (mode) {          case ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE1: -            string = "ps_1"; -            rc = CODE::SUCCESS; +            sMode = "ps_1"; +            rc = SUCCESS;              break;          case ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE2: -            string = "ps_2"; -            rc = CODE::SUCCESS; +            sMode = "ps_2"; +            rc = SUCCESS;              break;          case ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE1: -            string = "csps_1"; -            rc = CODE::SUCCESS; +            sMode = "csps_1"; +            rc = SUCCESS;              break;          case ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE2: -            string = "csps_2"; -            rc = CODE::SUCCESS; +            sMode = "csps_2"; +            rc = SUCCESS; +            break; +        case ICellularRadio::UE_MODES_OF_OPERATION::CS_MODE1: +            sMode = "cs_1"; +            rc = SUCCESS; +            break; +        case ICellularRadio::UE_MODES_OF_OPERATION::CS_MODE2: +            sMode = "cs_2"; +            rc = SUCCESS;              break;          default: -            string = MTS::IO::ICellularRadio::VALUE_UNKNOWN; -            rc = CODE::FAILURE; +            sMode = ICellularRadio::VALUE_UNKNOWN; +            rc = FAILURE;              break;      }      return rc;  } -MTS::IO::ICellularRadio::CODE MTS::IO::ICellularRadio::convertStringToUeMode(const std::string &sMode, UE_MODES_OF_OPERATION& mode) { -    using namespace MTS::IO; +MTS::IO::ICellularRadio::CODE MTS::IO::ICellularRadio::convertStringToUeMode(const std::string& sMode, ICellularRadio::UE_MODES_OF_OPERATION& mode) {      CODE rc;      if (sMode == "ps_1") {          mode = ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE1; -        rc = CODE::SUCCESS; +        rc = SUCCESS;      } else if (sMode == "ps_2") {          mode = ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE2; -        rc = CODE::SUCCESS; +        rc = SUCCESS;      } else if (sMode == "csps_1") {          mode = ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE1; -        rc = CODE::SUCCESS; +        rc = SUCCESS;      } else if (sMode == "csps_2") {          mode = ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE2; -        rc = CODE::SUCCESS; +        rc = SUCCESS; +    } else if (sMode == "cs_1") { +        mode = ICellularRadio::UE_MODES_OF_OPERATION::CS_MODE1; +        rc = SUCCESS; +    } else if (sMode == "cs_2") { +        mode = ICellularRadio::UE_MODES_OF_OPERATION::CS_MODE2; +        rc = SUCCESS;      } else { -        mode = ICellularRadio::UNKNOWN_MODE; -        rc = CODE::FAILURE; +        mode = ICellularRadio::UE_MODES_OF_OPERATION::UNKNOWN_MODE; +        rc = FAILURE;      }      return rc;  } diff --git a/src/MTS_IO_LE910Radio.cpp b/src/MTS_IO_LE910Radio.cpp index 764ac5e..ba03c5e 100644 --- a/src/MTS_IO_LE910Radio.cpp +++ b/src/MTS_IO_LE910Radio.cpp @@ -78,51 +78,55 @@ ICellularRadio::CODE LE910Radio::getModemLocation(std::string& sLocation) {      return SUCCESS;  } -ICellularRadio::CODE LE910Radio::setUeModeOfOperation(ICellularRadio::UE_MODES_OF_OPERATION newmode) { -    uint8_t iValue; +ICellularRadio::CODE LE910Radio::setUeModeOfOperation(ICellularRadio::UE_MODES_OF_OPERATION mode) { +    printTrace("%s| Set UE Mode Of Operation", getName().c_str()); -    switch (newmode) { -        case UE_MODES_OF_OPERATION::PS_MODE1: -            iValue = 3; +    std::string sValue; + +    switch (mode) { +        case ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE1: +            sValue = "3";              break; -        case UE_MODES_OF_OPERATION::PS_MODE2: -            iValue = 0; +        case ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE2: +            sValue = "0";              break; -        case UE_MODES_OF_OPERATION::CS_PS_MODE1: -            iValue = 1; +        case ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE1: +            sValue = "1";              break; -        case UE_MODES_OF_OPERATION::CS_PS_MODE2: -            iValue = 2; +        case ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE2: +            sValue = "2";              break;          default: -            printTrace("Set UE Mode Of Operation: invalid argument"); -            return CODE::INVALID_ARGS; +            printError("%s| Set UE Mode Of Operation: invalid argument", getName().c_str()); +            return INVALID_ARGS;      }      const int dTimeout = 1000; // ms -    const std::string sCommand = "AT+CEMODE=" + MTS::Text::format(iValue); +    const std::string sCommand = "AT+CEMODE=" + sValue;      return sendBasicCommand(sCommand, dTimeout);  } -ICellularRadio::CODE LE910Radio::getUeModeOfOperation(ICellularRadio::UE_MODES_OF_OPERATION& newmode) { +ICellularRadio::CODE LE910Radio::getUeModeOfOperation(ICellularRadio::UE_MODES_OF_OPERATION& mode) { +    printTrace("%s| Get UE Mode Of Operation", getName().c_str()); +      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()); +    printTrace("%s| Got response from the radio: %s", getName().c_str(), 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; +        printError("%s| Unable to get UE Mode Of Operation from radio using command [%s]", getName().c_str(), sCommand.c_str()); +        return 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; +        printError("%s| Unable to get UE Mode Of Operation from radio using command [%s]", getName().c_str(), sCommand.c_str()); +        return FAILURE;      }      start += sLabel.length(); @@ -130,32 +134,32 @@ ICellularRadio::CODE LE910Radio::getUeModeOfOperation(ICellularRadio::UE_MODES_O      uint8_t uiValue;      if (!MTS::Text::parse(uiValue, sValue)) { -        printWarning("Unable to parse CEMODE from response [%s]", sResult.c_str()); -        return CODE::FAILURE; +        printError("%s| Unable to parse CEMODE from response [%s]", getName().c_str(), sResult.c_str()); +        return FAILURE;      }      CODE rc;      switch (uiValue) {          case 0: -            newmode = ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE2; -            rc = CODE::SUCCESS; +            mode = ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE2; +            rc = SUCCESS;              break;          case 1: -            newmode = ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE1; -            rc = CODE::SUCCESS; +            mode = ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE1; +            rc = SUCCESS;              break;          case 2: -            newmode = ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE2; -            rc = CODE::SUCCESS; +            mode = ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE2; +            rc = SUCCESS;              break;          case 3: -            newmode = ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE1; -            rc = CODE::SUCCESS; +            mode = ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE1; +            rc = 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; +            printError("%s| Unable to parse CEMODE from response [%s]", getName().c_str(), sResult.c_str()); +            mode = ICellularRadio::UE_MODES_OF_OPERATION::UNKNOWN_MODE; +            rc = FAILURE;              break;      }      return rc; diff --git a/src/MTS_IO_QuectelRadio.cpp b/src/MTS_IO_QuectelRadio.cpp index aeb06ab..b6eab80 100644 --- a/src/MTS_IO_QuectelRadio.cpp +++ b/src/MTS_IO_QuectelRadio.cpp @@ -1221,3 +1221,158 @@ ICellularRadio::CODE QuectelRadio::abortFileUpload() {      sleep(1);      return sendBasicCommand(CMD_ABORT_UPLOAD, 2000, 0x00);  } + +ICellularRadio::CODE QuectelRadio::setUeModeOfOperation(ICellularRadio::UE_MODES_OF_OPERATION mode) { +    printTrace("%s| Set UE Mode Of Operation", getName().c_str()); + +    std::string sDomain, sPreference; + +    switch (mode) { +        case ICellularRadio::UE_MODES_OF_OPERATION::CS_MODE1: +            sDomain = "0"; +            sPreference = "00"; +            break; +        case ICellularRadio::UE_MODES_OF_OPERATION::CS_MODE2: +            sDomain = "0"; +            sPreference = "01"; +            break; +        case ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE1: +            sDomain = "1"; +            sPreference = "00"; +            break; +        case ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE2: +            sDomain = "1"; +            sPreference = "01"; +            break; +        case ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE1: +            sDomain = "2"; +            sPreference = "00"; +            break; +        case ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE2: +            sDomain = "2"; +            sPreference = "01"; +            break; +        default: +            printError("%s| Set UE Mode Of Operation: invalid argument", getName().c_str()); +            return INVALID_ARGS; +    } + +    CODE rc; +    const int dTimeout = 1000; // ms +    std::string sCommand = "AT+QNVFW=\"/nv/item_files/modem/mmode/ue_usage_setting\"," + sPreference; + +    rc = sendBasicCommand(sCommand, dTimeout); +    if (rc != SUCCESS) { +        printError("%s| Voice/data preference configuration failed with code [%d]", getName().c_str(), rc); +        return rc; +    } + +    sCommand = "AT+QCFG=\"servicedomain\"," + sDomain + ",0"; + +    rc = sendBasicCommand(sCommand, dTimeout); +    if (rc != SUCCESS) { +        printError("%s| Service domain configuration failed with code [%d]", getName().c_str(), rc); +        return rc; +    } + +    return SUCCESS; +} + +ICellularRadio::CODE QuectelRadio::getUeUsageSetting(QuectelRadio::UE_USAGE_SETTING& us) { +    printTrace("%s| Get UE Usage Setting", getName().c_str()); + +    std::string sCmd("AT+QNVFR=\"/nv/item_files/modem/mmode/ue_usage_setting\""); +    std::string sResult = sendCommand(sCmd); +    size_t end = sResult.find(ICellularRadio::RSP_OK); + +    if (end == std::string::npos) { +        printError("%s| Unable to get UE Usage Setting [%s]", getName().c_str(), sResult.c_str()); +        return FAILURE; +    } + +    // +QNVFR: <voice/data preference> +    const std::string sLabel = "+QNVFR: "; +    size_t start = sResult.find(sLabel); +    if (start == std::string::npos) { +        printError("%s| Failed to parse UE Usage Setting from output [%s]", getName().c_str(), sResult.c_str()); +        return FAILURE; +    } + +    start += sLabel.length(); +    const std::string sPreference = MTS::Text::trim(sResult.substr(start, end - start)); + +    if (convertToUeUsageSetting(sPreference, us) != SUCCESS) { +        printError("%s| Unable to convert [%s] to UE Usage Setting", getName().c_str(), sPreference.c_str()); +        return FAILURE; +    } + +    return SUCCESS; +} + +ICellularRadio::CODE QuectelRadio::convertToUeUsageSetting(const std::string& sSetting, QuectelRadio::UE_USAGE_SETTING& us) { +    if (sSetting == "00") { +        us = QuectelRadio::UE_USAGE_SETTING::MODE_1; +        return SUCCESS; +    } + +    if (sSetting == "01") { +        us = QuectelRadio::UE_USAGE_SETTING::MODE_2; +        return SUCCESS; +    } + +    us = QuectelRadio::UE_USAGE_SETTING::UNKNOWN_MODE; +    return FAILURE; +} + +ICellularRadio::CODE QuectelRadio::getUeModeOfOperation(ICellularRadio::UE_MODES_OF_OPERATION& mode) { +    printTrace("%s| Get UE Mode Of Operation", getName().c_str()); + +    SERVICEDOMAIN sd; +    UE_USAGE_SETTING us; + +    if (getServiceDomain(sd) != SUCCESS) { +        return FAILURE; +    } + +    printTrace("%s| Retrieved servicedomain [%d]", getName().c_str(), sd); + +    if (getUeUsageSetting(us) != SUCCESS) { +        return FAILURE; +    } + +    printTrace("%s| Retrieved ue_usage_setting [%d]", getName().c_str(), us); + +    if (sd == ICellularRadio::SERVICEDOMAIN::CS_ONLY && us == QuectelRadio::UE_USAGE_SETTING::MODE_1) { +        mode = ICellularRadio::UE_MODES_OF_OPERATION::CS_MODE1; +        return SUCCESS; +    } + +    if (sd == ICellularRadio::SERVICEDOMAIN::CS_ONLY && us == QuectelRadio::UE_USAGE_SETTING::MODE_2) { +        mode = ICellularRadio::UE_MODES_OF_OPERATION::CS_MODE2; +        return SUCCESS; +    } + +    if (sd == ICellularRadio::SERVICEDOMAIN::PS_ONLY && us == QuectelRadio::UE_USAGE_SETTING::MODE_1) { +        mode = ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE1; +        return SUCCESS; +    } + +    if (sd == ICellularRadio::SERVICEDOMAIN::PS_ONLY && us == QuectelRadio::UE_USAGE_SETTING::MODE_2) { +        mode = ICellularRadio::UE_MODES_OF_OPERATION::PS_MODE2; +        return SUCCESS; +    } + +    if (sd == ICellularRadio::SERVICEDOMAIN::CSPS && us == QuectelRadio::UE_USAGE_SETTING::MODE_1) { +        mode = ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE1; +        return SUCCESS; +    } + +    if (sd == ICellularRadio::SERVICEDOMAIN::CSPS && us == QuectelRadio::UE_USAGE_SETTING::MODE_2) { +        mode = ICellularRadio::UE_MODES_OF_OPERATION::CS_PS_MODE2; +        return SUCCESS; +    } + +    printError("%s| Unknown combination of servicedomain [%d] and ue_usage_setting [%d]", getName().c_str(), sd, us); +    mode = ICellularRadio::UE_MODES_OF_OPERATION::UNKNOWN_MODE; +    return FAILURE; +} | 
