Files
espresso_frame/firmware/main/combo_button.h
T
tfaour 3868d357ff
Build and push server image / build-and-push (push) Successful in 32s
Add back-photo button; consolidate reset/manage onto one hold-duration button
Back button (new GPIO0, POST /frame/back): the server now tracks a
bounded history of previously-current photos (photo_queue.py), pushed
to on every advance (auto or forced) and popped by back_forced() --
symmetric with advance, so pressing next afterwards returns to right
where you were. frame_client.c's force_advance bool becomes a 3-way
fetch_action_t (NORMAL/ADVANCE/BACK) threaded through the whole fetch
path.

Also folds the separate reset and manage buttons onto one pin
(combo_button.c, replacing reset_button.c/manage_button.c entirely),
disambiguated by hold duration: quick press shows the management menu
(unchanged), ~3s hold-then-release soft-resets (esp_restart(), config
kept -- new), ~15s hold factory-resets (today's old reset behavior,
extended from 10s for clearer tier separation). Driven by a production
board (Seeed XIAO ESP32-C6) exposing only 3 of the ESP32-C6's 8
deep-sleep-wakeup-capable GPIOs -- next/back keep their own dedicated
pins where instant response matters most, everything else shares the
third pin via timing instead of needing its own. Same three-pin layout
now works on both the dev board and the production board.

Fixed a fast-tap bug in combo_button_check() before shipping: it only
did a live gpio_get_level() read to decide whether the button was
pressed at all, so a press fast enough to already be released by the
time boot reached that check was missed entirely (treated as "never
pressed" rather than "quick press"). Added the same latched
esp_sleep_get_gpio_wakeup_status() check the other buttons already use
for exactly this reason.
2026-07-19 12:53:26 -04:00

40 lines
1.6 KiB
C

#pragma once
#include <stdbool.h>
/**
* Configures the combined menu/reset button GPIO
* (CONFIG_FRAME_COMBO_BUTTON_GPIO, active-low with internal pull-up) and
* arms it as a deep-sleep wakeup source, same as the other buttons. Call
* once, early in app_main(), before the device might enter deep sleep.
*
* A no-op if CONFIG_FRAME_COMBO_BUTTON_GPIO is negative (button disabled).
*/
void combo_button_init(void);
/**
* Checks the combined menu/reset button and acts on how long it was
* held, evaluated once per wake:
* - Not pressed: returns false immediately.
* - Released before CONFIG_FRAME_COMBO_SOFT_RESET_HOLD_MS (a quick
* press): returns true -- caller should show the management menu.
* - Released between the soft-reset and factory-reset thresholds: a
* soft reset (esp_restart(), stored WiFi/server config kept) --
* never returns.
* - Held through CONFIG_FRAME_COMBO_FACTORY_RESET_HOLD_MS: a factory
* reset (frame_config_clear() + esp_restart(), fires immediately
* without waiting for release) -- never returns.
*/
bool combo_button_check(void);
/**
* Returns whether the combined button is currently held, with no
* debounce and no hold-duration interpretation -- a bare live level
* check. Used only by the already-shipped escalating-menu polling in
* frame_client.c (wait_for_button_press()) to detect a further press
* while the menu is already showing; deliberately never reused for
* reset detection, so holding the button too long while escalating the
* menu can't be misread as a reset request.
*/
bool combo_button_is_pressed(void);