
/*
该文件cmd用于对各种命令的中转处理，以防止在remote遥控器任务中过于冗杂堆叠
*/

#ifndef __CMD_H
#define __CMD_H

#include "bsp/struct_typedef.h"
#include "device/device.h"

/* 遥控器类型 */
// 遥控器状态
typedef enum
{
    RC_DR16,
    RC_LD,
    RC_ET16s,
    Control_loss
} rc_type_t;

/* 拨杆位置 */
typedef enum
{
    CMD_SW_ERR = 0,
    CMD_SW_UP = 1,
    CMD_SW_MID = 3,
    CMD_SW_DOWN = 2,
} CMD_SwitchPos_t;
// 遥控器数据
typedef struct
{

    rc_type_t rc_type;

    struct
    {
        float ch_l_x; /* 遥控器左侧摇杆横轴值，上为正 */
        float ch_l_y; /* 遥控器左侧摇杆纵轴值，右为正 */
        float ch_r_x; /* 遥控器右侧摇杆横轴值，上为正 */
        float ch_r_y; /* 遥控器右侧摇杆纵轴值，右为正 */

        CMD_SwitchPos_t sw_r; /* 右侧拨杆位置 */
        CMD_SwitchPos_t sw_l; /* 左侧拨杆位置 */

    } __attribute__((packed)) DJ;

    struct
    {
        float ch_l_x; /* 遥控器左侧摇杆横轴值，上为正 */
        float ch_l_y; /* 遥控器左侧摇杆纵轴值，右为正 */
        float ch_r_x; /* 遥控器右侧摇杆横轴值，上为正 */
        float ch_r_y; /* 遥控器右侧摇杆纵轴值，右为正 */

        CMD_SwitchPos_t key_A;
        CMD_SwitchPos_t key_B;
        CMD_SwitchPos_t key_C;
        CMD_SwitchPos_t key_D;
        CMD_SwitchPos_t key_E;
        CMD_SwitchPos_t key_F;
        CMD_SwitchPos_t key_G;
        CMD_SwitchPos_t key_H;

        int16_t knob_left;  // 左旋钮
        int16_t knob_right; // 右旋钮
    } __attribute__((packed)) ET16s;

} __attribute__((packed)) CMD_RC_t;

/*底盘模式*/
typedef enum
{
    STOP, // 底盘平行
    RC,   // 遥控模式
    CHASSIS_MODE_BREAK, /* 刹车模式，电机闭环控制保持静止。用于机器人停止状态 */
     CHASSIS_MODE_RELAX, /* 放松模式，电机不输出。一般情况底盘初始化之后的模式 */
     CHASSIS_MODE_FOLLOW_GIMBAL, /* 通过闭环控制使车头方向跟随云台 */
     CHASSIS_MODE_ROTOR, /* 小陀螺模式，通过闭环控制使底盘不停旋转 */
    
     HUIHANG_BIANXING_DUOLUN, /*会航将军变形舵轮底盘*/
} Chassis_mode_t;

typedef struct
{
    int cmd_power_on_safe; // 上电安全标志

    Chassis_mode_t mode;

    // 遥控器输出值
    fp32 Vx;
    fp32 Vy;
    fp32 Vw;
    fp32 throttle;

    fp32 x_l;
    fp32 y_l;
} Chassis_CMD_t;

/* 云台模式 */
    typedef enum
    {
        GIMBAL_MODE_RELAX,    /* 放松模式，电机不输出。一般情况云台初始化之后的模式 */
        GIMBAL_MODE_ABSOLUTE, /* 绝对坐标系控制，控制在空间内的绝对姿态 */
        GIMBAL_MODE_RELATIVE, /* 相对坐标系控制，控制相对于底盘的姿态 */
    } Gimbal_Mode_t;
typedef struct {
  Gimbal_Mode_t mode;
  float delta_yaw_4310;
  float delta_pitch_4310;
  float delta_yaw_6020;
} Gimbal_CMD_t;

typedef enum {
    SHOOT_MODE_SAFE = 0,/* 安全模式 */
    SHOOT_MODE_SINGLE,  /* 单发模式 */
    SHOOT_MODE_BURST,   /* 多发模式 */
    SHOOT_MODE_CONTINUE,/* 连发模式 */
    SHOOT_MODE_NUM
}Shoot_Mode_t;

typedef struct {
  Shoot_Mode_t mode;/* 射击模式 */
  bool ready;       /* 准备射击 */
  bool firecmd;     /* 射击 */
}Shoot_CMD_t;

void CMD_Init(Chassis_CMD_t *cmd, Gimbal_CMD_t *g_cmd);
void CMD_ParseRc(Chassis_CMD_t *cmd, CMD_RC_t *rc, Gimbal_CMD_t *g_cmd);
static void CMD_remote(const CMD_RC_t *rc, Chassis_CMD_t *cmd, Gimbal_CMD_t *g_cmd);
int8_t CMD_CtrlSet(Chassis_CMD_t *cmd, const CMD_RC_t *rc, Gimbal_CMD_t *g_cmd,Shoot_CMD_t *s_cmd);
static void CMD_RcLostLogic(Chassis_CMD_t *cmd,Gimbal_CMD_t *g_cmd);

#endif