#include "sr_sunrise.h"

SR_AT_MNG_T *atServerObj = SR_NULL;

static SR_DEVICE_T *uart_1;
static int g_uartRecvFlag = 0;
static char recvBuf[48] = {0};
static uint32_t recvLen = 0;

// 串口事件回调
static void Uart1Callback(SR_DEVICE_T *dev, SR_UART_EVENT_E event, uint32_t size, void *args)
{
    int ret = 0;
    switch (event)
    {
    case SR_UART_EVT_RXNE:

        // 读取收到的数据
        ret = SR_HalUartRead(dev, recvBuf, size);
        recvBuf[size] = 0;

        if (ret > 0)
        {
            g_uartRecvFlag = 1;
            recvLen = ret;
        }
        BSP_LOG(INFO,"uart recv data = %s\n", recvBuf);
        SR_AtSendToServer(atServerObj, recvBuf, sizeof(recvBuf));

        break;
    }
}

int at_server_response(char *string, uint16_t size)
{
    SR_HalUartWrite(uart_1, string, size);
    return 0;
}

int at_exit(SR_AT_OPT_E opt, int argc, char *argv[])
{
    if (opt == SR_AT_OPT_EXECUTE)
    {
        BSP_LOG(INFO,"AT+EXIT\n");
        return 0;
    }

    return -1;
}
int at(SR_AT_OPT_E opt, int argc, char *argv[])
{
    if (opt == SR_AT_OPT_EXECUTE)
    {
        BSP_LOG(INFO,"AT\n");
        return 0;
    }

    return -1;
}

SR_AT_CMD_T at_cmd_table[] = {
    {"AT", at},
    {"AT+EXIT", at_exit},
};

static void AtThread(void *arg)
{
    SR_UART_CFG_T config = SR_UART_CFG_DEFAULT; // 初始默认配置

    // 获取设备句柄
    uart_1 = SR_HalUartOpen(SR_UART1);

    // 参数配置
    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(uart_1, &config); // 属性配置

    // 注册回调
    SR_HalUartSetCb(uart_1, Uart1Callback, SR_NULL);

    atServerObj = SR_AtServerCreate();

    SR_AtCmdTableRegister(atServerObj, at_cmd_table, sizeof(at_cmd_table) / sizeof(SR_AT_CMD_T));
    SR_AtServerSetResponseFun(atServerObj, at_server_response);

    while (1)
    {
        osDelay(1000);
    }

    SR_AtServerDestroy(atServerObj);
    osThreadExit();
}

int at_example(int argc, char *argv[])
{

    osThreadId_t atThreadId;

    gShellThreadRun = 1;

    // 使用默认参数
    atThreadId = osThreadNew(AtThread, SR_NULL, SR_NULL);
    return 0;
}
SR_SHELL_CMD_EXPORT(at_example, at_example);