pimoroni-pico/drivers/servo/servo_state.cpp

134 wiersze
3.1 KiB
C++
Czysty Zwykły widok Historia

#include "servo_state.hpp"
namespace servo {
ServoState::ServoState() {
}
2022-02-17 22:38:59 +00:00
ServoState::ServoState(CalibrationType default_type)
: calib(default_type) {
}
ServoState::ServoState(const Calibration& calibration)
: calib(calibration) {
}
float ServoState::enable() {
2022-02-19 19:25:15 +00:00
// Has the servo not had a pulse value set before being enabled?
2022-02-17 22:38:59 +00:00
if(last_enabled_pulse < MIN_VALID_PULSE) {
2022-02-19 19:25:15 +00:00
// Set the servo to its mid point
return to_mid();
}
2022-02-19 19:25:15 +00:00
return _enable();
}
float ServoState::disable() {
enabled = false;
return 0.0f; // A zero pulse
}
2022-02-19 19:25:15 +00:00
float ServoState::_enable() {
enabled = true;
return last_enabled_pulse;
}
2022-02-17 22:38:59 +00:00
bool ServoState::is_enabled() const {
return enabled;
}
2022-02-17 22:38:59 +00:00
float ServoState::get_pulse() const {
return last_enabled_pulse;
}
float ServoState::set_pulse(float pulse) {
2022-02-17 22:38:59 +00:00
if(pulse >= MIN_VALID_PULSE) {
2022-02-19 19:25:15 +00:00
float value_out, pulse_out;
if(calib.pulse_to_value(pulse, value_out, pulse_out)) {
2022-02-19 19:25:15 +00:00
servo_value = value_out;
last_enabled_pulse = pulse_out;
return _enable();
}
}
2022-02-19 19:25:15 +00:00
return disable();
}
float ServoState::get_value() const {
return servo_value;
}
float ServoState::set_value(float value) {
float pulse_out, value_out;
if(calib.value_to_pulse(value, pulse_out, value_out)) {
last_enabled_pulse = pulse_out;
servo_value = value_out;
return _enable();
}
return disable();
}
2022-02-17 22:38:59 +00:00
float ServoState::get_min_value() const {
float value = 0.0f;
Calibration::Point *point = calib.first_point();
2022-02-17 22:38:59 +00:00
if(point != nullptr) {
value = point->value;
}
return value;
}
float ServoState::get_mid_value() const {
float value = 0.0f;
Calibration::Point *first = calib.first_point();
Calibration::Point *last = calib.last_point();
2022-02-17 22:38:59 +00:00
if((first != nullptr) && (last != nullptr)) {
value = (first->value + last->value) / 2.0f;
}
return value;
}
float ServoState::get_max_value() const {
float value = 0.0f;
Calibration::Point *point = calib.last_point();
2022-02-17 22:38:59 +00:00
if(point != nullptr) {
value = point->value;
}
return value;
}
float ServoState::to_min() {
2022-02-17 22:38:59 +00:00
return set_value(get_min_value());
}
float ServoState::to_mid() {
2022-02-17 22:38:59 +00:00
return set_value(get_mid_value());
}
float ServoState::to_max() {
2022-02-17 22:38:59 +00:00
return set_value(get_max_value());
}
float ServoState::to_percent(float in, float in_min, float in_max) {
2022-02-17 22:38:59 +00:00
float value = Calibration::map_float(in, in_min, in_max, get_min_value(), get_max_value());
return set_value(value);
}
float ServoState::to_percent(float in, float in_min, float in_max, float value_min, float value_max) {
2022-02-17 22:38:59 +00:00
float value = Calibration::map_float(in, in_min, in_max, value_min, value_max);
return set_value(value);
}
2022-02-17 22:38:59 +00:00
Calibration& ServoState::calibration() {
return calib;
}
2022-02-17 22:38:59 +00:00
const Calibration& ServoState::calibration() const {
return calib;
}
2022-02-19 01:07:19 +00:00
uint32_t ServoState::pulse_to_level(float pulse, uint32_t resolution, float freq) {
2022-02-17 22:38:59 +00:00
uint32_t level = 0;
if(pulse >= MIN_VALID_PULSE) {
2022-02-19 01:07:19 +00:00
level = (uint32_t)((pulse * (float)resolution * freq) / 1000000);
2022-02-17 22:38:59 +00:00
}
return level;
}
};