From 31b6fb297b4af9e59c425d1549b6d44e8ff39493 Mon Sep 17 00:00:00 2001 From: alkonosst Date: Sun, 23 Nov 2025 21:11:02 -0300 Subject: [PATCH] fix(Modem): Calculate correctly remaining timeout of waiting functions --- src/SIM7600Modem.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/SIM7600Modem.cpp b/src/SIM7600Modem.cpp index 93c9ed9..defb65d 100644 --- a/src/SIM7600Modem.cpp +++ b/src/SIM7600Modem.cpp @@ -164,7 +164,12 @@ Status Modem::waitForResponse(const char* expected_response, const uint32_t time uint32_t start = millis(); while ((millis() - start) < timeout_ms) { - Status status = readLine(_rx_buf, SIM7600_MODEM_RX_BUFFER_SIZE_B, timeout_ms); + uint32_t elapsed = millis() - start; + if (elapsed >= timeout_ms) break; + + uint32_t remaining_time_ms = timeout_ms - elapsed; + + Status status = readLine(_rx_buf, SIM7600_MODEM_RX_BUFFER_SIZE_B, remaining_time_ms); if (status == Status::EmptyLine) continue; if (status != Status::Success) return status; @@ -190,7 +195,12 @@ Status Modem::waitForResponses(const char** expected_responses, const uint8_t re uint32_t start = millis(); while ((millis() - start) < timeout_ms) { - Status status = readLine(_rx_buf, SIM7600_MODEM_RX_BUFFER_SIZE_B, timeout_ms); + uint32_t elapsed = millis() - start; + if (elapsed >= timeout_ms) break; + + uint32_t remaining_time_ms = timeout_ms - elapsed; + + Status status = readLine(_rx_buf, SIM7600_MODEM_RX_BUFFER_SIZE_B, remaining_time_ms); if (status == Status::EmptyLine) continue; if (status != Status::Success) return status; @@ -218,12 +228,17 @@ Status Modem::waitForPrompt(const uint32_t timeout_ms) { uint32_t start = millis(); while ((millis() - start) < timeout_ms) { + uint32_t elapsed = millis() - start; + if (elapsed >= timeout_ms) break; + + uint32_t remaining_time_ms = timeout_ms - elapsed; + size_t bytes_read = 0; Status status = readBytes(reinterpret_cast(_rx_buf), SIM7600_MODEM_RX_BUFFER_SIZE_B, 1, bytes_read, - timeout_ms); + remaining_time_ms); if (status != Status::Success) return status;