
#include "abnormalManage.h"
#include "parameter.h"
#include "capture.h"
#include "checkTime.h"
#include "FM_GPIO.h"
#include "task.h"



/* 软件输出过载标志位 */
static BOOL disChargOverLoad = FALSE;

/* 短路标志位 */
static uint8_t shortCircuit = 0;
static BOOL shortCircuitFlag = FALSE;

/* 硬件过载状态位 */
static uint8_t excessiveLoad = 0;
static BOOL excessiveLoadFlag = FALSE;


/**
  * @brief  设定放电过载状态
  * @param  state   TRUE 过载
  *                 FALSE 未过载
  * @retval
  *
  */
void setDisChargOverLoad(void)
{
    if (getDischargCurrent() > 30.0f) {
        disChargOverLoad = TRUE;
    } else {
        disChargOverLoad = FALSE;
    }
}

/**
  * @brief  得到放电过载状态
  * @param
  * @retval
  *
  */
BOOL getChargOverLoad(void)
{
    return disChargOverLoad;
}

/**
  * @brief  设置短路状态位
  * @param  
  * @retval
  *
  */
void setShortCircuit(void)
{
    shortCircuit++;
}

/**
  * @brief  清零短路状位
  * @param  
  * @retval
  *
  */
void zeroShortCircuit(void)
{
    shortCircuit = 0;
}

/**
  * @brief  得到短路状位
  * @param  
  * @retval
  *
  */
uint8_t getShortCircuit(void)
{
    return shortCircuit;
}

/**
  * @brief  设定短路标志位
  * @param  state   TRUE    短路
  *                 FALSE 未短路
  * @retval
  *
  */
void setShortCircuitFlag(BOOL state)
{
    if (state == TRUE || state == FALSE) {
        shortCircuitFlag = state;
    }
    
}

/**
  * @brief  得到短路标志位
  * @param
  * @retval
  *
  */
BOOL getShortCircuitFlag(void)
{
    return shortCircuitFlag;
}

/**
  * @brief  设置硬件过载状态位
  * @param  
  * @retval
  *
  */
void setExcessiveLoad(void)
{
    excessiveLoad++;
}

/**
  * @brief  清零硬件过载状态位
  * @param  
  * @retval
  *
  */
void zeroExcessiveLoad(void)
{
    excessiveLoad = 0;
}

/**
  * @brief 得到硬件过载状态位
  * @param  
  * @retval
  *
  */
uint8_t getExcessiveLoad(void)
{
    return excessiveLoad;
}

/**
  * @brief  设定硬件过载标志位
  * @param  state   TRUE    过载
  *                 FALSE 未过载
  * @retval
  *
  */
void setExcessiveLoadFlag(BOOL state)
{
    if (state == TRUE || state == FALSE) {
        excessiveLoadFlag = state;
    }
    
}

/**
  * @brief  得到硬件过载标志位
  * @param
  * @retval
  *
  */
BOOL getExcessiveLoadFlag(void)
{
    return excessiveLoadFlag;
}

/**
  * @brief  设置输出状态
  * @param  
  * @retval
  *
  */
 void setPowerOutput(BOOL state)
{
    if (state == TRUE) {
        POW_FF_PCON_Open();
        POW_OUT_PCON_Open();
    } else {
        POW_FF_PCON_Close();
        POW_OUT_PCON_Close();
    }
}


/**
  * @brief  判断是否打开充电理想二极管
  * @param
  * @retval
  *
  */
void checkFFMOS_CON(void)
{
    if (get_CHG_CURR() > 2.0f) {
        FFMOS_CON_Open();
    }
    else if (get_CHG_CURR() < 1.0f) {
        FFMOS_CON_Close();
    }
}




void checkAbnormal(void)
{
    // checkTimeInit();
    /* 滤波 */
    adcCaptureFir();
    
    /* 转换 */
    setChargCurrent();
    setDischargCurrent();
    setOutputVoltage();
    setSolarInCircuitVoltage();

    /* 判断 */
    checkFFMOS_CON();
    setDisChargOverLoad();
    


    // checkAbnormalTime = getCheckTime();
}

/**
  * @brief  工作电压异常中断，过载（输入大于输出）
  * @param  
  * @retval
  *
  */
void WORK_VOLT_Interrupt(void)
{
    setExcessiveLoad();
    /* 第一次进入输出过载，启动过载保护任务 */ 
    if (getExcessiveLoad() == 1) {
        setExcessiveLoadFlag(TRUE);
        startExcessiveLoadProtection();
    }

    /* 多次进入输出过载，关闭输出 */ 
    if (getExcessiveLoad() > 2) {
        zeroExcessiveLoad();
        setPowerOutput(FALSE);
    }
}

/**
  * @brief  短路中断，输出电流大于一定值
  * @param  
  * @retval
  *
  */
void DSG_PROT_Interrupt(void)
{
    setShortCircuit();
    /* 第一次进入输出短路，启动短路任务 */
    if (getShortCircuit() == 1) {
        setShortCircuitFlag(TRUE);
        startShortCircuitProtection();
    } 

    /* 一定时间内第二次进入输出短路保护，关闭输出 */
    else if (getShortCircuit() >= 2) {
        stopShortCircuitProtection();
        setPowerOutput(FALSE);
        zeroShortCircuit();
    }
}







