mirror of
https://github.com/crosspoint-reader/crosspoint-reader.git
synced 2026-08-13 14:21:57 -07:00
## Summary Reduces active-reading power draw ~3.2x, measured end-to-end on an X3 with a [Nordic PPK2](https://www.nordicsemi.com/Products/Development-hardware/Power-Profiler-Kit-2) at the battery terminals (slim build, USB cable removed, 3.8v). Three independent changes: 1. **Light-sleep between input polls when idle** (the big one): after 1 s of inactivity the main loop replaces its busy `delay(50)` with 50 ms timer-paced `esp_light_sleep_start()` slices. Poll cadence and input latency are unchanged — the CPU sleeps between polls instead of spinning at 10 MHz. Guards: never sleeps while a `HalPowerManager::Lock` is held (render in flight), WiFi is up, or USB is connected (light sleep kills the CDC link). 2. **Two-stage idle backoff**: downclock at 500 ms, light sleep at 1 s, replacing the flat 3 s full-speed window. Renders re-raise the clock via `Lock` the moment they start, so the full-speed tail only ever served loop bookkeeping. (The 3 s value in #852 was a placeholder; responsiveness verified on device against stock.) 3. **Refresh BUSY-wait downclock**: drops the CPU to 10 MHz while `pollBusy()` polls the BUSY pin (0.3–2 s per refresh), via new optional hooks in the SDK — **depends on Free-Ink/freeink-sdk/pull/8**. Plus a 1 Hz throttle on the X3's I2C-based USB detection (was polled every loop). (1+2) reduced average static-page-current from 9.68mA to 3.45mA. Reducing the battery-monitor polling frequency further reduced it to 2.78mA. Before merging, we'll need to update the submodule reference. ## Measured results (PPK2, X3) | Metric | Before | After | |---|---|---| | Idle on a static page | 9.68 mA | **2.78 mA** | | Fast page turn (incl. post-turn behavior) | ~100 mC | **28.98 mC** | | Post-turn 160 MHz tail | 21.2 mA x 3 s | eliminated | | Session average @ 30 s/page | ~11.6 mA | **~3.6 mA (~3.2x reading time)** | | Deep sleep | 12.8 µA | unchanged | ## Typical-day profiles Assuming someone spends 30s per page. - **Light**: 1 h reading, 10 lock/wake cycles, remaining ~23 h deep sleep - **Heavy**: 2 h reading, 20 lock/wake cycles, remaining ~22 h deep sleep - Per-day cost components: reading 11.6 → 3.6 mA (session avg), lock+wake cycle 0.113 → 0.099 mAh each (sleep-screen mode), deep sleep 12.8 µA (unchanged, ~0.29 mAh/day) - Excluded: WiFi sessions, cold chapter indexing, self-discharge ### Days per charge (650mAh) | Profile | Before | After | Ratio | |---|---|---|---| | Light (1 h/day, 10 locks) | 13.0 mAh/day → ~50 days | 4.9 mAh/day → ~133 days | 2.7× | | Heavy (2 h/day, 20 locks) | 25.7 mAh/day → ~25 days | 9.5 mAh/day → ~68 days | 2.7× | | Pure active reading | 11.6 mA → ~56 h | 3.6 mA → ~180 h | 3.2× | ### Caveats - "After" saturates in reality: Li-ion self-discharge (~2–3%/month) is not modeled and becomes the limiter once firmware draw is this low. - Faster page-turners trend toward ~2.8×, slower readers slightly above 3.2×. - Frequent locking dilutes the ratio (wake = full cold boot, barely touched by the power branch): at 10–20 locks/day, cycles are ~20% of the "after" budget. --- ### AI Usage While CrossPoint doesn't have restrictions on AI tools in contributing, please be transparent about their usage as it helps set the right context for reviewers. Did you use AI tools to help write this code? _**YES**_ ---------