Next/back button assignment moves from a frame-level "Button assignments" card into each widget's own gear-icon dialog, prefilled with a sane default at creation (photos/calendar -> advance/back, whiteboard/weather -> check_now, others -> none). At most one binding per (widget, button) now -- cross-widget execution order never mattered since each widget's action only touches its own state. New firmware capability: holding NEXT or BACK past a configurable duration (min 3s, server-side default) triggers a frame-wide action instead of the per-widget short-press one -- cycling saved layouts, refreshing all widgets, or freezing/unfreezing every photo widget (see app/global_actions.py). Firmware next/back checks gain the same hold-duration polling the combo button already had; the threshold comes from the previous wake's /frame/config fetch (persisted in NVS), since this wake's button decision happens before that request. Not done here: firmware/version.txt is intentionally left unbumped -- this hasn't been built or hardware-tested (no ESP-IDF toolchain in this environment), so no firmware release build should be triggered yet.
79 lines
3.0 KiB
C
79 lines
3.0 KiB
C
#include <stdbool.h>
|
|
|
|
#include "esp_event.h"
|
|
#include "esp_log.h"
|
|
#include "nvs_flash.h"
|
|
#include "esp_netif.h"
|
|
|
|
#include "wifi_provisioning.h"
|
|
#include "frame_client.h"
|
|
#include "next_button.h"
|
|
#include "back_button.h"
|
|
#include "combo_button.h"
|
|
|
|
static const char *TAG = "main";
|
|
|
|
void app_main(void)
|
|
{
|
|
/* Redirected/invalid captive-portal traffic generates a lot of noise
|
|
* at the default log level. */
|
|
esp_log_level_set("httpd_uri", ESP_LOG_ERROR);
|
|
esp_log_level_set("httpd_txrx", ESP_LOG_ERROR);
|
|
esp_log_level_set("httpd_parse", ESP_LOG_ERROR);
|
|
|
|
ESP_ERROR_CHECK(esp_netif_init());
|
|
ESP_ERROR_CHECK(esp_event_loop_create_default());
|
|
|
|
esp_err_t nvs_err = nvs_flash_init();
|
|
if (nvs_err == ESP_ERR_NVS_NO_FREE_PAGES || nvs_err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
|
|
ESP_ERROR_CHECK(nvs_flash_erase());
|
|
nvs_err = nvs_flash_init();
|
|
}
|
|
ESP_ERROR_CHECK(nvs_err);
|
|
|
|
/* Arms all three buttons as deep-sleep wakeup sources (so holding one
|
|
* wakes the device promptly, not just during its brief awake
|
|
* windows), then checks them -- covers both "held while asleep, just
|
|
* woke us up" and "held while powering on" the same way, since both
|
|
* look identical from here: the pin is just low right now. */
|
|
next_button_init();
|
|
back_button_init();
|
|
combo_button_init();
|
|
|
|
next_button_result_t next_result = next_button_check();
|
|
back_button_result_t back_result = back_button_check();
|
|
/* Next takes priority over back if somehow both read pressed at once
|
|
* (e.g. both held through a power-on) -- an arbitrary but
|
|
* deterministic tie-break, not expected to matter in practice. Same
|
|
* priority applies whether the winning button resolved to a short
|
|
* press or a hold. */
|
|
fetch_action_t action;
|
|
if (next_result != NEXT_BUTTON_NOT_PRESSED) {
|
|
action = (next_result == NEXT_BUTTON_HOLD) ? FETCH_GLOBAL_NEXT : FETCH_ADVANCE;
|
|
} else if (back_result != BACK_BUTTON_NOT_PRESSED) {
|
|
action = (back_result == BACK_BUTTON_HOLD) ? FETCH_GLOBAL_BACK : FETCH_BACK;
|
|
} else {
|
|
action = FETCH_NORMAL;
|
|
}
|
|
/* Soft-resets or clears config + restarts internally for a medium/
|
|
* long hold and never returns in those cases -- only returns here
|
|
* for "not pressed" (false) or "quick press" (true, show the menu). */
|
|
bool show_management_qr = combo_button_check();
|
|
|
|
frame_config_t cfg;
|
|
esp_err_t cfg_err = frame_config_load(&cfg);
|
|
if (cfg_err == ESP_OK) {
|
|
ESP_LOGI(TAG, "Found stored config for '%s', connecting to home WiFi", cfg.sta_ssid);
|
|
if (frame_wifi_connect_sta(&cfg) == ESP_OK) {
|
|
frame_client_run(&cfg, action, show_management_qr);
|
|
return; /* frame_client_run currently never returns */
|
|
}
|
|
ESP_LOGW(TAG, "Could not connect to stored WiFi after %d attempts, falling back to provisioning",
|
|
CONFIG_FRAME_STA_CONNECT_MAX_RETRIES);
|
|
} else {
|
|
ESP_LOGI(TAG, "No stored config found (%s), starting provisioning", esp_err_to_name(cfg_err));
|
|
}
|
|
|
|
wifi_provisioning_start();
|
|
}
|