kopia lustrzana https://github.com/pimoroni/pimoroni-pico
133 wiersze
3.5 KiB
C++
133 wiersze
3.5 KiB
C++
#include "servo_state.hpp"
|
|
|
|
namespace servo {
|
|
ServoState::ServoState()
|
|
: servo_value(0.0f), last_enabled_pulse(0.0f), enabled(false) {
|
|
}
|
|
|
|
ServoState::ServoState(CalibrationType default_type)
|
|
: servo_value(0.0f), last_enabled_pulse(0.0f), enabled(false), calib(default_type) {
|
|
}
|
|
|
|
ServoState::ServoState(const Calibration& calibration)
|
|
: servo_value(0.0f), last_enabled_pulse(0.0f), enabled(false), calib(calibration) {
|
|
}
|
|
|
|
float ServoState::enable_with_return() {
|
|
// Has the servo not had a pulse value set before being enabled?
|
|
if(last_enabled_pulse < MIN_VALID_PULSE) {
|
|
// Set the servo to its middle
|
|
return to_mid_with_return();
|
|
}
|
|
return _enable_with_return();
|
|
}
|
|
|
|
float ServoState::disable_with_return() {
|
|
enabled = false;
|
|
return 0.0f; // A zero pulse
|
|
}
|
|
|
|
float ServoState::_enable_with_return() {
|
|
enabled = true;
|
|
return last_enabled_pulse;
|
|
}
|
|
|
|
bool ServoState::is_enabled() const {
|
|
return enabled;
|
|
}
|
|
|
|
float ServoState::get_pulse() const {
|
|
return last_enabled_pulse;
|
|
}
|
|
|
|
float ServoState::set_pulse_with_return(float pulse) {
|
|
if(pulse >= MIN_VALID_PULSE) {
|
|
float value_out, pulse_out;
|
|
if(calib.pulse_to_value(pulse, value_out, pulse_out)) {
|
|
servo_value = value_out;
|
|
last_enabled_pulse = pulse_out;
|
|
return _enable_with_return();
|
|
}
|
|
}
|
|
return disable_with_return();
|
|
}
|
|
|
|
float ServoState::get_value() const {
|
|
return servo_value;
|
|
}
|
|
|
|
float ServoState::set_value_with_return(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_with_return();
|
|
}
|
|
return disable_with_return();
|
|
}
|
|
|
|
float ServoState::get_min_value() const {
|
|
float value = 0.0f;
|
|
if(calib.size() > 0) {
|
|
value = calib.first().value;
|
|
}
|
|
return value;
|
|
}
|
|
|
|
float ServoState::get_mid_value() const {
|
|
float value = 0.0f;
|
|
if(calib.size() > 0) {
|
|
const Calibration::Pair &first = calib.first();
|
|
const Calibration::Pair &last = calib.last();
|
|
value = (first.value + last.value) / 2.0f;
|
|
}
|
|
return value;
|
|
}
|
|
|
|
float ServoState::get_max_value() const {
|
|
float value = 0.0f;
|
|
if(calib.size() > 0) {
|
|
value = calib.last().value;
|
|
}
|
|
return value;
|
|
}
|
|
|
|
float ServoState::to_min_with_return() {
|
|
return set_value_with_return(get_min_value());
|
|
}
|
|
|
|
float ServoState::to_mid_with_return() {
|
|
return set_value_with_return(get_mid_value());
|
|
}
|
|
|
|
float ServoState::to_max_with_return() {
|
|
return set_value_with_return(get_max_value());
|
|
}
|
|
|
|
float ServoState::to_percent_with_return(float in, float in_min, float in_max) {
|
|
float value = Calibration::map_float(in, in_min, in_max, get_min_value(), get_max_value());
|
|
return set_value_with_return(value);
|
|
}
|
|
|
|
float ServoState::to_percent_with_return(float in, float in_min, float in_max, float value_min, float value_max) {
|
|
float value = Calibration::map_float(in, in_min, in_max, value_min, value_max);
|
|
return set_value_with_return(value);
|
|
}
|
|
|
|
Calibration& ServoState::calibration() {
|
|
return calib;
|
|
}
|
|
|
|
const Calibration& ServoState::calibration() const {
|
|
return calib;
|
|
}
|
|
|
|
uint32_t ServoState::pulse_to_level(float pulse, uint32_t resolution, float freq) {
|
|
uint32_t level = 0;
|
|
if(pulse >= MIN_VALID_PULSE) {
|
|
level = (uint32_t)((pulse * (float)resolution * freq) / 1000000);
|
|
}
|
|
return level;
|
|
}
|
|
|
|
}; |