mirror of
https://github.com/alexhopeoconnor/firmware.git
synced 2026-10-21 18:52:36 +10:00
Add InkHUD driver for WeAct Studio 4.2" display module (#6384)
* chore: todo.txt * chore: InkHUD documentation Word salad for maintainers * refactor: don't init system applets using onActivate System applets cannot be deactivated, so we will avoid using onActivate / onDeactivate methods entirely. * chore: update the example applets * fix: SSD16XX reset pulse Allow time for controller IC to wake. Aligns with manufacturer's suggestions. T-Echo button timing adjusted to prevent bouncing as a result(?) of slightly faster refreshes. * fix: allow timeout if display update fails Result is not graceful, but avoids total display lockup requiring power cycle. Typical cause of failure is poor wiring / power supply. * fix: improve display health on shutdown Two extra full refreshes, masquerading as a "shutting down" screen. One is drawn white-on-black, to really shake the pixels up. * feat: driver for display HINK_E042A87 As of Feb. 2025, these panels are used for "WeActStudio 4.2in B&W" display modules. * fix: inkhud rotation should default to 0 * Revert "chore: todo.txt" This reverts commit bea7df44a7cbf2f92e8c67c965e53d26a7885b11. * fix: more generous timeout for display updates Previously this was tied to the expected duration of the update, but this didn't account for any delay if our polling thread got held up by an unrelated firmware task. * fix: don't use the full shutdown screen during reboot * fix: cooldown period during the display shutdown display sequence Observed to prevent border pixels from being locked in place with some residual charge?
This commit is contained in:
@@ -70,6 +70,9 @@ void InkHUD::Events::onButtonLong()
|
||||
// Returns 0 to signal that we agree to sleep now
|
||||
int InkHUD::Events::beforeDeepSleep(void *unused)
|
||||
{
|
||||
// If a previous display update is in progress, wait for it to complete.
|
||||
inkhud->awaitUpdate();
|
||||
|
||||
// Notify all applets that we're shutting down
|
||||
for (Applet *ua : inkhud->userApplets) {
|
||||
ua->onDeactivate();
|
||||
@@ -87,9 +90,12 @@ int InkHUD::Events::beforeDeepSleep(void *unused)
|
||||
inkhud->persistence->saveSettings();
|
||||
inkhud->persistence->saveLatestMessage();
|
||||
|
||||
// LogoApplet::onShutdown will have requested an update, to draw the shutdown screen
|
||||
// Draw that now, and wait here until the update is complete
|
||||
// LogoApplet::onShutdown attempted to heal the display by drawing a "shutting down" screen twice,
|
||||
// then prepared a final powered-off screen for us, which shows device shortname.
|
||||
// We're updating to show that one now.
|
||||
|
||||
inkhud->forceUpdate(Drivers::EInk::UpdateTypes::FULL, false);
|
||||
delay(1000); // Cooldown, before potentially yanking display power
|
||||
|
||||
return 0; // We agree: deep sleep now
|
||||
}
|
||||
@@ -106,16 +112,16 @@ int InkHUD::Events::beforeReboot(void *unused)
|
||||
a->onDeactivate();
|
||||
a->onShutdown();
|
||||
}
|
||||
for (Applet *sa : inkhud->systemApplets) {
|
||||
for (SystemApplet *sa : inkhud->systemApplets) {
|
||||
// Note: no onDeactivate. System applets are always active.
|
||||
sa->onShutdown();
|
||||
sa->onReboot();
|
||||
}
|
||||
|
||||
inkhud->persistence->saveSettings();
|
||||
inkhud->persistence->saveLatestMessage();
|
||||
|
||||
// Note: no forceUpdate call here
|
||||
// Because OSThread will not be given another chance to run before reboot, this means that no display update will occur
|
||||
// We don't have any final screen to draw, although LogoApplet::onReboot did already display a "rebooting" screen
|
||||
|
||||
return 0; // No special status to report. Ignored anyway by this Observable
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user