#include "kit_debug.h"

#include "dido_manager.h"
#include "fault_manager.h"
#include "signal_manager.h"
#include "flash_manager.h"
#include "eeprom_manager.h"
#include "run_status.h"

typedef struct
{
    uint16_t step;
    uint16_t dly;
}DiParamItem;

DiParamItem di_param_item[kDiType_End];


//辅助触点1
void ord_di_do_feedback_func(uint32_t base_time, DiStatus di_signal, DiType di)
{
    if(di < kDiType_End)
    {
        if(bms_get_do_status_by_idx(di - kDiType_Do1Feedback) != di_signal)
        {
            di_param_item[di].dly += base_time;
            if(di_param_item[di].dly >= 5000)
            {
                bms_set_fault_level(kFaultCode_Feedback, kFaultLevel_First, kFaultHandle_AlarmIdx);
            }
        }
        else
        {
            di_param_item[di].dly = 0;
        }
    }
}

//消防火警 报故障，断继电器
void ord_di_fire_alarm1_func(uint32_t base_time, DiStatus di_signal, DiType di)
{
	if((di < kDiType_End) && (di_signal == kDiStatus_Trigger))
	{
        di_param_item[di].dly += base_time;
        bms_set_fault_level(kFaultCode_Fire, kFaultLevel_Third, kFaultHandle_CutNoRelIdx);
	}
}


//急停信号
void ord_di_emerge_stop_func(uint32_t base_time, DiStatus di_signal, DiType di)
{
	if(di_signal == kDiStatus_Trigger)
	{
        bms_set_fault_level(kFaultCode_Stop, kFaultLevel_Third, kFaultHandle_CutNoRelIdx);
	}
}	


//自锁信号-解除休眠
void ord_di_self_lock_func(uint32_t base_time, DiStatus di_signal, DiType di)
{
	bool is_lock_enable_off = false;
	if(di_signal == kDiStatus_Trigger)
	{
		bms_set_signal(kSignalIdx_LowVoltSleep,(SignalStatus)is_lock_enable_off);
		bms_set_signal(kSignalIdx_StandbySleep,(SignalStatus)is_lock_enable_off);
	}
}

//水浸故障1
void ord_di_water1_fun(uint32_t base_time, DiStatus di_signal, DiType di)
{
	if((di < kDiType_End) && (di_signal == kDiStatus_Trigger))
	{
        di_param_item[di].dly += base_time;
        bms_set_fault_level(kFaultCode_Water, kFaultLevel_Third, kFaultHandle_CutNoRelIdx);
	}
}

//熔断器故障1
void ord_di_fuse1_fun(uint32_t base_time, DiStatus di_signal, DiType di)
{
	if((di < kDiType_End) && (di_signal == kDiStatus_Trigger))
	{
        di_param_item[di].dly += base_time;
        bms_set_fault_level(kFaultCode_FuseStatus, kFaultLevel_Third, kFaultHandle_CutNoRelIdx);
	}
}

//断路器反馈信号1
void ord_di_breaker1_fun(uint32_t base_time, DiStatus di_signal, DiType di)
{
	if((di < kDiType_End) && (di_signal == kDiStatus_Trigger))
	{
        di_param_item[di].dly += base_time;
        bms_set_fault_level(kFaultCode_Feedback, kFaultLevel_Third, kFaultHandle_CutNoRelIdx);
	}
}

/*无，消防1，消防2，消防3，DO1反馈信号，DO2反馈信号，DO3反馈信号，DO4反馈信号，DO5反馈信号，
DO6反馈信号，门禁，水浸，保险丝故障信号，PCS故障信号，空调故障信号，隔离开关反馈信号，气体检测故障信号，
UPS故障信号，EMS故障信号，*/
//DI策略对应函数，注意应与枚举DiStrategy顺序一致
const DiFun di_func[kDiType_End]= {
	NULL,
	ord_di_emerge_stop_func, //急停，
	ord_di_fire_alarm1_func,//消防1
	ord_di_fire_alarm1_func,//消防2
	ord_di_fire_alarm1_func,//消防3
	ord_di_do_feedback_func,//DO1反馈信号
	ord_di_do_feedback_func,//DO2反馈信号
	ord_di_do_feedback_func,//DO3反馈信号
	ord_di_do_feedback_func,//DO4反馈信号
	ord_di_do_feedback_func,//DO5反馈信号
	ord_di_do_feedback_func,//DO6反馈信号
	NULL,//门禁
	ord_di_water1_fun,//水浸
	ord_di_fuse1_fun,//保险丝故障信号
	NULL,//PCS故障信号
	NULL,//空调故障信号
	NULL,//隔离开关反馈信号
	NULL,//气体检测故障信号
	NULL,//UPS故障信号
	NULL//EMS故障信号   
};


