/*
|
|
|
|
BUTTON MODULE
|
|
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "espurna.h"
|
|
|
|
namespace ButtonMask {
|
|
|
|
constexpr int Pushbutton { 1 << 0 };
|
|
constexpr int Switch { 1 << 1 };
|
|
constexpr int DefaultLow { 1 << 2 };
|
|
constexpr int DefaultHigh { 1 << 3 };
|
|
constexpr int DefaultBoot { 1 << 4 };
|
|
constexpr int SetPullup { 1 << 5 };
|
|
constexpr int SetPulldown { 1 << 6 };
|
|
|
|
} // namespace ButtonMask
|
|
|
|
namespace button {
|
|
namespace build {
|
|
|
|
constexpr size_t pin(size_t index) {
|
|
return (
|
|
(index == 0) ? BUTTON1_PIN :
|
|
(index == 1) ? BUTTON2_PIN :
|
|
(index == 2) ? BUTTON3_PIN :
|
|
(index == 3) ? BUTTON4_PIN :
|
|
(index == 4) ? BUTTON5_PIN :
|
|
(index == 5) ? BUTTON6_PIN :
|
|
(index == 6) ? BUTTON7_PIN :
|
|
(index == 7) ? BUTTON8_PIN : GPIO_NONE
|
|
);
|
|
}
|
|
|
|
constexpr GpioType pinType(size_t index) {
|
|
return (
|
|
(index == 0) ? BUTTON1_PIN_TYPE :
|
|
(index == 1) ? BUTTON2_PIN_TYPE :
|
|
(index == 2) ? BUTTON3_PIN_TYPE :
|
|
(index == 3) ? BUTTON4_PIN_TYPE :
|
|
(index == 4) ? BUTTON5_PIN_TYPE :
|
|
(index == 5) ? BUTTON6_PIN_TYPE :
|
|
(index == 6) ? BUTTON7_PIN_TYPE :
|
|
(index == 7) ? BUTTON8_PIN_TYPE : GPIO_TYPE_NONE
|
|
);
|
|
}
|
|
|
|
constexpr int configBitmask(size_t index) {
|
|
return (
|
|
(index == 0) ? (BUTTON1_CONFIG) :
|
|
(index == 1) ? (BUTTON2_CONFIG) :
|
|
(index == 2) ? (BUTTON3_CONFIG) :
|
|
(index == 3) ? (BUTTON4_CONFIG) :
|
|
(index == 4) ? (BUTTON5_CONFIG) :
|
|
(index == 5) ? (BUTTON6_CONFIG) :
|
|
(index == 6) ? (BUTTON7_CONFIG) :
|
|
(index == 7) ? (BUTTON8_CONFIG) : (BUTTON_PUSHBUTTON | BUTTON_SET_PULLUP | BUTTON_DEFAULT_HIGH)
|
|
);
|
|
}
|
|
|
|
namespace internal {
|
|
|
|
constexpr debounce_event::types::Config decode(int bitmask) {
|
|
return {
|
|
((bitmask & ButtonMask::Pushbutton)
|
|
? debounce_event::types::Mode::Pushbutton
|
|
: debounce_event::types::Mode::Switch),
|
|
((bitmask & ButtonMask::DefaultLow) ? debounce_event::types::PinValue::Low
|
|
: (bitmask & ButtonMask::DefaultHigh) ? debounce_event::types::PinValue::High
|
|
: (bitmask & ButtonMask::DefaultBoot) ? debounce_event::types::PinValue::Initial
|
|
: debounce_event::types::PinValue::Low),
|
|
((bitmask & ButtonMask::SetPullup) ? debounce_event::types::PinMode::InputPullup
|
|
: (bitmask & ButtonMask::SetPulldown) ? debounce_event::types::PinMode::InputPulldown
|
|
: debounce_event::types::PinMode::Input)
|
|
};
|
|
}
|
|
|
|
} // namespace internal
|
|
|
|
constexpr debounce_event::types::Mode mode(size_t index) {
|
|
return internal::decode(configBitmask(index)).mode;
|
|
}
|
|
|
|
constexpr debounce_event::types::PinValue defaultValue(size_t index) {
|
|
return internal::decode(configBitmask(index)).default_value;
|
|
}
|
|
|
|
constexpr debounce_event::types::PinMode pinMode(size_t index) {
|
|
return internal::decode(configBitmask(index)).pin_mode;
|
|
}
|
|
|
|
constexpr ButtonAction release(size_t index) {
|
|
return (
|
|
(index == 0) ? BUTTON1_RELEASE :
|
|
(index == 1) ? BUTTON2_RELEASE :
|
|
(index == 2) ? BUTTON3_RELEASE :
|
|
(index == 3) ? BUTTON4_RELEASE :
|
|
(index == 4) ? BUTTON5_RELEASE :
|
|
(index == 5) ? BUTTON6_RELEASE :
|
|
(index == 6) ? BUTTON7_RELEASE :
|
|
(index == 7) ? BUTTON8_RELEASE : BUTTON_ACTION_NONE
|
|
);
|
|
}
|
|
|
|
constexpr ButtonAction press(size_t index) {
|
|
return (
|
|
(index == 0) ? BUTTON1_PRESS :
|
|
(index == 1) ? BUTTON2_PRESS :
|
|
(index == 2) ? BUTTON3_PRESS :
|
|
(index == 3) ? BUTTON4_PRESS :
|
|
(index == 4) ? BUTTON5_PRESS :
|
|
(index == 5) ? BUTTON6_PRESS :
|
|
(index == 6) ? BUTTON7_PRESS :
|
|
(index == 7) ? BUTTON8_PRESS : BUTTON_ACTION_NONE
|
|
);
|
|
}
|
|
|
|
constexpr ButtonAction click(size_t index) {
|
|
return (
|
|
(index == 0) ? BUTTON1_CLICK :
|
|
(index == 1) ? BUTTON2_CLICK :
|
|
(index == 2) ? BUTTON3_CLICK :
|
|
(index == 3) ? BUTTON4_CLICK :
|
|
(index == 4) ? BUTTON5_CLICK :
|
|
(index == 5) ? BUTTON6_CLICK :
|
|
(index == 6) ? BUTTON7_CLICK :
|
|
(index == 7) ? BUTTON8_CLICK : BUTTON_ACTION_NONE
|
|
);
|
|
}
|
|
|
|
constexpr ButtonAction doubleClick(size_t index) {
|
|
return (
|
|
(index == 0) ? BUTTON1_DBLCLICK :
|
|
(index == 1) ? BUTTON2_DBLCLICK :
|
|
(index == 2) ? BUTTON3_DBLCLICK :
|
|
(index == 3) ? BUTTON4_DBLCLICK :
|
|
(index == 4) ? BUTTON5_DBLCLICK :
|
|
(index == 5) ? BUTTON6_DBLCLICK :
|
|
(index == 6) ? BUTTON7_DBLCLICK :
|
|
(index == 7) ? BUTTON8_DBLCLICK : BUTTON_ACTION_NONE
|
|
);
|
|
}
|
|
|
|
constexpr ButtonAction tripleClick(size_t index) {
|
|
return (
|
|
(index == 0) ? BUTTON1_TRIPLECLICK :
|
|
(index == 1) ? BUTTON2_TRIPLECLICK :
|
|
(index == 2) ? BUTTON3_TRIPLECLICK :
|
|
(index == 3) ? BUTTON4_TRIPLECLICK :
|
|
(index == 4) ? BUTTON5_TRIPLECLICK :
|
|
(index == 5) ? BUTTON6_TRIPLECLICK :
|
|
(index == 6) ? BUTTON7_TRIPLECLICK :
|
|
(index == 7) ? BUTTON8_TRIPLECLICK : BUTTON_ACTION_NONE
|
|
);
|
|
}
|
|
|
|
constexpr ButtonAction longClick(size_t index) {
|
|
return (
|
|
(index == 0) ? BUTTON1_LNGCLICK :
|
|
(index == 1) ? BUTTON2_LNGCLICK :
|
|
(index == 2) ? BUTTON3_LNGCLICK :
|
|
(index == 3) ? BUTTON4_LNGCLICK :
|
|
(index == 4) ? BUTTON5_LNGCLICK :
|
|
(index == 5) ? BUTTON6_LNGCLICK :
|
|
(index == 6) ? BUTTON7_LNGCLICK :
|
|
(index == 7) ? BUTTON8_LNGCLICK : BUTTON_ACTION_NONE
|
|
);
|
|
}
|
|
|
|
constexpr ButtonAction longLongClick(size_t index) {
|
|
return (
|
|
(index == 0) ? BUTTON1_LNGLNGCLICK :
|
|
(index == 1) ? BUTTON2_LNGLNGCLICK :
|
|
(index == 2) ? BUTTON3_LNGLNGCLICK :
|
|
(index == 3) ? BUTTON4_LNGLNGCLICK :
|
|
(index == 4) ? BUTTON5_LNGLNGCLICK :
|
|
(index == 5) ? BUTTON6_LNGLNGCLICK :
|
|
(index == 6) ? BUTTON7_LNGLNGCLICK :
|
|
(index == 7) ? BUTTON8_LNGLNGCLICK : BUTTON_ACTION_NONE
|
|
);
|
|
}
|
|
|
|
constexpr size_t relay(size_t index) {
|
|
return (
|
|
(index == 0) ? (BUTTON1_RELAY - 1) :
|
|
(index == 1) ? (BUTTON2_RELAY - 1) :
|
|
(index == 2) ? (BUTTON3_RELAY - 1) :
|
|
(index == 3) ? (BUTTON4_RELAY - 1) :
|
|
(index == 4) ? (BUTTON5_RELAY - 1) :
|
|
(index == 5) ? (BUTTON6_RELAY - 1) :
|
|
(index == 6) ? (BUTTON7_RELAY - 1) :
|
|
(index == 7) ? (BUTTON8_RELAY - 1) : RELAY_NONE
|
|
);
|
|
}
|
|
|
|
constexpr unsigned long debounceDelay() {
|
|
return BUTTON_DEBOUNCE_DELAY;
|
|
}
|
|
|
|
constexpr unsigned long debounceDelay(size_t index) {
|
|
return (
|
|
(index == 0) ? BUTTON1_DEBOUNCE_DELAY :
|
|
(index == 1) ? BUTTON2_DEBOUNCE_DELAY :
|
|
(index == 2) ? BUTTON3_DEBOUNCE_DELAY :
|
|
(index == 3) ? BUTTON4_DEBOUNCE_DELAY :
|
|
(index == 4) ? BUTTON5_DEBOUNCE_DELAY :
|
|
(index == 5) ? BUTTON6_DEBOUNCE_DELAY :
|
|
(index == 6) ? BUTTON7_DEBOUNCE_DELAY :
|
|
(index == 7) ? BUTTON8_DEBOUNCE_DELAY : debounceDelay()
|
|
);
|
|
}
|
|
|
|
constexpr unsigned long repeatDelay() {
|
|
return BUTTON_REPEAT_DELAY;
|
|
}
|
|
|
|
constexpr unsigned long repeatDelay(size_t index) {
|
|
return (
|
|
(index == 0) ? BUTTON1_REPEAT_DELAY :
|
|
(index == 1) ? BUTTON2_REPEAT_DELAY :
|
|
(index == 2) ? BUTTON3_REPEAT_DELAY :
|
|
(index == 3) ? BUTTON4_REPEAT_DELAY :
|
|
(index == 4) ? BUTTON5_REPEAT_DELAY :
|
|
(index == 5) ? BUTTON6_REPEAT_DELAY :
|
|
(index == 6) ? BUTTON7_REPEAT_DELAY :
|
|
(index == 7) ? BUTTON8_REPEAT_DELAY : repeatDelay()
|
|
);
|
|
}
|
|
|
|
constexpr unsigned long longClickDelay() {
|
|
return BUTTON_LNGCLICK_DELAY;
|
|
}
|
|
|
|
constexpr unsigned long longClickDelay(size_t index) {
|
|
return (
|
|
(index == 0) ? BUTTON1_LNGCLICK_DELAY :
|
|
(index == 1) ? BUTTON2_LNGCLICK_DELAY :
|
|
(index == 2) ? BUTTON3_LNGCLICK_DELAY :
|
|
(index == 3) ? BUTTON4_LNGCLICK_DELAY :
|
|
(index == 4) ? BUTTON5_LNGCLICK_DELAY :
|
|
(index == 5) ? BUTTON6_LNGCLICK_DELAY :
|
|
(index == 6) ? BUTTON7_LNGCLICK_DELAY :
|
|
(index == 7) ? BUTTON8_LNGCLICK_DELAY : longClickDelay()
|
|
);
|
|
}
|
|
|
|
constexpr unsigned long longLongClickDelay() {
|
|
return BUTTON_LNGLNGCLICK_DELAY;
|
|
}
|
|
|
|
constexpr unsigned long longLongClickDelay(size_t index) {
|
|
return (
|
|
(index == 0) ? BUTTON1_LNGLNGCLICK_DELAY :
|
|
(index == 1) ? BUTTON2_LNGLNGCLICK_DELAY :
|
|
(index == 2) ? BUTTON3_LNGLNGCLICK_DELAY :
|
|
(index == 3) ? BUTTON4_LNGLNGCLICK_DELAY :
|
|
(index == 4) ? BUTTON5_LNGLNGCLICK_DELAY :
|
|
(index == 5) ? BUTTON6_LNGLNGCLICK_DELAY :
|
|
(index == 6) ? BUTTON7_LNGLNGCLICK_DELAY :
|
|
(index == 7) ? BUTTON8_LNGLNGCLICK_DELAY : longLongClickDelay()
|
|
);
|
|
}
|
|
|
|
constexpr bool mqttSendAllEvents() {
|
|
return (1 == BUTTON_MQTT_SEND_ALL_EVENTS);
|
|
}
|
|
|
|
constexpr bool mqttSendAllEvents(size_t index) {
|
|
return (
|
|
(index == 0) ? (1 == BUTTON1_MQTT_SEND_ALL_EVENTS) :
|
|
(index == 1) ? (1 == BUTTON2_MQTT_SEND_ALL_EVENTS) :
|
|
(index == 2) ? (1 == BUTTON3_MQTT_SEND_ALL_EVENTS) :
|
|
(index == 3) ? (1 == BUTTON4_MQTT_SEND_ALL_EVENTS) :
|
|
(index == 4) ? (1 == BUTTON5_MQTT_SEND_ALL_EVENTS) :
|
|
(index == 5) ? (1 == BUTTON6_MQTT_SEND_ALL_EVENTS) :
|
|
(index == 6) ? (1 == BUTTON7_MQTT_SEND_ALL_EVENTS) :
|
|
(index == 7) ? (1 == BUTTON8_MQTT_SEND_ALL_EVENTS) : mqttSendAllEvents()
|
|
);
|
|
}
|
|
|
|
constexpr bool mqttRetain() {
|
|
return (1 == BUTTON_MQTT_RETAIN);
|
|
}
|
|
|
|
constexpr bool mqttRetain(size_t index) {
|
|
return (
|
|
(index == 0) ? (1 == BUTTON1_MQTT_RETAIN) :
|
|
(index == 1) ? (1 == BUTTON2_MQTT_RETAIN) :
|
|
(index == 2) ? (1 == BUTTON3_MQTT_RETAIN) :
|
|
(index == 3) ? (1 == BUTTON4_MQTT_RETAIN) :
|
|
(index == 4) ? (1 == BUTTON5_MQTT_RETAIN) :
|
|
(index == 5) ? (1 == BUTTON6_MQTT_RETAIN) :
|
|
(index == 6) ? (1 == BUTTON7_MQTT_RETAIN) :
|
|
(index == 7) ? (1 == BUTTON8_MQTT_RETAIN) : mqttRetain()
|
|
);
|
|
}
|
|
|
|
constexpr ButtonProvider provider(size_t index) {
|
|
return (
|
|
(index == 0) ? (BUTTON1_PROVIDER) :
|
|
(index == 1) ? (BUTTON2_PROVIDER) :
|
|
(index == 2) ? (BUTTON3_PROVIDER) :
|
|
(index == 3) ? (BUTTON4_PROVIDER) :
|
|
(index == 4) ? (BUTTON5_PROVIDER) :
|
|
(index == 5) ? (BUTTON6_PROVIDER) :
|
|
(index == 6) ? (BUTTON7_PROVIDER) :
|
|
(index == 7) ? (BUTTON8_PROVIDER) : BUTTON_PROVIDER_NONE
|
|
);
|
|
}
|
|
|
|
constexpr int analogLevel(size_t index) {
|
|
return (
|
|
(index == 0) ? (BUTTON1_ANALOG_LEVEL) :
|
|
(index == 1) ? (BUTTON2_ANALOG_LEVEL) :
|
|
(index == 2) ? (BUTTON3_ANALOG_LEVEL) :
|
|
(index == 3) ? (BUTTON4_ANALOG_LEVEL) :
|
|
(index == 4) ? (BUTTON5_ANALOG_LEVEL) :
|
|
(index == 5) ? (BUTTON6_ANALOG_LEVEL) :
|
|
(index == 6) ? (BUTTON7_ANALOG_LEVEL) :
|
|
(index == 7) ? (BUTTON8_ANALOG_LEVEL) : 0
|
|
);
|
|
}
|
|
|
|
} // namespace build
|
|
} // namespace button
|