pimoroni-pico/drivers/servo/servo_state.hpp

77 lines
2.4 KiB
C++
Raw Normal View History

#pragma once
#include "pico/stdlib.h"
#include "calibration.hpp"
namespace servo {
class ServoState {
2022-02-17 22:38:59 +00:00
//--------------------------------------------------
// Constants
//--------------------------------------------------
public:
static constexpr float DEFAULT_FREQUENCY = 50.0f; // The standard servo update rate
static constexpr float MIN_FREQUENCY = 10.0f; // Lowest achievable with hardware PWM with good resolution
static constexpr float MAX_FREQUENCY = 350.0f; // Highest nice value that still allows the full uS pulse range
// Some servos are rated for 333Hz for instance
2022-02-17 22:38:59 +00:00
static constexpr float ZERO_PERCENT = 0.0f;
static constexpr float ONEHUNDRED_PERCENT = 1.0f;
private:
static constexpr float MIN_VALID_PULSE = 1.0f;
//--------------------------------------------------
// Variables
//--------------------------------------------------
private:
float servo_value = 0.0f;
float last_enabled_pulse = 0.0f;
bool enabled = false;
Calibration calib;
//--------------------------------------------------
// Constructors/Destructor
//--------------------------------------------------
public:
ServoState();
ServoState(CalibrationType default_type);
ServoState(const Calibration& calibration);
2022-02-17 22:38:59 +00:00
//--------------------------------------------------
// Methods
//--------------------------------------------------
public:
float enable();
float disable();
2022-02-17 22:38:59 +00:00
bool is_enabled() const;
2022-02-19 19:25:15 +00:00
private:
2022-03-22 14:21:10 +00:00
float _enable(); // Internal version of enable without convenient initialisation to the middle
2022-02-19 19:25:15 +00:00
public:
2022-02-17 22:38:59 +00:00
float get_pulse() const;
float set_pulse(float pulse);
float get_value() const;
float set_value(float value);
2022-02-19 19:25:15 +00:00
public:
2022-02-17 22:38:59 +00:00
float get_min_value() const;
float get_mid_value() const;
float get_max_value() const;
float to_min();
float to_mid();
float to_max();
2022-02-17 22:38:59 +00:00
float to_percent(float in, float in_min = ZERO_PERCENT, float in_max = ONEHUNDRED_PERCENT);
float to_percent(float in, float in_min, float in_max, float value_min, float value_max);
Calibration& calibration();
2022-02-17 22:38:59 +00:00
const Calibration& calibration() const;
//--------------------------------------------------
2022-02-19 01:07:19 +00:00
static uint32_t pulse_to_level(float pulse, uint32_t resolution, float freq);
};
}