Skip to content

File MultiPosInput.cpp

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

Go to the documentation of this file


#ifdef ARDUINO_ARCH_STM32

#include "MultiPosInput.h"
#include <CANProtocol.h>  // sendBatched, canIdEvt, ControlPacket
#include <STM32Board.h>

namespace OpenSkyhawk {

MultiPosInput::MultiPosInput(uint16_t controlId, uint8_t numPositions, uint16_t debounceMs)
    : _controlId(controlId),
      _numPositions(numPositions),
      _debounceMs(debounceMs),
      _lastPos(0),
      _pendingPos(0),
      _debounceStartMs(0),
      _initialized(false) {}

void MultiPosInput::emit(uint16_t pos, bool init) {
    CANProtocol::sendBatched(canIdEvt(NODE_ID),
                             ControlPacket{_controlId, pos});
#ifdef MULTIPOS_TEST
    _emitCount++;
#endif
    if (STM32Board::isDebug()) {
        auto& d = STM32Board::diagSerial();
        d.print(F("[MUL] 0x")); d.print(_controlId, HEX);
        d.print(F(": "));       d.print(pos);
        if (init) d.print(F(" (init)"));
        d.println();
    }
}

void MultiPosInput::forceReport() {
    uint16_t raw = readRaw();
    if (raw != NO_POSITION && raw >= _numPositions) raw = NO_POSITION;  // reject an out-of-range index
    if (raw == NO_POSITION) raw = 0;   // nothing active at boot → default to position 0
    _lastPos         = raw;
    _pendingPos      = raw;
    _debounceStartMs = millis();
    _initialized     = true;
    emit(raw, true);
}

void MultiPosInput::poll() {
    if (!_initialized) return;

    uint16_t raw = readRaw();
    if (raw != NO_POSITION && raw >= _numPositions) raw = NO_POSITION;  // reject an out-of-range index
    if (raw == NO_POSITION) raw = _lastPos;   // hold last confirmed position

    if (raw != _pendingPos) {
        _pendingPos      = raw;
        _debounceStartMs = millis();
    } else if (_pendingPos != _lastPos &&
               millis() - _debounceStartMs >= _debounceMs) {
        _lastPos = _pendingPos;
        emit(_lastPos);
    }
}

}  // namespace OpenSkyhawk

#endif  // ARDUINO_ARCH_STM32