summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/MTS_IO_QuectelRadio.cpp26
1 files changed, 17 insertions, 9 deletions
diff --git a/src/MTS_IO_QuectelRadio.cpp b/src/MTS_IO_QuectelRadio.cpp
index a41e6fc..67a8d71 100644
--- a/src/MTS_IO_QuectelRadio.cpp
+++ b/src/MTS_IO_QuectelRadio.cpp
@@ -31,7 +31,7 @@
using namespace MTS::IO;
-const size_t QuectelRadio::FILE_CHUNK_SIZE = 1024;
+const size_t QuectelRadio::FILE_CHUNK_SIZE = 2048;
const std::string QuectelRadio::CMD_ABORT_UPLOAD = "+++";
// It is strongly recommended to use DOS 8.3 file name format for <filename>.
@@ -874,6 +874,11 @@ ICellularRadio::CODE QuectelRadio::uploadFile(int fd, const std::string& sTarget
const uint16_t uFileTimeout = 2; // s
const int32_t iUploadResultTimeout = uFileTimeout * 2 * 1000; // ms
+ // Quectel radios return ACK string every 1024 bytes
+ const size_t nChunksPerAck = std::max(static_cast<size_t>(1), (1024 / FILE_CHUNK_SIZE));
+ const size_t nAcksPerChunk = std::max(static_cast<size_t>(1), (FILE_CHUNK_SIZE / 1024));
+ const std::string sAckString(nAcksPerChunk, 'A');
+
size_t dPayloadLength;
size_t nChunks;
CODE rc;
@@ -907,8 +912,8 @@ ICellularRadio::CODE QuectelRadio::uploadFile(int fd, const std::string& sTarget
std::string sResponse;
// ACK waiter callback - wait for ACK and populate result code
- IsNeedMoreData waitAck = [&rc](const std::string& iterationData, const std::string&/*allData*/)->bool {
- if (iterationData.find('A') != std::string::npos) {
+ IsNeedMoreData waitAck = [&rc, &sAckString](const std::string& /*iterationData*/, const std::string& allData)->bool {
+ if (allData.find(sAckString) != std::string::npos) {
// No data needed
rc = SUCCESS;
return false;
@@ -919,7 +924,7 @@ ICellularRadio::CODE QuectelRadio::uploadFile(int fd, const std::string& sTarget
return true;
};
- for (size_t iChunk = 1; iChunk < (nChunks + 1); iChunk++) {
+ for (size_t iChunk = 0; iChunk < nChunks; iChunk++) {
rc = readChunk(fd, vBuffer.data(), vBuffer.size(), nFragmentLength);
if (rc != SUCCESS) {
@@ -936,11 +941,14 @@ ICellularRadio::CODE QuectelRadio::uploadFile(int fd, const std::string& sTarget
break;
}
- // Wait for ACK for up to 1 second and populate rc variable
- sResponse = waitResponse(waitAck, 1000);
- if (rc != SUCCESS) {
- // timeout or end of execution - check later
- break;
+ // Every 1024 bytes
+ if ((iChunk) && (iChunk % nChunksPerAck == 0)) {
+ // Wait for ACK for up to 1 second and populate rc variable
+ sResponse = waitResponse(waitAck, 1000);
+ if (rc != SUCCESS) {
+ // timeout or end of execution - check later
+ break;
+ }
}
if (stepCb && ((iChunk % nChunksPerCent) == 0)) {