diff --git a/docs/software/TODO.md b/docs/software/TODO.md index 5c09e9b54..828f4f933 100644 --- a/docs/software/TODO.md +++ b/docs/software/TODO.md @@ -4,6 +4,7 @@ You probably don't care about this section - skip to the next one. ## before next release +* DONE naks are being dropped (though enqueuedLocal) sometimes before phone/PC gets them * DONE have android fill in if local GPS has poor signal * fix heltec battery scaling * add reference counting to mesh packets diff --git a/src/concurrency/NotifiedWorkerThread.cpp b/src/concurrency/NotifiedWorkerThread.cpp index aaac07f59..78c15a6d0 100644 --- a/src/concurrency/NotifiedWorkerThread.cpp +++ b/src/concurrency/NotifiedWorkerThread.cpp @@ -1,5 +1,6 @@ #include "NotifiedWorkerThread.h" #include "configuration.h" +#include "main.h" #include namespace concurrency @@ -28,6 +29,7 @@ IRAM_ATTR bool NotifiedWorkerThread::notifyCommon(uint32_t v, bool overwrite) if (overwrite || notification == 0) { enabled = true; setInterval(0); // Run ASAP + runASAP = true; notification = v; if (debugNotification) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 9698f41b1..c7580f02d 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -717,6 +717,7 @@ void Screen::handleSetOn(bool on) dispdev.displayOn(); enabled = true; setInterval(0); // Draw ASAP + runASAP = true; } else { DEBUG_MSG("Turning off screen\n"); dispdev.displayOff(); @@ -1053,6 +1054,7 @@ void Screen::setFastFramerate() targetFramerate = SCREEN_TRANSITION_FRAMERATE; ui.setTargetFPS(targetFramerate); setInterval(0); // redraw ASAP + runASAP = true; } void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) diff --git a/src/main.cpp b/src/main.cpp index 7ce86ffc0..ba99c88aa 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -590,8 +590,14 @@ void rebootCheck() } } +// If a thread does something that might need for it to be rescheduled ASAP it can set this flag +// This will supress the current delay and instead try to run ASAP. +bool runASAP; + void loop() { + runASAP = false; + // axpDebugOutput.loop(); // heap_caps_check_integrity_all(true); // FIXME - disable this expensive check @@ -627,6 +633,7 @@ void loop() mainController.nextThread->tillRun(millis())); */ // We want to sleep as long as possible here - because it saves power - mainDelay.delay(delayMsec); + if (!runASAP) + mainDelay.delay(delayMsec); // if (didWake) DEBUG_MSG("wake!\n"); } diff --git a/src/main.h b/src/main.h index 1a6dfe439..0c5cb349c 100644 --- a/src/main.h +++ b/src/main.h @@ -22,4 +22,8 @@ const char *getDeviceName(); extern uint32_t rebootAtMsec; +// If a thread does something that might need for it to be rescheduled ASAP it can set this flag +// This will supress the current delay and instead try to run ASAP. +extern bool runASAP; + void nrf52Setup(), esp32Setup(), nrf52Loop(), esp32Loop(); diff --git a/src/mesh/ReliableRouter.h b/src/mesh/ReliableRouter.h index db161b984..7299d1c18 100644 --- a/src/mesh/ReliableRouter.h +++ b/src/mesh/ReliableRouter.h @@ -79,9 +79,10 @@ class ReliableRouter : public FloodingRouter /** Do our retransmission handling */ virtual int32_t runOnce() { - auto d = FloodingRouter::runOnce(); + // Note: We must doRetransmissions FIRST, because it might queue up work for the base class runOnce implementation + auto d = doRetransmissions(); - int32_t r = doRetransmissions(); + int32_t r = FloodingRouter::runOnce(); return min(d, r); } @@ -109,7 +110,6 @@ class ReliableRouter : public FloodingRouter PendingPacket *startRetransmission(MeshPacket *p); private: - /** * Stop any retransmissions we are doing of the specified node/packet ID pair * diff --git a/src/mesh/Router.cpp b/src/mesh/Router.cpp index fe207de1e..5582b77d3 100644 --- a/src/mesh/Router.cpp +++ b/src/mesh/Router.cpp @@ -4,6 +4,7 @@ #include "NodeDB.h" #include "RTC.h" #include "configuration.h" +#include "main.h" #include "mesh-pb-constants.h" #include "plugins/RoutingPlugin.h" @@ -55,9 +56,11 @@ int32_t Router::runOnce() { MeshPacket *mp; while ((mp = fromRadioQueue.dequeuePtr(0)) != NULL) { + // printPacket("handle fromRadioQ", mp); perhapsHandleReceived(mp); } + // DEBUG_MSG("sleeping forever!\n"); return INT32_MAX; // Wait a long time - until we get woken for the message queue } @@ -117,7 +120,9 @@ void Router::abortSendAndNak(Routing_Error err, MeshPacket *p) void Router::setReceivedMessage() { + // DEBUG_MSG("set interval to ASAP\n"); setInterval(0); // Run ASAP, so we can figure out our correct sleep time + runASAP = true; } ErrorCode Router::sendLocal(MeshPacket *p)