#include "sr_sunrise.h"

#include <string.h>

#define TEST_UART_ID SR_UART1

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

#if 1
/*********************************************************************************************************
			uart使用示例-操作系统环境下
*********************************************************************************************************/
// 串口事件回调
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 UartExmp(int argc, char *argv[])
{
    char sendBuf[48] = "uart send\r\n";
    uint32_t tick = 0;
    int ret;
	
		SR_UART_ID_E uartId = TEST_UART_ID;  //默认
	
		if(argc >=2) uartId = (SR_UART_ID_E)atoi(argv[1]);

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

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

    gShellThreadRun = 1;

        // 参数配置
    config.baudrate = SR_UART_BAUD_115200;
    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));
        }

        osDelay(10);
    }

    return 0;
}
//将函数UartExmp映射为命令uartExmp
SR_SHELL_CMD_EXPORT(uartExmp, UartExmp);

#elif
/*********************************************************************************************************
			uart使用示例-裸机环境下
*********************************************************************************************************/

// 串口事件回调
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 SR_THD_RET _UartThdExmp(void *arg)
{
    char sendBuf[48] = "uart send\r\n";
    uint32_t tick = 0;
    int ret;
	
		SR_UART_ID_E uartId = TEST_UART_ID;  //默认
	
		if(argc >=2) uartId = (SR_UART_ID_E)atoi(argv[1]);

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

    // 获取设备句柄
    uartDev = SR_HalUartOpen(uartId);
    
	SR_GET_CT(); 				// 获取当前上下文
	SR_CT_BEGIN();			   // 上下文环境起始
        
    // 参数配置
    config.baudrate = SR_UART_BAUD_115200;
    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));
        }

        osDelay(10);
    }
    
    osThreadExit();         //退出线程    
	SR_CT_END(); 			// 上下文环境结束
}

static int UartExmp(int argc, char *argv[])
{
    osThreadId_t uartThread = SR_NULL;

    gShellThreadRun = 1;

    uartThread = osThreadNew(_UartThdExmp, SR_NULL, SR_NULL);

    return 0;
}
//将函数UartExmp映射为命令uartExmp
SR_SHELL_CMD_EXPORT(uartExmp, UartExmp);
#endif