2022-02-16 22:06:07 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "pico/stdlib.h"
|
|
|
|
|
|
|
|
namespace servo {
|
|
|
|
|
2022-02-17 22:38:59 +00:00
|
|
|
enum CalibrationType {
|
2022-02-16 22:06:07 +00:00
|
|
|
ANGULAR = 0,
|
|
|
|
LINEAR,
|
2022-03-21 23:51:15 +00:00
|
|
|
CONTINUOUS
|
2022-02-16 22:06:07 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class Calibration {
|
|
|
|
//--------------------------------------------------
|
|
|
|
// Constants
|
|
|
|
//--------------------------------------------------
|
|
|
|
public:
|
|
|
|
static constexpr float DEFAULT_MIN_PULSE = 500.0f; // in microseconds
|
|
|
|
static constexpr float DEFAULT_MID_PULSE = 1500.0f; // in microseconds
|
|
|
|
static constexpr float DEFAULT_MAX_PULSE = 2500.0f; // in microseconds
|
2022-02-19 19:25:15 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
static constexpr float LOWER_HARD_LIMIT = 400.0f; // The minimum microsecond pulse to send
|
|
|
|
static constexpr float UPPER_HARD_LIMIT = 2600.0f; // The maximum microsecond pulse to send
|
2022-02-16 22:06:07 +00:00
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------
|
|
|
|
// Substructures
|
|
|
|
//--------------------------------------------------
|
|
|
|
public:
|
2022-02-17 22:38:59 +00:00
|
|
|
struct Point {
|
2022-02-16 22:06:07 +00:00
|
|
|
//--------------------------------------------------
|
|
|
|
// Constructors/Destructor
|
|
|
|
//--------------------------------------------------
|
2022-02-17 22:38:59 +00:00
|
|
|
Point();
|
2022-03-08 14:26:57 +00:00
|
|
|
Point(float pulse, float value);
|
2022-02-16 22:06:07 +00:00
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------
|
|
|
|
// Variables
|
|
|
|
//--------------------------------------------------
|
|
|
|
float pulse;
|
|
|
|
float value;
|
|
|
|
};
|
|
|
|
|
2022-02-17 22:38:59 +00:00
|
|
|
|
2022-02-16 22:06:07 +00:00
|
|
|
//--------------------------------------------------
|
|
|
|
// Constructors/Destructor
|
|
|
|
//--------------------------------------------------
|
2022-02-17 22:38:59 +00:00
|
|
|
public:
|
2022-02-16 22:06:07 +00:00
|
|
|
Calibration();
|
2022-02-17 22:38:59 +00:00
|
|
|
Calibration(CalibrationType default_type);
|
2022-03-08 16:54:20 +00:00
|
|
|
Calibration(const Calibration &other);
|
2022-02-16 22:06:07 +00:00
|
|
|
virtual ~Calibration();
|
|
|
|
|
|
|
|
|
2022-03-08 16:54:20 +00:00
|
|
|
//--------------------------------------------------
|
|
|
|
// Operators
|
|
|
|
//--------------------------------------------------
|
|
|
|
public:
|
|
|
|
Calibration& operator=(const Calibration &other);
|
2022-03-21 23:51:15 +00:00
|
|
|
Point& operator[](uint8_t index) const;
|
2022-03-08 16:54:20 +00:00
|
|
|
|
|
|
|
|
2022-02-16 22:06:07 +00:00
|
|
|
//--------------------------------------------------
|
|
|
|
// Methods
|
|
|
|
//--------------------------------------------------
|
|
|
|
public:
|
2022-03-21 23:51:15 +00:00
|
|
|
void apply_blank(uint size);
|
|
|
|
void apply_two_point(float min_pulse, float max_pulse, float min_value, float max_value);
|
|
|
|
void apply_three_point(float min_pulse, float mid_pulse, float max_pulse, float min_value, float mid_value, float max_value);
|
|
|
|
void apply_uniform(uint size, float min_pulse, float max_pulse, float min_value, float max_value);
|
|
|
|
void apply_default(CalibrationType default_type);
|
2022-02-16 22:06:07 +00:00
|
|
|
|
2022-02-17 22:38:59 +00:00
|
|
|
uint size() const;
|
|
|
|
Point* point_at(uint8_t index) const; // Ensure the points are assigned in ascending value order
|
|
|
|
Point* first_point() const;
|
|
|
|
Point* last_point() const;
|
2022-02-16 22:06:07 +00:00
|
|
|
|
2022-03-08 14:26:57 +00:00
|
|
|
bool has_lower_limit() const;
|
|
|
|
bool has_upper_limit() const;
|
2022-02-16 22:06:07 +00:00
|
|
|
void limit_to_calibration(bool lower, bool upper);
|
|
|
|
|
2022-02-19 19:25:15 +00:00
|
|
|
bool value_to_pulse(float value, float &pulse_out, float &value_out) const;
|
2022-02-19 20:13:18 +00:00
|
|
|
bool pulse_to_value(float pulse, float &value_out, float &pulse_out) const;
|
2022-02-17 22:38:59 +00:00
|
|
|
|
|
|
|
static float map_float(float in, float in_min, float in_max, float out_min, float out_max);
|
|
|
|
|
2022-02-16 22:06:07 +00:00
|
|
|
|
|
|
|
//--------------------------------------------------
|
|
|
|
// Variables
|
|
|
|
//--------------------------------------------------
|
2022-03-08 14:26:57 +00:00
|
|
|
private:
|
2022-02-17 22:38:59 +00:00
|
|
|
Point* calibration;
|
|
|
|
uint calibration_size;
|
2022-02-16 22:06:07 +00:00
|
|
|
bool limit_lower;
|
|
|
|
bool limit_upper;
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|