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

#ifndef __CMD_H
#define __CMD_H

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

/* 遥控器类型 */
// 遥控器状态
typedef enum
{
    RC_DR16,
    RC_AT9S,
    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;

        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)) LD;

} __attribute__((packed)) CMD_RC_t;


/*底盘模式*/
typedef enum
{
    STOP, // 底盘平行
    RC,   // 遥控模式
    // CHASSIS_MODE_BREAK, /* 刹车模式，电机闭环控制保持静止。用于机器人停止状态 */
    //  CHASSIS_MODE_RELAX, /* 放松模式，电机不输出。一般情况底盘初始化之后的模式 */
    //  CHASSIS_MODE_FOLLOW_GIMBAL, /* 通过闭环控制使车头方向跟随云台 */
    //  CHASSIS_MODE_ROTOR, /* 小陀螺模式，通过闭环控制使底盘不停旋转 */
    
} 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
    {
        Assemble_MODE_RELAX,    /* 放松模式，电机不输出。一般情况云台初始化之后的模式 */
        Assemble_MODE_CONTRAL, /* 绝对坐标系控制，控制在空间内的绝对姿态 */
         /* 相对坐标系控制，控制相对于底盘的姿态 */
    } Assemble_Mode_t;


typedef struct {
  Assemble_Mode_t mode;
    float delta_4310_1;
    float delta_4310_2;
    float delta_4310_3;

    struct{
    fp32 motor_4310_setpoint[3];
    }setpoint;
} Assemble_CMD_t;



static void CMD_RcLostLogic(Chassis_CMD_t *cmd,Assemble_CMD_t *g_cmd);
static void CMD_remote(const CMD_RC_t *rc, Chassis_CMD_t *cmd, Assemble_CMD_t *g_cmd);
void CMD_Init(Chassis_CMD_t *cmd, Assemble_CMD_t *g_cmd);
void CMD_ParseRc( CMD_RC_t *rc,Chassis_CMD_t *c_cmd, Assemble_CMD_t *a_cmd);
int8_t CMD_CtrlSet(Chassis_CMD_t *c_cmd, const CMD_RC_t *rc, Assemble_CMD_t *g_cmd);


#endif