/**
    @copyright None
    @file      GPIO.c
    @author    Comment Vivre
    @date      2025-11-03
    @brief     None
*/
#include <Myproject.h>

/**
    @function     GPIO_Init
    @brief        IO初始化
    @date         2025-11-01
*/
void GPIO_Init(void)
{
    // LED上拉 低电平点亮
    SetBit(P0_OE, P03);
    SetBit(P0_PU, P03);
    GP03 = 1;
    // 主电源继电器驱动 高使能
    SetBit(P5_OE, P51);
    SetBit(P5_PU, P51);
    GP51 = 0;
    // 预驱复位控制 低复位
    SetBit(P0_OE, P04);
    SetBit(P0_PU, P04);
    GP04 = 0;
}


/**
    @function     PreDriver_Falut_Init
    @brief        预驱故障中断
    @date         2025-10-31
*/
void PreDriver_Falut_Init(void)
{
    // 关闭输出 配置上拉
    ClrBit(P0_OE, PIN2);
    SetBit(P0_PU, PIN2);
    // 中断源配置为P02
    SetReg(LVSR, EXT0CFG0 | EXT0CFG1 | EXT0CFG2, EXT0CFG1);
    // 清除中断标志位
    IF0 = 0;
    // 配置为下降沿触发
    IT01 = 0;
    IT00 = 1;
    // 中断触发时自动关闭MOE
    SetBit(EVT_FILT, INT0_MOE_EN);
    // 不滤波
    ClrBit(EVT_FILT, EFDIV0 | EFDIV1);
    // 配置中断优先级为最高
    SetBit(IP0, PX00 | PX01);
    // 外部中断0使能
    EX0 = 1;
}

LED_Control_t ledControl = { LED_STATE_OFF, 0, 0 };

/**
    @function     LED_State_Display
    @brief        指示运行与故障代码
    @param[in]    Xn0: [输入/出] 故障代码
    @date         2025-05-30
*/
void LED_State_Display(uint8_t Xn0)
{
    switch (ledControl.LedState)
    {
        // 关闭状态
        case LED_STATE_OFF:
        
            // 存在故障 切入故障状态 清零计数
            if (Xn0)
            {
                ledControl.LedState = LED_STATE_BLINK_FAULT;
                ledControl.PauseDelayCnt = 0;
                ledControl.BlinkCnt = 0;
            }
            // 开启状态且无故障 切入开启状态并打开LED
            else if (isCtrlPowOn)
            {
                ledControl.LedState = LED_STATE_ON;
                LED_ON;
            }
            
            break;
            
        // 开启状态
        case LED_STATE_ON:
        
            // 故障或停止时 关闭LED并切回关闭状态
            if (!isCtrlPowOn || Xn0)
            {
                ledControl.LedState = LED_STATE_OFF;
                LED_OFF;
            }
            
            break;
            
        // 故障指示状态
        case LED_STATE_BLINK_FAULT:
            ledControl.PauseDelayCnt ++;
            
            // 延时等待
            if (ledControl.PauseDelayCnt >= 500)
            {
                ledControl.PauseDelayCnt = 0;
                LED_TOGGLE;
                
                // 灭灯时计数
                if (LED_OFF_STATE)
                {
                    ledControl.BlinkCnt ++;
                    
                    // 完成一个周期的闪烁 切换到延时等待模式
                    if (ledControl.BlinkCnt >= Xn0)
                    { ledControl.LedState = LED_STATE_POST_FAULT_DELAY; }
                }
            }
            
            // 故障清除后 立刻回到熄灭状态
            if (!Xn0)
            {
                LED_OFF;
                ledControl.LedState = LED_STATE_OFF;
            }
            
            break;
            
        // 延迟等待
        case LED_STATE_POST_FAULT_DELAY:
            ledControl.PauseDelayCnt ++;
            
            // 延时满足或故障清除回到关闭状态
            if ((ledControl.PauseDelayCnt >= 1000) || (!Xn0))
            { ledControl.LedState = LED_STATE_OFF; }
            
            break;
    }
}

volatile Power_Control_t powerControl = {DELAY_POWER_ON, 0};

/**
    @function     Power_In_Control
    @brief        上电控制与预驱复位控制
    @date         2025-11-01
*/
void Power_In_Control(void)
{
    switch (powerControl.PowerSate)
    {
        case DELAY_POWER_ON:
        {
            powerControl.PowerInCnt ++;
            
            if (powerControl.PowerInCnt > 1000)
            {
                // 继电器上电
                MAIN_RELAY = 1;
                powerControl.PowerInCnt = 0;
                powerControl.PowerSate = DELAY_FREE_RST;
            }
            
            break;
        }
        
        case DELAY_FREE_RST:
        {
            powerControl.PowerInCnt ++;
            
            if (powerControl.PowerInCnt > 500)
            {
                powerControl.PowerInCnt = 0;
                powerControl.PowerSate = POWER_RUN;
            }
            
            break;
        }
        
        case POWER_RUN:
        {
            if (mcFaultSource == FaultNoSource)
            { PRE_DRIVER_RST = 1;  }
        }
    }
}

/*Value--定时时间，单位ms，最小定时时间8ms，最大定时1800ms*/
void WatchDogConfig(uint32 value, uint8 Status)
{
    SetReg(CCFG1, WDT_EN, (Status ? WDT_EN : 0x00));
    WDT_ARR = ((uint16)(65532 - value * 32768 / 1000) >> 8);
    ClrBit(WDT_CR, WDTF);
    SetBit(WDT_CR, WDTRF);
}

