18#include "TaskManager.h"
25#define HOLD_THRESHOLD 20
29#ifndef SWITCHES_ACCELERATION_DIVISOR
30#define SWITCHES_ACCELERATION_DIVISOR 2
39#define MAX_KEYS DEFAULT_LIST_SIZE
46#ifndef MAX_ROTARY_ENCODERS
47#define MAX_ROTARY_ENCODERS 4
53#ifndef SWITCH_POLL_INTERVAL
54#define SWITCH_POLL_INTERVAL 20
63#ifndef REJECT_DIRECTION_CHANGE_THRESHOLD
64#define REJECT_DIRECTION_CHANGE_THRESHOLD 10000
72enum KeyPressState : uint8_t {
80#define KEY_PRESS_STATE_MASK 0x0f
81#define KEY_LISTENER_MODE_BIT 7
82#define KEY_LOGIC_IS_INVERTED 6
135 KeyPressState previousState;
138 uint8_t acceleration;
139 uint8_t repeatInterval;
147 KeyboardItem(pinid_t pin,
KeyCallbackFn callback, uint8_t repeatInterval = NO_REPEAT,
bool keyLogicIsInverted =
false);
148 KeyboardItem(pinid_t pin,
SwitchListener* switchListener, uint8_t repeatInterval = NO_REPEAT,
bool keyLogicIsInverted =
false);
149 KeyboardItem(
const KeyboardItem& other);
150 KeyboardItem& operator=(
const KeyboardItem& other);
151 void checkAndTrigger(uint8_t pin);
154 bool isDebouncing()
const {
return getState() == DEBOUNCING1 || getState() == DEBOUNCING2; }
155 bool isPressed()
const {
return getState() == PRESSED || getState() == BUTTON_HELD; }
156 bool isHeld()
const {
return getState() == BUTTON_HELD; }
157 pinid_t getPin()
const {
return pin; }
158 pinid_t getKey()
const {
return pin; }
160 void trigger(
bool held);
161 void triggerRelease(
bool held);
163 KeyPressState getState()
const {
return (KeyPressState)(stateFlags & KEY_PRESS_STATE_MASK); }
164 void setState(KeyPressState state) {
165 stateFlags &= ~KEY_PRESS_STATE_MASK;
166 stateFlags |= (state & KEY_PRESS_STATE_MASK);
168 bool isUsingListener() {
return bitRead(stateFlags, KEY_LISTENER_MODE_BIT); }
169 bool isLogicInverted() {
return bitRead(stateFlags, KEY_LOGIC_IS_INVERTED); }
174 void setRepeatInterval(uint8_t newInterval) { repeatInterval = newInterval;}
214 enum EncoderFlagBits { LAST_SYNC_STATUS=0, WRAP_AROUND_MODE, OO_LISTENER_CALLBACK, LAST_ENCODER_DIRECTION_UP };
215 uint16_t maximumValue;
216 uint16_t currentReading;
227 virtual ~RotaryEncoder() {;}
236 void changePrecision(uint16_t maxValue,
int currentValue,
bool rolloverOnMax =
false,
int step = 1);
289 void runCallback(
int newVal) {
290 if(bitRead(flags, OO_LISTENER_CALLBACK)) {
291 notify.encoderListener->encoderHasChanged(newVal);
293 notify.callback(newVal);
329class AbstractHwRotaryEncoder :
public RotaryEncoder {
331 unsigned long lastChange;
338 explicit AbstractHwRotaryEncoder(
EncoderCallbackFn callback) : RotaryEncoder(callback) {}
339 explicit AbstractHwRotaryEncoder(
EncoderListener* listener) : RotaryEncoder(listener) {}
355 int amountFromChange(
unsigned long change);
356 void handleChangeRaw(
bool increase);
369 uint8_t pulseCounter = 0;
404 int8_t currentEncoderState = 0;
429 int8_t stateFor(uint8_t bits);
439 const pinid_t upPin, downPin, backPin, nextPin;
441 const bool canRotate;
497 void onPressed(pinid_t pin,
bool held)
override;
498 void onReleased(pinid_t pin,
bool held)
override;
507#define SW_FLAG_PULLUP_LOGIC 0
508#define SW_FLAG_INTERRUPT_DRIVEN 1
509#define SW_FLAG_INTERRUPT_DEBOUNCE 2
510#define SW_FLAG_ENCODER_IS_POLLING 3
541 BtreeList<pinid_t, KeyboardItem> keys;
542 volatile uint8_t swFlags;
596 bool addSwitch(pinid_t pin,
KeyCallbackFn callback, uint8_t repeat = NO_REPEAT,
bool invertLogic =
false);
681 void changeEncoderPrecision(uint8_t slot, uint16_t precision, uint16_t currentValue,
bool rollover,
int step=1);
705 bool pullUp = bitRead(swFlags, SW_FLAG_PULLUP_LOGIC);
707 return (pullUp && !invertedLogic) || (!pullUp && invertedLogic);
713 bool isInterruptDriven() {
return bitRead(swFlags, SW_FLAG_INTERRUPT_DRIVEN);}
749 return keys.removeByKey(pin);
759 void ensureInitialized();
762 bool internalAddSwitch(pinid_t pin,
bool invertLogic);
764 friend void onSwitchesInterrupt(pinid_t);
BasicIoAbstraction * IoAbstractionRef
Definition BasicIoAbstraction.h:174
Using basic IoFacilities allows one to abstract away the use of IoExpanders, such that the switching ...
void setEncoderType(EncoderType et)
Definition SwitchInput.h:351
void setAccelerationMode(HWAccelerationMode mode)
Definition SwitchInput.h:345
Definition SwitchInput.h:197
virtual void encoderHasChanged(int newValue)=0
HardwareRotaryEncoder(pinid_t pinA, pinid_t pinB, EncoderCallbackFn callback, HWAccelerationMode accelerationMode=HWACCEL_REGULAR, EncoderType=FULL_CYCLE)
Definition SwitchInput.cpp:351
void encoderChanged() override
Definition SwitchInput.cpp:440
HwStateRotaryEncoder(pinid_t pinA, pinid_t pinB, EncoderCallbackFn callback, HWAccelerationMode accelerationMode=HWACCEL_REGULAR, EncoderType=FULL_CYCLE)
Definition SwitchInput.cpp:682
void encoderChanged() override
Definition SwitchInput.cpp:639
Definition SwitchInput.h:212
bool didLastSyncSucceed()
Definition SwitchInput.h:277
int getCurrentReading() const
Definition SwitchInput.h:253
virtual void encoderChanged()
Definition SwitchInput.h:270
void replaceCallbackListener(EncoderListener *callbackFn)
Definition SwitchInput.cpp:312
void setUserIntention(EncoderUserIntention intention)
Definition SwitchInput.cpp:317
void replaceCallback(EncoderCallbackFn callbackFn)
Definition SwitchInput.cpp:307
void increment(int8_t incVal)
Definition SwitchInput.cpp:328
void setCurrentReading(int reading)
Definition SwitchInput.h:259
bsize_t getMaximumValue()
Definition SwitchInput.h:300
void changePrecision(uint16_t maxValue, int currentValue, bool rolloverOnMax=false, int step=1)
Definition SwitchInput.cpp:298
Definition SwitchInput.h:98
virtual void onPressed(pinid_t pin, bool held)=0
virtual void onReleased(pinid_t pin, bool held)=0