Files
espresso_frame/firmware/main/Kconfig.projbuild
T
tfaour d32236d832 Add two ways back into provisioning: RST press and repeated server failure
RST/power-on trigger: checks esp_reset_reason() at the very top of boot.
ESP32-C6 can't electrically distinguish the RST/EN button from a genuine
power-on (both report ESP_RST_POWERON -- confirmed against ESP-IDF's own
docs, ESP_RST_EXT is explicitly "not applicable"), so POWERON is treated
as "user wants to reconfigure" and routes straight to provisioning. Safe
because the device's only normal restart path is ESP_RST_DEEPSLEEP (its
own scheduled wake), and crash-type resets (brownout/watchdog/panic)
report their own distinct reasons, not POWERON -- so a flaky power supply
or transient crash won't get bounced into provisioning, only an actual
power cycle or RST press will (which plausibly means the frame is being
moved/redeployed anyway).

Auto-fallback: a new NVS-persisted consecutive-failure counter
(frame_config_record_server_failure/reset_server_failures) tracks wakes
where the tools server was unreachable. After
CONFIG_FRAME_REPROVISION_AFTER_FAILURES in a row (default 12, ~1hr at the
retry interval), the device clears its stored WiFi config and
esp_restart()s rather than calling wifi_provisioning_start() directly --
doing that inline would mean initializing the display driver a second
time in the same session (frame_client_run already did once), the same
class of double-init bug hit earlier with WiFi. The next boot's
frame_config_load() naturally reports "not provisioned" and routes
through the existing, already-tested provisioning path with a single
fresh epd_init(). Solves the "I moved the server to a new address" case
without needing USB access.

Both frame_config_save() (fresh provisioning) and any successful server
contact reset the failure counter.
2026-07-18 16:10:03 -04:00

99 lines
4.3 KiB
Plaintext

menu "ESPresso Frame Configuration"
config ESP_AP_SSID
string "Provisioning softAP SSID prefix"
default "ESPRESSO"
help
SSID prefix of the softAP the device brings up when it needs
provisioning; the device appends "_XXXXXX" (last 3 bytes of its
WiFi MAC) so multiple frames never collide on the same SSID.
The password is generated randomly per device on first boot and
shown on the e-ink panel both as a WiFi-join QR code and as
plaintext underneath it, so it can be typed in by hand on a
desktop/laptop that can't scan the QR.
config ESP_MAX_STA_CONN
int "Maximal STA connections"
default 4
range 1 4 if IDF_TARGET_ESP32C2
range 1 15
help
Maximum number of STAs allowed to connect to the soft-AP (wifi_config_t.ap.max_connection).
Upper bound matches ESP_WIFI_MAX_CONN_NUM in esp_wifi_types_native.h:
1-4 on ESP32-C2, 1-15 on other Wi-Fi chips.
Soft-AP and ESP-NOW share encryption keys; see Wi-Fi driver documentation
if ESP-NOW is enabled.
config ESP_ENABLE_DHCP_CAPTIVEPORTAL
bool "DHCP Captive portal"
default y
help
Enables more modern DHCP-based Option 114 to provide clients with the captive portal URI
config FRAME_STA_CONNECT_MAX_RETRIES
int "Home WiFi connect max retries before falling back to provisioning"
default 3
help
Number of failed connection attempts to the stored home WiFi network
before the device gives up and re-enters provisioning (softAP) mode.
config FRAME_STA_CONNECT_TIMEOUT_MS
int "Home WiFi connect timeout per attempt (ms)"
default 15000
help
How long to wait for an IP address on each connection attempt to the
stored home WiFi network before counting it as a failed retry.
config FRAME_SERVER_CHECK_TIMEOUT_MS
int "Tools server /frame/config request timeout (ms)"
default 3000
help
How long to wait for a GET /frame/config response from the
tools server -- doubles as both the reachability check for the
post-connect status screen and the source of the
server-configured refresh interval below.
config FRAME_FETCH_TIMEOUT_MS
int "Image fetch HTTP timeout (ms)"
default 15000
help
How long to wait on the GET /frame/image request before giving
up. The server does real work per request (Immich download +
resize + dither), so this is longer than the reachability
check's timeout.
config FRAME_SLEEP_INTERVAL_S
int "Fallback deep sleep interval between refreshes (seconds)"
default 3600
help
The refresh interval is normally set server-side (the "Refresh
interval" field in the server's web UI, delivered via GET
/frame/config) so it can be changed without reflashing. This
value is only a fallback: used before the device has ever
successfully reached a configured server, or if the server's
response doesn't include a valid interval (e.g. an older
server version). Lower this for bench testing so you don't
have to wait an hour per iteration.
config FRAME_RETRY_INTERVAL_S
int "Deep sleep interval after a failed cycle (seconds)"
default 300
help
How long the device deep-sleeps before retrying after the
server was unreachable or the fetch/display failed, instead of
waiting the full FRAME_SLEEP_INTERVAL_S.
config FRAME_REPROVISION_AFTER_FAILURES
int "Consecutive server-unreachable wakes before falling back to provisioning"
default 12
help
If the tools server is unreachable for this many consecutive
wakes in a row (at FRAME_RETRY_INTERVAL_S apart -- ~1 hour at
the defaults), the device gives up retrying silently and drops
back into provisioning mode instead, so a moved/renamed server
can be reconfigured without a USB connection. Resets to 0 on
any successful contact with the server, or on fresh
provisioning.
endmenu