From a872231f8a25ddb7b834dab399fbfb6dab3f6a5b Mon Sep 17 00:00:00 2001 From: Kevin Hester Date: Sun, 14 Feb 2021 11:57:48 +0800 Subject: [PATCH] clean up position broadcasts, send them even if we don't have gps lock --- src/mesh/MeshService.cpp | 17 ----------------- src/plugins/PositionPlugin.cpp | 19 +++++++++++++++++++ src/plugins/PositionPlugin.h | 14 ++++++++++++-- 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/mesh/MeshService.cpp b/src/mesh/MeshService.cpp index 59e9fb25..a6eaff5c 100644 --- a/src/mesh/MeshService.cpp +++ b/src/mesh/MeshService.cpp @@ -247,22 +247,5 @@ int MeshService::onGPSChanged(const meshtastic::GPSStatus *unused) // Update our current position in the local DB nodeDB.updatePosition(nodeDB.getNodeNum(), pos); - // We limit our GPS broadcasts to a max rate - static uint32_t lastGpsSend; - uint32_t now = millis(); - if (lastGpsSend == 0 || now - lastGpsSend > getPref_position_broadcast_secs() * 1000) { - lastGpsSend = now; - - static uint32_t currentGeneration; - - // If we changed channels, ask everyone else for their latest info - bool requestReplies = currentGeneration != radioGeneration; - currentGeneration = radioGeneration; - - DEBUG_MSG("Sending position to mesh (wantReplies=%d)\n", requestReplies); - assert(positionPlugin); - positionPlugin->sendOurPosition(NODENUM_BROADCAST, requestReplies); - } - return 0; } diff --git a/src/plugins/PositionPlugin.cpp b/src/plugins/PositionPlugin.cpp index 4a0fdb4d..09dbdd50 100644 --- a/src/plugins/PositionPlugin.cpp +++ b/src/plugins/PositionPlugin.cpp @@ -60,3 +60,22 @@ void PositionPlugin::sendOurPosition(NodeNum dest, bool wantReplies) service.sendToMesh(p); } + + +int32_t PositionPlugin::runOnce(){ + + // We limit our GPS broadcasts to a max rate + uint32_t now = millis(); + if (lastGpsSend == 0 || now - lastGpsSend >= getPref_position_broadcast_secs() * 1000) { + lastGpsSend = now; + + // If we changed channels, ask everyone else for their latest info + bool requestReplies = currentGeneration != radioGeneration; + currentGeneration = radioGeneration; + + DEBUG_MSG("Sending position to mesh (wantReplies=%d)\n", requestReplies); + sendOurPosition(NODENUM_BROADCAST, requestReplies); + } + + return 5000; // to save power only wake for our callback occasionally +} \ No newline at end of file diff --git a/src/plugins/PositionPlugin.h b/src/plugins/PositionPlugin.h index 9ca2d208..580a2299 100644 --- a/src/plugins/PositionPlugin.h +++ b/src/plugins/PositionPlugin.h @@ -1,19 +1,26 @@ #pragma once #include "ProtobufPlugin.h" +#include "concurrency/OSThread.h" /** * Position plugin for sending/receiving positions into the mesh */ -class PositionPlugin : public ProtobufPlugin +class PositionPlugin : public ProtobufPlugin, private concurrency::OSThread { /// The id of the last packet we sent, to allow us to cancel it if we make something fresher PacketId prevPacketId = 0; + /// We limit our GPS broadcasts to a max rate + uint32_t lastGpsSend = 0; + + /// We force a rebroadcast if the radio settings change + uint32_t currentGeneration = 0; + public: /** Constructor * name is for debugging output */ - PositionPlugin() : ProtobufPlugin("position", PortNum_POSITION_APP, Position_fields) {} + PositionPlugin() : ProtobufPlugin("position", PortNum_POSITION_APP, Position_fields), concurrency::OSThread("PositionPlugin") {} /** * Send our position into the mesh @@ -31,6 +38,9 @@ class PositionPlugin : public ProtobufPlugin /** Messages can be received that have the want_response bit set. If set, this callback will be invoked * so that subclasses can (optionally) send a response back to the original sender. */ virtual MeshPacket *allocReply(); + + /** Does our periodic broadcast */ + virtual int32_t runOnce(); }; extern PositionPlugin *positionPlugin; \ No newline at end of file