#ifndef __DRV_LSM6DS3TR_C_H__
#define __DRV_LSM6DS3TR_C_H__

#ifdef __cplusplus
extern "C" {
#endif

/*Includes ------------------------------------------------------*/
#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#include "lsm6ds3tr-c_reg.h"

/*STRUCTION -----------------------------------------------------*/
typedef enum{
	LSM_ACC_ODR_OFF   		= LSM6DS3TR_C_XL_ODR_OFF,																		//关闭加速度
	
	LSM_ACC_ODR_12HZ5 		= LSM6DS3TR_C_XL_ODR_12Hz5,																	//采样频率 - 12.5赫兹
	
	LSM_ACC_ODR_104HZ 		= LSM6DS3TR_C_XL_ODR_104Hz,																	//采样频率 - 104赫兹
	
	LSM_ACC_ODR_208HZ			= LSM6DS3TR_C_XL_ODR_208Hz,																	//采样频率 - 208赫兹
	
	LSM_ACC_ODR_416HZ			= LSM6DS3TR_C_XL_ODR_416Hz,																	//采样频率 - 416赫兹
	
	LSM_ACC_ODR_833HZ			= LSM6DS3TR_C_XL_ODR_833Hz,																	//采样频率 - 833赫兹
		
} LSM_ACC_ODR_e;

typedef enum{
	LSM_GRY_ODR_OFF   		= LSM6DS3TR_C_GY_ODR_OFF,																		//关闭陀螺仪
	
	LSM_GRY_ODR_12HZ5 		= LSM6DS3TR_C_GY_ODR_12Hz5,																	//采样频率 - 12.5赫兹
	
	LSM_GRY_ODR_104HZ 		= LSM6DS3TR_C_GY_ODR_104Hz,																	//采样频率 - 104赫兹
	
	LSM_GRY_ODR_208HZ 		= LSM6DS3TR_C_GY_ODR_208Hz,																	//采样频率 - 208赫兹

	LSM_GRY_ODR_416HZ 		= LSM6DS3TR_C_GY_ODR_416Hz,																	//采样频率 - 416赫兹

	LSM_GRY_ODR_833HZ 		= LSM6DS3TR_C_GY_ODR_833Hz,																	//采样频率 - 833赫兹	
	
} LSM_GRY_ODR_e;

typedef enum{
	LSM_MAG_ODR_OFF   		= 0x00,																											//关闭地磁计
	
	LSM_MAG_ODR_10HZ 			= 0x31,																											//采样频率 - 10赫兹
	
	LSM_MAG_ODR_100HZ 		= 0x39,																											//采样频率 - 100赫兹
	
	LSM_MAG_ODR_200HZ 		= 0x3D,																											//采样频率 - 200赫兹
	
} LSM_MAG_ODR_e;

typedef enum{
	LSM_FIFO_ODR_OFF   		= LSM6DS3TR_C_FIFO_DISABLE,																	//关闭FIFO
	
	LSM_FIFO_ODR_12HZ5 		= LSM6DS3TR_C_FIFO_12Hz5,																		//采样频率 - 12.5赫兹
	
	LSM_FIFO_ODR_104HZ 		= LSM6DS3TR_C_FIFO_104Hz,																		//采样频率 - 104赫兹
	
	LSM_FIFO_ODR_208HZ 		= LSM6DS3TR_C_FIFO_208Hz,																		//采样频率 - 208赫兹
	
	LSM_FIFO_ODR_416HZ 		= LSM6DS3TR_C_FIFO_416Hz,																		//采样频率 - 416赫兹
	
	LSM_FIFO_ODR_833HZ 		= LSM6DS3TR_C_FIFO_833Hz,																		//采样频率 - 833赫兹
		
} LSM_FIFO_ODR_e;

typedef enum{
	LSM_ACC_POWER_MODE_HIGH_PERFORMANCE		=	LSM6DS3TR_C_XL_HIGH_PERFORMANCE,					//加速度工作模式 - 高性能
	
	LSM_ACC_POWER_MODE_NORMAL							=	LSM6DS3TR_C_XL_NORMAL,										//加速度工作模式 - 正常
	
} LSM_ACC_POWER_MODE_e;

typedef enum{
	LSM_GRY_POWER_MODE_HIGH_PERFORMANCE		=	LSM6DS3TR_C_GY_HIGH_PERFORMANCE,					//陀螺仪工作模式 - 高性能
	
	LSM_GRY_POWER_MODE_NORMAL							=	LSM6DS3TR_C_GY_NORMAL,										//陀螺仪工作模式 - 正常
	
} LSM_GRY_POWER_MODE_e;

typedef enum{
	LSM_TIMESTAMP_6MS4		=	LSM6DS3TR_C_LSB_6ms4,																			//时间戳精度 - 6.4毫秒
	
	LSM_TIMESTAMP_25US		=	LSM6DS3TR_C_LSB_25us,																			//时间戳精度 - 25微妙
	
} LSM_TIMESTAMP_RESOLUTION_e;

typedef enum{
	LSM_TIMESTAMP_OFF			=	0,																												//时间戳关闭
	
	LSM_TIMESTAMP_ON			=	1,																												//时间戳开启
	
} LSM_TIMESTAMP_SWITCH_e;

typedef enum{
	LSM_ACC_FS_2G   			= LSM6DS3TR_C_2g,																						//量程 - 2倍重力加速度
	
	LSM_ACC_FS_16G   			= LSM6DS3TR_C_16g,																					//量程 - 16倍重力加速度
	
} LSM_ACC_FS_e;

typedef enum{
	LSM_GRY_FS_250DPS			=	LSM6DS3TR_C_250dps,																				//量程 - 250角速度/秒
	
	LSM_GRY_FS_2000DPS	  = LSM6DS3TR_C_2000dps,																			//量程 - 2000角速度/秒
	
} LSM_GRY_FS_e;

typedef enum{
	LSM_MAG_FS_30GS   		= 0x00,																											//量程 - 30高斯
	
} LSM_MAG_FS_e;

typedef struct 
{
	LSM_ACC_POWER_MODE_e				acc_power_mode;																				//加速度工作模式
	
	LSM_GRY_POWER_MODE_e				gry_power_mode;																				//陀螺仪工作模式
	
	LSM_FIFO_ODR_e							fifo_odr;																							//FIFO采样频率
	
	LSM_TIMESTAMP_RESOLUTION_e	timestamp_resolution;																	//时间戳精度
	
	LSM_TIMESTAMP_SWITCH_e			timestamp_switch;																			//时间戳开关，注：时间戳采样率和FIFO采样率一致
	
	LSM_ACC_ODR_e								acc_odr;																							//加速度采样频率
	
	LSM_GRY_ODR_e								gry_odr;																							//陀螺仪采样频率
	
	LSM_MAG_ODR_e								mag_odr;																							//地磁计采样频率
	
	LSM_ACC_FS_e								acc_fs;																								//加速度量程
	
	LSM_GRY_FS_e								gry_fs;																								//陀螺仪量程
	
	LSM_MAG_FS_e								mag_fs;																								//地磁计量程
	
} drv_lsm_config_param_t;

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

/*API -------------------------------------------------------*/
/**
	@brief 		初始化LSM驱动
	@param 		无
	@return 	错误代码							- [out]	-1失败，0成功
*/
int drv_lsm_Init(void);
/**
	@brief 		LSM断电
	@param 		无
	@return 	错误代码							- [out]	-1失败，0成功
*/
int drv_lsm_power_off(void);
/**
	@brief 		LSM上电（默认配置挂起）
	@param 		无
	@return 	错误代码							- [out]	-1失败，0成功
*/
int drv_lsm_power_on(void);
/**
	@brief 		设置加速度工作模式
	@param 		acc_power_mode 				- [in]	加速度工作模式
	@return 	错误代码							- [out]	-1失败，0成功
*/
int	drv_lsm_set_acc_power_mode(LSM_ACC_POWER_MODE_e acc_power_mode);
/**
	@brief 		设置陀螺仪工作模式
	@param 		gry_power_mode 				- [in]	陀螺仪工作模式
	@return 	错误代码							- [out]	-1失败，0成功
*/
int	drv_lsm_set_gry_power_mode(LSM_GRY_POWER_MODE_e gry_power_mode);
/**
	@brief 		设置时间戳精度
	@param 		timestamp_resolution 	- [in]	时间戳精度
	@return 	错误代码							- [out]	-1失败，0成功
*/
int	drv_lsm_set_timestamp_resolution(LSM_TIMESTAMP_RESOLUTION_e timestamp_resolution);
/**
	@brief 		设置时间戳开关
	@param 		timestamp_switch 			- [in]	时间戳开关
	@return 	错误代码							- [out]	-1失败，0成功
*/
int	drv_lsm_set_timestamp_switch(LSM_TIMESTAMP_SWITCH_e timestamp_switch);
/**
	@brief 		设置FIFO采样频率
	@param 		fifo_odr 							- [in]	FIFO采样频率
	@param 		acc_odr 							- [in]	加速度采样频率
	@param 		gry_odr 							- [in]	陀螺仪采样频率
	@param 		mag_odr 							- [in]	地磁计采样频率
	@param 		timestamp_switch 			- [in]	时间戳开关
	@return 	错误代码							- [out]	-1失败，0成功
*/
int	drv_lsm_set_fifo_odr(LSM_FIFO_ODR_e fifo_odr, LSM_ACC_ODR_e acc_odr, LSM_GRY_ODR_e gry_odr, LSM_MAG_ODR_e mag_odr, LSM_TIMESTAMP_SWITCH_e timestamp_switch);
/**
	@brief 		设置ACC量程
	@param 		acc_fs 								- [in]	ACC量程
	@return 	错误代码							- [out]	-1失败，0成功
*/
int	drv_lsm_set_acc_fs(LSM_ACC_FS_e acc_fs);
/**
	@brief 		设置ACC采样频率
	@param 		acc_odr 							- [in]	ACC采样频率
	@return 	错误代码							- [out]	-1失败，0成功
*/
int	drv_lsm_set_acc_odr(LSM_ACC_ODR_e acc_odr);
/**
	@brief 		设置GRY量程
	@param 		gry_fs 								- [in]	GRY量程
	@return 	错误代码							- [out]	-1失败，0成功
*/
int	drv_lsm_set_gry_fs(LSM_GRY_FS_e gry_fs);
/**
	@brief 		设置GRY采样频率
	@param 		gry_odr 							- [in]	GRY采样频率
	@return 	错误代码							- [out]	-1失败，0成功
*/
int	drv_lsm_set_gry_odr(LSM_GRY_ODR_e gry_odr);
/**
	@brief 		获取配置MAG量程需要的步骤数量
	@return 	错误代码							- [out]	配置MAG量程需要的步骤数量
*/
int	drv_lsm_get_mag_fs_flow(void);
/**
	@brief 		设置MAG量程
	@param 		mag_fs 								- [in]	MAG量程
	@param 		flow 									- [in]	当前需要处理的步骤
	@return 	错误代码							- [out]	-1失败，0成功
*/
int	drv_lsm_set_mag_fs(LSM_MAG_FS_e mag_fs, int flow);
/**
	@brief 		获取配置MAG采样频率需要的步骤数量
	@return 	错误代码							- [out]	配置MAG采样频率需要的步骤数量
*/
int	drv_lsm_get_mag_odr_flow(void);
/**
	@brief 		设置MAG采样频率
	@param 		mag_odr 							- [in]	MAG采样频率
	@param 		set_hub 							- [in]	是否配置hub
	@param 		flow 									- [in]	当前需要处理的步骤
	@return 	错误代码							- [out]	-1失败，0成功
*/
int	drv_lsm_set_mag_odr(LSM_MAG_ODR_e mag_odr, bool set_hub, int flow);
/**
	@brief 		获取LSM配置参数
	@param 		param 								- [in]	LSM配置参数
	@return 	错误代码							- [out]	-1失败，0成功
*/
int	drv_lsm_get_config_param(drv_lsm_config_param_t	*p_param);
/**
	@brief 		当前LSM的FIFO有几组数据
	@return 	错误代码							- [out]	FIFO当前有几组数据
*/
int	drv_lsm_get_fifo_group_num(void);
/**
	@brief 		获取LSM的FIFO数据
	@param 		p_data 								- [out]	返回的FIFO数据
	@return 	错误代码							- [out]	-1失败，0成功
*/
int	drv_lsm_get_fifo_data(lsm_data_t	*p_data);
/**
	@brief 		获取LSM的ACC数据
	@param 		p_data 								- [out]	返回的ACC三轴数据
	@return 	错误代码							- [out]	-1失败，0成功
*/
int	drv_lsm_get_acc_data(lsm_data_t	*p_data);
/**
	@brief 		LSM自检步骤拆分——1，执行玩需等待100ms稳定输出才能执行步骤2
	@param 		无
	@return 	错误代码							- [out]	-1失败，0成功
*/
int drv_lsm_self_check_1(void);
/**
	@brief 		LSM自检步骤拆分——2，执行玩需等待100ms稳定输出才能执行步骤3
	@param 		无
	@return 	错误代码							- [out]	-1失败，0成功
*/
int drv_lsm_self_check_2(void);
/**
	@brief 		LSM自检步骤拆分——3，执行玩需等待150ms稳定输出才能执行步骤4
	@param 		无
	@return 	错误代码							- [out]	-1失败，0成功
*/
int drv_lsm_self_check_3(void);
/**
	@brief 		LSM自检步骤拆分——4，执行玩需等待50ms稳定输出才能执行步骤5
	@param 		无
	@return 	错误代码							- [out]	-1失败，0成功
*/
int drv_lsm_self_check_4(void);
/**
	@brief 		LSM自检步骤拆分——5，获取自检结果。
	@param 		无
	@return 	错误代码							- [out]	-1失败，0成功
*/
int drv_lsm_self_check_5(void);



#ifdef __cplusplus
}
#endif

#endif




















