Two changes to the yellow Step 1/2 (and red retry-twin) screens, both
in service of the locked-phone-scan failure mode where iOS joins the
AP but never opens the captive portal:
* Promote 'Unlock your phone first' to step 1 of a four-step list
(was three steps starting with 'Scan the QR'). Tightens step pitch
from 46→38 px to fit the new step. Surfacing the requirement
visually beats discovering it by scanning, getting nothing, and
giving up.
* Bake a manual-link QR into the bottom of the left panel pointing
to https://pictureframe.edholm.me/help. Side label 'Need help? /
Scan for setup / & troubleshooting'. Static URL → encoded directly
into ap_bg.bin via the qrcode Python lib at gen time, no firmware
QR-render changes needed. Retry twin (ap_bg_retry.bin) inherits.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two related fixes that together let the post-WiFi-setup window be quiet:
1. operation.h 204/404: skip the panel redraw entirely. The panel already
holds the right thing — setup QR if no image has ever been painted
(img_id == -1), or a real photo if img_id >= 0. Redrawing the QR every
15s during the bootstrap claim window put the e-ink into a perpetual
~20s mid-refresh loop and risked ghosting. Tests updated to assert
no redraw on either sub-case.
2. main.cpp WiFi-fail path: drop the epd_fill(RED) + 3s delay + AP
re-redraw sequence (~43s of e-ink work that destroyed the QR mid-flow)
and replace with a single repaint of a new "Connection Failed — try
again" Step 1/2 screen with red accents. gen_screens.py grows a
gen_ap_retry() variant that recolors yellow → red and swaps the
header/QR labels; the result is shipped as ap_bg_retry.bin alongside
ap_bg.bin in LittleFS. epd.h exposes epd_draw_ap_screen_retry().