Files
Crosspoint/src/CrossPointState.h
T
Eloren1andClaude Sonnet 4.6 41e6e15229 feat: Seamless sleep/wake screens for displaying book pages during deep sleep (#2064)
<img width="605" height="454" alt="image"
src="https://github.com/user-attachments/assets/bfd84afe-3b58-436e-9a5d-539af3ec3d4e"
/>

Actualized "Last" sleep screen setting from previous PRs, rebranded as a
~~`Seamless Sleep`~~ `Page as Sleep Screen` option with more
improvements.


https://github.com/user-attachments/assets/59029ba6-007e-4841-abfa-f680d7e98b79

---

New option: `Page as Sleep Screen` - `Never (default)`, `After Timeout`,
`Always`

When enabled, it seamlessly sleeps on timeout or power off, making a
fast refresh for the moon icon. When waking up, we still show the last
page, instead of the boot screen, making it fully seamless.

I tried different icons such as "refresh arrow" and others, but they
looked not as nice as 3 simple dots.

With this mode, the device turns off 4 seconds faster. And has 6 seconds
less delay when turning back on. Much more responsive.

Previously, even a 10-minute timeout sometimes wasn't enough, and I'd
worry about seeing the book cover. It's now easier to use a shorter
sleep timeout: if I get distracted during a reading session but don't
want to stop, the new screen is much more inviting to come back to.

---

Did you use AI tools to help write this code? _**PARTIALLY**_.

---

Test v1.3.0 firmware.bin file
[download](https://github.com/user-attachments/files/28015193/firmware.zip)

Based on PRs #410 and #495

Closes #400, #1649

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-19 18:45:28 -04:00

40 lines
1.1 KiB
C++

#pragma once
#include <cstdint>
#include <string>
class CrossPointState {
// Static instance
static CrossPointState instance;
public:
static constexpr uint8_t SLEEP_RECENT_COUNT = 16;
std::string openEpubPath;
uint16_t recentSleepImages[SLEEP_RECENT_COUNT] = {}; // circular buffer of recent wallpaper indices
uint8_t recentSleepPos = 0; // next write slot
uint8_t recentSleepFill = 0; // valid entries (0..SLEEP_RECENT_COUNT)
uint8_t readerActivityLoadCount = 0;
bool lastSleepFromReader = false;
bool showBootScreen = true;
// Returns true if idx was shown within the last checkCount picks.
// Walks backwards from the most recently written slot.
bool isRecentSleep(uint16_t idx, uint8_t checkCount) const;
void pushRecentSleep(uint16_t idx);
~CrossPointState() = default;
// Get singleton instance
static CrossPointState& getInstance() { return instance; }
bool saveToFile() const;
bool loadFromFile();
private:
bool loadFromBinaryFile();
};
// Helper macro to access settings
#define APP_STATE CrossPointState::getInstance()