/* * EncoderQuadratureCounter.h * * Created on: 22 янв. 2020 г. * Author: user */ #ifndef UMLIBRARY_DRIVER_ENCODERQUADRATURECOUNTER_HH_ #define UMLIBRARY_DRIVER_ENCODERQUADRATURECOUNTER_HH_ #include "IEncoder.hh" #include "../math/math_inc.hh" #include "../common/DoubleBuffer.hpp" #include "../peripheral/ICounter.hh" namespace driver { namespace derail { class EncoderQuadratureCounter: public IEncoder { public: //!Описание настроек драйвера счетчика квадратурного энкодера. struct Setting { unsigned long max_turn_value; //!<Максимальное значение счетчиков оборотов. unsigned long line_in_turn; //!<Количество штрихов диска энкодера на оборот. }; virtual float getAngle() const override; virtual float getTurn() const override; virtual std::pair getPosition() const override; bool configure( Setting & set ); bool isFailure() const; void resetFailure(); void process(); void setAbsolurePosition( float angle, unsigned long turn ); EncoderQuadratureCounter( peripheral::ICounter & counter ); private: peripheral::ICounter & counter; unsigned long max_turn_value; //!<Максимальное значение счетчиков оборотов из настроек. unsigned long line_in_turn; //!<Количество штрихов диска энкодера на оборот из настроек. bool failure = false; long angle_position = 0; //!<Угловое положение в отсчетах энкодера. unsigned long turn_counter = 0; //!<Счетчик оборотов. Изменяется от 0 до max_turn_value-1. float _1_line_to_rad = NAN; float angle = NAN; //!Угол внутри оборота [0..2pi). DoubleBuffer< std::pair > data; }; } /* namespace derail */ } /* namespace driver */ #endif /* UMLIBRARY_DRIVER_ENCODERQUADRATURECOUNTER_HH_ */