/**
************************************************************************************************
* @文件    : uart1.c
* @作者    : 樊春春
* @版本    : V1.0
* @时间    : 2022/05/31 20:20:39
* @邮箱    : fanchcho@gmail.com
* @说明    : uart1底层驱动,待修复
************************************************************************************************
**/
#include "uart1.h"
#include "queue.h"

static uint8_t uart1_tx_buf[UART1_TX_LEN]  = {0};
static uint8_t uart1_rx_buf[UART1_REC_LEN] = {0};

__IO uint8_t rx_index = 0x00;

__IO uint8_t tx_index = 0x00;

__IO uint8_t TimeOut = 0x00;

//  重定义fputc函数
#ifdef __GNUC__

int _write(int fd, char *buffer, int size)
{
    /* 写一个字节到USART1 */
    for (int i = 0; i < size; i++)
    {
        USART_SendData(USART1, buffer[i]);
        /* 等待发送结束 */
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
            ;
    }

    return size;
}
int _read(int fd, char *buffer, int size)
{

    for (int i = 0; i < size; i++)
    {
        /* 等待串口1输入数据 */
        while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
            ;
        buffer[i] = USART_ReceiveData(USART1);
    }
    return size;
}
// int _write(int fd, char *buffer, int size)
// {
//     uart1_dma_send((uint8_t *)buffer, size);
//     while (USART_GetITStatus(USART1, USART_IT_TC) != RESET)
//         ;
//     return size;
// }

// int _read(int fd, char *buffer, int size)
// {

//     /* 等待串口1输入数据 */
//     while (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
//         ;
//     // uint8_t err = 0;
//     // UartFrame_TypeDef *msg;

//     // msg = (UartFrame_TypeDef *)OSMboxPend(uart1_mbox, 50, &err);
//     // return msg->len;
//     return (int)USART_ReceiveData(USART1);
// }

#endif

void uart1_nvic_config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    // Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel                   = USART1_IRQn; //串口1中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;           //抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;           //子优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;      // IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);                                     //根据指定的参数初始化VIC寄存器
}

void uart1_config(void)
{
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate            = 115200;                         //波特率设置
    USART_InitStructure.USART_WordLength          = USART_WordLength_8b;            //字长为8位数据格式
    USART_InitStructure.USART_StopBits            = USART_StopBits_1;               //一个停止位
    USART_InitStructure.USART_Parity              = USART_Parity_No;                //无奇偶校验位
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制
    USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;  //收发模式
    USART_Init(USART1, &USART_InitStructure);                                       //初始化串口1

    USART_Cmd(USART1, ENABLE); //使能串口1
}

void uart1_init(void)
{
    uart1_config();
    uart1_nvic_config();

    /* CPU的小缺陷：串口配置好，如果直接Send，则第1个字节发送不出去
    如下语句解决第1个字节无法正确发送出去的问题 */
    USART_ClearFlag(USART1, USART_FLAG_TC);
}

void USART1_IRQHandler(void)
{
    /* 处理接收中断 */
    if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
    {
        if (rx_index < UART1_REC_LEN)
        {
            /* 接收数据 */
            uart1_rx_buf[rx_index++] = USART_ReceiveData(USART1);
        }
        else
        {
            /* 禁止接收中断 */
            USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
        }
    }
    /* 处理发送缓冲区空中断 */
    if (USART_GetITStatus(USART1, USART_IT_TXE) == SET)

    {
        if (tx_index < UART1_TX_LEN)
        {
            /* 发送数据 */
            USART_SendData(USART1, uart1_tx_buf[tx_index++]);
        }
        else
        {
            /* 禁止发送缓冲区空中断 */
            USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
        }
    }
}