pimoroni-pico/drivers/servo/servo_cluster.hpp

72 lines
2.5 KiB
C++

#pragma once
#include "pico/stdlib.h"
#include "pwm_cluster.hpp"
#include "servo_state.hpp"
namespace servo {
class ServoCluster {
//--------------------------------------------------
// Variables
//--------------------------------------------------
private:
pimoroni::PWMCluster pwms;
uint32_t pwm_period;
float pwm_frequency;
ServoState* servos[NUM_BANK0_GPIOS];
//--------------------------------------------------
// Constructors/Destructor
//--------------------------------------------------
public:
ServoCluster(PIO pio, uint sm, uint pin_mask, CalibrationType default_type = ANGULAR, float freq = ServoState::DEFAULT_FREQUENCY);
ServoCluster(PIO pio, uint sm, uint pin_base, uint pin_count, CalibrationType default_type = ANGULAR, float freq = ServoState::DEFAULT_FREQUENCY);
ServoCluster(PIO pio, uint sm, std::initializer_list<uint8_t> pins, CalibrationType default_type = ANGULAR, float freq = ServoState::DEFAULT_FREQUENCY);
~ServoCluster();
//--------------------------------------------------
// Methods
//--------------------------------------------------
public:
bool init();
// For print access in micropython
uint get_pin_mask() const;
bool is_assigned(uint servo) const;
void enable(uint servo, bool load = true);
void disable(uint servo, bool load = true);
bool is_enabled(uint servo) const;
float get_value(uint servo) const;
void set_value(uint servo, float value, bool load = true);
float get_pulse(uint servo) const;
void set_pulse(uint servo, float pulse, bool load = true);
float get_frequency() const;
bool set_frequency(float freq);
//--------------------------------------------------
float get_min_value(uint servo) const;
float get_mid_value(uint servo) const;
float get_max_value(uint servo) const;
void to_min(uint servo, bool load = true);
void to_mid(uint servo, bool load = true);
void to_max(uint servo, bool load = true);
void to_percent(uint servo, float in, float in_min = ServoState::ZERO_PERCENT, float in_max = ServoState::ONEHUNDRED_PERCENT, bool load = true);
void to_percent(uint servo, float in, float in_min, float in_max, float value_min, float value_max, bool load = true);
Calibration* calibration(uint servo);
const Calibration* calibration(uint servo) const;
//--------------------------------------------------
private:
void apply_pulse(uint servo, float pulse, bool load);
};
}