#ifndef UP_H
#define UP_H


#include "struct_typedef.h"
#include "pid.h"
#include "bmi088.h"
#include "map.h"
#include "user_math.h"
#include "ahrs.h"
#include "can_use.h"
#include "cmd.h"
#include "filter.h"
#include "Action.h"
#include "chassis.h" 
#include "vofa.h"	
#include "GO_M8010_6_Driver.h"
	
typedef enum {
    STATE_IDLE,          // 空闲状态
    STATE_PRE_DRIBBLE,   // 运球前
    STATE_POST_DRIBBLE,  // 运球后
    STATE_PRE_LAUNCH,    // 发射前
    STATE_POST_LAUNCH    // 发射后
} OperationState;
	


typedef struct {

 BMI088_t bmi088;

 AHRS_Eulr_t imu_eulr;//解算后存放欧拉角（弧度制）
	
}UP_Imu_t;
	
	
typedef struct
{	
	/*该部分决定PID的参数整定在config中修改*/
	pid_param_t VESC_5065_M1_param;
	pid_param_t VESC_5065_M2_param;
	
	pid_param_t UP_GM6020_speed_param;
	pid_param_t UP_GM6020_angle_param;
	
	pid_param_t M2006_speed_param;	
	pid_param_t M2006_angle_param;	
	
	pid_param_t M3508_speed_param;
}UP_Param_t;

typedef struct
{		
	float orig_angle;
  int8_t offset_flag;
	float angle;
	float last_angle;
	float total_angle;
	
}M2006_data;


typedef struct{
	
   uint8_t up_task_run; 
   const	UP_Param_t *param;  
	 UP_Imu_t pos088; 
	
	OperationState ctrl;
      struct {
        float orig_angle;     // 初始偏移量
        float last_angle;     // 上一次编码器值
        int32_t round_cnt;    // 圈数计数器
        uint16_t init_cnt;    // 初始化计数器（前50次记录初始值）
				float total_angle;
    } M2006;
	 struct{
					
	  fp32 rotor_pit6020ecd;
	  fp32 rotor_pit6020rpm;

	  fp32 VESC_5065_M1_rpm;
	  fp32 VESC_5065_M2_rpm;

	  fp32 M2006_rpm;
	  fp32 M2006_angle;
		 
		fp32 M3508_speed[3];

	}motorfeedback;
 

	
	 struct{
					
	  fp32 rotor_pit6020angle;

	  fp32 VESC_5065_M1_rpm;
	  fp32 VESC_5065_M2_rpm;

	  fp32 M2006_angle;
		fp32 M3508_speed;

	}motor_target;
  
	 struct{
		 
		 pid_type_def GM6020_speed;
		 pid_type_def GM6020_angle;
		 pid_type_def VESC_5065_M1;
		 pid_type_def VESC_5065_M2;
		 pid_type_def M2006_angle;
		 pid_type_def M2006_speed;
		 pid_type_def M3508_speed[3];
				
	}pid;
 
	
	
	
	
	
		/*经PID计算后的实际发送给电机的实时输出值*/
    struct 
	{
		fp32 final_2006out;
		fp32 final_3508out[3];
		fp32 final_pitchout;
		fp32 final_VESC_5065_M1out;
		fp32 final_VESC_5065_M2out;

	}final_out;
	
	 LowPassFilter2p_t filled[6]; /* 输出滤波器滤波器数组 */
	
	   fp32 vofa_send[8];

	
}	UP_t;


int8_t up_init(UP_t *u,const UP_Param_t *param,float target_freq);

int8_t UP_UpdateFeedback(UP_t *u, const CAN_t *can) ;
int8_t GM6020_control(UP_t *u,fp32 angle);
int8_t VESC_M5065_Control(UP_t *u,fp32 speed);

int8_t UP_M2006_angle(UP_t *u,fp32 target_angle);
int8_t UP_control(UP_t *u,CAN_Output_t *out);
int8_t ALL_Motor_Control(UP_t *u,CAN_Output_t *out);
int8_t UP_M2006_angle(UP_t *u,fp32 target_angle);
int8_t UP_M3508_speed(UP_t *u,fp32 speed);



#endif
