#include <rtthread.h>
#include "bsp_usart.h"
#define SAMPLE_UART_NAME       "uart1"

/* 用于接收消息的信号量 */
static struct rt_semaphore rx_sem;
static rt_device_t serial;
uint8_t GPS_TransferCount=0;
extern  uint8_t GPS_TransferEnd ;
extern  uint8_t GPS_HalfTransferEnd;

/* 接收数据回调函数 */
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
    /* 串口接收到数据后产生中断，调用此回调函数，然后发送接收信号量 */
    rt_sem_release(&rx_sem);

    return RT_EOK;
}

static void serial_thread_entry(void *parameter)
{
    char ch;

    while (1)
    {
        /* 从串口读取一个字节的数据，没有读取到则等待接收信号量 */
        while (rt_device_read(serial, -1, &ch, 1) != 1)
        {
            /* 阻塞等待接收信号量，等到信号量后再次读取数据 */
            rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
            GPS_TransferCount = GPS_TransferCount + 1;
        }
        /* 读取到的数据通过串口错位输出 */
//        ch = ch + 1;
//        rt_device_write(serial, 0, &ch, 1);
    }
}

static int uart_sample(int argc, char *argv[])
{
    rt_err_t ret = RT_EOK;
    char uart_name[RT_NAME_MAX];
    char str[] = "hello RT-Thread!\r\n";

    if (argc == 2)
    {
        rt_strncpy(uart_name, argv[1], RT_NAME_MAX);
    }
    else
    {
        rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);
    }

    /* 查找系统中的串口设备 */
    serial = rt_device_find(uart_name);
    if (!serial)
    {
        rt_kprintf("find %s failed!\n", uart_name);
        return RT_ERROR;
    }

    /* 初始化信号量 */
    rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
    /* 以中断接收及轮询发送模式打开串口设备 */
    rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
    /* 设置接收回调函数 */
    rt_device_set_rx_indicate(serial, uart_input);
    /* 发送字符串 */
    rt_device_write(serial, 0, str, (sizeof(str) - 1));

    /* 创建 serial 线程 */
    rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
    /* 创建成功则启动线程 */
    if (thread != RT_NULL)
    {
        rt_thread_startup(thread);
    }
    else
    {
        ret = RT_ERROR;
    }

    return ret;
}


//int rt_hw_usart_init(void)
//{
//    rt_size_t obj_num = 8;
//    struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
//    rt_err_t result = 0;
//
//    rt_hw_interrupt_install(IRQ_UART0_2_VECTOR, uart_isr, RT_NULL, "ut_isr");
//
//    for (int i = 0; i < obj_num; i++)
//    {
//        /* init UART object */
//        uart_obj[i].config          = &uart_config_all;
//        uart_obj[i].rx_idx          = 0;
//        uart_obj[i].rx_idx_prev     = 0;
//        uart_obj[i].serial.ops      = &ab32_uart_ops;
//        uart_obj[i].serial.config   = config;
//        uart_obj[i].serial.config.baud_rate = 1500000;
//        uart_obj[i].rx_buf          = rt_malloc(uart_config_all.fifo_size);
//
//        if (uart_obj[i].rx_buf == RT_NULL) {
//            LOG_E("uart%d malloc failed!", i);
//            continue;
//        }
//        //如果是串口1，修改波特率位115200
//        if (i == 1)
//        {
//            uart_obj[i].serial.config.baud_rate = 9600;
//        }
//        //------------------
//        /* register UART device */
//        result = rt_hw_serial_register(&uart_obj[i].serial, uart_obj[i].config->name,
//                                       RT_DEVICE_FLAG_RDWR
//                                       | RT_DEVICE_FLAG_INT_RX
//                                       | RT_DEVICE_FLAG_INT_TX
//                                       | uart_obj[i].uart_dma_flag
//                                       , RT_NULL);
//        RT_ASSERT(result == RT_EOK);
//    }
//
//    return result;
//}


