From 359b41d869c6e7ad5d073cbdf331c11ea82c8454 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Tue, 26 Apr 2022 19:40:24 -0500 Subject: [PATCH] Position fwd phone (#1413) * Correct factory reset code for NRF (from 1.2) * Changes from 1.2 * Update proto ref * Whoops Co-authored-by: Ben Meadors --- src/mesh/MeshService.cpp | 32 ++++++++++++++++++++------------ src/mesh/MeshService.h | 5 ++++- src/modules/PositionModule.cpp | 2 +- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/mesh/MeshService.cpp b/src/mesh/MeshService.cpp index fa1b2a90c..6fe8cd38d 100644 --- a/src/mesh/MeshService.cpp +++ b/src/mesh/MeshService.cpp @@ -71,17 +71,7 @@ int MeshService::handleFromRadio(const MeshPacket *mp) printPacket("Forwarding to phone", mp); nodeDB.updateFrom(*mp); // update our DB state based off sniffing every RX packet from the radio - fromNum++; - - if (toPhoneQueue.numFree() == 0) { - DEBUG_MSG("NOTE: tophone queue is full, discarding oldest\n"); - MeshPacket *d = toPhoneQueue.dequeuePtr(0); - if (d) - releaseToPool(d); - } - - MeshPacket *copied = packetPool.allocCopy(*mp); - assert(toPhoneQueue.enqueue(copied, 0)); // FIXME, instead of failing for full queue, delete the oldest mssages + sendToPhone((MeshPacket *)mp); return 0; } @@ -161,12 +151,16 @@ bool MeshService::cancelSending(PacketId id) return router->cancelSending(nodeDB.getNodeNum(), id); } -void MeshService::sendToMesh(MeshPacket *p, RxSource src) +void MeshService::sendToMesh(MeshPacket *p, RxSource src, bool ccToPhone) { nodeDB.updateFrom(*p); // update our local DB for this packet (because phone might have sent position packets etc...) // Note: We might return !OK if our fifo was full, at that point the only option we have is to drop it router->sendLocal(p, src); + + if (ccToPhone) { + sendToPhone(p); + } } void MeshService::sendNetworkPing(NodeNum dest, bool wantReplies) @@ -187,6 +181,20 @@ void MeshService::sendNetworkPing(NodeNum dest, bool wantReplies) } } +void MeshService::sendToPhone(MeshPacket *p) { + if (toPhoneQueue.numFree() == 0) { + DEBUG_MSG("NOTE: tophone queue is full, discarding oldest\n"); + MeshPacket *d = toPhoneQueue.dequeuePtr(0); + if (d) + releaseToPool(d); + } + + MeshPacket *copied = packetPool.allocCopy(*p); + perhapsDecode(copied); + assert(toPhoneQueue.enqueue(copied, 0)); // FIXME, instead of failing for full queue, delete the oldest mssages + fromNum++; +} + NodeInfo *MeshService::refreshMyNodeInfo() { NodeInfo *node = nodeDB.getNode(nodeDB.getNodeNum()); diff --git a/src/mesh/MeshService.h b/src/mesh/MeshService.h index 3abae8efe..45559d3a2 100644 --- a/src/mesh/MeshService.h +++ b/src/mesh/MeshService.h @@ -75,7 +75,7 @@ class MeshService /// Send a packet into the mesh - note p must have been allocated from packetPool. We will return it to that pool after /// sending. This is the ONLY function you should use for sending messages into the mesh, because it also updates the nodedb /// cache - void sendToMesh(MeshPacket *p, RxSource src = RX_SRC_LOCAL); + void sendToMesh(MeshPacket *p, RxSource src = RX_SRC_LOCAL, bool ccToPhone = false); /** Attempt to cancel a previously sent packet from this _local_ node. Returns true if a packet was found we could cancel */ bool cancelSending(PacketId id); @@ -83,6 +83,9 @@ class MeshService /// Pull the latest power and time info into my nodeinfo NodeInfo *refreshMyNodeInfo(); + /// Send a packet to the phone + void sendToPhone(MeshPacket *p); + private: /// Called when our gps position has changed - updates nodedb and sends Location message out into the mesh /// returns 0 to allow futher processing diff --git a/src/modules/PositionModule.cpp b/src/modules/PositionModule.cpp index da34ed69e..750920714 100644 --- a/src/modules/PositionModule.cpp +++ b/src/modules/PositionModule.cpp @@ -118,7 +118,7 @@ void PositionModule::sendOurPosition(NodeNum dest, bool wantReplies) p->priority = MeshPacket_Priority_BACKGROUND; prevPacketId = p->id; - service.sendToMesh(p); + service.sendToMesh(p, RX_SRC_LOCAL, true); } int32_t PositionModule::runOnce()