summaryrefslogtreecommitdiff
path: root/src/MTS_IO_QuectelRadio.cpp
diff options
context:
space:
mode:
authorJeff Hatch <jhatch@multitech.com>2021-04-16 10:57:54 -0500
committerJeff Hatch <jhatch@multitech.com>2021-04-16 10:57:54 -0500
commitbcd5443bcfff3e17ee120c305bbfd0ce2c812b21 (patch)
tree8baa012e02a30fb5eeb64e006db516da101cc8c8 /src/MTS_IO_QuectelRadio.cpp
parentb7f7d95092b87d0b278b1a74af53bfbc837b7acd (diff)
parentac88b70987f59e89ce5257941e61ad4f1021d65f (diff)
downloadlibmts-io-1.0.25.tar.gz
libmts-io-1.0.25.tar.bz2
libmts-io-1.0.25.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/MTS_IO_QuectelRadio.cpp')
-rw-r--r--src/MTS_IO_QuectelRadio.cpp155
1 files changed, 155 insertions, 0 deletions
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;
+}