#ifndef __HAL_SER_IMU_H__
#define __HAL_SER_IMU_H__

#ifdef __cplusplus
extern "C" {
#endif

/*Includes ------------------------------------------------------*/
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include "sdk_common.h"
#include "SEGGER_RTT.h"
#include "usr_config.h"
#include "drv_qmc6310_v2.h"
#include "drv_lsm6ds3tr_c.h"

/*STRUCTION ----------------------------------------------------*/
typedef enum{
	SER_IMU_ACC_ODR_OFF   										= 0,																						//关闭加速度									优先级 - 0				优先级越大，级别越高
	
	SER_IMU_ACC_ODR_12HZ5 										= 1,																						//采样频率 - 12.5赫兹					优先级 - 1
	
	SER_IMU_ACC_ODR_104HZ 										= 2,																						//采样频率 - 104赫兹					优先级 - 2

} SER_IMU_ACC_ODR_e;

typedef enum{
	SER_IMU_GRY_ODR_OFF   										= 0,																						//关闭陀螺仪									优先级 - 0				优先级越大，级别越高
	
	SER_IMU_GRY_ODR_12HZ5 										= 1,																						//采样频率 - 12.5赫兹					优先级 - 1
	
	SER_IMU_GRY_ODR_104HZ 										= 2,																						//采样频率 - 104赫兹					优先级 - 2
	
	
} SER_IMU_GRY_ODR_e;

typedef enum{
	SER_IMU_MAG_ODR_OFF   										= 0,																						//关闭地磁计									优先级 - 0				优先级越大，级别越高
	
	SER_IMU_MAG_ODR_10HZ 											= 1,																						//采样频率 - 10赫兹						优先级 - 1
	
	SER_IMU_MAG_ODR_100HZ 										= 2,																						//采样频率 - 100赫兹					优先级 - 2
	
	SER_IMU_MAG_ODR_200HZ											=	3,																						//采样频率 - 200赫兹					优先级 - 3
	
} SER_IMU_MAG_ODR_e;

typedef enum{
	SER_IMU_FIFO_ODR_OFF   										= 0,																						//关闭FIFO										优先级 - 0				优先级越大，级别越高
		
	SER_IMU_FIFO_ODR_104HZ 										= 1,																						//采样频率 - 104赫兹					优先级 - 1
	
} SER_IMU_FIFO_ODR_e;

typedef enum{
	SER_IMU_ACC_POWER_MODE_HIGH_PERFORMANCE		=	0,																						//加速度工作模式 - 高性能			优先级 - 0				优先级越大，级别越高
	
	SER_IMU_ACC_POWER_MODE_NORMAL							=	1,																						//加速度工作模式 - 正常				优先级 - 1
	
} SER_IMU_ACC_POWER_MODE_e;

typedef enum{
	SER_IMU_GRY_POWER_MODE_HIGH_PERFORMANCE		=	0,																						//陀螺仪工作模式 - 高性能			优先级 - 0				优先级越大，级别越高
	
	SER_IMU_GRY_POWER_MODE_NORMAL							=	1,																						//陀螺仪工作模式 - 正常				优先级 - 1
	
} SER_IMU_GRY_POWER_MODE_e;

typedef enum{
	SER_IMU_TIMESTAMP_6MS4										=	0,																						//时间戳精度 - 6.4毫秒				优先级 - 0				优先级越大，级别越高
	
	SER_IMU_TIMESTAMP_25US										=	1,																						//时间戳精度 - 25微妙					优先级 - 1
	
} SER_IMU_TIMESTAMP_RESOLUTION_e;

typedef enum{
	SER_IMU_TIMESTAMP_OFF											=	0,																						//时间戳关闭									优先级 - 0				优先级越大，级别越高
	
	SER_IMU_TIMESTAMP_ON											=	1,																						//时间戳开启									优先级 - 1
	
} SER_IMU_TIMESTAMP_SWITCH_e;

typedef enum{
	SER_IMU_ACC_FS_2G													=	0,																						//量程 - 2倍重力加速度				优先级 - 0				优先级越大，级别越高
	
	SER_IMU_ACC_FS_16G   											= 1,																						//量程 - 16倍重力加速度				优先级 - 1
	
} SER_IMU_ACC_FS_e;

typedef enum{
	SER_IMU_GRY_FS_250DPS											=	0,																						//量程 - 250角速度/秒					优先级 - 0				优先级越大，级别越高
	
	SER_IMU_GRY_FS_2000DPS	  								= 1,																						//量程 - 2000角速度/秒				优先级 - 1
	
} SER_IMU_GRY_FS_e;

typedef enum{
	SER_IMU_MAG_FS_30GS   										= 0,																						//量程 - 30高斯								优先级 - 0				优先级越大，级别越高
	
} SER_IMU_MAG_FS_e;

typedef enum{
	SER_IMU_DIR_FRONT													=	0,																						//方向 - 前脚
	
	SER_IMU_DIR_BACK													= 1,																						//方向 - 后脚
	
	SER_IMU_DIR_NUM														=	2,																						//方向 - 方向数量
	
} SER_IMU_DIR_e;

typedef struct 
{
	SER_IMU_ACC_POWER_MODE_e									acc_power_mode;																	//加速度工作模式
	
	SER_IMU_GRY_POWER_MODE_e									gry_power_mode;																	//陀螺仪工作模式
	
	SER_IMU_FIFO_ODR_e												fifo_odr;																				//FIFO采样频率
	
	SER_IMU_TIMESTAMP_RESOLUTION_e						timestamp_resolution;														//时间戳精度
	
	SER_IMU_TIMESTAMP_SWITCH_e								timestamp_switch;																//时间戳开关，注：时间戳采样率和FIFO采样率一致	
	
	SER_IMU_ACC_ODR_e													acc_odr;																				//加速度采样频率
	
	SER_IMU_GRY_ODR_e													gry_odr;																				//陀螺仪采样频率
	
	SER_IMU_MAG_ODR_e													mag_odr;																				//地磁计采样频率
	
	SER_IMU_ACC_FS_e													acc_fs;																					//加速度量程
	
	SER_IMU_GRY_FS_e													gry_fs;																					//陀螺仪量程
	
	SER_IMU_MAG_FS_e													mag_fs;																					//地磁计量程
	
} ser_imu_config_param_t;

typedef struct
{
	int16_t 																	acc[3];																					//加速度三轴
		
	int16_t 																	gry[3];																					//陀螺仪三轴
	
  int16_t 																	mag[3];																					//地磁计三轴
	
	int32_t 																	fifo_timestamp;																	//fifo时间戳
	
} ser_imu_data_t;

typedef void (*hal_ser_imu_data_update_callback)(int front_num, int back_num);

/*API -------------------------------------------------------*/
/**
	@brief 		初始化IMU服务
	@param 		无
	@return 	错误代码					- [out]	-1失败，0成功
*/
int	hal_ser_imu_Init(void);
/**
	@brief 		获取IMU服务句柄
	@param 		p_name 						- [in]	为服务句柄设置的名字
	@param 		p_handle_id 			- [out]	返回的服务句柄ID
	@return 	错误代码					- [out]	-1失败，0成功
*/
int	hal_ser_imu_get_handle(char *p_name, int *p_handle_id);
/**
	@brief 		设置IMU需要的配置参数
	@param 		handle 						- [in]	操作的IMU服务句柄
	@param 		foot 							- [in]	IMU方向 - 前/后脚
	@param 		param 						- [in]	IMU配置参数
	@return 	错误代码					- [out]	-1失败，0成功
*/
int	hal_ser_imu_set_required_param(int handle_id, SER_IMU_DIR_e dir, ser_imu_config_param_t	*param);
/**
	@brief 		IMU配置参数是否准备好
	@param 		foot 							- [in]	IMU方向 - 前/后脚
	@param 		param 						- [in]	IMU配置参数
	@return 	错误代码					- [out]	-1失败，0成功
*/
int hal_ser_imu_is_param_get_ready(SER_IMU_DIR_e dir, ser_imu_config_param_t	*param);
/**
	@brief 		获取IMU当前数据数量
	@param 		dir 							- [in]	IMU方向 - 前/后脚
	@return 	错误代码					- [out]	返回数据数量
*/
int	hal_ser_imu_get_data_num(SER_IMU_DIR_e dir);
/**
	@brief 		获取IMU数据
	@param 		dir 							- [in]	IMU方向 - 前/后脚
	@param 		index 						- [in]	第几组数据
	@param 		pdata 						- [out]	IMU数据
	@return 	错误代码					- [out]	-1失败，0成功
*/
int	hal_ser_imu_get_data(SER_IMU_DIR_e dir, int index, ser_imu_data_t *pdata);
/**
	@brief 		数据更新通知
	@param 		p_cb 							- [in]	需要回调的函数
	@return 	错误代码					- [out]	-1失败，0成功，-2已存在
*/
int	hal_ser_imu_data_update_notify(hal_ser_imu_data_update_callback p_cb);


#ifdef __cplusplus
}
#endif

#endif








