#pragma once extern "C" { #include "esp_log.h" #include "hal/gpio_types.h" #include "driver/gpio.h" #include "esp_timer.h" } //Encoder disk requirements: //encoder disk has to have gaps in 3 differnt intervals (short, medium, long) //that pattern can be repeated multiple times, see config option typedef struct { gpio_num_t gpioPin; float degreePerGroup; //360 / [count of short,medium,long groups on encoder disk] float tireCircumferenceMeter; //positive direction is pulse order "short, medium, long" bool directionInverted; char* logName; } speedSensor_config_t; class speedSensor { //TODO add count of revolutions/pulses if needed? (get(), reset() etc) public: //constructor speedSensor(speedSensor_config_t config); //initializes gpio pin and configures interrupt void init(); //negative values = reverse direction //positive values = forward direction float getKmph(); //kilometers per hour float getMps(); //meters per second float getRpm(); //rotations per minute //1=forward, -1=reverse int direction; //variables for handling the encoder speedSensor_config_t config; int prevState = 0; uint64_t pulseDurations[3] = {}; uint64_t lastEdgeTime = 0; uint8_t pulseCounter = 0; int debugCount = 0; double currentRpm = 0; bool isInitialized = false; private: };