File syn_servo.h¶
File List > motor > syn_servo.h
Go to the documentation of this file
#ifndef SYN_SERVO_H
#define SYN_SERVO_H
#include "../port/syn_port_system.h"
#include <stdbool.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/* ── Servo descriptor ───────────────────────────────────────────────────── */
typedef struct {
/* Configuration */
uint16_t pulse_min;
uint16_t pulse_max;
uint16_t angle_range;
/* State */
uint16_t current_us;
uint16_t target_us;
int32_t rate;
uint32_t last_tick;
} SYN_Servo;
/* ── API ────────────────────────────────────────────────────────────────── */
void syn_servo_init(SYN_Servo *servo, uint16_t pulse_min, uint16_t pulse_max, uint16_t angle_range);
void syn_servo_set_angle(SYN_Servo *servo, uint16_t angle);
void syn_servo_set_pulse(SYN_Servo *servo, uint16_t us);
void syn_servo_move_to(SYN_Servo *servo, uint16_t angle, uint16_t duration);
void syn_servo_update(SYN_Servo *servo);
static inline uint16_t syn_servo_get_pulse_us(const SYN_Servo *servo)
{
if (servo == NULL)
return 0;
return servo->current_us;
}
static inline uint16_t syn_servo_get_angle(const SYN_Servo *servo)
{
if (servo == NULL)
return 0;
uint32_t range_us = (uint32_t)(servo->pulse_max - servo->pulse_min);
if (range_us == 0)
return 0;
return (uint16_t)(((uint32_t)(servo->current_us - servo->pulse_min) * servo->angle_range) /
range_us);
}
static inline bool syn_servo_at_target(const SYN_Servo *servo)
{
if (servo == NULL)
return true;
return servo->current_us == servo->target_us;
}
#ifdef __cplusplus
}
#endif
#endif /* SYN_SERVO_H */