// uart.h
#ifndef __UART_H
#define __UART_H
#include "stm32f10x.h"
#include "stm32f10x_usart.h"
#include <stdarg.h>
#include <stdio.h>

#define TXEN1_PORT      GPIOC
#define TXEN2_PORT      GPIOC
#define TXEN3_PORT      GPIOC
#define TXEN1_PIN       GPIO_Pin_14
#define TXEN2_PIN       GPIO_Pin_15
#define TXEN3_PIN       GPIO_Pin_12

#define TXEN1_ENABLE    (GPIOC->BSRR = GPIO_Pin_14)
#define TXEN1_DISABLE   (GPIOC->BRR  = GPIO_Pin_14)
#define TXEN2_ENABLE    (GPIOC->BSRR = GPIO_Pin_15)
#define TXEN2_DISABLE   (GPIOC->BRR  = GPIO_Pin_15)
#define TXEN3_ENABLE    (GPIOC->BSRR = GPIO_Pin_12)
#define TXEN3_DISABLE   (GPIOC->BRR  = GPIO_Pin_12)

#define UART1_TX_START  {if(txen1_use) TXEN1_ENABLE;   \
                            USART_ITConfig(USART1, USART_IT_TXE, ENABLE);}
#define UART2_TX_START  {if(txen2_use) TXEN2_ENABLE;   \
                            USART_ITConfig(USART2, USART_IT_TXE, ENABLE);}
#define UART3_TX_START  {if(txen3_use) TXEN3_ENABLE;   \
                            USART_ITConfig(USART3, USART_IT_TXE, ENABLE);}

#define	UART_TX_BUF_SIZE    0x100
#define	UART_RX_BUF_SIZE    0x100

#define UART1_TX_POS_MASK (uart1_tx_pos &= 0xff)
#define UART1_TX_END_MASK (uart1_tx_end &= 0xff)
#define UART1_RX_POS_MASK (uart1_rx_pos &= 0xff)
#define UART1_RX_END_MASK (uart1_rx_end &= 0xff)

#define UART2_TX_POS_MASK (uart2_tx_pos &= 0xff)
#define UART2_TX_END_MASK (uart2_tx_end &= 0xff)
#define UART2_RX_POS_MASK (uart2_rx_pos &= 0xff)
#define UART2_RX_END_MASK (uart2_rx_end &= 0xff)

#define UART3_TX_POS_MASK (uart3_tx_pos &= 0xff)
#define UART3_TX_END_MASK (uart3_tx_end &= 0xff)
#define UART3_RX_POS_MASK (uart3_rx_pos &= 0xff)
#define UART3_RX_END_MASK (uart3_rx_end &= 0xff)

void init_uart(u8 uart, u32 bps, u8 txen);
void uart1_putc_p(char c);
void uart2_putc_p(char c);
void uart3_putc_p(char c);
void uart1_puts_p(char *p);
void uart2_puts_p(char *p);
void uart3_puts_p(char *p);
void uart1_printf_p(const char *fmt,...);
void uart2_printf_p(const char *fmt,...);
void uart3_printf_p(const char *fmt,...);

void uart1_putc(char c);
void uart2_putc(char c);
void uart3_putc(char c);
void uart1_puts(char *p);
void uart2_puts(char *p);
void uart3_puts(char *p);
void uart1_printf(const char *fmt,...);
void uart2_printf(const char *fmt,...);
void uart3_printf(const char *fmt,...);

u8 uart1_rx_ready(void);
u8 uart2_rx_ready(void);
u8 uart3_rx_ready(void);

#endif /* __UART_H */
