summaryrefslogtreecommitdiff
path: root/src/MTS_IO_TelitRadio.cpp
diff options
context:
space:
mode:
authorAndrii Pientsov <andrii.pientsov@globallogic.com>2020-07-13 15:29:38 +0300
committerAndrii Pientsov <andrii.pientsov@globallogic.com>2020-07-13 15:29:38 +0300
commitccd41677d998134ff501a8d6ac3a154dcaca9321 (patch)
treed2323d7ecbf3b267d5daceeb6d194ba51f5410d0 /src/MTS_IO_TelitRadio.cpp
parent8b4bfd172258ca62932c378f13f2b23a8be6818a (diff)
downloadlibmts-io-ccd41677d998134ff501a8d6ac3a154dcaca9321.tar.gz
libmts-io-ccd41677d998134ff501a8d6ac3a154dcaca9321.tar.bz2
libmts-io-ccd41677d998134ff501a8d6ac3a154dcaca9321.zip
MTX-3404 Code Review
Diffstat (limited to 'src/MTS_IO_TelitRadio.cpp')
-rw-r--r--src/MTS_IO_TelitRadio.cpp138
1 files changed, 31 insertions, 107 deletions
diff --git a/src/MTS_IO_TelitRadio.cpp b/src/MTS_IO_TelitRadio.cpp
index 967baae..86c3565 100644
--- a/src/MTS_IO_TelitRadio.cpp
+++ b/src/MTS_IO_TelitRadio.cpp
@@ -28,7 +28,6 @@
using namespace MTS::IO;
-const size_t TelitRadio::FILE_CHUNK_SIZE = 1024;
const std::string TelitRadio::CMD_ABORT_UPLOAD = "+++";
@@ -739,13 +738,6 @@ ICellularRadio::CODE TelitRadio::setCellularMode(CELLULAR_MODES networks) {
ICellularRadio::CODE TelitRadio::updateFumoLocal(int fd, ICellularRadio::UpdateCb& stepCb) {
CODE rc = FAILURE;
- FOTA_GROUP group = getFotaGroup();
-
- if (group == VALUE_UNKNOWN) {
- printError("Delta firmware upgrade is not supported for this type of radio modem");
- callNextStep(stepCb, "FUMO Error: delta firmware upgrade is not supported for this type of radio modem");
- return rc;
- }
rc = fumoLocalInject(fd, stepCb);
if (rc != SUCCESS) {
@@ -765,16 +757,22 @@ ICellularRadio::CODE TelitRadio::fumoLocalInject(int fd, ICellularRadio::UpdateC
callNextStep(stepCb, "FUMO Info: downloading the firmware");
if ((group == VALUE_GROUP_A) || (group == VALUE_GROUP_B) || (group == VALUE_GROUP_D)) {
- rc = uploadFile(fd, stepCb);
+ rc = fumoWriteGroupsABD(fd, stepCb);
if (rc != SUCCESS) {
printError("Failed to inject the delta file.");
callNextStep(stepCb, "FUMO Error: failed to download the firmware file");
break;
}
} else if (group == VALUE_GROUP_C) {
- //TODO Not Implemented
+ //TODO Not Implemented TelitRadio::fumoWriteGroupC
printError("Failed to inject the delta file.");
callNextStep(stepCb, "FUMO Error: not implemented");
+ rc = NOT_APPLICABLE;
+ break;
+ } else {
+ printError("Delta firmware upgrade is not supported for this type of radio modem");
+ callNextStep(stepCb, "FUMO Error: delta firmware upgrade is not supported for this type of radio modem");
+ rc = NOT_APPLICABLE;
break;
}
@@ -803,9 +801,13 @@ ICellularRadio::CODE TelitRadio::fumoLocalApply(ICellularRadio::UpdateCb& stepCb
} else if ((group == VALUE_GROUP_B) || (group == VALUE_GROUP_C)) {
// Send "AT#OTAUP=2" command to start the upgrade. OK response follows shortly.
sCmd = "AT#OTAUP=2";
+ } else {
+ printError("Delta firmware upgrade is not supported for this type of radio modem");
+ callNextStep(stepCb, "FUMO Error: delta firmware upgrade is not supported for this type of radio modem");
+ return NOT_APPLICABLE;
}
- rc = sendBasicCommand(sCmd, 2000);
+ rc = sendBasicCommand(sCmd, 10000);
if (rc != SUCCESS) {
printError("FUMO failed, OK not received from the radio");
@@ -814,30 +816,15 @@ ICellularRadio::CODE TelitRadio::fumoLocalApply(ICellularRadio::UpdateCb& stepCb
}
const uint32_t duDetachTimeout = 10000; // wait for 10 seconds for the radio to detach
- const uint32_t duAttachTimeout = 300000; // wait for 300 seconds for the radio to attach
do {
- printInfo("Waiting for the radio to enter recovery mode");
- callNextStep(stepCb, "FUMO Info: waiting for the radio to enter recovery mode");
+ printInfo("Applying the radio firmware");
+ callNextStep(stepCb, "FUMO Info: applying the radio firmware");
// Wait for the radio to detach from the USB bus
MTS::Thread::sleep(duDetachTimeout);
- printInfo("Firmware update in progress");
- callNextStep(stepCb, "FUMO Info: firmware update in progress");
-
- // 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: unable to obtain radio after reset");
- rc = ERROR;
- break;
- }
-
- // 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 = fumoWaitRadioBooted(stepCb);
+ rc = fumoWaitUpgradeFinished(stepCb);
if (rc != SUCCESS) {
break;
@@ -863,7 +850,7 @@ TelitRadio::FOTA_GROUP TelitRadio::getFotaGroup() {
return VALUE_UNKNOWN;
}
-ICellularRadio::CODE TelitRadio::uploadFile(int fd, ICellularRadio::UpdateCb& stepCb) {
+ICellularRadio::CODE TelitRadio::fumoWriteGroupsABD(int fd, ICellularRadio::UpdateCb& stepCb) {
size_t dPayloadLength;
size_t nChunks;
CODE rc;
@@ -875,7 +862,7 @@ ICellularRadio::CODE TelitRadio::uploadFile(int fd, ICellularRadio::UpdateCb& st
printTrace("File size: %d bytes and %d chunks", dPayloadLength, nChunks);
printTrace("Starting file upload...");
- rc = startFileUpload();
+ rc = startWrite();
if (rc != SUCCESS) {
return rc;
}
@@ -912,83 +899,12 @@ ICellularRadio::CODE TelitRadio::uploadFile(int fd, ICellularRadio::UpdateCb& st
}
// send +++
- abortFileUpload();
- return rc;
-}
-
-ICellularRadio::CODE TelitRadio::getFileSize(int fd, size_t& nBytes, size_t& nChunks) {
- CODE rc = FAILURE;
-
- do {
- ssize_t dScrollPos;
- dScrollPos = lseek(fd, 0, SEEK_SET);
- if (dScrollPos < 0) {
- printError("Failed to seek to the start of the file: %d", errno);
- break;
- }
-
- dScrollPos = lseek(fd, 0, SEEK_END);
- if (dScrollPos < 0) {
- printError("Failed to determine the file size: %d", errno);
- break;
- }
-
- nBytes = static_cast<size_t>(dScrollPos);
- nChunks = (nBytes + FILE_CHUNK_SIZE - 1) / FILE_CHUNK_SIZE; // round up
-
- rc = SUCCESS;
-
- } while (false);
-
- lseek(fd, 0, SEEK_SET);
+ abortWrite();
return rc;
}
-ICellularRadio::CODE TelitRadio::readChunk(int fd, char* pChunk, size_t dChunkSize, size_t& nReadBytes) {
- size_t nUsedBuffer = 0;
- CODE rc = FAILURE;
-
- while (true) {
-
- if (nUsedBuffer > dChunkSize) {
- printError("Internal pointer error, abort upload: %d", nUsedBuffer);
- rc = ERROR;
- break;
- }
-
- if (nUsedBuffer == dChunkSize) {
- // full chunk received
- rc = SUCCESS;
- nReadBytes = dChunkSize;
- break;
- }
-
- char* pData = pChunk + nUsedBuffer;
- size_t nFreeBuffer = dChunkSize - nUsedBuffer;
-
- ssize_t dReadCount = read(fd, pData, nFreeBuffer);
- if (dReadCount < 0) {
- printError("Failed to read from the source file: %d", errno);
- rc = ERROR;
- break;
- }
-
- size_t duReadCount = static_cast<size_t>(dReadCount);
- if (duReadCount == 0) {
- // EOF. Return what was already read
- nReadBytes = nUsedBuffer;
- rc = SUCCESS;
- break;
- }
-
- nUsedBuffer += duReadCount;
- }
-
- return rc;
-}
-
-ICellularRadio::CODE TelitRadio::startFileUpload() {
+ICellularRadio::CODE TelitRadio::startWrite() {
const std::vector<std::string> vBailStrings{ ICellularRadio::RSP_CONNECT, ICellularRadio::RSP_ERROR };
const int dTimeout = 1000; //ms
std::string sCommand, sResult;
@@ -1004,7 +920,7 @@ ICellularRadio::CODE TelitRadio::startFileUpload() {
return SUCCESS;
}
-ICellularRadio::CODE TelitRadio::abortFileUpload() {
+ICellularRadio::CODE TelitRadio::abortWrite() {
/*
* To prevent the “+++” from being mistaken for data, the following sequence should be followed:
* 1) Do not input any character within 1s or longer before inputting “+++”.
@@ -1050,8 +966,9 @@ ICellularRadio::CODE TelitRadio::getTelitFirmware(std::string& sFirmware) {
return SUCCESS;
}
-ICellularRadio::CODE TelitRadio::fumoWaitRadioBooted(ICellularRadio::UpdateCb& stepCb) {
- const uint32_t duUrcTimeout = 60 * 1000; // wait for 1 minutes for the next URC message
+ICellularRadio::CODE TelitRadio::fumoWaitUpgradeFinished(ICellularRadio::UpdateCb& stepCb) {
+ const uint32_t duAttachTimeout = 300000; // wait for 300 seconds for the radio to attach
+ const uint32_t duUrcTimeout = 60 * 1000; // wait for 1 minutes for the next URC message
const std::string sFotaUrcPrefix = "#OTAEV:"; // prefix for the URC notification messages
const std::string sFotaUrcEndSuccess = "Module Upgraded To New Fw";
const std::string sFotaUrcEndFailed = "OTA Fw Upgrade Failed";
@@ -1060,6 +977,13 @@ ICellularRadio::CODE TelitRadio::fumoWaitRadioBooted(ICellularRadio::UpdateCb& s
CODE rc = FAILURE;
std::string sResponse;
+ // 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: unable to obtain radio after reset");
+ return ERROR;
+ }
+
while (true) {
sResponse = sendCommand("", vFotaBailStrings, duUrcTimeout, 0x00);