Skip to content

File MultiPosInput.h

File List > Firmware > Libraries > PanelGroup > Inputs > MultiPosInput > MultiPosInput.h

Go to the documentation of this file


#pragma once
#ifdef ARDUINO_ARCH_STM32

#include <PanelGroup.h>  // InputBase

namespace OpenSkyhawk {

class MultiPosInput : public InputBase {
public:
    static constexpr uint16_t NO_POSITION = 0xFFFF;

    void poll() override;

    void forceReport() override;

    uint16_t position() const { return _lastPos; }

#ifdef MULTIPOS_TEST
    uint16_t emitCount() const { return _emitCount; }
#endif

protected:
    MultiPosInput(uint16_t controlId, uint8_t numPositions, uint16_t debounceMs);

    virtual uint16_t readRaw() = 0;

    uint16_t _controlId;     
    uint8_t  _numPositions;  

private:
    void emit(uint16_t pos, bool init = false);  

    uint16_t _debounceMs;       // stability window (ms); 0 = confirm next poll
    uint16_t _lastPos;          // last confirmed / emitted index
    uint16_t _pendingPos;       // last raw reading (pre-confirm)
    uint32_t _debounceStartMs;  // millis() when _pendingPos last changed
    bool     _initialized;      // false until forceReport(); poll() no-op before this
#ifdef MULTIPOS_TEST
    uint16_t _emitCount = 0;    // test-only EVT counter
#endif
};

}  // namespace OpenSkyhawk

#endif  // ARDUINO_ARCH_STM32