#ifndef __hal_ble_uart0__
#define __hal_ble_uart0__
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include "sdk_common.h"
#include "SEGGER_RTT.h"
#include "usr_config.h"

#ifdef __cplusplus  
extern "C" {  
#endif  

	
#ifdef __cplusplus
} 
#endif

#define UART0_INVALID_PIN		PIN_UART0_UNUSED_PIN		//该引脚不能使用0XFF，否则程序崩溃。

/*************** 发送命令 ********************/
typedef enum {
	UART0_T_HEART = 0,
	UART0_T_CONFIG_ASK,					//配对申请
	UART0_T_CONFIG_ACK,					//配对成功
	UART0_T_CHAR_VOL,						//充电电量
	UART0_T_SELF_CHECK_RDY,			//自检准备
	UART0_T_SELF_CHECK_ASK,			//自检开始
	UART0_T_SELF_CHECK_ACK,			//自检结果
	UART0_T_LINE_CHECK_ASK,			//自检串口线ASK
	UART0_T_LINE_CHECK_ACK,			//自检串口线ACK
	UART0_NUM_OF_T,	//命令连续用此值
}UART0_T_n;	
//#define UART0_NUM_OF_T 9  //注意：：：此值根据命令的数量改变

/*************** 发送子命令 ********************/
//enum { //UART0_T_UPDATE
//	UART0_T_UPDATE_BASEINFO = 0,	//设备基本信息
//	UART0_T_UPDATE_DATA ,			//设备数据
//	UART0_T_UPDATE_STEPNUM ,		//回复存储步数
//	UART0_T_UPDATE_STEPNUM_CLERA,	//删除存储步数
//};

//enum { //UART0_T_CHARGE
//	UART0_T_CHARGE_NONE = 0,
//	UART0_T_CHARGE_PULLOUT,
//	UART0_T_CHARGE_INSERT,
//	UART0_T_CHARGE_DONE,
//	UART0_T_CHARGE_ERROR,
//};


/*************** 接收命令 ********************/
typedef enum {
	UART0_R_HEART = 0,
	UART0_R_CONFIG_ASK,					//配对申请
	UART0_R_CONFIG_ACK,					//配对成功
	UART0_R_CHAR_VOL,						//充电电量
	UART0_R_SELF_CHECK_RDY,			//自检准备
	UART0_R_SELF_CHECK_ASK,			//自检开始
	UART0_R_SELF_CHECK_ACK,			//自检结果
	UART0_R_LINE_CHECK_ASK,			//自检串口线ASK
	UART0_R_LINE_CHECK_ACK,			//自检串口线ACK
	UART0_NUM_OF_R,	//命令连续用此值
}UART0_R_n;	
//#define UART0_NUM_OF_R 11  //注意：：：此值根据命令的数量改变


/*************** 接收子命令 ********************/
//enum { //UART0_R_UPDATE
//	UART0_R_UPDATE_BASEINFO = 0,
//	UART0_R_UPDATE_DATA ,
//	UART0_R_UPDATE_STEPNUM,
//	UART0_R_UPDATE_STEPNUM_CLERA,
//};


typedef void (*UART0_Callback)(void*);

typedef struct _UART0_Rx{
	uint8_t  cmd;
	uint8_t*  pDat;
	uint8_t  datLen;
	UART0_Callback cb;
}UART0_Rx_t;

typedef struct _UART0_Tx{
	uint8_t  n;
	uint32_t t;
	uint8_t  ncnt;
	uint32_t tcnt;
	uint8_t  cmd;
	uint8_t* pDat;
	uint8_t  datLen;
	uint8_t  holdon;
	UART0_Callback cb;
	struct _UART0_Tx *next;	//单向链表
}UART0_Tx_t;

void UART0_Initialize(uint32_t txd, uint32_t rxd, uint32_t baud);
void UART0_unInit(uint32_t txd, uint32_t rxd);
void UART0_Send(unsigned char cmd,unsigned char *pDat,unsigned char datLen);
int UART0_Rx_Regist(unsigned char cmd,UART0_Callback cb);
void UART0_Tx_Send(UART0_Tx_t* handle,unsigned char cmd,unsigned char *pDat,unsigned char datLen);
void UART0_Tx_Clear(UART0_Tx_t* handle);
void UART0_Push(unsigned char* p,int len);
void UART0_GetPinConfig(uint32_t *txd, uint32_t *rxd);
void UART0_PrintfDebug(char *p);

#endif

