Build and push server image / build-and-push (push) Successful in 32s
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.
22 lines
682 B
C
22 lines
682 B
C
#pragma once
|
|
|
|
#include <stdbool.h>
|
|
|
|
/**
|
|
* Configures the next-photo button GPIO (CONFIG_FRAME_NEXT_BUTTON_GPIO,
|
|
* active-low with internal pull-up) and arms it as a deep-sleep wakeup
|
|
* source. Call once, early in app_main(), before the device might enter
|
|
* deep sleep.
|
|
*
|
|
* A no-op if CONFIG_FRAME_NEXT_BUTTON_GPIO is negative (button disabled).
|
|
*/
|
|
void next_button_init(void);
|
|
|
|
/**
|
|
* Returns whether the next-photo button is currently held, debounced with
|
|
* a couple of short re-checks to reject noise. No long hold-to-confirm
|
|
* gate -- advancing a photo is low-stakes and should feel immediate, so
|
|
* this returns right away either way.
|
|
*/
|
|
bool next_button_check(void);
|