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;
 | 
						|
  }
 | 
						|
 | 
						|
}; |