#ifndef _USART_H
#define _USART_H

#include "gd32f4xx.h"
#include "ring_queue.h"
#include "includes.h"
#include "comm_types.h"
#include "agent_hyt.h"

typedef u_int32_t device_handle;

#define TEST           USART0
#define UART_485       USART1
#define UART_422       USART2


#define PTZ_UART_485_BUFF_SIZE       100
#define PTZ_UART_422_BUFF_SIZE       100

#define PTZ_UART_485_INDEX           1 //485使用串口1
#define PTZ_UART_422_INDEX           2 //422使用串口2

#define PTZ_UART_485_TX      gpio_bit_set(GPIOD, GPIO_PIN_7)//485发送
#define PTZ_UART_485_RX      gpio_bit_reset(GPIOD, GPIO_PIN_7)//485接收




extern device_handle uart_485_handle ;
extern device_handle uart_422_handle ;

extern BSP_OS_SEM ser_mutex;
//串口
//RS422
extern u_int8_t ptz_uart_422_buff[PTZ_UART_422_BUFF_SIZE];
extern char uart_422_state ;
//RS485
extern u_int8_t ptz_uart_485_buff[PTZ_UART_485_BUFF_SIZE];
extern char uart_485_state ;



typedef struct _uart_device_info{
  u_int8_t init;  //该设备是否初始化准备接收数据标志
  u_int8_t index; //uart设备索引，0，1，2...
  RingQueue  uart_ring_queue; //用于维护设备的接收缓存的循环队列
  BSP_OS_SEM ser_mutex;//用于锁调用发生一个字节函数
  BSP_OS_SEM port_mutex;//用于所发送一个字节
  BSP_OS_SEM read_mutex;//用于读串口buffer
  BSP_OS_SEM sem_recv_data;//用于通知接收到数据
}uart_device_info;






void Usart_init_module();
void IRQHandler_485_process(u_int8_t data);
void IRQHandler_422_process(u_int8_t data);
void ptz_uart_dev_send(device_handle device, void *data, int len);
char ptz_uart_dev_in_char(device_handle device);
int ptz_uart_dev_char_present(device_handle device);
void init_term_uart();

#endif