2026-08-03 10:51:29 -04:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <Arduino.h>
|
|
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
|
|
class PowerManager;
|
|
|
|
|
class SettingsManager;
|
|
|
|
|
|
|
|
|
|
enum class ButtonEvent : uint8_t {
|
|
|
|
|
None,
|
|
|
|
|
NextPhoto,
|
|
|
|
|
RandomPhoto,
|
|
|
|
|
PlayPause,
|
|
|
|
|
DeepSleep,
|
|
|
|
|
FactoryReset
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class ButtonHandler {
|
|
|
|
|
public:
|
|
|
|
|
void begin(PowerManager& power, SettingsManager& settings);
|
|
|
|
|
ButtonEvent poll();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
PowerManager* _power = nullptr;
|
|
|
|
|
SettingsManager* _settings = nullptr;
|
|
|
|
|
|
|
|
|
|
unsigned long _btnTopPressTime = 0;
|
|
|
|
|
unsigned long _btnUpPressTime = 0;
|
|
|
|
|
unsigned long _btnDownPressTime = 0;
|
|
|
|
|
|
|
|
|
|
bool _btnTopPressed = false;
|
|
|
|
|
bool _btnUpPressed = false;
|
|
|
|
|
bool _btnDownPressed = false;
|
|
|
|
|
|
feat: blurred letterbox, portrait pairs, overlay metadata, button fixes
- Letterbox: extend edge pixels outward with blur + fade to solid color
- Portrait: detect and pair portraits side-by-side, fallback to solo
- Metadata: add overlay mode (corner badge), time field, custom date/time
format strings (strftime), font size 1.5x, region-aware for pairs
- Buttons: swap G9/G10 to match physical layout, double-press random
button for deep sleep, SLP indicator drawn before sleep
- Boot: remove redundant 'Loading photos' screen (saves 17s refresh)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-03 15:53:06 -04:00
|
|
|
// Double-press detection for BTN_TOP
|
|
|
|
|
unsigned long _btnTopLastRelease = 0;
|
|
|
|
|
bool _btnTopPendingSingle = false;
|
|
|
|
|
static constexpr unsigned long DOUBLE_PRESS_WINDOW = 400;
|
|
|
|
|
|
2026-08-03 10:51:29 -04:00
|
|
|
unsigned long _lastDebounce = 0;
|
|
|
|
|
|
|
|
|
|
bool debounced(unsigned long now);
|
|
|
|
|
};
|