diff options
Diffstat (limited to 'src/MTS_IO_QuectelRadio.cpp')
-rw-r--r-- | src/MTS_IO_QuectelRadio.cpp | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/MTS_IO_QuectelRadio.cpp b/src/MTS_IO_QuectelRadio.cpp index a8986f4..2ed11b0 100644 --- a/src/MTS_IO_QuectelRadio.cpp +++ b/src/MTS_IO_QuectelRadio.cpp @@ -447,6 +447,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::uploadDeltaFirmwareFile(int fd, ICellularRadio::UpdateCb& stepCb) { CODE rc = FAILURE; bool bIsFilePresent = false; |