#ifndef __UART_H
#define __UART_H
#include "stdint.h"
#include "stm32f4xx.h"

#pragma pack(0)
typedef struct
{
    USART_TypeDef *usart_periph;
    uint8_t       *tx_buf;
    uint16_t       tx_buf_size;
    uint16_t       tx_rd;
    uint16_t       tx_wr;
    uint16_t       tx_err;
    uint8_t       *rx_buf;
    uint16_t       rx_buf_size;
    uint16_t       rx_rd;
    uint16_t       rx_wr;
    uint16_t       rx_err;
    void (*config)(void);
    void (*deconfig)(void);
} usart_context_t;
#pragma pack()

void    usart_config_init(usart_context_t *p_usart_content, uint32_t band_rate);
void    usart_config_deinit(usart_context_t *p_usart_content);
void    usart_send_it(usart_context_t *p_usart_content, const void *_send_buf, const uint16_t send_count);
void    usart_wait_send_finished(usart_context_t *p_usart_content);
int32_t usart_read_until_char(usart_context_t *p_usart_content, char c);
int32_t usart_read_until_mem(usart_context_t *p_usart_content, char *mem, int len);
int32_t usart_read_ble_format(usart_context_t *p_usart_content);
int32_t usart_read_update(usart_context_t *p_usart_content, int rlen, char *data);
int32_t usart_read_drop(usart_context_t *p_usart_content);
void    usart_it(usart_context_t *p_usart_content);
int     usart_receive_read(usart_context_t *p_usart_context, void *_receive_buf, const int receive_count);
void    usart_printf(usart_context_t *p_usart_context, char *args, ...);
void    u_tm_log(char *args, ...);
void    u_log(char *arg, ...);

extern usart_context_t usart1_context;
extern usart_context_t usart2_context;
extern usart_context_t usart3_context;
#endif
