#pragma once #include "AtomicPosition.hpp" #include "DirectPinRead.hpp" #include "NumInterrupts.hpp" #include #include BEGIN_CS_NAMESPACE #define CS_ENCODER_ISR_ATTR #define CS_ENCODER_ARGLIST_SIZE CORE_NUM_INTERRUPT class AHEncoder { public: AHEncoder(uint8_t pinA, uint8_t pinB); AHEncoder(const AHEncoder &) = delete; AHEncoder &operator=(const AHEncoder &) = delete; AHEncoder(AHEncoder &&other); AHEncoder &operator=(AHEncoder &&other); ~AHEncoder(); void begin(); void end(); int32_t read(); int32_t readAndReset(int32_t newpos = 0); void write(int32_t p); private: AH::Array pins; uint8_t interrupts_in_use = 0; uint8_t state = 0; AH::Array direct_pins; AtomicPosition position {0}; void update(); void attachInterruptCtx(uint8_t pin); void detachInterruptCtx(uint8_t pin); static AHEncoder *instance_table[CS_ENCODER_ARGLIST_SIZE]; friend void swap(AHEncoder &a, AHEncoder &b); friend void encoder_gpio_callback(unsigned int, uint32_t); }; END_CS_NAMESPACE #include "AHEncoder.ipp"