#pragma once #include "writepin.h" #include #include #include class Train { public: static constexpr uint8_t HIGH = 2; static constexpr uint8_t LOW = 1; static constexpr uint8_t OFF = 0; private: static constexpr unsigned char _pinHighA = PD5; static constexpr unsigned char _pinLowA = PD4; static constexpr unsigned char _pinHighB = PD2; static constexpr unsigned char _pinLowB = PD3; uint8_t _address; uint8_t _function = 0; uint8_t _functionmask; uint8_t _speed = 0; bool _direction = false; static const uint8_t SEND_COUNT = 2; inline static void off(); static void sendBit(const bool bit); static void sendAddress(uint8_t address); uint16_t packetAddSpeed(); uint16_t packetAddDirection(); uint16_t packetAddFunction(const uint8_t function); uint16_t assemblePacket(); public: static void setOutput(const uint8_t state); Train(const uint8_t address, uint8_t functionmask = 0b1111); Train(); void resendData(); void reverse(); void stop(); bool isActive() {return _speed || _function;} uint8_t getAddress(); uint16_t getLastPacket(); void setSpeed(uint8_t speed); uint8_t getSpeed(); void setFunctionMask(uint8_t functionmask) {_functionmask = functionmask;} uint8_t getFunctions(); uint8_t getFunctionMask(); void setAddress(const uint8_t address); void sendFunction(const uint8_t function, bool enable = true); void sendRaw(const uint16_t data); static void sendRawAddr(const uint16_t address, const uint16_t data); };