diff options
author | Serhii Kostiuk <serhii.o.kostiuk@globallogic.com> | 2020-06-25 10:17:59 +0300 |
---|---|---|
committer | Serhii Kostiuk <serhii.o.kostiuk@globallogic.com> | 2020-06-25 10:17:59 +0300 |
commit | 6b3026ba736d3eef4b7754dfed46e32e45c5a490 (patch) | |
tree | e5316d29beba3d8c0d1fd791e0e7bac73aa8cfb6 /src | |
parent | adaca6b0fc6430f38ae3f0551f9a248563ad53b5 (diff) | |
parent | a949739583abb1fe30895edfda216e83ffdbef52 (diff) | |
download | libmts-io-6b3026ba736d3eef4b7754dfed46e32e45c5a490.tar.gz libmts-io-6b3026ba736d3eef4b7754dfed46e32e45c5a490.tar.bz2 libmts-io-6b3026ba736d3eef4b7754dfed46e32e45c5a490.zip |
[MTX-3489] mPower Oct20: Porting "LNA7 Intermediate Release" changes
Merged all the changes from the intermediate release to master.
Diffstat (limited to 'src')
-rw-r--r-- | src/MTS_IO_CellularRadio.cpp | 49 | ||||
-rw-r--r-- | src/MTS_IO_ICellularRadio.cpp | 5 | ||||
-rw-r--r-- | src/MTS_IO_QuectelRadio.cpp | 92 |
3 files changed, 145 insertions, 1 deletions
diff --git a/src/MTS_IO_CellularRadio.cpp b/src/MTS_IO_CellularRadio.cpp index 50fdf5c..b18478e 100644 --- a/src/MTS_IO_CellularRadio.cpp +++ b/src/MTS_IO_CellularRadio.cpp @@ -912,6 +912,49 @@ ICellularRadio::CODE CellularRadio::unlockSimCard(const Json::Value& jArgs) { return SUCCESS; } +ICellularRadio::CODE CellularRadio::getSimCarrierCode(std::string& sCarrierCode) { + std::string sIccid; + CODE rc; + + printTrace("%s| Get carrier code from the SIM card installed", m_sName.c_str()); + + rc = getIccid(sIccid); + if (rc != SUCCESS) { + printError("%s| Unable to determine SIM carrier: Failed to fetch SIM identifier", m_sName.c_str()); + return rc; + } + + printTrace("%s| Fetched ICCID: [%s]", m_sName.c_str(), sIccid.c_str()); + + rc = getSimCarrierCode(sIccid, sCarrierCode); + if (rc != SUCCESS) { + printError("%s| Unable to determine SIM carrier: Unable to extract carrier from the SIM identifier", m_sName.c_str()); + return rc; + } + + printTrace("%s| Detected carrier code: [%s]", m_sName.c_str(), sCarrierCode.c_str()); + return rc; +} + +ICellularRadio::CODE CellularRadio::getSimCarrierCode(const std::string& sIccid, std::string& sCarrierCode) { + const char* ICCID_PREFIX_VZW = "891480"; + const char* ICCID_PREFIX_ATT = "8901410"; + + if (sIccid.find(ICCID_PREFIX_VZW) == 0) { + printTrace("%s| Verizon SIM detected", m_sName.c_str()); + sCarrierCode = VALUE_CARRIER_CODE_VERIZON; + } else if (sIccid.find(ICCID_PREFIX_ATT) == 0) { + printTrace("%s| AT&T SIM detected", m_sName.c_str()); + sCarrierCode = VALUE_CARRIER_CODE_ATT; + } else { + // All other carriers for which ICCID prefixes are not defined + printWarning("%s| Carrier is unknown for this SIM ID: [%s]", m_sName.c_str(), sIccid.c_str()); + sCarrierCode = VALUE_UNKNOWN; + } + + return SUCCESS; // no error cases for now +} + ICellularRadio::CODE CellularRadio::validateMsl(const Json::Value&) { printTrace("%s| Validate MSL", m_sName.c_str()); @@ -1020,6 +1063,12 @@ ICellularRadio::CODE CellularRadio::activate(const Json::Value&, UpdateCb&) { return NOT_APPLICABLE; } +ICellularRadio::CODE CellularRadio::startOmaDm(ICellularRadio::UpdateCb&) { + printTrace("%s| Start OMA DM procedure: not applicable", m_sName.c_str()); + + return NOT_APPLICABLE; +} + ICellularRadio::CODE CellularRadio::setActiveFirmware(const Json::Value&) { printTrace("%s| Set Active Firmware Image Number: not applicable", m_sName.c_str()); diff --git a/src/MTS_IO_ICellularRadio.cpp b/src/MTS_IO_ICellularRadio.cpp index c9bed33..1a428e4 100644 --- a/src/MTS_IO_ICellularRadio.cpp +++ b/src/MTS_IO_ICellularRadio.cpp @@ -50,7 +50,7 @@ const char *MTS::IO::ICellularRadio::KEY_MDN = "mdn"; //!< Mobile Dir const char *MTS::IO::ICellularRadio::KEY_ICCID = "iccid"; //!< Integrated Circuit Card Identifier const char *MTS::IO::ICellularRadio::KEY_MSL = "msl"; //!< Master Subsidy Lock const char *MTS::IO::ICellularRadio::KEY_SUPPORTED_CELL_MODES = "supportedCellularModes"; //!< Comma-separated list of all supported cellular modes (2g,3g,4g) - +const char *MTS::IO::ICellularRadio::KEY_SIM_CARRIER_CODE = "simCarrierCode"; //!< Unique carrier identifier based on the SIM card information. //Dynamic Data const char *MTS::IO::ICellularRadio::KEY_ROAMING = "roaming"; //!< Indicates whether or not using Home Network const char *MTS::IO::ICellularRadio::KEY_DATETIME = "datetime"; //!< Date and Time from tower @@ -112,6 +112,9 @@ const char *MTS::IO::ICellularRadio::VALUE_ABND_GSM_900 = "GSM 900"; const char *MTS::IO::ICellularRadio::VALUE_ABND_DCS_1800 = "DCS 1800"; const char *MTS::IO::ICellularRadio::VALUE_ABND_PCS_1900 = "PCS 1900"; +const char *MTS::IO::ICellularRadio::VALUE_CARRIER_CODE_VERIZON = "vz"; +const char *MTS::IO::ICellularRadio::VALUE_CARRIER_CODE_ATT = "att"; + const std::vector<std::string> MTS::IO::ICellularRadio::DEFAULT_BAIL_STRINGS = { MTS::IO::ICellularRadio::RSP_OK, MTS::IO::ICellularRadio::RSP_ERROR }; MTS::IO::ICellularRadio::~ICellularRadio() diff --git a/src/MTS_IO_QuectelRadio.cpp b/src/MTS_IO_QuectelRadio.cpp index 5024f54..5c2c352 100644 --- a/src/MTS_IO_QuectelRadio.cpp +++ b/src/MTS_IO_QuectelRadio.cpp @@ -438,6 +438,98 @@ ICellularRadio::CODE QuectelRadio::setMdn(const Json::Value& jArgs) { return NOT_APPLICABLE; } +ICellularRadio::CODE QuectelRadio::startOmaDm(ICellularRadio::UpdateCb& stepCb) { + printTrace("%s| Start OMA DM procedure", getName().c_str()); + + // TODO: All the timeout values below are empirically defined. + // Feel free to update them if you get any verified information. + const int32_t iTimeoutOk = 3 * 1000; // 3 seconds + const int32_t iTimeoutStart = 5 * 1000; // 5 seconds + const int32_t iTimeoutEnd = 160 * 1000; // 2 minutes 40 seconds + const int32_t iTimeoutAbort = 3 * 1000; // 3 seconds + + const std::string sCmdOdmStart = "AT+QODM=\"dme\",2,\"ui\""; + const std::string sCmdOdmAbort = "AT+QODM=\"dme\",2,\"kill\""; + + const std::string sOdmStarted = "DM Start"; + const std::string sOdmFinished = "DM End"; + const std::string sOdmAbnormal = "DME Abnormal"; + + const std::vector<std::string> vOdmStartedStrings{ sOdmStarted }; + const std::vector<std::string> vOdmFinishedStrings{ sOdmFinished, sOdmAbnormal }; + + CODE eCode; + + do { + + // Send command and expect "OK" in iTimeoutOk milliseconds + eCode = sendBasicCommand(sCmdOdmStart, iTimeoutOk); + if (eCode != SUCCESS) { + printError("%s| OMA DM procedure can not be started", getName().c_str()); + if (stepCb) { + stepCb(Json::Value("OMA DM Error: OMA DM can not be started")); + } + break; + } + + // Wait for the "Start" response + std::string sResponse = sendCommand("", vOdmStartedStrings, iTimeoutStart, 0x00); + printDebug("%s| Radio returned: [%s]", getName().c_str(), sResponse.c_str()); + + // Received something unexpected or nothing at all? + if (sResponse.find(sOdmStarted) == std::string::npos) { + printError("%s| OMA DM procedure failed due to timeout", getName().c_str()); + if (stepCb) { + stepCb(Json::Value("OMA DM Error: OMA DM failed due to timeout")); + } + eCode = FAILURE; + break; + } + + // Got "DM Started" message from the radio + printTrace("%s| OMA DM started", getName().c_str()); + if (stepCb) { + stepCb(Json::Value("OMA DM Info: OMA DM started")); + } + + // Wait for the "End" or "Abnormal" response + sResponse = sendCommand("", vOdmFinishedStrings, iTimeoutEnd, 0x00); + printDebug("%s| Radio returned: [%s]", getName().c_str(), sResponse.c_str()); + + // Received "Abnormal"? + if (sResponse.find(sOdmAbnormal) != std::string::npos) { + printError("%s| OMA DM procedure failed due to internal error: [%s]", getName().c_str(), sResponse.c_str()); + if (stepCb) { + stepCb(Json::Value("OMA DM Error: OMA DM failed due to internal error")); + } + eCode = FAILURE; + break; + } + + // Received something unexpected or nothing at all? + if (sResponse.find(sOdmFinished) == std::string::npos) { + printError("%s| OMA DM procedure failed due to timeout", getName().c_str()); + if (stepCb) { + stepCb(Json::Value("OMA DM Error: OMA DM failed due to timeout")); + } + sendBasicCommand(sCmdOdmAbort, iTimeoutAbort); // abort the procedure + eCode = FAILURE; + break; + } + + // Got "DM End" message from the radio + printTrace("%s| OMA DM finished", getName().c_str()); + if (stepCb) { + stepCb(Json::Value("OMA DM Info: OMA DM finished")); + } + + eCode = SUCCESS; + + } while (false); + + return eCode; +} + ICellularRadio::CODE QuectelRadio::getServiceDomain(ICellularRadio::SERVICEDOMAIN& sd) { printTrace("%s| Get Service Domain", getName().c_str()); |