#ifndef ROTARY_ENCODER_DRIVER_H #define ROTARY_ENCODER_DRIVER_H #include #include #include #include "digital_in.h" #include "timer_usec.h" class RotaryEncoderDriver { public: static constexpr uint16_t SAMPLE_PERIOD_US = 4000; // Ts = 4 ms static constexpr float COUNTS_PER_REV = 1050.0f; RotaryEncoderDriver(); // Returns 0 on success, or a negative Zephyr error code. int begin(); void update(); int32_t position(); void update_delta(); float count_per_sec(); float rpm(); bool new_speed_available(); void reset_speed_measurement(); // Blocks until the next speed sample, or until the timeout expires. // Lets the main loop run in step with the 4 ms sampling. void wait_for_sample(k_timeout_t timeout); private: static const uint8_t HIST_LEN = 4; // 4 x Ts = 16 ms gluggi fyrir rpm-utreikning volatile int32_t count; volatile int16_t delta; volatile bool speed_ready; volatile int32_t history[HIST_LEN]; volatile uint8_t hist_idx; Digital_in eA; Digital_in eB; struct gpio_callback encoder_c1_callback; struct k_sem sample_sem; Timer_usec timer; static void gpio_edge_handler( const struct device *dev, struct gpio_callback *callback, uint32_t pins); static void timer_expired(void *context); }; #endif