dramatically speed up message RX in some cases (we were sleeping much too long)

This commit is contained in:
Kevin Hester 2021-03-28 12:16:37 +08:00
parent c7f411fc7c
commit 525fe9b96c
7 changed files with 25 additions and 4 deletions

View File

@ -4,6 +4,7 @@ You probably don't care about this section - skip to the next one.
## before next release ## 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 * DONE have android fill in if local GPS has poor signal
* fix heltec battery scaling * fix heltec battery scaling
* add reference counting to mesh packets * add reference counting to mesh packets

View File

@ -1,5 +1,6 @@
#include "NotifiedWorkerThread.h" #include "NotifiedWorkerThread.h"
#include "configuration.h" #include "configuration.h"
#include "main.h"
#include <assert.h> #include <assert.h>
namespace concurrency namespace concurrency
@ -28,6 +29,7 @@ IRAM_ATTR bool NotifiedWorkerThread::notifyCommon(uint32_t v, bool overwrite)
if (overwrite || notification == 0) { if (overwrite || notification == 0) {
enabled = true; enabled = true;
setInterval(0); // Run ASAP setInterval(0); // Run ASAP
runASAP = true;
notification = v; notification = v;
if (debugNotification) if (debugNotification)

View File

@ -717,6 +717,7 @@ void Screen::handleSetOn(bool on)
dispdev.displayOn(); dispdev.displayOn();
enabled = true; enabled = true;
setInterval(0); // Draw ASAP setInterval(0); // Draw ASAP
runASAP = true;
} else { } else {
DEBUG_MSG("Turning off screen\n"); DEBUG_MSG("Turning off screen\n");
dispdev.displayOff(); dispdev.displayOff();
@ -1053,6 +1054,7 @@ void Screen::setFastFramerate()
targetFramerate = SCREEN_TRANSITION_FRAMERATE; targetFramerate = SCREEN_TRANSITION_FRAMERATE;
ui.setTargetFPS(targetFramerate); ui.setTargetFPS(targetFramerate);
setInterval(0); // redraw ASAP setInterval(0); // redraw ASAP
runASAP = true;
} }
void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)

View File

@ -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() void loop()
{ {
runASAP = false;
// axpDebugOutput.loop(); // axpDebugOutput.loop();
// heap_caps_check_integrity_all(true); // FIXME - disable this expensive check // heap_caps_check_integrity_all(true); // FIXME - disable this expensive check
@ -627,6 +633,7 @@ void loop()
mainController.nextThread->tillRun(millis())); */ mainController.nextThread->tillRun(millis())); */
// We want to sleep as long as possible here - because it saves power // 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"); // if (didWake) DEBUG_MSG("wake!\n");
} }

View File

@ -22,4 +22,8 @@ const char *getDeviceName();
extern uint32_t rebootAtMsec; 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(); void nrf52Setup(), esp32Setup(), nrf52Loop(), esp32Loop();

View File

@ -79,9 +79,10 @@ class ReliableRouter : public FloodingRouter
/** Do our retransmission handling */ /** Do our retransmission handling */
virtual int32_t runOnce() 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); return min(d, r);
} }
@ -109,7 +110,6 @@ class ReliableRouter : public FloodingRouter
PendingPacket *startRetransmission(MeshPacket *p); PendingPacket *startRetransmission(MeshPacket *p);
private: private:
/** /**
* Stop any retransmissions we are doing of the specified node/packet ID pair * Stop any retransmissions we are doing of the specified node/packet ID pair
* *

View File

@ -4,6 +4,7 @@
#include "NodeDB.h" #include "NodeDB.h"
#include "RTC.h" #include "RTC.h"
#include "configuration.h" #include "configuration.h"
#include "main.h"
#include "mesh-pb-constants.h" #include "mesh-pb-constants.h"
#include "plugins/RoutingPlugin.h" #include "plugins/RoutingPlugin.h"
@ -55,9 +56,11 @@ int32_t Router::runOnce()
{ {
MeshPacket *mp; MeshPacket *mp;
while ((mp = fromRadioQueue.dequeuePtr(0)) != NULL) { while ((mp = fromRadioQueue.dequeuePtr(0)) != NULL) {
// printPacket("handle fromRadioQ", mp);
perhapsHandleReceived(mp); perhapsHandleReceived(mp);
} }
// DEBUG_MSG("sleeping forever!\n");
return INT32_MAX; // Wait a long time - until we get woken for the message queue 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() void Router::setReceivedMessage()
{ {
// DEBUG_MSG("set interval to ASAP\n");
setInterval(0); // Run ASAP, so we can figure out our correct sleep time setInterval(0); // Run ASAP, so we can figure out our correct sleep time
runASAP = true;
} }
ErrorCode Router::sendLocal(MeshPacket *p) ErrorCode Router::sendLocal(MeshPacket *p)