#ifndef _FOC_CMD_H__
#define _FOC_CMD_H__
#include "os/os_types.h"
#include "config.h"

typedef enum {
	Foc_Start_Motor = 32, //foc_start_stop_t, ready, unread, 014d01
	Foc_Cali_Hall_Phase, //calibrate hall phase, get the angle when motor running 0-360
	Foc_Cali_Hall_Offset,//calibrate hall offset from A phase 0x034d00
	Foc_Set_iDC_Limit,   //u32, set the limited current//mA
	Foc_Set_Speed_Limit,     //u32, set the limited speed//rpm
	Foc_Set_Speed_Target,    //u32, set the target speed, just for test
	Foc_Set_Cruise_Speed,    //u32, set the speed for curise riding
	Foc_Set_Cruise_Mode,
	Foc_Set_Phase_CurrLim,
	Foc_Set_Ctrl_Mode,
	Foc_Set_Gear_Limit,    //通过设置限速，限相电流，限母线电流上层可以实现任意挡位
	Foc_Set_Open_Dq_Vol,		//u32, u32, 114d000000000a000000, 114d0000000000000000
	Foc_Set_EPM_Mode,
	Foc_Start_EPM_Move,
	Foc_Conf_Pid,
	Foc_Start_DQ_Calibrate,
	Foc_Set_IS_Curr_Angle,  //设置DQ电流矢量和超前角
	Foc_Set_Plot_Type,
	Foc_Set_Throttle_throld,
	Foc_Set_eBrake_Throld,
	Foc_Lock_Motor,
	Foc_Auto_Hold,
	Foc_Set_Config,
	Foc_Get_Config,
	Foc_Get_Pid,
	Foc_Fan_Duty, //57
	Foc_Get_Gear_Limit,
	Foc_Set_Thro_Ration,
	Foc_Use_SensorLess_Angle,
	Foc_Force_Open_Run,
	Foc_Enc_Zero_Cali_Result,
	Foc_Set_Limiter_Config,
	Foc_Get_Limiter_Config,
	Foc_End_Write_TRQ_Table,
	Foc_SN_Write, //66
	Foc_SN_Read,
	Foc_Set_DQ_Current, //0x44
	Foc_Set_Gear_Mode,//0-3, eco, normal, sport, turbo
	Foc_Set_Adrc_Params,
	Foc_Get_Adrc_Params,
	Foc_Hall_Phase_Cali_Result = 160,
	Foc_Hall_Offset_Cali_Result,
	Foc_Report_Speed,
	Foc_Report_Vbus_Current, 	//u32
	Foc_Report_Phase_Current, 	//s32,s32,s32
	Foc_Report_Dq_Current, 		//s32,s32
	Foc_Report_Vbus_Vol,		//u32
	Foc_Report_Phase_Vol,		//u32,u32,u32
	Foc_Report_Dq_Vol,			//u32, u32
	Foc_Report_Power,
	Foc_Report_Pid,
	Foc_Report_Status,
	Foc_Report_MTPA_DQ_Angle,
	Foc_Report_Plot,
	Foc_Report_Temp,
	Foc_Cmd_Max = 0xDF
}foc_cmd_t;
#define CMD_2_CAN_KEY(cmd) ((u16)(((u16)cmd) | (CAN_MY_ADDRESS<<8)))
typedef enum {
	Foc_Start = 1,
	Foc_Stop,
}FSwith_t;;

typedef struct {
	foc_cmd_t cmd;
	u16       ext_key;
	u8        can_src;
	u8        len;
	void      *data;
}foc_cmd_body_t;

#pragma  pack (push,1)
typedef struct {
	u8 start_stop; //1: start, 2: stop
}foc_start_cmd_t;


typedef struct {
	u32 vq_mvol; //mV
}hall_phase_cali_cmd_t;

typedef struct {
	u32 vq_mvol;  //mV
	u32 step_inc; //degree
	u32 step_time;//second
}hall_offset_cali_cmd_t;

typedef struct {
	float kp;
	float ki;
	float kd;
}pid_conf_t;

#pragma pack(pop)

void foc_command_init(void);
bool foc_send_command(foc_cmd_body_t *command);

#endif /*_FOC_CMD_H__ */

