/**************************************************************************//**
 * @item     CosyOS-III 例程（系统构建）
 * @file     demo_debug_fwl.c
 * @brief    例程-DEBUG for STM32 use Standard Peripheric Driver
 * @author   迟凯峰
 * @version  V1.0.2
 * @date     2026.06.28
 ******************************************************************************/

#if 1 /* 编译开关 */ \
 && defined (USE_STDPERIPH_DRIVER)

#include "CosyOS.H"
#if (SYSCFG_DEBUGGING == __ENABLED__)

/*
 * 用户定义
 */

/*-------------------------------------------------------------*
 | DEBUG_MODE | 输出（UART SEND）| 输入（UART RECV）| 推荐等级 |
 |------------+------------------+------------------+----------|
 | 0          | printf（查询）   | 串口接收中断     | *        |
 |------------+------------------+------------------+----------|
 | 1          | 串口发送中断     | 串口接收中断     | ***      |
 *-------------------------------------------------------------*/
#define DEBUG_MODE          0

/* DEBUG RECV 缓存SIZE */
#define DEBUG_RECV_BUFF     32

////////////////////////////////////////////////////////////////////////////////

// 1、例程中使用了UART1做为DEBUG专用串口，用户如需更换其它串口请自行调整。
// 2、下方的DEBUG配置函数 Debug_Config()，不能够取代基本的串口初始化工作，
//    用户在main函数中，在调用该函数之前，需先行初始化串口。

////////////////////////////////////////////////////////////////////////////////

#if   (__CORTEX_M == 0)
#include "stm32f0xx_usart.h"
#elif (__CORTEX_M == 3)
#include "stm32f10x_usart.h"
#elif (__CORTEX_M == 4)
#include "stm32f4xx_usart.h"
#elif (__CORTEX_M == 7)
#include "stm32h7xx_usart.h"
#endif
static char  u_debug_recv_buff[DEBUG_RECV_BUFF];
static char *u_debug_recv_p = u_debug_recv_buff;
#if   (DEBUG_MODE == 0)
#include <stdio.h>
#elif (DEBUG_MODE == 1)
static char *u_debug_send_p;
#endif

void Debug_Config(void)
{
    #if   (DEBUG_MODE == 0)
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    
    #elif (DEBUG_MODE == 1)
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    #endif
}

#if (SYSCFG_DEBUG_SENDLEN == __DISABLED__)
void debug_hook(char _XDATA_MEM_ *p)
#else
void debug_hook(char _XDATA_MEM_ *p, s_u16_t len)
#endif
{
    #if   (DEBUG_MODE == 0)
    printf("%s", p);
    xDebugSend_Complete();
    
    #elif (DEBUG_MODE == 1)
    u_debug_send_p = p;
    USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
    #endif
}

void USART1_IRQHandler(void)
{
    #if   (DEBUG_MODE == 1)
    if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET){
        if(*u_debug_send_p){
            USART_SendData(USART1, *u_debug_send_p++);
        }
        else{
            USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
            xDebugSend_Complete();
        }
    }
    #endif
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
        if(u_debug_recv_p - u_debug_recv_buff < DEBUG_RECV_BUFF - 1){
            *u_debug_recv_p = USART_ReceiveData(USART1);
            if(*u_debug_recv_p++ == '\n'){
                xDebugRecv_Handler(u_debug_recv_buff, u_debug_recv_p - u_debug_recv_buff);
                u_debug_recv_p = u_debug_recv_buff;
            }
        }
        else{
            u_debug_recv_p = u_debug_recv_buff;
        }
    }
}

#endif

#endif
