/************************************************************************************
 * @Copyright (c)    :(C)2021, Qindao ieslab Co., Ltd
 * @FileName   	     :ble_driver.h
 * @Author           :QDIES PLATFORM TEAM
 * @Version          :V1.1
 * @Date             :2021-7
 * @Description     :
 ************************************************************************************/

#ifndef __BLE_DRIVER_H
#define	__BLE_DRIVER_H

#include "type.h"
#include <string.h>

#ifdef __cplusplus
extern "C"
{
#endif

/*---------------- 配置宏开关，可根据MCU类型或主从模式使用情况进行选择     --------------------*/
//#define HDSC_HC32L13x			1				//华大13x系列
//#define HDSC_HC32L196			(!HDSC_HC32L13x)//华大196系列

#define BLE_CENTRAL_SLAVE_MOD	0				//驱动是否为主从模式都支持，0从机，1主从机

/*------------------------------------*/
#define BLE_POW_PORT			(GpioPortE)		//电源控制
#define BLE_POW_PIN				(GpioPin4)

#define BLE_CON_PORT			(GpioPortA)		//连接状态指示
#define BLE_CON_PIN				(GpioPin4)
#define BLE_CON_IRQ				PORTA_IRQn
#define BLE_CON_PRIORITY		IrqLevel2		//中断优先级

#define BLE_LOWPOWER_PORT		(GpioPortA)		//唤醒蓝牙
#define BLE_LOWPOWER_PIN		(GpioPin2)

#define BLE_RXPORT_IRQ			PORTA_IRQn
#define BLE_RXPORT_PRIORITY		IrqLevel2		//中断优先级

#define BLE_CONorRX_IRQHandler		PORTA_IRQHandler
//#define BLE_TX_IRQHandler		PORTA_IRQHandler

#define BLE_CON_MSG					0xAA			//蓝牙连接
#define BLE_DISCON_MSG				0xBB			//蓝牙断开
#define BLE_CON_NOMSG               0X00

#define CENTRAL_MODE			0xAA			//主机模式
#define SLAVE_MODE				0xBB			//从机模式
#define MODE_ERROR				0x00			//主从切换失败


#define SCAN_END				0x00			//扫描结束或未开始
#define SCAN_ING				0xBB			//扫描中
#define SACN_START_ORDER		0xAA			//启动扫描
#define SACN_STOP_ORDER			0xBB			//停止扫描
#define SCAN_START			0xCC				//开始扫描

#define CON_START_ORDER			0xAA			//建立连接
#define CON_STOP_ORDER			0xBB			//断开连接
#define CON_END					0xAA			//连接结束或未开始
#define CON_ING					0xBB			//连接中
#define CON_START				0xCC			//开始连接

#define CHK_KEY_WORD			0xAA			//查询关键字
#define SET_KEY_WORD			0xBB			//修改关键字
#define CLR_KEY_WORD			0xCC			//取消关键字

#define CHK_WHITE_LIST			0xAA			//查询白名单
#define SET_WHITE_LIST			0xBB			//修改白名单
#define CLR_WHITE_LIST			0xCC			//取消白名单

#define CHK_NAME_MAC			0xAA			//查询蓝牙名称及MAC
#define SET_NAME_MAC			0xBB			//修改蓝牙名称及MAC

#define CHK_BLE_SEC				0xAA			//查询蓝牙加密配对
#define SET_BLE_SEC				0xBB			//启用蓝牙加密配对
#define CLR_BLE_SEC				0xCC			//取消蓝牙加密配对

#define CHK_BLE_PIN				0xAA			//查询蓝牙配对密码
#define SET_BLE_PIN				0xBB			//设置蓝牙配对密码

//任务完成情况
#define BLE_TASK_FAIL               0xA8
#define BLE_TASK_SUCCESS            0xA9
#define BLE_TASK_INIT               0xB0

#define BLE_NAME_MAX_LEN		12				//蓝牙名称的最大长度

//初始化状态机状态号BLE
enum BLE_MAIN_STA
{
	S_BLE_IDLE = 0				,
	S_BLE_MAIN_INIT				,
	S_BLE_MAIN_CENTRAL_SWITCH	,
	S_BLE_MAIN_SCAN				,
	S_BLE_MAIN_CONNECT			,
	S_BLE_MAIN_NAME_MAC			,
	S_BLE_MAIN_ADV_DATA			,
	S_BLE_MAIN_ADV_PARAM		,
	S_BLE_MAIN_KEY_WORD			,
	S_BLE_MAIN_WHITE_LIST		,
	S_BLE_MAIN_CHK_STATUS		,
	S_BLE_MAIN_SEC_PIN			,
};

enum BLEINIT_STA
{
	S_BLEINIT_POWER_ON = 1		,	//模块送电
	S_BLEINIT_POWER_WAIT		,
	S_BLEINIT_POWER_DW			,	//开始断电复位
	S_BLEINIT_POWER_DW_R		,
	S_BLEINIT_ATS				,	//发送初始化AT指令
	S_BLEINIT_ADV0_CTL			,	//关闭广播
	S_BLEINIT_VER				,	//查询软件版本
	S_BLEINIT_NAME				,	//查询广播名称
	S_BLEINIT_NAME_SET			,	//设置广播名称
	S_BLEINIT_MAC				,	//查询模块物理地址
	S_BLEINIT_MAC_SET			,	//设置模块物理地址
	S_BLEINIT_MAC_SAVE			,	//保存MAC
	S_BLEINIT_MAC_RESET			,	//保存MAC后需复位
	S_BLEINIT_TXPOW				,	//查询发射功率
	S_BLEINIT_TXPOW_SET			,	//设置发射功率
	S_BLEINIT_ADVPERIOD			,	//查询广播间隔时间
	S_BLEINIT_ADVPERIOD_SET		,	//设置广播间隔时间
	S_BLEINIT_CONPERIOD			,	//查询广播间隔时间
	S_BLEINIT_CONPERIOD_SET		,	//设置广播间隔时间
	S_BLEINIT_ADVMFID_SET		,	//设置广播数据
	S_BLEINIT_ADV_CTL			,	//打开广播
	S_BLEINIT_END
};

#if BLE_CENTRAL_SLAVE_MOD
//BLE主从模式切换状态
enum BLEMODESWITCH_STA
{
//	S_BLE_SWITCH_IDLE = 0		,  
	S_BLE_SWITCH_CENTRAL = 1	,  	//主机模式
	S_BLE_SWITCH_CENTRAL_CHK	,	//先查询链接状态
	S_BLE_SWITCH_CENTRAL_DISCON	,	//断开连接
	S_BLE_SWITCH_ADV0			,	//停止广播
	S_BLE_SWITCH_STATUS			,	//查询当前主从模式
	S_BLE_SWITCH_SET_CENTRAL	,	//切换主机模式	
	S_BLE_SWITCH_SLAVE			,
	S_BLE_SWITCH_SLAVE_CHK		,	//先查询链接状态
	S_BLE_SWITCH_SLAVE_DISCON	,	//断开连接
	S_BLE_SWITCH_STATUS_SLAVE	,	
	S_BLE_SWITCH_SET_SLAVE		,	//切换从机模式	
	S_BLE_SWITCH_ADV1			,	//开启广播
};

//BLE开始扫描状态
enum BLESCAN_STA
{
//	S_BLE_SCAN_IDLE = 0			,
	S_BLE_SCAN_START = 1		,
	S_BLE_SCAN_DISCON			,	//断开连接
	S_BLE_SCAN_ING				,	//启动扫描
	S_BLE_SCAN_OVERTIME			,	//扫描超时
	S_BLE_SCAN_STOP				,
	S_BLE_SCAN_END				,
	S_BLE_SCAN_END_OVERTIME		,
};

//BLE更新MAC白名单状态
enum BLEWHITELIST_STA
{
	S_BLE_WHITE_LIST = 1		,	//修改白名单
	S_BLE_WHITE_LIST_R			,
	S_BLE_WHITE_LIST_CLR		,	//取消白名单
	S_BLE_WHITE_LIST_CLR_R		,
	S_BLE_WHITE_LIST_CHK		,	//差白名单
	S_BLE_WHITE_LIST_CHK_R		,
	S_BLE_WHITE_LIST_SAVE		,	//保存
};

#endif
//BLE建立连接状态
enum BLECON_STA
{
	S_BLE_CON_START = 1			,
	S_BLE_CON_STATE_CHEK		,
	S_BLE_CON_DISCON			,	//断开连接
	S_BLE_CON_DISCON_WAIT		,	//断开连接延时
	S_BLE_CON_CLRBNDE			,	
	S_BLE_CON_RECON				,	//重新根据MAC连接
	S_BLE_CON_RECON_R			,
	S_BLE_CON_RECON_XIAODOU		,
	S_BLE_CON_STOP				,	//断开连接
	S_BLE_CON_END				,
};

//BLE修改蓝牙名称及MAC状态
enum BLECHANGEMAC_STA
{
	S_BLE_MAC_SET_START = 1		,
	S_BLE_MAC_DISCON			,	//断开连接
	S_BLE_MAC_ADV0				,	//停止广播
	S_BLE_MAC_NAME				,	//修改蓝牙名称
	S_BLE_MAC_MAC				,	//修改MAC
	S_BLE_MAC_SAVE				,	//修改完MAC要保存
	S_BLE_MAC_RESET				,	//修改完成后复位
	S_BLE_MAC_ADV1				,
	S_BLE_MAC_CHK_START			,
	S_BLE_MAC_NAME_CHK			,
	S_BLE_MAC_MAC_CHK			,
};

//BLE更新广播数据状态
enum BLEUPDATEADVDATA_STA
{
	S_BLE_UPDATE_ADV_START = 1	,
	S_BLE_UPDATE_ADV			,	//更新广播数据
	S_BLE_UPDATE_ADV_RD_MAC		,
};

//BLE更新广播参数状态
enum BLECHANGEADVPARA_STA
{
	S_BLE_CHANGE_ADV_START = 1	,
	S_BLE_CHANGE_ADV0			,	//停止广播
	S_BLE_CHANGE_ADV_PARAM		,	//修改广播间隔
	S_BLE_CHANGE_CON_PARAM		,	//修改连接间隔
	S_BLE_CHANGE_TX_POWER		,	//修改发射功率
	S_BLE_CHANGE_SCAN_TIMES		,	//修改扫描次数
	S_BLE_CHANGE_SAVE			,	//修改完成后保存
	S_BLE_CHANGE_ADV1			,	//开启广播
};

//BLE更新关键字状态
enum BLECHANGEKEYWORD_STA
{
	S_BLE_SET_KEY_WORD = 1		,	//修改关键字
	S_BLE_SET_KEY_WORD_R		,
	S_BLE_CHK_KEY_WORD			,	//查询关键字
	S_BLE_CHK_KEY_WORD_R		,
	S_BLE_CLEAR_KEY_WORD		,	//取消关键字
	S_BLE_CLEAR_KEY_WORD_R		,
	S_BLE_KEY_WORD_SAVE			,	//保存
};

//BLE查询蓝牙主从模式及连接状态
enum BLECHKSTATUS_STA
{
	S_BLE_CHK_STATUS = 1		,	//查询主从模式及连接状态
	S_BLE_CHK_STATUS_R			,
};

//BLE查询或设置加密配对状态
enum BLESEC_STA
{
	S_BLE_CHK_SEC = 1		,	//查询SEC
	S_BLE_CHK_SEC_R			,
	S_BLE_CHK_PIN			,	//查询PIN
	S_BLE_SET_SEC_ADV0		,
	S_BLE_SET_SEC_ADV0_R	,
	S_BLE_SET_PIN			,	//设置PIN
	S_BLE_SET_PIN_R			,
	S_BLE_SET_SEC			,	//设置SEC
	S_BLE_SET_SEC_R			,
	
	S_BLE_SET_SEC_ADV1		,
	S_BLE_CLR_SEC			,	//取消
	S_BLE_CLR_SEC_R			,
	S_BLE_SEC_RESET			,
	S_BLE_SEC_SAVE			,	//保存
};


//AT指令通用状态，子状态机状态
typedef enum{
//	AT_REQUEST_IDLE = 0			,  
	BLE_AT_REQUEST_SEND = 1			,   	
	BLE_AT_REQUEST_CHECK			,
	BLE_AT_REQUEST_WT				,
}BLE_TYP_STATE_AT_REQUEST;


//模组AT指令编号
typedef enum {
	AT_CODE_AT = 0				,	//AT
	AT_CODE_VER_CHK				,	//版本检查
	AT_CODE_NAME_CHK			,   //广播名称查询
	AT_CODE_NAME				,	//广播名称设置
	AT_CODE_MAC_CHK				,	//查询MAC
	AT_CODE_MAC					,	//设置MAC
	AT_CODE_TXPOWER_CHK			,	//发射功率查询
	AT_CODE_TXPOWER				,	//发射功率设置
	AT_CODE_ADVPARAM_CHK		,	//广播间隔查询
	AT_CODE_ADVPARAM			,	//广播间隔设置
	AT_CODE_CONPARAM_CHK		,	//连接间隔查询
	AT_CODE_CONPARAM			,	//连接间隔设置
	AT_CODE_ADVMFID				,	//广播数据设置
	AT_CODE_ADV0				,	//关闭广播
	AT_CODE_ADV1				,	//打开广播
	AT_CODE_DISCON				,	//断开所有连接
	AT_CODE_SLAVE				,	//设置为从机模式
#if BLE_CENTRAL_SLAVE_MOD
    AT_CODE_CENTRAL				,	//设置为主机模式
	AT_CODE_SCAN				,	//扫描周围设备
	AT_CODE_CONNECT				,	//连接指定设置
	AT_CODE_STOP_SCAN			,	//停止扫描
	AT_CODE_WHITE_LIST_SET		,	//设置MAC白名单
	AT_CODE_WHITE_LIST_CLR		,	//取消MAC白名单
	AT_CODE_WHITE_LIST_CHK		,	//查询MAC白名单
#endif
	AT_CODE_SCAN_TIMES			,	//扫描次数
	AT_CODE_KEY_CHK				,	//查询关键字
	AT_CODE_KEY_SET				,	//修改关键字
	AT_CODE_KEY_CLR				,	//取消关键字
	AT_CODE_RESET				,	//蓝牙软复位
	AT_CODE_SAVE				,	//蓝牙保存参数
	AT_CODE_STATUS				,	//蓝牙查询主从模式及连接状态
	AT_CODE_SEC_CHK				,	//查询蓝牙加密配对
	AT_CODE_SEC_SET				,	//设置蓝牙加密配对
	AT_CODE_SEC_CLR				,	//取消蓝牙加密配对
	AT_CODE_PIN_CHK				,	//查询蓝牙配对密码
	AT_CODE_PIN					,	//设置蓝牙配对密码
	AT_CODE_CLRBNDE				,	//加密配对启用时，建立连接前需发送清除命令
	
	AT_CODE_ALL
} BLE_TYP_AT_CMDCODE;

//AT指令等待应答时间
typedef enum {				//使用100ms定时器
	BLE_WT_0S = 0,
	BLE_WT_halfS = 5,
	BLE_WT_1S = 10,
	BLE_WT_2S = 20,
	BLE_WT_5S = 50,
} BLE_TYP_AT_WAIT_TIME;

//AT指令重试次数
typedef enum {
	BLE_RETRY_0 = 0,
	BLE_RETRY_1,
	BLE_RETRY_2,
	BLE_RETRY_3,
	BLE_RETRY_4,
	BLE_RETRY_5,
	BLE_RETRY_15 = 15,
} BLE_TYP_AT_RETRY_COUNT;

//AT指令状态机执行结果
typedef enum {
	ResultBusy = 0,
	ResultOk,
	ResultError,
	ResultFail
} BLE_TYP_RESULT_CODE;

//连接状态
typedef enum {
	BleNoCon = 0,
	BleSlaveCon,
	BleMasterCon
} TYP_CON_STATUS;

//供电状态状态
typedef enum {
	BlePowerOk = 0,
	BlePowerWrong,   //故障,强制断电状态
	BlePowerFactory  //厂区模式期间断电状态
} TYP_POWER_STATUS;
//******************************* 结构体定义*************************************

typedef struct 
{
	unsigned char AtCode;		//指令编号
	unsigned char CaseAtNum;	//应答处理编号
	unsigned char ErrorLimit;	//最大尝试出错次数
//	unsigned char ExpectLen;	//期待应答数据长度
	char* pAtCmdStr;			//指令内容指针
//	char* pExpectData;			//期待应答数据内容指针
	unsigned short int WaitTime;//等待应答最大时间，ms
} BLE_STRUCT_AT_CMD, *P_BLE_STRUCT_AT_CMD; 

typedef union
{
	struct
	{
		u8 at_err:1			;	//查询AT异常
		u8 ver_err:1		;	//查询版本异常
		u8 name_chk_err:1	;	//查询蓝牙名称异常
		u8 name_set_err:1	;	//设置蓝牙名称异常
		u8 mac_chk_err:1	;	//查询蓝牙MAC异常
		u8 mac_set_err:1	;	//设置蓝牙MAC异常
		
	};
	mtype32_ err_byte;
} BLE_STATE_ERR;	//蓝牙状态错误指示

typedef struct
{
    u8 Ble_cur_mode; 			//当前主从模式
    u8 Ble_scan_state; 			//当前扫描状态，扫描未开始、扫描中、扫描结束
	u8 Ble_con_state;			//当前的连接状态
	u8 Ble_power_flag;			//当前的供电状态
	u8 Ble_con_MAC[12];			//连接时的MAC
	u8 Ble_adv_data[13];		//广播数据
	u8 Ble_key_word_len;		//关键字长度
	u8 Ble_key_word[12];		//关键字内容
	u8 Ble_white_list[15][6];	//MAC白名单
	u8 Ble_softverson[2];		//蓝牙版本
	u8 Ble_name[12];			//蓝牙名称
	u8 Ble_mac[6];				//蓝牙MAC
	u8 Ble_cur_sec;				//蓝牙当前的加密配对状态
	u8 Ble_cur_pin[3];			//蓝牙当前使用的配对密码，密码不超过六位

} BLE_WORK_STATE;

//******************************* 外部变量***************************************


//******************************* 外部接口函数***********************************
void BleInit(void);
void BleMainMachine(void);
u8 BleIfIdle(void);
u8 BleIfSleep(void);
void BlePreSleep(void);
void BleWakeSleep(void);

void BlePowerOff(void);
void BlePowerOn(void) ;
u8 BleIfPowerOn(void);
void BleForcePowerOff(TYP_POWER_STATUS data);

u8 format_ascii2hex(u8 *dest, u8 *sour, u8 sourlen);
//任务启动接口
void BleStartInitTask(void);				//初始化启动
void BleCentralSwitchTask(u8 switch_type);	//主从切换启动
u8 BleGetCurMode(void);						//获取当前的模式


u8 BleConMacTask(u8 con_oeder,u8 *con_mac);	//连接或断开连接
u8 BleGetCurConState(void);		//查询当前连接状态
void BleNameMacTask(u8 opr_type,u8* name_src);//启动修改蓝牙名称及MAC
u8 BleUpdataAdvDataTask(u8* snd_data);		//启动更新广播数据
void BleChangeAdvParaTask(void);			//启动变更蓝牙参数
void BleKeyWordTask(u8 type,u8* key_word,u8 key_len);//启动变更蓝牙关键字
u8 BleGetCurKeyWord(u8* key_addr);			//查询当前关键字
void BleChkStatusTask(void);				//启动查询当前的主从模式及连接状态
u8 BleSecChkOrSetTask(u8 sec_type);			//启动查询、设置、取消蓝牙加密配对
u8 BleChkCurSecState(u8 **cur_pin);			//获取蓝牙当前的加密配对状态及PIN

#if BLE_CENTRAL_SLAVE_MOD
void BleMacWhiteListTask(u8 type,u8* list_addr);//启动MAC白名单
u8 BleScanTask(u8 scan_order);				//启动或关闭扫描
u8 BleGetCurScanState(void);				//获取当前扫描状态
#endif

void BleGetFirmVerson(u8* verson_addr);		//获取蓝牙版本号
void BleGetCurMacAddr(u8 *cur_mac);			//获取当前蓝牙的MAC
void Ble_IODeInit(void);
void BleClearResetCount(void);
TYP_POWER_STATUS BleGetPowerState(void);
//u8 BleCheckConInitMsg(void);
//u8 BleClrConInitMsg(void);
//u8 BleCheckTxInitMsg(void);
//u8 BleClrTxInitMsg(void);

//#pragma pack()

#ifdef __cplusplus
}
#endif

#endif	



