summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSerhii Kostiuk <serhii.o.kostiuk@globallogic.com>2020-07-03 22:03:53 +0300
committerSerhii Kostiuk <serhii.o.kostiuk@globallogic.com>2020-07-03 22:03:53 +0300
commit075c19d664719808164a5c4ea5e5a3525fcb4702 (patch)
treecc2c4b5f239d9c2023d1b9423cee3c975bceaa70
parentd19829b7e9cdd3c7e3d209628044ab62cd46b907 (diff)
downloadlibmts-io-075c19d664719808164a5c4ea5e5a3525fcb4702.tar.gz
libmts-io-075c19d664719808164a5c4ea5e5a3525fcb4702.tar.bz2
libmts-io-075c19d664719808164a5c4ea5e5a3525fcb4702.zip
Quectel Delta Radio Firmware Upgrade support - libmts-io implementation
Cleanup for the printouts and status messages.
-rw-r--r--src/MTS_IO_QuectelRadio.cpp52
1 files changed, 38 insertions, 14 deletions
diff --git a/src/MTS_IO_QuectelRadio.cpp b/src/MTS_IO_QuectelRadio.cpp
index cbc2cfb..03593a7 100644
--- a/src/MTS_IO_QuectelRadio.cpp
+++ b/src/MTS_IO_QuectelRadio.cpp
@@ -549,9 +549,12 @@ ICellularRadio::CODE QuectelRadio::fumoLocalInject(int fd, ICellularRadio::Updat
bool bIsFilePresent = false;
do {
+ callNextStep(stepCb, "FUMO Info: downloading the firmware");
+
rc = checkFile(bIsFilePresent, VALUE_MTS_DELTA_NAME);
if (rc != SUCCESS) {
- printError("Failed to check if the delta file was already uploaded.");
+ printError("Failed to check if the delta file was already download.");
+ callNextStep(stepCb, "FUMO Error: failed to download the firmware file");
break;
}
@@ -561,15 +564,19 @@ ICellularRadio::CODE QuectelRadio::fumoLocalInject(int fd, ICellularRadio::Updat
if (rc != SUCCESS) {
printError("Failed to remove the previous delta file.");
+ callNextStep(stepCb, "FUMO Error: failed to download the firmware file");
break;
}
rc = uploadFile(fd, VALUE_MTS_DELTA_NAME, stepCb);
if (rc != SUCCESS) {
- printError("Failed to upload the delta file.");
+ printError("Failed to inject the delta file.");
+ callNextStep(stepCb, "FUMO Error: failed to download the firmware file");
break;
}
+ callNextStep(stepCb, "FUMO Info: firmware downloaded successfully");
+
} while (false);
return rc;
@@ -592,6 +599,7 @@ ICellularRadio::CODE QuectelRadio::fumoLocalApply(ICellularRadio::UpdateCb& step
rc = sendBasicCommand(sCmd, 1000);
if (rc != SUCCESS) {
+ printError("FUMO failed, OK not received from the radio");
callNextStep(stepCb, "FUMO Error: failed to apply the firmware");
return rc;
}
@@ -611,29 +619,44 @@ ICellularRadio::CODE QuectelRadio::fumoLocalApply(ICellularRadio::UpdateCb& step
// It's now detached. Try to reconnect
if (!resetConnection(duAttachTimeout)) {
printError("Can't connect to the radio in %d ms", (duAttachTimeout));
-
- callNextStep(stepCb, "FUMO error: failed to connect to the radio in recovery mode");
+ callNextStep(stepCb, "FUMO Error: unable to obtain radio after reset");
break;
}
// It's now back on the bus. Wait for the URC messages.
+ printInfo("Applying the radio firmware");
+ callNextStep(stepCb, "FUMO Info: applying the radio firmware");
rc = fumoWaitUpgradeFinished(stepCb);
+
if (rc == ERROR) {
// unrecoverable error
+ callNextStep(stepCb, "FUMO Error: failed to apply the firmware, consider radio reset");
break;
}
if (rc != SUCCESS) {
// attempt failed, radio reboots and starts its next attempt
+ printError("Failed to apply the firmware, attempts left: %d", (dMaxAttempts - i - 1));
+ callNextStep(stepCb, "FUMO Error: failed to apply the firmware");
continue;
}
- // attempt finished
+ // Wait for the radio to finish update and reboot
+ printTrace("Waiting for the radio to come up");
+ callNextStep(stepCb, "FUMO Info: waiting for the radio to enter normal mode");
+
+ rc = fumoWaitNewFirmware(stepCb);
break;
}
- // Wait for the radio to finish update and reboot
- rc = fumoWaitNewFirmware(stepCb);
+ if (rc == SUCCESS) {
+ printInfo("Radio firmware applied successfully");
+ callNextStep(stepCb, "FUMO done: radio firmware applied successfully");
+ } else {
+ printError("Radio firmware has not been updated");
+ callNextStep(stepCb, "FUMO error: radio firmware has not been updated");
+ }
+
return rc;
}
@@ -1015,7 +1038,7 @@ ICellularRadio::CODE QuectelRadio::fumoWaitUpgradeFinished(ICellularRadio::Updat
const std::string sFotaUrcEnd = "\"END\"";
const std::vector<std::string> vFotaBailStrings{ sFotaUrcPrefix };
- CODE rc = ERROR;
+ CODE rc = FAILURE;
std::string sResponse;
while (true) { // breaks on "FOTA","END"
@@ -1025,6 +1048,7 @@ ICellularRadio::CODE QuectelRadio::fumoWaitUpgradeFinished(ICellularRadio::Updat
if (sResponse.find(sFotaUrcPrefix) == std::string::npos) {
printError("No URC messages from the radio in %d ms", duUrcTimeout);
callNextStep(stepCb, "FUMO error: timeout, radio is not responding");
+ rc = ERROR;
break;
}
@@ -1041,7 +1065,7 @@ ICellularRadio::CODE QuectelRadio::fumoWaitUpgradeFinished(ICellularRadio::Updat
break;
}
// attempt failed, the radio attempts to recover
- rc = FAILURE;
+ callNextStep(stepCb, "FUMO Error: radio returned error code " + sCode);
break;
} else if (sStage == sFotaUrcStart) {
printTrace("Got FOTA START message");
@@ -1049,6 +1073,7 @@ ICellularRadio::CODE QuectelRadio::fumoWaitUpgradeFinished(ICellularRadio::Updat
printTrace("Got FOTA progress message");
const std::string& sPercents = vParts[2];
printInfo("FOTA progress: [%s]", sPercents.c_str());
+ callNextStep(stepCb, "FUMO Info: firmware apply progress " + sPercents);
} else {
printInfo("FOTA unexpected URC code: [%s]", sStage.c_str());
}
@@ -1074,6 +1099,7 @@ ICellularRadio::CODE QuectelRadio::fumoWaitNewFirmware(ICellularRadio::UpdateCb&
}
#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.
@@ -1089,11 +1115,9 @@ ICellularRadio::CODE QuectelRadio::fumoWaitNewFirmware(ICellularRadio::UpdateCb&
}
oTimer.stop();
- if (rc == SUCCESS) {
- callNextStep(stepCb, "FUMO done: radio firmware applied successfully");
- }
- else {
- callNextStep(stepCb, "FUMO error: radio firmware has not been updated");
+ if (rc != SUCCESS) {
+ printError("Radio is not responding");
+ callNextStep(stepCb, "FUMO Error: unable to obtain radio after reset");
}
return rc;