#include "sr_shell.h"
#include "sr_log.h"

#include "sr_osal.h"
#include "sr_uart.h"


#include <string.h>

static SR_DEVICE_T *uartDev;
static int g_uartRxFlag = 0;
static uint32_t g_uartRxLen = 0;
static char recvBuf[48] = {0};


// 串口事件回调
static void UserUartCb(SR_DEVICE_T *dev, SR_UART_EVENT_E event, uint32_t size, void *args)
{
    switch (event)
    {
        case SR_UART_EVT_RXNE:
                g_uartRxFlag = 1;
                g_uartRxLen = size;
        break;
    }

}

static int N32UartTest(int argc, char *argv[])
{
    char sendBuf[48] = "uart send\r\n";
    uint32_t tick = 0;
    int ret;
	
    SR_UART_ID_E uartId = SR_UART4;  //默认

    if(argc >=2) uartId = (SR_UART_ID_E)atoi(argv[1]);

    gShellThreadRun =1;

    SR_UART_CFG_T config = SR_UART_CFG_DEFAULT; // 初始默认配置

    // 获取设备句柄
    uartDev = SR_HalUartOpen(uartId);

    // 参数配置
    config.baudrate = 9600;
    config.dataBits = SR_UART_DATA_BIT_8;
    config.parity = SR_UART_PARITY_NONE;
    config.stopBits = SR_UART_STOP_BIT_1;
    SR_HalUartConfig(uartDev, &config);

    // 注册回调
    SR_HalUartSetCb(uartDev, UserUartCb, 0);

    while (gShellThreadRun)
    {
        if (g_uartRxFlag == 1)
        {
            g_uartRxFlag = 0;

            // 读取收到的数据
            ret = SR_HalUartRead(uartDev, recvBuf, g_uartRxLen);
            if(ret >0) recvBuf[ret] = 0;

            // 打印收到的数据
            SR_HalUartWrite(uartDev, "recv: ", 6);
            SR_HalUartWrite(uartDev, recvBuf, g_uartRxLen);
            SR_HalUartWrite(uartDev, "\r\n", 2);
        }

        if (tick++ >= 500)
        {
            tick = 0;

            // 周期发送数据
            SR_HalUartWrite(uartDev, sendBuf, strlen(sendBuf));
        }

        SR_Delay(10);
    }
    
    // 关闭串口
    SR_HalUartClose(uartDev);

    return 0;
}
SR_SHELL_CMD_EXPORT(n32Uart, N32UartTest);

