/**
 *@file    sr_log.c
 *@brief   LOG组件
 *@details 提供打印、日志级别设置等基本功能的具体实现
 *@copyright Copyright (c) 2024 lierda. All rights reserved.
 *@author  Lierda-RDC
 *@date    2024-05-07
 *@example ZhaoyangSDK\example\component\log_example.c
 */

#include "sr_log.h"

#ifdef SR_USE_LOG

#include "sr_uart.h"
#include <stdarg.h>
#include <stdio.h>
#include <string.h>

#ifdef SR_USE_SHELL
#include "sr_shell.h"

#endif

// LOG输出等级
#ifdef SR_LOG_LEVEL_DEFAULT
static uint8_t gs_logLevel = SR_LOG_LEVEL_DEFAULT;
#else
static uint8_t gs_logLevel = INFO;
#endif

// LOG串口句柄
static SR_DEVICE_T *gs_logUart = SR_NULL;

char *g_levelColor[8] = {BLUE, CYAN, PURPLE, RED, YELLOW, BROWN, GREEN, GRAY};

void SR_LogSetLevel(SR_LOG_LVL_E level)
{
    gs_logLevel = level;
}

uint8_t SR_LogGetLevel(void)
{
	return gs_logLevel;
}

int _LogPrintf(uint8_t level, char *fmt, ...)
{

    char buf[SR_LOG_UART_TBUF_LEN] = {0};
    int len = 0;
    va_list va_args;

    if (level <= gs_logLevel)
    {
        // Start the va_args processing.
        va_start(va_args, fmt);

        len = vsnprintf((char *)buf, sizeof(buf), fmt, va_args);

        if (len < 0 || len >= sizeof(buf))
        {
            len = -1;
        }
        else
        {
#ifdef SR_LOG_PRINTF

#else
            // 将格式化后的字符串写入串口
            SR_HalUartWrite(gs_logUart, buf, len);

#endif
        }

        // End the va_args processing.
        va_end(va_args);
    }

    return len;
}

static void _LogUartCb(SR_DEVICE_T *dev, SR_UART_EVENT_E event, uint32_t size, void *args)
{

    char buf[SR_LOG_UART_RBUF_LEN] = {0};
    (void)args;

    switch (event)
    {
    case SR_UART_EVT_RXNE:
        SR_HalUartRead(dev, buf, size);
        // BSP_DEBUG_PRINTF("[dUart] recv[%d]: %s\n", size, buf);
#ifdef SR_USE_SHELL
        if (0x03 == buf[0]) gShellThreadRun = 0; // CTRL+C处理

        for (int i = 0; i < size; i++)
        {
            Write_RingBuff(buf[i]);
            // BSP_DEBUG_PRINTF("[rbuf] ret=%d len=%d\n", ret, RingbuffGetDataLen());
        }
#endif
        break;
    }
}

int SR_Printf(const char *fmt, ...)
{
    char buf[SR_LOG_UART_TBUF_LEN] = {0};
    int len = -1;
    va_list va_args;

    // Start the va_args processing.
    va_start(va_args, fmt);

    len = vsnprintf((char *)buf, sizeof(buf), fmt, va_args);

    if (len < 0 || len >= sizeof(buf))
    {
        len = -1;
    }
    else
    {
        // 将格式化后的字符串写入串口
        SR_HalUartWrite(gs_logUart, buf, len);
    }

    // End the va_args processing.
    va_end(va_args);

    return len;
}


void SR_LogUartInit(void)
{
    SR_UART_CFG_T config = SR_UART_CFG_DEFAULT;
    //char testStr[50] = "\r\nlog uart find and init\r\n";

    //UART初始化
    gs_logUart = SR_HalUartOpen(SR_LOG_UART_ID);
    if (SR_NULL != gs_logUart)
    {
        config.rxBufsz = SR_LOG_UART_RBUF_LEN;
        SR_HalUartConfig(gs_logUart, &config);
        SR_HalUartSetCb(gs_logUart, _LogUartCb, SR_NULL);

        //SR_HalUartWrite(gs_logUart, testStr, strlen(testStr));
    }

    SR_Printf("SR_Printf test\r\n");
}

int SR_LogUartWrite(uint8_t *buf, uint32_t len)
{
    return SR_HalUartWrite(gs_logUart, buf, len);
}

#endif
