add BLOCKING modifier to frameFlagTypes

This commit is contained in:
Todd Herbert 2024-03-10 03:48:59 +13:00
parent 94794edd43
commit e232e3462c
2 changed files with 21 additions and 2 deletions

View File

@ -458,15 +458,32 @@ void EInkDynamicDisplay::checkAsyncFullRefresh()
// Figure out who runs the post-update code // Figure out who runs the post-update code
void EInkDynamicDisplay::endOrDetach() void EInkDynamicDisplay::endOrDetach()
{ {
if (previousRefresh == FULL) { // Note: previousRefresh is the refresh from this loop. if (refresh == FULL) {
asyncRefreshRunning = true; // Set the flag - picked up at start of determineMode(), next loop. asyncRefreshRunning = true; // Set the flag - picked up at start of determineMode(), next loop.
LOG_DEBUG("Async full-refresh begins\n");
if (frameFlags & BLOCKING)
awaitRefresh();
else
LOG_DEBUG("Async full-refresh begins\n");
} }
// Fast Refresh // Fast Refresh
else else
EInkDisplay::endUpdate(); // Still block while updating, but EInkDisplay needs us to call endUpdate() ourselves. EInkDisplay::endUpdate(); // Still block while updating, but EInkDisplay needs us to call endUpdate() ourselves.
} }
// Hold control while an async refresh runs
void EInkDynamicDisplay::awaitRefresh()
{
// Continually poll the BUSY pin
while (adafruitDisplay->epd2.isBusy())
yield();
// End the full-refresh process
adafruitDisplay->endAsyncFull(); // Run the end of nextPage() code
EInkDisplay::endUpdate(); // Run base-class code to finish off update (NOT our derived class override)
asyncRefreshRunning = false; // Unset the flag
}
#endif // HAS_EINK_ASYNCFULL #endif // HAS_EINK_ASYNCFULL
#endif // USE_EINK_DYNAMICDISPLAY #endif // USE_EINK_DYNAMICDISPLAY

View File

@ -28,6 +28,7 @@ class EInkDynamicDisplay : public EInkDisplay
RESPONSIVE = (1 << 1), // For frames via forceDisplay() RESPONSIVE = (1 << 1), // For frames via forceDisplay()
COSMETIC = (1 << 2), // For splashes COSMETIC = (1 << 2), // For splashes
DEMAND_FAST = (1 << 3), // Special case only DEMAND_FAST = (1 << 3), // Special case only
BLOCKING = (1 << 4), // Modifier - block while refresh runs
}; };
void addFrameFlag(frameFlagTypes flag); void addFrameFlag(frameFlagTypes flag);
@ -112,6 +113,7 @@ class EInkDynamicDisplay : public EInkDisplay
#if defined(HAS_EINK_ASYNCFULL) #if defined(HAS_EINK_ASYNCFULL)
void checkAsyncFullRefresh(); // Check the status of "async full-refresh"; run the post-update code if the hardware is ready void checkAsyncFullRefresh(); // Check the status of "async full-refresh"; run the post-update code if the hardware is ready
void endOrDetach(); // Run the post-update code, or delegate it off to checkAsyncFullRefresh() void endOrDetach(); // Run the post-update code, or delegate it off to checkAsyncFullRefresh()
void awaitRefresh(); // Hold control while an async refresh runs
void endUpdate() override {} // Disable base-class behavior of running post-update immediately after forceDisplay() void endUpdate() override {} // Disable base-class behavior of running post-update immediately after forceDisplay()
bool asyncRefreshRunning = false; // Flag, checked by checkAsyncFullRefresh() bool asyncRefreshRunning = false; // Flag, checked by checkAsyncFullRefresh()
#endif #endif