Correct for awake time in AQ telemetry (#11404)
* Correct for awake time in AQ telemetry * Minor typo on debug log * Avoid updating start of cycle twice Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Fix log type * Only update ahead of time if successful transmit --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
This commit is contained in:
co-authored by
coderabbitai[bot]
parent
cb557d89a6
commit
97f8361867
2 files changed
+36
-8
No files matched your search
@@ -208,6 +208,10 @@ int32_t AirQualityTelemetryModule::runOnce()
|
||||
|
||||
if (!sensor->isActive()) {
|
||||
LOG_DEBUG("Waking up: %s", sensor->sensorName);
|
||||
if (awakeAheadOfTimeMs == 0)
|
||||
startAirQualityTelemetryCycle = millis();
|
||||
awakeAheadOfTimeMs = max(awakeAheadOfTimeMs, sensor->wakeUpTimeMs());
|
||||
// TODO multiple sensors with different wake up times collide
|
||||
return sensor->wakeUp();
|
||||
}
|
||||
|
||||
@@ -219,19 +223,35 @@ int32_t AirQualityTelemetryModule::runOnce()
|
||||
}
|
||||
|
||||
bool telemetryDue = (lastTelemetry == 0) || !Throttle::isWithinTimespanMs(lastTelemetry, telemetryIntervalMs);
|
||||
|
||||
bool phoneDue = (lastSentToPhone == 0) || !Throttle::isWithinTimespanMs(lastSentToPhone, sendToPhoneIntervalMs);
|
||||
|
||||
if (telemetryDue && telemetryAllowed) {
|
||||
sendTelemetry();
|
||||
|
||||
if (transmitHistory) {
|
||||
transmitHistory->setLastSentToMesh(TX_HISTORY_KEY_AIR_QUALITY_TELEMETRY);
|
||||
if (sendTelemetry()) {
|
||||
if (transmitHistory) {
|
||||
transmitHistory->setLastSentToMesh(TX_HISTORY_KEY_AIR_QUALITY_TELEMETRY);
|
||||
}
|
||||
// Correct the awake time, trimming to 0
|
||||
const unsigned long elapsed = millis() - startAirQualityTelemetryCycle;
|
||||
awakeAheadOfTimeMs = elapsed >= awakeAheadOfTimeMs ? 0 : awakeAheadOfTimeMs - elapsed;
|
||||
// LOG_DEBUG("Time to publish. Correcting ahead of time by: %d", awakeAheadOfTimeMs);
|
||||
} else {
|
||||
awakeAheadOfTimeMs = 0;
|
||||
}
|
||||
} else if (phoneDue && phoneAllowed) {
|
||||
// Mesh transmission isn't due yet, but we can still update the phone.
|
||||
sendTelemetry(NODENUM_BROADCAST, true);
|
||||
lastSentToPhone = millis();
|
||||
if (sendTelemetry(NODENUM_BROADCAST, true)) {
|
||||
lastSentToPhone = millis();
|
||||
// Correct the awake time, trimming to 0
|
||||
const unsigned long elapsed = millis() - startAirQualityTelemetryCycle;
|
||||
awakeAheadOfTimeMs = elapsed >= awakeAheadOfTimeMs ? 0 : awakeAheadOfTimeMs - elapsed;
|
||||
// LOG_DEBUG("Time to publish. Correcting ahead of time by: %d", awakeAheadOfTimeMs);
|
||||
} else {
|
||||
awakeAheadOfTimeMs = 0;
|
||||
}
|
||||
} else {
|
||||
// if for some reason we end up here after waking up, but not able to send, then reset
|
||||
// the counter
|
||||
awakeAheadOfTimeMs = 0;
|
||||
}
|
||||
|
||||
// Send to sleep sensors that can be to save power
|
||||
@@ -253,7 +273,13 @@ int32_t AirQualityTelemetryModule::runOnce()
|
||||
// mistime the pending deep sleep
|
||||
return FIVE_SECONDS_MS;
|
||||
}
|
||||
return min(sendToPhoneIntervalMs, result);
|
||||
|
||||
// Update next interval if we were ahead
|
||||
uint32_t correctedIntervalMs = sendToPhoneIntervalMs + awakeAheadOfTimeMs;
|
||||
awakeAheadOfTimeMs = 0;
|
||||
startAirQualityTelemetryCycle = 0;
|
||||
LOG_DEBUG("Corrected interval in ms: %u", correctedIntervalMs);
|
||||
return min(correctedIntervalMs, result);
|
||||
}
|
||||
|
||||
bool AirQualityTelemetryModule::wantUIFrame()
|
||||
|
||||
@@ -66,6 +66,8 @@ class AirQualityTelemetryModule : private concurrency::OSThread,
|
||||
|
||||
private:
|
||||
bool firstTime = true;
|
||||
int32_t awakeAheadOfTimeMs = 0;
|
||||
int32_t startAirQualityTelemetryCycle = 0;
|
||||
meshtastic_MeshPacket *lastMeasurementPacket;
|
||||
uint32_t sendToPhoneIntervalMs = SECONDS_IN_MINUTE * 1000; // Send to phone every minute
|
||||
// uint32_t sendToPhoneIntervalMs = 1000; // Send to phone every minute
|
||||
|
||||
Reference in New Issue
Block a user