Root cause: Panel_ED2208's epd_quality mode applies _dither_row_rgb_pair (diagonal bias pattern with dither=140) during _exec_transfer(). Since our ImagePipeline already does proper Floyd-Steinberg dithering, the driver's additional dithering was creating visible diagonal artifacts. Fix: setEpdMode(epd_fastest) selects _dither_row_none (clean nearest-color lookup, no spatial bias). On Panel_ED2208 this only affects the dither function — NOT refresh quality or waveform. Also: default dither_noise setting to OFF since error scatter was targeting the wrong layer (it made gradient areas fuzzier without fixing the real problem in the display driver). Co-authored-by: Cursor <cursoragent@cursor.com>
Testing
Native Tests (host machine)
Run algorithm tests that don't require hardware:
pio test -e native
Tests:
test_photo_queue.cpp— queue cycling, favorites weightingtest_image_pipeline.cpp— nearest color, dithering correctness
On-Device Testing
Flash and monitor:
pio run -e m5stack-papercolor -t upload && pio device monitor
Verification Checklist
- Device boots and prints version to serial
- AP mode activates on first boot
- Captive portal serves setup page at 192.168.4.1
- WiFi credentials save and device reboots to station mode
- mDNS resolves at papercolor.local
- Web UI dashboard shows battery/WiFi/uptime
- Albums page lists Immich albums
- Album selection persists across reboots
- Photos download and display correctly
- Portrait photos pair side-by-side
- Slideshow advances at configured interval
- BTN_UP: next photo (LED flashes white)
- BTN_TOP: random photo (LED flashes white)
- BTN_DOWN: pause/play toggle
- BTN_TOP+BTN_DOWN 3s: deep sleep
- BTN_UP 5s: factory reset
- Battery LED: orange at 25%, red at 10%
- OTA upload succeeds via web UI
- Device recovers from WiFi disconnect (reconnect on next cycle)