#include "FM_GPIO.h"

#include "uart_dev.h"

void FM_GPIO_Init(void)
{
    HD_GPIO_Init();
}

/**
  * @brief  打开输出防反mos管
  * @param  None
  * @retval None
  */
void POW_FF_PCON_Open(void)
{
    HAL_GPIO_WritePin(POW_FF_CON_GPIO_Port, POW_FF_CON_Pin, GPIO_PIN_SET);
}

/**
  * @brief  关闭输出防反mos管
  * @param  None
  * @retval None
  */
void POW_FF_PCON_Close(void)
{
    HAL_GPIO_WritePin(POW_FF_CON_GPIO_Port, POW_FF_CON_Pin, GPIO_PIN_RESET);
}

/**
  * @brief  打开输出mos管
  * @param  None
  * @retval None
  */
void POW_OUT_PCON_Open(void)
{
    HAL_GPIO_WritePin(POW_OUT_CON_GPIO_Port, POW_OUT_CON_Pin, GPIO_PIN_SET);
}

/**
  * @brief  关闭输出mos管
  * @param  None
  * @retval None
  */
void POW_OUT_PCON_Close(void)
{
    HAL_GPIO_WritePin(POW_OUT_CON_GPIO_Port, POW_OUT_CON_Pin, GPIO_PIN_RESET);
}

/**
  * @brief  读取输出控制引脚状态
  * @param  None
  * @retval TRUE    打开
  *         FALSE   关闭
  */
BOOL readPOW_OUT_PCON_State(void)
{
    if (HAL_GPIO_ReadPin(POW_OUT_CON_GPIO_Port, POW_OUT_CON_Pin)) {
        return TRUE;
    }
    
    return FALSE;
}

/**
  * @brief  打开LED灯
  * @param  None
  * @retval None
  */
void RUN_LEN_Open(void)
{
    HAL_GPIO_WritePin(RUN_LED_GPIO_Port, RUN_LED_Pin, GPIO_PIN_SET);
}

/**
  * @brief  关闭LED灯
  * @param  None
  * @retval None
  */
void RUN_LEN_Close(void)
{
    HAL_GPIO_WritePin(RUN_LED_GPIO_Port, RUN_LED_Pin, GPIO_PIN_RESET);
}

/**
  * @brief  翻转LED状态
  * @param  None
  * @retval None
  */
void RUN_LED(void)
{
    HAL_GPIO_TogglePin(RUN_LED_GPIO_Port, RUN_LED_Pin);
}

/**
  * @brief  打开mppt电感后的输出mos管
  * @param  None
  * @retval None
  */
BOOL FFMOS_CON_read(void)
{
    if (HAL_GPIO_ReadPin(FFMOS_CON_GPIO_Port, FFMOS_CON_Pin)) {
        return FALSE;
    }
    return TRUE;
}

/**
  * @brief  打开mppt电感后的输出mos管
  * @param  None
  * @retval None
  */
void FFMOS_CON_Open(void)
{
    HAL_GPIO_WritePin(FFMOS_CON_GPIO_Port, FFMOS_CON_Pin, GPIO_PIN_RESET);
}

/**
  * @brief  关闭mppt电感后的输出mos管
  * @param  None
  * @retval None
  */
void FFMOS_CON_Close(void)
{
    HAL_GPIO_WritePin(FFMOS_CON_GPIO_Port, FFMOS_CON_Pin, GPIO_PIN_SET);
}

/**
  * @brief  下桥的mos管使能pwm输出
  * @param  None
  * @retval None
  */
void EN_PWMOUT_Eable(void)
{
    HAL_GPIO_WritePin(EN_PWMOUT_GPIO_Port, EN_PWMOUT_Pin, GPIO_PIN_RESET);
}

/**
  * @brief  下桥的mos管关闭pwm输出
  * @param  None
  * @retval None
  */
void EN_PWMOUT_Diseable(void)
{
    HAL_GPIO_WritePin(EN_PWMOUT_GPIO_Port, EN_PWMOUT_Pin, GPIO_PIN_SET);
}

/**
  * @brief  喂狗
  * @param  None
  * @retval None
  */
void feedDog(void)
{
    HAL_GPIO_WritePin(WDI_INPUT_GPIO_Port, WDI_INPUT_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(WDI_INPUT_GPIO_Port, WDI_INPUT_Pin, GPIO_PIN_RESET);
}

/**
  * @brief  判断过流状态
  * @param  None
  * @retval 
  */
BOOL readOverCurrState(void)
{
    if (HAL_GPIO_ReadPin(DSG_PROT_GPIO_Port, DSG_PROT_Pin)) {
        return TRUE;
    }
    
    return FALSE;
}

/**
  * @brief  仅有充电控制器时,判断输出开关是否打开
  * @param  None
  * @retval None
  */
BOOL readOnlyPowerOutputState(void)
{
    // static volatile GPIO_PinState gpioTemp1, gpioTemp2, gpioTemp3;    
    GPIO_PinState gpioTemp1, gpioTemp2, gpioTemp3;

    gpioTemp1 = HAL_GPIO_ReadPin(POW_FF_CON_GPIO_Port, POW_FF_CON_Pin);
    gpioTemp2 = HAL_GPIO_ReadPin(POW_OUT_CON_GPIO_Port, POW_OUT_CON_Pin);
    gpioTemp3 = HAL_GPIO_ReadPin(DSG_PROT_GPIO_Port, DSG_PROT_Pin);

    if (gpioTemp1 == GPIO_PIN_SET
        && gpioTemp2 == GPIO_PIN_SET
        && gpioTemp3 == GPIO_PIN_SET) {
            return TRUE;
    }    

    // if (HAL_GPIO_ReadPin(POW_FF_CON_GPIO_Port, POW_FF_CON_Pin)
    //     && HAL_GPIO_ReadPin(POW_OUT_CON_GPIO_Port, POW_OUT_CON_Pin)
    //     && HAL_GPIO_ReadPin(DSG_PROT_GPIO_Port, DSG_PROT_Pin)) {
    //     return TRUE;
    // }

    return FALSE;
}

/**
  * @brief  带网关时,判断输出开关是否打开
  * @param  None
  * @retval None
  */
BOOL readOutputState(void)
{
    if (HAL_GPIO_ReadPin(POW_OUT_CON_GPIO_Port, POW_OUT_CON_Pin)
        && HAL_GPIO_ReadPin(DSG_PROT_GPIO_Port, DSG_PROT_Pin)) {
        return TRUE;
    }

    return FALSE;
}

/**
  * @brief  GPIO外部中断的回调函数
  * @param  GPIO_Pin    引发外部中断的引脚
  * @retval None
  */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == WORK_VOLT_INT_Pin) {
        WORK_VOLT_Interrupt();
    } 
    
    // else if (GPIO_Pin == DSG_PROT_Pin) {
    //     DSG_PROT_Interrupt();
    // }    
}