84 lines
1.9 KiB
C++
84 lines
1.9 KiB
C++
//
|
||
// Created by Administrator on 2026/1/7.
|
||
//
|
||
|
||
#ifndef SERVO_MANAGER_H
|
||
#define SERVO_MANAGER_H
|
||
|
||
extern "C" {
|
||
#include <rtthread.h>
|
||
#include <rtdevice.h>
|
||
}
|
||
|
||
#include <stdint.h>
|
||
#include <stddef.h>
|
||
#include <vector>
|
||
|
||
class ServoManager
|
||
{
|
||
public:
|
||
struct ServoConfig
|
||
{
|
||
const char* servo_id; // 唯一ID
|
||
const char* pwm_dev_name;
|
||
int pwm_channel;
|
||
|
||
// ns
|
||
rt_uint32_t period_ns;
|
||
rt_uint32_t min_pulse_ns;
|
||
rt_uint32_t max_pulse_ns;
|
||
|
||
float min_angle_deg;
|
||
float max_angle_deg;
|
||
float home_angle_deg;
|
||
};
|
||
|
||
struct ServoCmd
|
||
{
|
||
const char* id;
|
||
float angle_deg;
|
||
};
|
||
|
||
public:
|
||
|
||
explicit ServoManager(const std::vector<ServoConfig> &cfg);
|
||
~ServoManager();
|
||
|
||
size_t count() const { return _cfg.size(); }
|
||
|
||
rt_err_t init(bool enable_after_init = true, bool go_home = true);
|
||
|
||
rt_err_t enable(const char* servo_id, bool on);
|
||
rt_err_t setAngle(const char* servo_id, float angle_deg);
|
||
|
||
// 全部设置:两种形态(vector / 指针)
|
||
rt_err_t setAllAngles(const std::vector<float>& angles_deg);
|
||
rt_err_t setAllAngles(const float* angles_deg, size_t n);
|
||
|
||
// 批量设置:两种形态(vector / 指针)
|
||
rt_err_t setAngles(const std::vector<ServoCmd>& cmds);
|
||
rt_err_t setAngles(const ServoCmd* cmds, size_t n);
|
||
|
||
const char* idAt(size_t order) const;
|
||
int orderOf(const char* servo_id) const;
|
||
|
||
private:
|
||
rt_err_t enableNoLock(size_t order, bool on);
|
||
rt_err_t setAngleNoLock(size_t order, float angle_deg);
|
||
|
||
int findOrderByIdNoLock(const char* servo_id) const;
|
||
|
||
static float clampf(float v, float lo, float hi);
|
||
static rt_uint32_t angleToPulseNs(const ServoConfig& c, float angle_deg);
|
||
|
||
private:
|
||
std::vector<ServoConfig> _cfg;
|
||
std::vector<rt_device_pwm*> _pwm_dev;
|
||
std::vector<rt_uint32_t> _last_pulse;
|
||
|
||
rt_mutex_t _mutex;
|
||
};
|
||
|
||
#endif // SERVO_MANAGER_H
|
||
|