#ifndef __FML_IMU_H__
#define __FML_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"

/*Private macro ------------------------------------------------------------------------------------------------------------------------------------*/

#define	FML_IMU_CONFIG_FLOW_DONE						0xFFFFFFFF																			//配置流程完成标志

/*STRUCTION ----------------------------------------------------*/
typedef enum{
	FML_IMU_ACC_ODR_OFF   										= 0,																						//关闭加速度									优先级 - 0				优先级越大，级别越高
	
	FML_IMU_ACC_ODR_12HZ5 										= 1,																						//采样频率 - 12.5赫兹					优先级 - 1
	
	FML_IMU_ACC_ODR_104HZ 										= 2,																						//采样频率 - 104赫兹					优先级 - 2
	
	FML_IMU_ACC_ODR_208HZ 										= 3,																						//采样频率 - 208赫兹					优先级 - 3
	
	FML_IMU_ACC_ODR_416HZ 										= 4,																						//采样频率 - 416赫兹					优先级 - 4
	
	FML_IMU_ACC_ODR_833HZ 										= 5,																						//采样频率 - 833赫兹					优先级 - 5

} FML_IMU_ACC_ODR_e;

typedef enum{
	FML_IMU_GRY_ODR_OFF   										= 0,																						//关闭陀螺仪									优先级 - 0				优先级越大，级别越高
	
	FML_IMU_GRY_ODR_12HZ5 										= 1,																						//采样频率 - 12.5赫兹					优先级 - 1
	
	FML_IMU_GRY_ODR_104HZ 										= 2,																						//采样频率 - 104赫兹					优先级 - 2
	
	FML_IMU_GRY_ODR_208HZ 										= 3,																						//采样频率 - 208赫兹					优先级 - 3
	
	FML_IMU_GRY_ODR_416HZ 										= 4,																						//采样频率 - 416赫兹					优先级 - 4
	
	FML_IMU_GRY_ODR_833HZ 										= 5,																						//采样频率 - 833赫兹					优先级 - 5
	
} FML_IMU_GRY_ODR_e;

typedef enum{
	FML_IMU_MAG_ODR_OFF   										= 0,																						//关闭地磁计									优先级 - 0				优先级越大，级别越高
	
	FML_IMU_MAG_ODR_10HZ 											= 1,																						//采样频率 - 10赫兹						优先级 - 1
	
	FML_IMU_MAG_ODR_100HZ 										= 2,																						//采样频率 - 100赫兹					优先级 - 2
	
	FML_IMU_MAG_ODR_200HZ											=	3,																						//采样频率 - 200赫兹					优先级 - 3
	
} FML_IMU_MAG_ODR_e;

typedef enum{
	FML_IMU_FIFO_ODR_OFF   										= 0,																						//关闭FIFO										优先级 - 0				优先级越大，级别越高
	
	FML_IMU_FIFO_ODR_12HZ5 										= 1,																						//采样频率 - 12.5赫兹					优先级 - 1
		
	FML_IMU_FIFO_ODR_104HZ 										= 2,																						//采样频率 - 104赫兹					优先级 - 2
	
	FML_IMU_FIFO_ODR_208HZ 										= 3,																						//采样频率 - 208赫兹					优先级 - 3
	
	FML_IMU_FIFO_ODR_416HZ 										= 4,																						//采样频率 - 416赫兹					优先级 - 4
	
	FML_IMU_FIFO_ODR_833HZ 										= 5,																						//采样频率 - 833赫兹					优先级 - 5
	
} FML_IMU_FIFO_ODR_e;

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

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

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

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

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

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

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

typedef enum{
	FML_IMU_DIR_FRONT													=	0,																						//方向 - 前脚
	
	FML_IMU_DIR_BACK													= 1,																						//方向 - 后脚
	
	FML_IMU_DIR_NUM														=	2,																						//方向 - 方向数量
	
} FML_IMU_DIR_e;

typedef struct 
{
	FML_IMU_ACC_POWER_MODE_e									acc_power_mode;																	//加速度工作模式
	
	FML_IMU_GRY_POWER_MODE_e									gry_power_mode;																	//陀螺仪工作模式
	
	FML_IMU_FIFO_ODR_e												fifo_odr;																				//FIFO采样频率
	
	FML_IMU_TIMESTAMP_RESOLUTION_e						timestamp_resolution;														//时间戳精度
	
	FML_IMU_TIMESTAMP_SWITCH_e								timestamp_switch;																//时间戳开关，注：时间戳采样率和FIFO采样率一致	
	
	FML_IMU_ACC_ODR_e													acc_odr;																				//加速度采样频率
	
	FML_IMU_GRY_ODR_e													gry_odr;																				//陀螺仪采样频率
	
	FML_IMU_MAG_ODR_e													mag_odr;																				//地磁计采样频率
	
	FML_IMU_ACC_FS_e													acc_fs;																					//加速度量程
	
	FML_IMU_GRY_FS_e													gry_fs;																					//陀螺仪量程
	
	FML_IMU_MAG_FS_e													mag_fs;																					//地磁计量程
	
} fml_imu_param_t;

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

typedef void (*fml_imu_config_cb)(uint32_t conf_result);

typedef void (*fml_imu_data_notify_cb)(uint32_t dir_bit);

/*API -------------------------------------------------------*/
/**
	@brief 		初始化IMU功能模块
	@param 		无
	@return 	错误代码					- [out]	-1失败，0成功
*/
int	fml_imu_Init(void);
/**
	@brief 		设置需要配置IMU的参数
	@param 		param 						- [in]	设置IMU的参数
	@return 	错误代码					- [out]	-1失败，0成功
*/
int fml_imu_config_param(FML_IMU_DIR_e dir, const fml_imu_param_t *param);
/**
	@brief 		注册IMU配置结果回调函数
	@param 		cb 								- [in]	回调函数
	@return 	错误代码					- [out]	-1失败，0成功
*/
int fml_imu_register_config_callback(fml_imu_config_cb cb);
/**
	@brief 		注册IMU数据通知回调函数
	@param 		cb 								- [in]	回调函数
	@return 	错误代码					- [out]	-1失败，0成功
*/
int fml_imu_register_data_notify_callback(fml_imu_data_notify_cb cb);
/**
	@brief 		开始配置IMU
	@param 		param 						无
	@return 	返回配置状态：		- [out] -1不需要重新配置，0需要重新配置
*/
int fml_imu_start_config(void);
/**
	@brief 		读取当前IMU数据的数量
	@param 		dir 							- [in]	方向
	@return 	返回当前IMU数据的数量
*/
int fml_imu_get_data_num(FML_IMU_DIR_e dir);
/**
	@brief 		获取当前IMU数据
	@param 		dir 							- [in]	方向
	@param 		index 						- [in]	数据索引
	@param 		pdata 						- [out]	返回的IMU数据指针
	@return 	错误代码					- [out]	-1失败，0成功
*/
int fml_imu_get_data(FML_IMU_DIR_e dir, int index, fml_imu_data_t *pdata);
/**
	@brief 		关闭IMU
	@param 		dir 							- [in]	方向
	@return 	错误代码					- [out]	-1失败，0成功
*/
int fml_imu_close(FML_IMU_DIR_e dir);

#ifdef __cplusplus
}
#endif

#endif








