From 50d724780ad2e1ede1457128a4a599d3ad768268 Mon Sep 17 00:00:00 2001 From: geeksville Date: Wed, 25 Mar 2020 13:09:12 -0700 Subject: [PATCH] make user presses ask other nodes for their latest status see related bug https://github.com/meshtastic/Meshtastic-esp32/issues/59 --- src/MeshService.cpp | 18 +++++++++++------- src/MeshService.h | 6 +++--- src/PowerFSM.cpp | 2 +- src/screen.cpp | 3 +++ 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/MeshService.cpp b/src/MeshService.cpp index e637c604..59ba8d99 100644 --- a/src/MeshService.cpp +++ b/src/MeshService.cpp @@ -71,10 +71,11 @@ void MeshService::init() // sendOwnerPeriod(); } -void MeshService::sendOurOwner(NodeNum dest) +void MeshService::sendOurOwner(NodeNum dest, bool wantReplies) { MeshPacket *p = allocForSending(); p->to = dest; + p->payload.want_response = wantReplies; p->payload.which_variant = SubPacket_user_tag; User &u = p->payload.variant.user; u = owner; @@ -257,9 +258,10 @@ void MeshService::sendToMesh(MeshPacket *p) // nodes shouldn't trust it anyways) Note: for now, we allow a device with a local GPS to include the time, so that gpsless // devices can get time. if (p->has_payload && p->payload.which_variant == SubPacket_position_tag) { - if (!myNodeInfo.has_gps) + if (!myNodeInfo.has_gps) { + DEBUG_MSG("Stripping time %u from position send\n", p->payload.variant.position.time); p->payload.variant.position.time = 0; - else + } else DEBUG_MSG("Providing time to mesh %u\n", p->payload.variant.position.time); } @@ -285,18 +287,19 @@ MeshPacket *MeshService::allocForSending() return p; } -void MeshService::sendNetworkPing(NodeNum dest) +void MeshService::sendNetworkPing(NodeNum dest, bool wantReplies) { NodeInfo *node = nodeDB.getNode(nodeDB.getNodeNum()); assert(node); + DEBUG_MSG("Sending network ping to 0x%x, with position=%d, wantReplies=%d\n", dest, node->has_position, wantReplies); if (node->has_position) - sendOurPosition(dest); + sendOurPosition(dest, wantReplies); else - sendOurOwner(dest); + sendOurOwner(dest, wantReplies); } -void MeshService::sendOurPosition(NodeNum dest) +void MeshService::sendOurPosition(NodeNum dest, bool wantReplies) { NodeInfo *node = nodeDB.getNode(nodeDB.getNodeNum()); assert(node); @@ -307,6 +310,7 @@ void MeshService::sendOurPosition(NodeNum dest) p->to = dest; p->payload.which_variant = SubPacket_position_tag; p->payload.variant.position = node->position; + p->payload.want_response = wantReplies; p->payload.variant.position.time = gps.getValidTime(); // This nodedb timestamp might be stale, so update it if our clock is valid. sendToMesh(p); diff --git a/src/MeshService.h b/src/MeshService.h index e92b5684..3eb06a6c 100644 --- a/src/MeshService.h +++ b/src/MeshService.h @@ -61,14 +61,14 @@ class MeshService : private Observer /// Called when the user wakes up our GUI, normally sends our latest location to the mesh (if we have it), otherwise at least /// sends our owner - void sendNetworkPing(NodeNum dest = NODENUM_BROADCAST); + void sendNetworkPing(NodeNum dest, bool wantReplies = false); /// Send our owner info to a particular node - void sendOurOwner(NodeNum dest = NODENUM_BROADCAST); + void sendOurOwner(NodeNum dest = NODENUM_BROADCAST, bool wantReplies = false); private: /// Broadcasts our last known position - void sendOurPosition(NodeNum dest = NODENUM_BROADCAST); + void sendOurPosition(NodeNum dest = NODENUM_BROADCAST, bool wantReplies = false); /// 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 diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp index f109b20d..95cfee72 100644 --- a/src/PowerFSM.cpp +++ b/src/PowerFSM.cpp @@ -121,7 +121,7 @@ static void onEnter() uint32_t now = millis(); if (now - lastPingMs > 60 * 1000) { // if more than a minute since our last press, ask other nodes to update their state - service.sendNetworkPing(); + service.sendNetworkPing(NODENUM_BROADCAST, true); lastPingMs = now; } } diff --git a/src/screen.cpp b/src/screen.cpp index 69e16419..6d06b020 100644 --- a/src/screen.cpp +++ b/src/screen.cpp @@ -344,6 +344,9 @@ static void drawNodeInfo(OLEDDisplay *display, OLEDDisplayUiState *state, int16_ float bearingToOther = bearing(p.latitude, p.longitude, op.latitude, op.longitude); float myHeading = estimatedHeading(p.latitude, p.longitude); headingRadian = bearingToOther - myHeading; + } else { + // Debug info for gps lock errors + // DEBUG_MSG("ourNode %d, ourPos %d, theirPos %d\n", !!ourNode, ourNode && hasPosition(ourNode), hasPosition(node)); } const char *fields[] = {username, distStr, signalStr, lastStr, NULL};