From fc57a9daa400cd8c46ea40fe6678f79bb7a2b6bf Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Sun, 16 Oct 2022 11:36:38 -0500 Subject: [PATCH] Send environment telemetry every minute (#1808) --- src/modules/Telemetry/DeviceTelemetry.cpp | 5 +-- .../Telemetry/EnvironmentTelemetry.cpp | 33 ++++++++++++------- src/modules/Telemetry/EnvironmentTelemetry.h | 4 ++- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/modules/Telemetry/DeviceTelemetry.cpp b/src/modules/Telemetry/DeviceTelemetry.cpp index ee370692e..4ba35a0eb 100644 --- a/src/modules/Telemetry/DeviceTelemetry.cpp +++ b/src/modules/Telemetry/DeviceTelemetry.cpp @@ -15,8 +15,9 @@ int32_t DeviceTelemetryModule::runOnce() { #ifndef ARCH_PORTDUINO uint32_t now = millis(); - if ((lastSentToMesh == 0 || (now - lastSentToMesh) >= getConfiguredOrDefaultMs(moduleConfig.telemetry.device_update_interval)) - && airTime->channelUtilizationPercent() < max_channel_util_percent) { + if ((lastSentToMesh == 0 || + (now - lastSentToMesh) >= getConfiguredOrDefaultMs(moduleConfig.telemetry.device_update_interval)) && + airTime->channelUtilizationPercent() < max_channel_util_percent) { sendTelemetry(); lastSentToMesh = now; } else if (service.isToPhoneQueueEmpty()) { diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp index 7dbd09146..933f37786 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.cpp +++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp @@ -9,6 +9,7 @@ #include "main.h" #include #include +#include "MeshService.h" // Sensors #include "Sensor/BMP280Sensor.h" @@ -98,15 +99,20 @@ int32_t EnvironmentTelemetryModule::runOnce() // if we somehow got to a second run of this module with measurement disabled, then just wait forever if (!moduleConfig.telemetry.environment_measurement_enabled) return result; - // this is not the first time OSThread library has called this function - // so just do what we intend to do on the interval - if (!sendOurTelemetry()) { - // if we failed to read the sensor, then try again - // as soon as we can according to the maximum polling frequency - return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; + + uint32_t now = millis(); + if ((lastSentToMesh == 0 || + (now - lastSentToMesh) >= getConfiguredOrDefaultMs(moduleConfig.telemetry.environment_update_interval)) && + airTime->channelUtilizationPercent() < max_channel_util_percent) { + sendTelemetry(); + lastSentToMesh = now; + } else if (service.isToPhoneQueueEmpty()) { + // Just send to phone when it's not our time to send to mesh yet + // Only send while queue is empty (phone assumed connected) + sendTelemetry(NODENUM_BROADCAST, true); } } - return getConfiguredOrDefaultMs(moduleConfig.telemetry.environment_update_interval); + return sendToPhoneIntervalMs; #endif } @@ -192,7 +198,7 @@ bool EnvironmentTelemetryModule::handleReceivedProtobuf(const MeshPacket &mp, Te return false; // Let others look at this message also if they want } -bool EnvironmentTelemetryModule::sendOurTelemetry(NodeNum dest, bool wantReplies) +bool EnvironmentTelemetryModule::sendTelemetry(NodeNum dest, bool phoneOnly) { Telemetry m; m.time = getTime(); @@ -234,10 +240,15 @@ bool EnvironmentTelemetryModule::sendOurTelemetry(NodeNum dest, bool wantReplies MeshPacket *p = allocDataProtobuf(m); p->to = dest; - p->decoded.want_response = wantReplies; + p->decoded.want_response = false; lastMeasurementPacket = packetPool.allocCopy(*p); - DEBUG_MSG("Sending packet to mesh"); - service.sendToMesh(p, RX_SRC_LOCAL, true); + if (phoneOnly) { + DEBUG_MSG("Sending packet to phone\n"); + service.sendToPhone(p); + } else { + DEBUG_MSG("Sending packet to mesh\n"); + service.sendToMesh(p, RX_SRC_LOCAL, true); + } return true; } diff --git a/src/modules/Telemetry/EnvironmentTelemetry.h b/src/modules/Telemetry/EnvironmentTelemetry.h index 2166a006a..c081ead51 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.h +++ b/src/modules/Telemetry/EnvironmentTelemetry.h @@ -31,11 +31,13 @@ class EnvironmentTelemetryModule : private concurrency::OSThread, public Protobu /** * Send our Telemetry into the mesh */ - bool sendOurTelemetry(NodeNum dest = NODENUM_BROADCAST, bool wantReplies = false); + bool sendTelemetry(NodeNum dest = NODENUM_BROADCAST, bool wantReplies = false); private: float CelsiusToFahrenheit(float c); bool firstTime = 1; const MeshPacket *lastMeasurementPacket; + uint32_t sendToPhoneIntervalMs = SECONDS_IN_MINUTE * 1000; // Send to phone every minute + uint32_t lastSentToMesh = 0; uint32_t sensor_read_error_count = 0; };