#ifndef RC_PWM_CONTROL_H
#define RC_PWM_CONTROL_H

#include "driver/ledc.h"
#include "esp_err.h"
#include <stdbool.h>
#include <stdint.h>

/* RC 车统一 PWM 引脚定义（6 路均为 50Hz） */
#define RC_PWM_PIN_DRV1_A        10  /* 驱动芯片1 */
#define RC_PWM_PIN_DRV1_B        21  /* 驱动芯片1 */
#define RC_PWM_PIN_DRV2_A        11  /* 驱动芯片2 */
#define RC_PWM_PIN_DRV2_B        12  /* 驱动芯片2 */
#define RC_PWM_PIN_AUX_15        15  /* 舵机/电调（Kconfig 选择） */
#define RC_PWM_PIN_AUX_16        16  /* 舵机/电调（Kconfig 选择） */

#define RC_PWM_LEDC_TIMER        LEDC_TIMER_0
#define RC_PWM_LEDC_MODE         LEDC_LOW_SPEED_MODE
#define RC_PWM_DUTY_RES          LEDC_TIMER_13_BIT
#define RC_PWM_FREQ_HZ           50

/* 50Hz + 13bit 下的典型占空比（20ms 周期） */
#define RC_PWM_DUTY_500US        205U   /* 舵机 0 度 */
#define RC_PWM_DUTY_1500US       614U   /* 舵机 90 度 / ESC 中位 */
#define RC_PWM_DUTY_2500US       1024U  /* 舵机 180 度 */

#define RC_ESC_DUTY_MIN          410U   /* 1000us */
#define RC_ESC_DUTY_MID          RC_PWM_DUTY_1500US
#define RC_ESC_DUTY_MAX          819U   /* 2000us */

typedef enum {
    RC_AUX_ROLE_SERVO = 0,
    RC_AUX_ROLE_ESC = 1,
} rc_aux_role_t;

/**
 * @brief 初始化全部 6 路 PWM 输出
 *
 * IO15/16 初始值根据 Kconfig 选择：
 * - 舵机：90 度（1500us）
 * - 电调：1500us 中位
 */
esp_err_t rc_pwm_control_init(void);

/**
 * @brief 根据 device_id 选择设备控制策略
 */
void rc_pwm_control_set_drive_from_device_id(const char *device_id);

void rc_vehicle_stop(void);
void rc_vehicle_shot(int pin, int val);
void rc_vehicle_control(int mode, int val);

/**
 * @brief 设置驱动芯片控制引脚百分比（支持 10/21/11/12）
 */
void rc_pwm_set_drive_percent(int gpio, uint32_t duty_percent);

/**
 * @brief 停止驱动芯片相关输出（10/21/11/12）
 */
void rc_pwm_stop_all_drive_outputs(void);

/**
 * @brief 将指定 AUX 引脚按舵机角度输出（仅当该引脚被配置为 SERVO）
 */
void rc_pwm_set_aux_servo_angle_deg(int gpio, uint32_t angle);

/**
 * @brief 将指定 AUX 引脚按电调油门百分比输出（仅当该引脚被配置为 ESC）
 */
void rc_pwm_set_aux_esc_percent(int gpio, uint32_t percent);

/**
 * @brief 双电调同步输出（会对配置为 ESC 的 AUX 引脚生效）
 */
void rc_pwm_set_dual_esc_percent(uint32_t percent);

/**
 * @brief 给“默认转向舵机”输出角度（优先 IO15，其次 IO16）
 */
void rc_pwm_set_steering_angle_deg(uint32_t angle);

/* ======================== PID 接口 ======================== */

typedef enum {
    RC_PID_ACT_ESC_AUX_BOTH = 0,  /* 对 IO15/16 中被配置为 ESC 的引脚生效 */
    RC_PID_ACT_DRV1_A,            /* IO10 */
    RC_PID_ACT_DRV1_B,            /* IO21 */
    RC_PID_ACT_DRV2_A,            /* IO11 */
    RC_PID_ACT_DRV2_B,            /* IO12 */
    RC_PID_ACT_STEERING_SERVO,    /* 默认舵机（IO15 优先） */
} rc_pid_actuator_t;

typedef enum {
    RC_PID_CH_0 = 0,
    RC_PID_CH_1,
    RC_PID_CH_2,
    RC_PID_CH_3,
    RC_PID_CH_MAX
} rc_pid_channel_t;

typedef struct {
    float kp;
    float ki;
    float kd;
    float out_min;
    float out_max;
    float i_min;
    float i_max;
    rc_pid_actuator_t actuator;
    bool enabled;
} rc_pid_config_t;

esp_err_t rc_pid_config(rc_pid_channel_t ch, const rc_pid_config_t *cfg);
void rc_pid_reset(rc_pid_channel_t ch);
void rc_pid_enable(rc_pid_channel_t ch, bool enabled);
float rc_pid_step(rc_pid_channel_t ch,
                  float target,
                  float feedback,
                  float dt_s,
                  bool apply_output);

#endif
