fix: preserve last image and overlay yellow border on sync failure
Previously a 5xx / timeout / malformed response fired epd_fill(COLOR_YELLOW),
which writes the yellow nibble across the entire 800×480 framebuffer and
destroys the last good image — exactly what FR38 forbids ("Last image
persists ... yellow border signals state"). The device then got stuck on a
blank yellow screen because the next 304 didn't redraw.
Changes:
- New epd_draw_image_with_border streams the cached .bin row-by-row,
overwrites border-region pixels in the row buffer, and pushes a single
composited framebuffer (same pattern as the existing setup-QR overlay).
- normal_operation_impl else-branch now redraws the cached image with a
yellow border, falling back to epd_fill only when no cache exists
(first-boot error). Sets a new NVS_KEY_ERR_BORDER flag.
- 200 and 304 paths clear NVS_KEY_ERR_BORDER. The 304 branch now
triggers a clean repaint when the err flag is set, so the device
recovers from the stuck-yellow state on the next healthy poll
without waiting for rotation to advance.
- LittleFS read mock now returns invalid File when the file doesn't
exist (matches real LittleFS), so the no-cache fallback path is
actually exercisable in tests.
Tests:
- Replaces the old test_fw06_error_fills_yellow (which locked in the
buggy fill behavior) with FW-06a..e covering: error+cache draws
border (no fill), error+no-cache falls back to fill, 304 after
error repaints clean, steady-state 304 touches nothing (the
regression the user flagged), 200 after error clears the flag.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -12,6 +12,9 @@ extern int g_epd_draw_image_count;
|
||||
extern int g_epd_fill_count;
|
||||
extern int g_epd_fill_last_color;
|
||||
extern int g_epd_draw_setup_count;
|
||||
extern int g_epd_draw_border_count;
|
||||
extern int g_epd_draw_border_last_color;
|
||||
extern int g_epd_draw_border_last_thickness;
|
||||
|
||||
inline void epd_init() { g_epd_init_count++; }
|
||||
inline void epd_sleep() { g_epd_sleep_count++; }
|
||||
@@ -21,5 +24,10 @@ inline void epd_draw_image_from_file(File& f) {
|
||||
g_call_seq++;
|
||||
}
|
||||
inline void epd_fill(int color) { g_epd_fill_count++; g_epd_fill_last_color = color; }
|
||||
inline void epd_draw_image_with_border(File& f, int color, int thickness) {
|
||||
g_epd_draw_border_count++;
|
||||
g_epd_draw_border_last_color = color;
|
||||
g_epd_draw_border_last_thickness = thickness;
|
||||
}
|
||||
inline void epd_draw_ap_screen(void*) {}
|
||||
inline void epd_draw_setup_screen(void*) { g_epd_draw_setup_count++; }
|
||||
|
||||
Reference in New Issue
Block a user