diff options
| author | Serhii Kostiuk <serhii.o.kostiuk@globallogic.com> | 2020-07-03 22:59:02 +0300 | 
|---|---|---|
| committer | Serhii Kostiuk <serhii.o.kostiuk@globallogic.com> | 2020-07-03 23:31:39 +0300 | 
| commit | 0d5806073d2e9bbd7259c474b4079991e0c5ef13 (patch) | |
| tree | f4d096ad05b970208bc42d4a4272b87066c62e66 | |
| parent | 075c19d664719808164a5c4ea5e5a3525fcb4702 (diff) | |
| download | libmts-io-0d5806073d2e9bbd7259c474b4079991e0c5ef13.tar.gz libmts-io-0d5806073d2e9bbd7259c474b4079991e0c5ef13.tar.bz2 libmts-io-0d5806073d2e9bbd7259c474b4079991e0c5ef13.zip | |
Quectel Delta Radio Firmware Upgrade support - libmts-io implementation
Implemented firmware version check detection.
| -rw-r--r-- | include/mts/MTS_IO_QuectelRadio.h | 7 | ||||
| -rw-r--r-- | src/MTS_IO_QuectelRadio.cpp | 52 | 
2 files changed, 46 insertions, 13 deletions
| diff --git a/include/mts/MTS_IO_QuectelRadio.h b/include/mts/MTS_IO_QuectelRadio.h index 3751b5a..d8228cb 100644 --- a/include/mts/MTS_IO_QuectelRadio.h +++ b/include/mts/MTS_IO_QuectelRadio.h @@ -64,11 +64,18 @@ namespace MTS {                  virtual CODE checkFile(bool& bFilePresent, const std::string& sTargetFilename);              private: +                // private variable to save old firmware versions during FOTA +                std::string m_sQuectelFirmware; +                  static const size_t FILE_CHUNK_SIZE;                  static const std::string CMD_ABORT_UPLOAD;                  static const std::string VALUE_MTS_DELTA_NAME;                  static const std::string VALUE_MTS_DELTA_PATH; +                // TODO: Consider asbtracting to the ICellularRadio::getFirmwareBuild +                //!< Get Quectel-specific firmware version (firmware build?) +                CODE getQuectelFirmware(std::string& sFirmware); +                  CODE startFileUpload(const std::string& sTargetFilename, size_t nBytes);                  CODE abortFileUpload(); diff --git a/src/MTS_IO_QuectelRadio.cpp b/src/MTS_IO_QuectelRadio.cpp index 03593a7..9a95046 100644 --- a/src/MTS_IO_QuectelRadio.cpp +++ b/src/MTS_IO_QuectelRadio.cpp @@ -591,6 +591,13 @@ ICellularRadio::CODE QuectelRadio::fumoLocalApply(ICellularRadio::UpdateCb& step      ICellularRadio::CODE rc;      std::string sCmd; +    rc = getQuectelFirmware(m_sQuectelFirmware); +    if (rc != SUCCESS) { +        callNextStep(stepCb, "FUMO Error: Failed to obtain current firmware version"); +        return rc; +    } +    printInfo("Current firmware version: %s", m_sQuectelFirmware.c_str()); +      // Send "AT+QFOTADL" command to start the upgrade. OK response follows shortly.      sCmd  = "AT+QFOTADL=\"";      sCmd += VALUE_MTS_DELTA_PATH; @@ -941,6 +948,26 @@ ICellularRadio::CODE QuectelRadio::checkFile(bool& bIsFilePresent, const std::st      return SUCCESS;  } +ICellularRadio::CODE QuectelRadio::getQuectelFirmware(std::string& sFirmware) { +    printTrace("%s| Get Quectel-specific firmware version", getName().c_str()); +    sFirmware = ICellularRadio::VALUE_NOT_SUPPORTED; +    std::string sCmd("AT+QGMR"); +    std::string sResult = sendCommand(sCmd); +    size_t pos = sResult.find(ICellularRadio::RSP_OK); +    if (pos == std::string::npos) { +        printWarning("%s| Unable to get firmware from radio using command [%s]", getName().c_str(), sCmd.c_str()); +        return FAILURE; +    } + +    sFirmware = MTS::Text::trim(sResult.substr(0, pos)); +    if(sFirmware.size() == 0) { +        printWarning("%s| Unable to get firmware from radio using command [%s]", getName().c_str(), sCmd.c_str()); +        return FAILURE; +    } + +    return SUCCESS; +} +  uint16_t QuectelRadio::getQuectelChecksum(const void* data, size_t nBytes) {      auto castData = static_cast<const uint8_t*>(data);      uint16_t iChecksum = 0; @@ -1085,37 +1112,36 @@ ICellularRadio::CODE QuectelRadio::fumoWaitUpgradeFinished(ICellularRadio::Updat  ICellularRadio::CODE QuectelRadio::fumoWaitNewFirmware(ICellularRadio::UpdateCb& stepCb) {      MTS::Timer oTimer;      oTimer.start(); -    std::string sFirmware; -    CODE rc = FAILURE; +    std::string sQuectelFirmware; +    CODE rc = ERROR;      while (oTimer.getSeconds() < (5 * 60)) { // 5 minutes          MTS::Thread::sleep(10000); -        if (getFirmware(sFirmware) != SUCCESS) { +        if (getQuectelFirmware(sQuectelFirmware) != SUCCESS) {              // The radio is probably unavailable              resetConnection(100);              continue;          } -#if 0 -        // TODO: Implement the version check -        if (sFirmware == m_sFw && sFirmwareBuild == m_sFwBuild) { -            // Have the same firmware. The radio resets several time -            // before the firmware is actually get upgraded. So keep polling. -            continue; +        printInfo("Firmware version before the upgrade: %s", m_sQuectelFirmware.c_str()); +        printInfo("Current firmware version: %s", sQuectelFirmware.c_str()); + +        if (sQuectelFirmware == m_sQuectelFirmware) { +            // Radio will not reset anymore, firmware version left the same, not updated +            printError("Radio firmware version not changed after upgrade"); +            rc = FAILURE; +            break;          } -#endif          // The firmware numbers have changed -        printTrace("Current firmware: %s", sFirmware.c_str());          rc = SUCCESS;          break; -      }      oTimer.stop(); -    if (rc != SUCCESS) { +    if (rc == ERROR) {          printError("Radio is not responding");          callNextStep(stepCb, "FUMO Error: unable to obtain radio after reset");      } | 
