/* BUTTON MODULE Copyright (C) 2016-2019 by Xose PĂ©rez */ #pragma once #include "espurna.h" #include "libs/BasePin.h" #include "libs/DebounceEvent.h" #include constexpr size_t ButtonsActionMax { 255ul }; constexpr size_t ButtonsPresetMax { 8ul }; constexpr size_t ButtonsMax { 32ul }; enum class ButtonProvider : int { None, Gpio, Analog }; enum class ButtonEvent { None, Pressed, Released, Click, DoubleClick, LongClick, LongLongClick, TripleClick }; // button actions, limited to 8-bit number (0b11111111 / 0xff / 255) enum class ButtonAction : uint8_t { None, Toggle, On, Off, AccessPoint, Reset, Pulse, FactoryReset, Wps, SmartConfig, BrightnessIncrease, BrightnessDecrease, DisplayOn, Custom, FanLow, FanMedium, FanHigh }; struct ButtonActions { ButtonAction pressed; ButtonAction released; ButtonAction click; ButtonAction dblclick; ButtonAction lngclick; ButtonAction lnglngclick; ButtonAction trplclick; }; struct ButtonEventDelays { ButtonEventDelays(); ButtonEventDelays(unsigned long debounce, unsigned long repeat, unsigned long lngclick, unsigned long lnglngclick); unsigned long debounce; unsigned long repeat; unsigned long lngclick; unsigned long lnglngclick; }; struct button_t { button_t(ButtonActions&& actions, ButtonEventDelays&& delays); button_t(BasePinPtr&& pin, const debounce_event::types::Config& config, ButtonActions&& actions, ButtonEventDelays&& delays); bool state(); ButtonEvent loop(); std::unique_ptr event_emitter; ButtonActions actions; ButtonEventDelays event_delays; }; using ButtonEventHandler = void(*)(size_t id, ButtonEvent event); void buttonSetCustomAction(ButtonEventHandler); void buttonSetNotifyAction(ButtonEventHandler); bool buttonState(size_t id); ButtonAction buttonAction(size_t id, const ButtonEvent event); void buttonEvent(size_t id, ButtonEvent event); size_t buttonCount(); void buttonSetup();