#ifndef SHOOT_HPP
#define SHOOT_HPP
#include "djiMotor.h"
#include "pid.h"
#include "GO_M8010_6_Driver.h"
#include "nuc.h"
#include "usart.h"
#include "filter.h"

// 定义状态枚举
typedef enum {
    SHOOT_IDLE,        // 空闲状态
    SHOOT_TOP,         // 顶部状态
    SHOOT_TENSION,     // 拉回到设定
    SHOOT_READY,      
    SHOOT_WAIT,
    SHOOT_FIRE,        // 发射状态
    SHOOT_RETURN,       // 自动返回状态
    //运射配合
    GO_TOP,
    BAKC,
    WAIT_CHANGE
} ShootState_t;

// // 定义状态枚举
// typedef enum {
//     BALL_IDLE,         // 空闲状态
//     BALL_FINISH,        // 完成状态
// //持球状态
//     BALL_TAKE,
//     BALL_LOSE

// } BallState_t;

typedef enum
{
    UP1=1,
    MIDDLE1,
    DOWN1,
    SHOOT,
    WAIT,
    TEST,
    VSION,
    PASS,
    OFFENSIVE,
    DEFENSE
    
}rc_mode;

// 光电传感器读取宏
#define IS_PHOTOELECTRIC_TRIGGERED() (HAL_GPIO_ReadPin(STOP_GPIO_Port, STOP_Pin) == GPIO_PIN_RESET)

class Shoot
{
public:
    Shoot();
    void rc_mode();
    void trigger_control(void);
    void distanceGet(const NUC_t &nuc);

    void shoot_control(void);
    void shoot_Current(void); 
    void RemoveError(void);
    void ball_receive(void);
   
    int GO_SendData(float pos,float limit);

    //go电机
     GO_MotorCmd_t go1;
     GO_MotorData_t *go1_data;//存放go电机数据
     float control_pos; //控制位置
    float fire_pos; //发射位置
     struct feedback
     {
         float fd_gopos;
         float fd_tpos;
     }feedback;
     
    
    //扳机
    float speed_trigger;
    int16_t result;
    float t_speedSet;
    float t_posSet;//扳机位置
    float fd_tpos; //扳机反馈位置
    motor_measure_t *trigger_Motor;

    //滤波器
    LowPassFilter2p_t distance_filter; // 用于滤波视觉距离
    LowPassFilter2p_t pass_filter;

    //==========================公共变量==========================
    int16_t rc_key; //遥控器按键
    int16_t mode_key;
    int16_t ready_key; 
    int16_t trigger_key;
    ShootState_t currentState; //状态机

    volatile uint32_t shoot_thread;//接收传回的线程通知
    fp32 distance;   //视觉距离
    fp32 pass_distance;   //视觉距离

private:
    //扳机2006
    static const float M2006_speed_PID[3];
    static const float M2006_angle_PID[3];

    //电机速度pid结构体
    pid_type_def speed_pid;
    //位置环pid
    pid_type_def angle_pid;

    bool is_hooked;// 标记钩子是否已经钩住拉簧
    
    float limit_speed;//go电机限速

    int shoot_wait;


};

#endif
