Pressing the manage button (GPIO1) overlays a small QR code -- "SCAN TO MANAGE" -- in the top-right corner of whatever photo is currently on screen, linking to the server's config page, then reverts to the plain photo after 30 seconds. The overlay is spliced into the existing streaming fetch as chunks pass through (frame_client.c's http_read_fn), rather than buffering the full 192,000-byte frame in RAM: only the small overlay rectangle itself (~30KB) is ever held in memory, generated via new stride-parameterized drawing helpers (epd_draw_*_ex in epd_draw.c) that let the existing QR/text drawing code target an arbitrarily-sized buffer instead of a full-frame one. epd7in3e.c is untouched -- it has no idea an overlay exists.
63 lines
2.2 KiB
C
63 lines
2.2 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 "reset_button.h"
|
|
#include "next_button.h"
|
|
#include "manage_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. */
|
|
reset_button_init();
|
|
next_button_init();
|
|
manage_button_init();
|
|
reset_button_check(); /* clears config + restarts if held the full duration; never returns in that case */
|
|
|
|
bool force_advance = next_button_check();
|
|
bool show_management_qr = manage_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, force_advance, 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();
|
|
}
|