#include "uart_transfer.h"

u8 REC_STA;
u8 REC_BUFF[REC_BUF_MAX_LENGTH];

AT(.com_text.isr)
void uart2_isr(void)
{
    u8 data_buf;

    if (uart_get_flag(UART2, UART_FLAG_RX) != RESET)
    {
        uart_clear_flag(UART2, UART_FLAG_RX);
        data_buf = uart_receive_data(UART2);
        if ((REC_STA & REC_STA_FINISH_MASK) == RESET)
        {
            if (data_buf == '\n')
                    REC_STA |= REC_STA_FINISH_MASK;
            else
            {
                REC_BUFF[REC_STA & REC_STA_LEN_MASK] = data_buf;
                REC_STA++;
                if ((REC_STA & REC_STA_LEN_MASK) >= (REC_BUF_MAX_LENGTH - 1))      // 接收数据达到最大长度，强制结束
                    REC_STA |= REC_STA_LEN_MASK;
                }
        }
    }
}

void uart2_init(u32 baud)
{
    uart_init_typedef uart_init_struct;
    gpio_init_typedef gpio_init_structure;

    clock_gate1_cmd(CLOCK_GATE1_UART2, ENABLE);

    gpio_init_structure.gpio_pin = GPIO_PIN_1;
    gpio_init_structure.gpio_dir = GPIO_DIR_INPUT;
    gpio_init_structure.gpio_fen = GPIO_FEN_PER;
    gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
    gpio_init_structure.gpio_pupd = GPIO_PUPD_UP;
    gpio_init(GPIOB_REG, &gpio_init_structure);

    gpio_init_structure.gpio_pin = GPIO_PIN_2;
    gpio_init_structure.gpio_dir = GPIO_DIR_OUTPUT;
    gpio_init_structure.gpio_drv = GPIO_DRV_8MA;
    gpio_init(GPIOB_REG, &gpio_init_structure);

    gpio_func_mapping(UT2RXMAP_PB1);
    gpio_func_mapping(UT2TXMAP_PB2);

    uart_init_struct.baud = baud;
    uart_init_struct.mode = UART_SEND_MODE | UART_RW_MODE;
    uart_init_struct.work_len = UART_WORD_LENGTH_8b;
    uart_init_struct.stop_bits = UART_STOP_BIT_1BIT;
    uart_init_struct.one_line_enable = UART_SEPARATE;
    uart_init_struct.clock_source = UART_INC_CLOCK;
    uart_init_struct.inc_div = UART_INC_DIV2;
    uart_init(UART2, &uart_init_struct);

    uart_pic_config(UART2, uart2_isr, 0, UART_CON_RXIE, ENABLE);

    uart_cmd(UART2, ENABLE);
}
void uart0_init(u32 baud)
{
    uart_init_typedef uart_init_struct;
    gpio_init_typedef gpio_init_structure;

    clock_gate0_cmd(CLOCK_GATE0_UART0, ENABLE);
    uart_send_data(UART2, 0x01);
    uart_cmd(UART0, DISABLE);
    gpio_init_structure.gpio_pin = GPIO_PIN_4;
    gpio_init_structure.gpio_dir = GPIO_DIR_INPUT;
    gpio_init_structure.gpio_fen = GPIO_FEN_PER;
    gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
    gpio_init_structure.gpio_pupd = GPIO_PUPD_UP;
    gpio_init(GPIOB_REG, &gpio_init_structure);

    gpio_init_structure.gpio_pin = GPIO_PIN_3;
    gpio_init_structure.gpio_dir = GPIO_DIR_OUTPUT;
    gpio_init_structure.gpio_drv = GPIO_DRV_8MA;
    gpio_init(GPIOB_REG, &gpio_init_structure);

    gpio_func_mapping(UT0RXMAP_PB4);
    gpio_func_mapping(UT0TXMAP_PB3);
uart_send_data(UART2, 0x02);
    uart_init_struct.baud = baud;
    uart_init_struct.mode = UART_SEND_MODE | UART_RW_MODE;
    uart_init_struct.work_len = UART_WORD_LENGTH_8b;
    uart_init_struct.stop_bits = UART_STOP_BIT_1BIT;
    uart_init_struct.one_line_enable = UART_SEPARATE;
    uart_init_struct.clock_source = UART_INC_CLOCK;
    uart_init_struct.inc_div = UART_INC_DIV2;
    uart_init(UART0, &uart_init_struct);
uart_send_data(UART2, 0x03);
    uart_pic_config(UART0, uart2_isr, 0, UART_CON_RXIE, ENABLE);
uart_send_data(UART2, 0x04);
    uart_cmd(UART0, ENABLE);
    uart_send_data(UART2, 0x05);
}

void uart2_transfer_example(void)
{
    u8 len, i;

    if ((REC_STA & REC_STA_FINISH_MASK) != RESET) {
        len = (REC_STA & REC_STA_LEN_MASK);
        for (i = 0; i < len; i++) {
            uart_send_data(UART2, REC_BUFF[i]);
            while (uart_get_flag(UART2, UART_FLAG_TX) != SET);      //Query the sending flag and continue after the sending is completed
        }
        REC_STA = 0;
    #ifdef MY_PB3_uart0
        uart_send_data(UART2, len);
    #else
        printf("RX DATA[%d]: ", len);
        print_r(REC_BUFF, len);
    #endif // MY_PB3_uart0
    }
}
