diff options
| author | Serhii Kostiuk <serhii.o.kostiuk@globallogic.com> | 2020-07-23 16:03:09 +0300 | 
|---|---|---|
| committer | Serhii Kostiuk <serhii.o.kostiuk@globallogic.com> | 2020-07-23 18:40:24 +0300 | 
| commit | cb4e2bf0e1902ef91fe10fe6e6aa9c91e04d7c90 (patch) | |
| tree | 380b6513ab601f759d03786d30800ca19b3d2a25 | |
| parent | 8af6be402eba48a02853bebc5f9f6d5b9e8844f3 (diff) | |
| download | libmts-io-cb4e2bf0e1902ef91fe10fe6e6aa9c91e04d7c90.tar.gz libmts-io-cb4e2bf0e1902ef91fe10fe6e6aa9c91e04d7c90.tar.bz2 libmts-io-cb4e2bf0e1902ef91fe10fe6e6aa9c91e04d7c90.zip | |
Quectel Delta Radio Firmware Upgrade support - libmts-io implementation
During testing it was discovered that rarely CellularRadio::sendCommand implementation
returns not one line with URC output but multiple lines.
It happened once during testing and development. But is likely to happen again under
increased CPU load and/or when CPU does not keep pace with the serial data flow.
| -rw-r--r-- | src/MTS_IO_QuectelRadio.cpp | 68 | 
1 files changed, 46 insertions, 22 deletions
| diff --git a/src/MTS_IO_QuectelRadio.cpp b/src/MTS_IO_QuectelRadio.cpp index 59170fe..8656973 100644 --- a/src/MTS_IO_QuectelRadio.cpp +++ b/src/MTS_IO_QuectelRadio.cpp @@ -1001,10 +1001,11 @@ ICellularRadio::CODE QuectelRadio::fumoWaitUpgradeFinished(ICellularRadio::Updat      const std::string sFotaUrcEnd = "\"END\"";      const std::vector<std::string> vFotaBailStrings{ sFotaUrcPrefix }; +    bool bFinished = false;      CODE rc = FAILURE;      std::string sResponse; -    while (true) {  // breaks on "FOTA","END" +    while (!bFinished) {  // breaks on "FOTA","END"          sResponse = sendCommand("", vFotaBailStrings, duUrcTimeout, 0x00);          printTrace("Radio response: [%s]", sResponse.c_str()); @@ -1015,31 +1016,54 @@ ICellularRadio::CODE QuectelRadio::fumoWaitUpgradeFinished(ICellularRadio::Updat              break;          } -        const auto vParts = MTS::Text::split(MTS::Text::trim(sResponse), ',', 3); -        const std::string& sStage = getByIndex(vParts, 1, "NOT_DEFINED"); +        // Occasionally sendCommand returns multiple lines in one chunk. +        // Handle each line separately for such cases. +        const auto vLines = MTS::Text::split(sResponse, '\r'); -        if (sStage == sFotaUrcEnd) { -            // FOTA finished -            printTrace("Got FOTA END message"); -            const std::string& sCode = getByIndex(vParts, 2, "-1"); +        for (const auto& sLine : vLines) { +            const auto& sTrimmedLine = MTS::Text::trim(sLine); -            if (sCode == "0") { -                // finished successfully -                rc = SUCCESS; +            if (sTrimmedLine.empty()) { +                // whitespace characters only, ignore +                continue; +            } + +            printTrace("Processing line: [%s]", sTrimmedLine.c_str()); + +            if (sTrimmedLine.find(sFotaUrcPrefix) == std::string::npos) { +                printDebug("URC message not found, line skipped"); +                continue; +            } + +            const auto vParts = MTS::Text::split(sTrimmedLine, ',', 3); +            const std::string& sStage = getByIndex(vParts, 1, "NOT_DEFINED"); + +            if (sStage == sFotaUrcEnd) { +                // FOTA finished +                printTrace("Got FOTA END message"); +                const std::string& sCode = getByIndex(vParts, 2, "-1"); + +                if (sCode == "0") { +                    // finished successfully +                    rc = SUCCESS; +                    bFinished = true; +                    break; +                } + +                // attempt failed, the radio attempts to recover +                callNextStep(stepCb, "FUMO Error: radio returned error code " + sCode); +                bFinished = true;                  break; +            } else if (sStage == sFotaUrcStart) { +                printTrace("Got FOTA START message"); +            } else if (sStage == sFotaUrcProgress) { +                printTrace("Got FOTA progress message"); +                const std::string& sPercents = getByIndex(vParts, 2, "0"); +                printInfo("FOTA progress: [%s]", sPercents.c_str()); +                callNextStep(stepCb, "FUMO Info: firmware apply progress " + sPercents); +            } else { +                printInfo("FOTA unexpected URC code: [%s]", sLine.c_str());              } -            // attempt failed, the radio attempts to recover -            callNextStep(stepCb, "FUMO Error: radio returned error code " + sCode); -            break; -        } else if (sStage == sFotaUrcStart) { -            printTrace("Got FOTA START message"); -        } else if (sStage == sFotaUrcProgress) { -            printTrace("Got FOTA progress message"); -            const std::string& sPercents = getByIndex(vParts, 2, "0"); -            printInfo("FOTA progress: [%s]", sPercents.c_str()); -            callNextStep(stepCb, "FUMO Info: firmware apply progress " + sPercents); -        } else { -            printInfo("FOTA unexpected URC code: [%s]", sResponse.c_str());          }      } | 
