#ifndef __BSP_UART_H
#define __BSP_UART_H

#include "stm32f4xx.h"

/**
* 封装不同使用类型串口  232  485 max3160
* 包含发送回调的GPIO操作
* 其他回调外部处理
*/
/*  485 3160 启用一个， 两个接口都有 MAX3160_ENABLE */
#define MAX485_ENABLE  0
#define MAX3160_ENABLE 1

#ifdef __cplusplus
	extern "C" {
#endif

#include <stdlib.h>
#include "main.h"

// #if MAX3160_ENABLE
// #define     DUPLEX_HALF  	1
// #define     DUPLEX_FULL  	0
// #define    SEL_485 			1
// #define    SEL_232 			0

// #define    ENABLE_485_Trans      1
// #define    DISABLE_485_Trans     0
// # endif

// #if MAX485_ENABLE
// #define    ENABLE_485_Trans      1
// #define    DISABLE_485_Trans     0
// # endif

/* -----------------------    variables     ---------------------------------*/
extern UART_HandleTypeDef huart3;
UART_HandleTypeDef *pMyUart = &huart3;

typedef  void ( *enable_func)  (void);
typedef  int ( *callback_fun)  (void *obj, void *buf, uint16_t size);

typedef struct 
{
	UART_HandleTypeDef *huart;
	uint8_t  interface_type; /* 0: common, 1: 485 ,2:3160*/
	uint8_t enable_idle_it;

// #if MAX485_ENABLE
// 	GPIO_TypeDef *de485_gpio;
// 	uint16_t de485_pin;
//     uint8_t de485;
// #endif

// #if MAX3160_ENABLE
// 	GPIO_TypeDef *de485_gpio;
// 	uint16_t de485_pin;
// 	GPIO_TypeDef *sel_gpio;
// 	GPIO_TypeDef *dplx_gpio;
// 	uint16_t sel_pin;
// 	uint16_t dplx_pin;
//     uint8_t sel;
//     uint8_t dplx;
// #endif

    // uint8_t dplx;
    // uint8_t sel;
    // uint8_t de485;

	uint8_t trans_mode; /* 0 :polling, 1: IT  2: DMA*/
	// uint8_t *send_buf;
	// uint16_t size_send;
	// uint8_t *rcv_buf;
	// uint16_t size_rcv;

	volatile uint8_t send_flag;
	volatile uint8_t send_tc_flag;  /* 0 开始发送， 1 发送完成*/
	// uint32_t timebase;

	void (*enable_snd)(void);
	void (*enable_rcv)(void);

	void * obj;
	callback_fun callback;

	//  这个是供外部调用的； 中断是统一管理的， 中断会找到这里的接收回调，然后返回回去

}MYUART_TypeDef;

extern MYUART_TypeDef *myuart;

MYUART_TypeDef * Myuart_Init( );
void Myuart_Set_Huart(MYUART_TypeDef * myuart, UART_HandleTypeDef *huart);
int Myuart_Setup_Transmod( MYUART_TypeDef * myuart, uint8_t trans_mode );
int Myuart_Set_enable_snd_func( MYUART_TypeDef * myuart, enable_func enable_snd_func );
int Myuart_Set_enable_rcv_func( MYUART_TypeDef * myuart, enable_func enable_rcv_func);
int Myuart_Set_enable_idle( MYUART_TypeDef * myuart, uint8_t enable_idle);

int Myuart_Set_Callback( MYUART_TypeDef * myuart, void *obj, callback_fun func);

// void Myuart_Set_Sel_GPIO_Pin(MYUART_TypeDef * myuart, GPIO_TypeDef *gpio, uint16_t pin);
// void Myuart_Set_Dplx_GPIO_Pin(MYUART_TypeDef * myuart, GPIO_TypeDef *gpio, uint16_t pin);
// void Myuart_Set_DE485_GPIO_Pin(MYUART_TypeDef * myuart, GPIO_TypeDef *gpio, uint16_t pin);

// void Myuart_Set_232(MYUART_TypeDef * myuart);
// void Myuart_Set_485(MYUART_TypeDef * myuart);


int Myuart_Trans(MYUART_TypeDef * myuart, uint8_t *buf, uint16_t size);
// int __Myuart_Trans(MYUART_TypeDef * myuart , uint8_t *buf, uint16_t size);
int Myuart_Trans_TxCplt_Callback( MYUART_TypeDef * myuart );
/* 接收方式 也有三种类型 */
int Myuart_Start_Rcv(MYUART_TypeDef * myuart, uint8_t *buf, uint16_t size);

#endif

/*

485 
enable rcv
HAL_GPIO_WritePin(myuart->de485_gpio, myuart->de485_pin, 0); 
enable send 
HAL_GPIO_WritePin(myuart->de485_gpio, myuart->de485_pin, 1); 

3160 485   --高    (232 - 低)
enable rcv
        HAL_GPIO_WritePin(myuart->dplx_gpio, myuart->dplx_gpio ,  1);
        HAL_GPIO_WritePin(myuart->de485_gpio, myuart->de485_pin, 0); 
enable send 
        HAL_GPIO_WritePin(myuart->dplx_gpio, myuart->dplx_gpio ,  0);
        HAL_GPIO_WritePin(myuart->de485_gpio, myuart->de485_pin, 1); 


myuart = Myuart_Init();

Myuart_Set_Huart(  myuart, phuart),
Myuart_Setup_Transmod(  myuart, 2 );
 Myuart_Set_enable_snd_func(   myuart, NULL );
 Myuart_Set_enable_rcv_func(   myuart, NULL);
 Myuart_Set_enable_idle(   myuart,  enable_idle);
 Myuart_Set_enable_rcv_func(   myuart,  obj, (callback_fun) func);
*/