add init code as a determineMode() check

This commit is contained in:
Todd Herbert 2024-03-10 03:43:07 +13:00
parent 95b6f27d2a
commit 94794edd43
3 changed files with 18 additions and 1 deletions

View File

@ -184,7 +184,6 @@ bool EInkDisplay::connect()
// Init GxEPD2 // Init GxEPD2
adafruitDisplay->init(); adafruitDisplay->init();
adafruitDisplay->setRotation(3); adafruitDisplay->setRotation(3);
adafruitDisplay->clearScreen(); // Clearing now, so the boot logo will draw nice and smoothe (fast refresh)
} }
#elif defined(PCA10059) #elif defined(PCA10059)
{ {

View File

@ -111,6 +111,7 @@ bool EInkDynamicDisplay::update()
// Assess situation, pick a refresh type // Assess situation, pick a refresh type
bool EInkDynamicDisplay::determineMode() bool EInkDynamicDisplay::determineMode()
{ {
checkInitialized();
checkForPromotion(); checkForPromotion();
#if defined(HAS_EINK_ASYNCFULL) #if defined(HAS_EINK_ASYNCFULL)
checkAsyncFullRefresh(); checkAsyncFullRefresh();
@ -157,6 +158,21 @@ bool EInkDynamicDisplay::determineMode()
return true; // Do trigger a refresh return true; // Do trigger a refresh
} }
// Is this the very first frame?
void EInkDynamicDisplay::checkInitialized()
{
if (!initialized) {
// Undo GxEPD2_BW::partialWindow(), if set by developer in EInkDisplay::connect()
configForFullRefresh();
// Clear any existing image, so we can draw logo with fast-refresh, but also to set GxEPD2_EPD::_initial_write
adafruitDisplay->clearScreen();
LOG_DEBUG("initialized, ");
initialized = true;
// Use a fast-refresh for the next frame; no skipping or else blank screen when waking from deep sleep
addFrameFlag(DEMAND_FAST);
} }
} }

View File

@ -69,6 +69,7 @@ class EInkDynamicDisplay : public EInkDisplay
bool update(); // Trigger the display update - determine mode, then call base class bool update(); // Trigger the display update - determine mode, then call base class
// Checks as part of determineMode() // Checks as part of determineMode()
void checkInitialized(); // Is this the very first frame?
void checkForPromotion(); // Was a frame skipped (rate, display busy) that should have been a FAST refresh? void checkForPromotion(); // Was a frame skipped (rate, display busy) that should have been a FAST refresh?
void checkRateLimiting(); // Is this frame too soon? void checkRateLimiting(); // Is this frame too soon?
void checkCosmetic(); // Was the COSMETIC flag set? void checkCosmetic(); // Was the COSMETIC flag set?
@ -91,6 +92,7 @@ class EInkDynamicDisplay : public EInkDisplay
refreshTypes previousRefresh = UNSPECIFIED; // (Previous) Outcome refreshTypes previousRefresh = UNSPECIFIED; // (Previous) Outcome
reasonTypes previousReason = NO_OBJECTIONS; // (Previous) Reason reasonTypes previousReason = NO_OBJECTIONS; // (Previous) Reason
bool initialized = false; // Have we drawn at least one frame yet?
uint32_t previousRunMs = -1; // When did determineMode() last run (rather than rejecting for rate-limiting) uint32_t previousRunMs = -1; // When did determineMode() last run (rather than rejecting for rate-limiting)
uint32_t imageHash = 0; // Hash of the current frame. Don't bother updating if nothing has changed! uint32_t imageHash = 0; // Hash of the current frame. Don't bother updating if nothing has changed!
uint32_t previousImageHash = 0; // Hash of the previous update's frame uint32_t previousImageHash = 0; // Hash of the previous update's frame