diff options
Diffstat (limited to 'src')
| -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());          }      } | 
