firmware/src/input/RotaryEncoderInterruptBase.h

42 lines
1.9 KiB
C
Raw Normal View History

2022-01-08 12:13:29 +00:00
#pragma once
2022-01-11 15:02:55 +00:00
2022-01-12 08:26:42 +00:00
#include "InputBroker.h"
#include "concurrency/OSThread.h"
#include "mesh/generated/meshtastic/module_config.pb.h"
2022-01-08 12:13:29 +00:00
2022-05-07 10:31:21 +00:00
enum RotaryEncoderInterruptBaseStateType { ROTARY_EVENT_OCCURRED, ROTARY_EVENT_CLEARED };
2022-01-08 12:13:29 +00:00
2022-05-07 10:31:21 +00:00
enum RotaryEncoderInterruptBaseActionType { ROTARY_ACTION_NONE, ROTARY_ACTION_PRESSED, ROTARY_ACTION_CW, ROTARY_ACTION_CCW };
2022-01-08 12:13:29 +00:00
class RotaryEncoderInterruptBase : public Observable<const InputEvent *>, public concurrency::OSThread
2022-01-08 12:13:29 +00:00
{
public:
2022-05-07 10:31:21 +00:00
explicit RotaryEncoderInterruptBase(const char *name);
void init(uint8_t pinA, uint8_t pinB, uint8_t pinPress, char eventCw, char eventCcw, char eventPressed,
// std::function<void(void)> onIntA, std::function<void(void)> onIntB, std::function<void(void)> onIntPress);
void (*onIntA)(), void (*onIntB)(), void (*onIntPress)());
2022-01-08 12:13:29 +00:00
void intPressHandler();
void intAHandler();
void intBHandler();
protected:
2022-01-24 17:24:40 +00:00
virtual int32_t runOnce() override;
2022-05-07 10:31:21 +00:00
RotaryEncoderInterruptBaseStateType intHandler(bool actualPinRaising, int otherPinLevel,
RotaryEncoderInterruptBaseActionType action,
RotaryEncoderInterruptBaseStateType state);
2022-01-12 21:50:37 +00:00
2022-01-09 09:08:31 +00:00
volatile RotaryEncoderInterruptBaseStateType rotaryStateCW = ROTARY_EVENT_CLEARED;
volatile RotaryEncoderInterruptBaseStateType rotaryStateCCW = ROTARY_EVENT_CLEARED;
2022-01-08 12:13:29 +00:00
volatile int rotaryLevelA = LOW;
volatile int rotaryLevelB = LOW;
2022-01-09 09:08:31 +00:00
volatile RotaryEncoderInterruptBaseActionType action = ROTARY_ACTION_NONE;
2022-01-08 12:13:29 +00:00
private:
2022-01-24 07:00:14 +00:00
uint8_t _pinA = 0;
uint8_t _pinB = 0;
char _eventCw = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_NONE;
char _eventCcw = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_NONE;
char _eventPressed = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_NONE;
2022-01-11 15:02:55 +00:00
const char *_originName;
2022-01-24 07:00:14 +00:00
};