#pragma once #include class Stepper { private: volatile uint8_t * const _port; const uint8_t _pinA; const uint8_t _pinB; const uint8_t _pinC; const uint8_t _pinD; static constexpr uint8_t acceleration = 1; static constexpr uint16_t speedFloor = 0xEF00; bool endlessMove = false; bool endlessDriection = true; bool halfCurrent = false; uint16_t _speed = speedFloor; uint16_t _targetSpeed = 220; uint8_t _stepInterval = 0; uint16_t _tickCounter = 0; int32_t _currentStep = 0; int32_t _targetStep = 0; void step(bool direction); void setOutputs(); void disableOutputs(); public: Stepper( volatile uint8_t * const port, const uint8_t pinA, const uint8_t pinB, const uint8_t pinC, const uint8_t pinD): _port(port), _pinA(pinA), _pinB(pinB), _pinC(pinC), _pinD(pinD){} void tick(); void moveTo(const int32_t step); void moveRelative(const int16_t dist); void setSpeed(const uint16_t speed); uint32_t isAt(); void setHalfCurrent(bool current); bool isStoped(); void setEndlesMove(bool endless, bool direction = true); void shutdown(); };