From cae27c1764afeb66e4313bc844a225f83c44af71 Mon Sep 17 00:00:00 2001 From: oscgonfer Date: Sat, 18 Jul 2026 20:52:39 +0200 Subject: [PATCH] Add retries for SCD4X data reading (#11058) * Add retries for SCD4X data reading * Adds a retry loop with 3 tries by default to get sensor data from the SCD4X * Fix log and happy path --- src/modules/Telemetry/Sensor/SCD4XSensor.cpp | 14 ++++++++++++-- src/modules/Telemetry/Sensor/SCD4XSensor.h | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/modules/Telemetry/Sensor/SCD4XSensor.cpp b/src/modules/Telemetry/Sensor/SCD4XSensor.cpp index bae0cf12a..26d50ab3e 100644 --- a/src/modules/Telemetry/Sensor/SCD4XSensor.cpp +++ b/src/modules/Telemetry/Sensor/SCD4XSensor.cpp @@ -104,8 +104,18 @@ bool SCD4XSensor::getMetrics(meshtastic_Telemetry *measurement) reClockI2C.setClock(SCD4X_I2C_CLOCK_SPEED); #endif /* SCD4X_I2C_CLOCK_SPEED */ - bool dataReady; - error = scd4x.getDataReadyStatus(dataReady); + bool dataReady = false; + uint8_t dataReadyTries = 0; + + while (!dataReady && (dataReadyTries < SCD4X_MAX_RETRIES)) { + error = scd4x.getDataReadyStatus(dataReady); + if (error != SCD4X_NO_ERROR || !dataReady) { + LOG_WARN("%s: Error collecting data. Retrying", sensorName); + delay(100); + dataReadyTries++; + } + } + if (error != SCD4X_NO_ERROR || !dataReady) { #ifdef SCD4X_I2C_CLOCK_SPEED LOG_DEBUG("%s: restoring clock speed", sensorName); diff --git a/src/modules/Telemetry/Sensor/SCD4XSensor.h b/src/modules/Telemetry/Sensor/SCD4XSensor.h index 065c82a13..f9161942e 100644 --- a/src/modules/Telemetry/Sensor/SCD4XSensor.h +++ b/src/modules/Telemetry/Sensor/SCD4XSensor.h @@ -11,6 +11,7 @@ // Max speed 400kHz #define SCD4X_I2C_CLOCK_SPEED 400000 #define SCD4X_WARMUP_MS 5000 +#define SCD4X_MAX_RETRIES 3 class SCD4XSensor : public TelemetrySensor {