/**
 ******************************************************************************
 * @文件     main.c
 * @作者     阜阳师范大学物电学院
 * @版本     V0.1
 * @日期     2026-01-15
 * @简介     DTU 屏幕按键部分的驱动程序
 ******************************************************************************
 **/

#include "main.h"

#define TIMER                               5                                    /* 定时器定时时间 */
#define LED_TOGGLE_TIME                     1000                                 /* 系统运行指示灯闪烁时间，也就是亮的时间*/  

volatile static uint32_t sysRunTime = 0;                                         /* 系统运行时间计数器 */
volatile static  uint8_t LED_ToggleFlag = 0;                                     /* LED闪烁定时标志位 */
static KEY_TYPE keyStatus = KEY_NONE;                                            /* 按键状态指示 */
static uint8_t ConnectFlg = 0;                                                          /**< 连接标志：0x01=已连接，0x00=未连接 */

/**
 * @brief 按键业务逻辑回调函数
 * @param key_type 按键类型
 */
static void Key_ProcessCallback(KEY_TYPE key_type)
{
//    IntValue_Printf(2,  32, key_type, RESET);
    BackLight_ON();           /* 任意按键按下，都打开背光 */
    keyStatus = key_type;     /* 更新按键状态 */
}
 

int main(void)
{
    HAL_Init();                              /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);      /* 设置时钟, 72Mhz */
    delay_init(72);                          /* 延时初始化 */
    LED_Init();                              /* LED灯初始化 */
    Key_Init();                              /* 初始化按键驱动 */
    WDog_Init();                             /* 看门狗初始化 */
    RS485_DMA_init();                        /* Rs485初始化 */
    LcdInit();
    Process_Init();                            /* 通信任务初始化 */
    NL_LOGO_Printf();                          /* 显示存储的LOGO */
    gtim_timx_int_init(50-1, 7200-1);        /* 定时5毫秒 */
    // 注册按键业务逻辑回调函数
    Key_RegisterCallback(Key_ProcessCallback); /* 注册按键回调函数 */
    while(1)
    { 
        if(ConnectFlg == 1)
        {
            /* 指示灯闪烁 */  
            if(LED_ToggleFlag == 1)
            {
                LED_ToggleFlag = 0;
                LED_Toggle(LED_RUN);
            }
        }
        ConnectFlg = RS485_Process(keyStatus, ConnectFlg);
        keyStatus = KEY_NONE;
        
        /*系统运行超过一定时间立即复位重启*/
        if(sysRunTime > 1000000)  
        {
            HAL_NVIC_SystemReset();   /* 系统立即复位 */
            sysRunTime = 0;
        }  
    }
}

/**
* @brief       定时器中断服务函数
 * @param      无
 * @retval      无
 */
void GTIM_TIMX_INT_IRQHandler(void)
{
    /*直接通过判断中断标志位来处理中断 */
    if(__HAL_TIM_GET_FLAG(&g_timx_handle, TIM_FLAG_UPDATE) != RESET)
    {
        sysRunTime++;
        if(sysRunTime % (LED_TOGGLE_TIME / 5) == 0)
        {
            LED_ToggleFlag = 1;
        }
        Button_Ticks();          /* 按键检测 */
        Clear_Watchdog();        /* 看门狗喂狗 */
        BackLight_Close();       /* 背光关闭检测 */
        Process_Count();         /* 通信任务处理计数器 */
    }
    __HAL_TIM_CLEAR_IT(&g_timx_handle, TIM_IT_UPDATE);  /* 清楚定时器溢出中断 */
}



