#ifndef __BLL_IMU_H__
#define __BLL_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 "fml_imu.h"

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



/*STRUCTION ----------------------------------------------------*/
typedef fml_imu_param_t											bll_imu_one_way_param_t;
typedef fml_imu_data_t											bll_imu_data_t;
typedef fml_imu_data_notify_cb   						bll_imu_data_notify_cb;

typedef enum{
	
	BLL_IMU_DATA_NOTIFY_CB_PRIORITY_0					=	0,																						//优先级 - 0				优先级越大，级别越高
	
	BLL_IMU_DATA_NOTIFY_CB_PRIORITY_1					= 1,																						//优先级 - 1				优先级越大，级别越高
	
	BLL_IMU_DATA_NOTIFY_CB_PRIORITY_NUM																												//优先级数量
	
} BLL_IMU_DATA_NOTIFY_CB_PRIORITY_e;

typedef enum{
	BLL_IMU_DIR_FRONT													=	FML_IMU_DIR_FRONT,														//方向 - 前脚
	
	BLL_IMU_DIR_BACK													= FML_IMU_DIR_BACK,															//方向 - 后脚
	
	BLL_IMU_DIR_NUM														=	FML_IMU_DIR_NUM,															//方向 - 方向数量
	
} BLL_IMU_DIR_e;

typedef struct
{
	const bll_imu_one_way_param_t										*config_param[FML_IMU_DIR_NUM];									//配置参数
} bll_imu_param_t;

typedef enum{
	BLL_IMU_CONFIG_FINISH = 0,
	
	BLL_IMU_CONFIG_DOING,
	
	BLL_IMU_CONFIG_VAILERROR,
	
	BLL_IMU_CONFIG_FAIL_FRONT_SIX_AXIS,
	
	BLL_IMU_CONFIG_FAIL_FRONT_MAG,
	
	BLL_IMU_CONFIG_FAIL_BACK_MAG,

} BLL_IMU_CONFIG_RESULT;


/*API -------------------------------------------------------*/
/**
	@brief 		初始化IMU业务逻辑层
	@param 		无
	@return 	错误代码					- [out]	-1失败，0成功
*/
int	bll_imu_Init(void);
/**
	@brief 		注册IMU要进行配置的参数
	@param 		param							- [in]	IMU要进行配置的参数地址
	@return 	错误代码					- [out]	0失败，成功返回参数地址
*/
const bll_imu_param_t* bll_imu_Resume_config_param(const bll_imu_param_t *param);

/**
	@brief 		注销已注册的IMU配置参数并重新配置IMU
	@param 		param							- [in]	IMU配置参数的地址
	@return 	错误代码					- [out]	0成功，-1地址异常，-2没有该注册的IMU配置参数
*/
int bll_imu_Resume_unregister_config_param(const bll_imu_param_t* param);

/**
	@brief 		注册IMU数据通知回调函数
	@param 		priority 					- [in]	回调优先级
	@param 		cb 								- [in]	回调函数
	@return 	错误代码					- [out]	-1失败，0成功
*/
int bll_imu_register_data_notify_callback(BLL_IMU_DATA_NOTIFY_CB_PRIORITY_e priority, bll_imu_data_notify_cb cb);
/**
	@brief 		开始配置。根据已注册IMU参数筛选出最高优先级进行配置，且只配置一次。
	@param 		无
	@return 	错误代码					- [out]	-1失败，0成功
*/
int bll_imu_start_config(void);
/**
	@brief 		查询IMU配置参数是否准备好
	@param 		dir 							- [in]	方向
	@param 		param							- [in]	需要查询的IMU配置参数
	@return 	查询结果					- [out] BLL_IMU_CONFIG_RESULT
*/
BLL_IMU_CONFIG_RESULT bll_imu_query_config_param_is_ready(BLL_IMU_DIR_e dir, const bll_imu_param_t *param);
/**
	@brief 		读取当前IMU数据的数量
	@param 		dir 							- [in]	方向
	@return 	返回当前IMU数据的数量
*/
int bll_imu_get_data_num(BLL_IMU_DIR_e dir);
/**
	@brief 		获取当前IMU数据
	@param 		dir 							- [in]	方向
	@param 		index 						- [in]	数据索引
	@param 		pdata 						- [out]	返回的IMU数据指针
	@return 	错误代码					- [out]	-1失败，0成功
*/
int bll_imu_get_data(BLL_IMU_DIR_e dir, int index, bll_imu_data_t *pdata);
/**
	@brief 		关闭IMU
	@return 	错误代码					- [out]	-1失败，0成功
*/
int bll_imu_close(void);


#ifdef __cplusplus
}
#endif

#endif








