/******************************************************************************
版权所有：	
文件名称：	protect.h
文件版本：	01.01
创建作者：	xxxxxx
创建日期：	2012-03-28
功能说明：	保护整组处理过程
其它说明：
修改记录：
*/
#ifndef _PROTECT_H
#define _PROTECT_H
/*------------------------------- 头文件 --------------------------------------
*/

/*------------------------------- 宏定义 --------------------------------------
*/
//控制出口总压板
#define JZS_ALL_EN(sw)     (g_tRelay[sw].run_stu.jzs_tt && pRunSet->bTT_SOFT_JZS_YB)
#define KZ_OUT_ALL_EN(sw)  (pRunSet->bTT_KZ_YB && !JZS_ALL_EN(sw))

// 保护总投退
#if defined YB_AUTO_SELECT && !defined GD_AREA_ECZD_2020
	#define 	FUN_ALL_EN(sw)		(pRunSet->bTT_BH_YB&&fa_fun_true(sw))
#elif defined GD_AREA_ZHONGSHAN_FTU
	#define 	FUN_ALL_EN(sw)		(g_run_stu.bhall&&pRunSet->bTT_BH_YB&&(!g_tRelay[sw].run_stu.bs_bhz))
//#elif defined GD_AREA_ZHONGSHAN_2020
#elif defined GD_AREA_ZHONGSHAN_2020 || defined GD_AREA_MAIN_2020
	#define 	FUN_ALL_EN(sw)		(g_run_stu.bhall&&pRunSet->bTT_BH_YB&&g_tRelay[sw].run_stu.bhztt&&fa_fun_true(sw))
#else
    #define 	FUN_ALL_EN(sw)		(g_run_stu.bhall&&pRunSet->bTT_BH_YB&&g_tRelay[sw].run_stu.bhztt)
#endif



#if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020  //中山要求通信异常，全系统均异常
	// 分布式 FA总投退
	#define 	BH_GOOSE_EN_YB(sw)	(FUN_ALL_EN(sw)&&g_tRelay[sw].run_stu.fa_g_tt&&pRunSet->bTT_SOFT_GOOSE_YB&&pRunSet->tSwSet[sw].tGocSet.bTT_gooseFA)
	#define 	BH_GOOSE_EN(sw)	(BH_GOOSE_EN_YB(sw)&&(!tFAg.bComErr))
	#define 	BH_GOOSE_COMMERR(sw)	(BH_GOOSE_EN_YB(sw)&&(tFAg.bComErr))

	#define 	BH_ALL_EN(sw)		(FUN_ALL_EN(sw) && pRunSet->bTT_SOFT_BH_YB &&  ((g_tRelay[sw].run_stu.bhtt&&(!BH_GOOSE_EN_YB(sw)))||(BH_GOOSE_EN_YB(sw)&&pRunSet->tSwSet[sw].tGocSet.bsw_fz)))
	#define 	FA_ALL_EN(sw)		(FUN_ALL_EN(sw) && pRunSet->bTT_SOFT_FA_YB &&  ((g_tRelay[sw].run_stu.fatt&&(!BH_GOOSE_EN_YB(sw)))||(BH_GOOSE_COMMERR(sw)&&!pRunSet->tSwSet[sw].tGocSet.bsw_fz)))
#elif defined GD_AREA_HEYUAN_KL || (defined GD_AREA_CHAOZHOUFENGXI && !defined GD_AREA_ECZD_2020)	//科陆河源要求智能分布式不判断硬件压板，只判断FA的依赖通信的时候投入
    #define 	BH_GOOSE_EN_YB(sw)	(FUN_ALL_EN(sw)&& pRunSet->bTT_SOFT_GOOSE_YB &&	 pRunSet->tSwSet[sw].tGocSet.bTT_gooseFA && (!pRunSet->tSwSet[sw].bTT_FA) && (g_tRelay[sw].run_stu.fatt))
	#define 	BH_GOOSE_EN(sw)	(BH_GOOSE_EN_YB(sw))
	#define 	BH_GOOSE_COMMERR(sw)	 (false)
	#define 	BH_ALL_EN(sw)		(FUN_ALL_EN(sw) && pRunSet->bTT_SOFT_BH_YB&& g_tRelay[sw].run_stu.bhtt&&(!BH_GOOSE_EN(sw)))
	#define 	FA_ALL_EN(sw)		(FUN_ALL_EN(sw) && pRunSet->bTT_SOFT_FA_YB  && g_tRelay[sw].run_stu.fatt&&(!BH_GOOSE_EN(sw)))

#else
	#ifdef YB_AUTO_SELECT
        #define 	BH_GOOSE_EN_YB(sw)	(FUN_ALL_EN(sw)&&goose_yb_enable(sw)&&pRunSet->tSwSet[sw].tGocSet.bTT_gooseFA)
		#define 	BH_GOOSE_EN(sw) (BH_GOOSE_EN_YB(sw))
		#define 	BH_GOOSE_COMMERR(sw)	 (false)
	
        #define 	BH_ALL_2(sw)		(FUN_ALL_EN(sw) && bh_yb_enable(sw) && (!BH_GOOSE_EN(sw)))
        #define 	BH_ALL_EN(sw)		(BH_ALL_2(sw)||JZS_ALL_EN(sw))	
		#define 	FA_ALL_EN(sw)		(FUN_ALL_EN(sw) && fa_yb_enable(sw) &&(!BH_GOOSE_EN(sw)))
	#else
        #define 	BH_GOOSE_EN_YB(sw)	(FUN_ALL_EN(sw)&&g_tRelay[sw].run_stu.fa_g_tt&&pRunSet->bTT_SOFT_GOOSE_YB&&pRunSet->tSwSet[sw].tGocSet.bTT_gooseFA)
		#define 	BH_GOOSE_EN(sw)	(BH_GOOSE_EN_YB(sw))
		#define 	BH_GOOSE_COMMERR(sw)	 (false)
        #define 	BH_ALL_2(sw)		(FUN_ALL_EN(sw) && pRunSet->bTT_SOFT_BH_YB && g_tRelay[sw].run_stu.bhtt && (!BH_GOOSE_EN(sw)))
        #define 	BH_ALL_EN(sw)		(BH_ALL_2(sw)||JZS_ALL_EN(sw))	
		#define 	FA_ALL_EN(sw)		(FUN_ALL_EN(sw) && pRunSet->bTT_SOFT_FA_YB  && g_tRelay[sw].run_stu.fatt&&(!BH_GOOSE_EN(sw)))
	#endif	
#endif

//重合闸压板
#define     CHZ_ALL_EN(sw)      (pRunSet->bTT_CHZ_YB && g_tRelay[sw].run_stu.chzyb && !g_tRelay[sw].run_stu.bsch)//BH_ALL_EN(sw) &&

//同期压板
#define 	TQ_ALL_EN(sw)		(FUN_ALL_EN(sw) && pRunSet->bTT_TQ_YB)
//解列压板
#define 	JL_ALL_EN(sw)		(FUN_ALL_EN(sw) && pRunSet->bTT_JL_YB)

//同期合闸软压板
#define     TYTQ_ALL_EN(sw) (!FUN_ALL_EN(sw) || !pRunSet->bTT_TQ_YB)

//定值时间判断
#define 	BH_WAVETIME_EN(dSetTime)	((dSetTime>=(T_10ms*10))?1:0)



// 取相量模值
#define    	SQR(a,b)       (a*a + b*b)

// 采样区存储采样点数
#define 	SAMLENGTH         (CFG_ADC_DOTS_PER_CHANNEL-1)

#define    	ANGLE_P180	( 11796480)
#define    	ANGLE_N180 	(-11796480) 
#define    	ANGLE_P360 	( 23592960)
#define    	ANGLE_N40  	(-2621440)
#define    	ANGLE_P130 	( 8519680)
#define    	ANGLE_P140 	( 9175040)
#define    	ANGLE_N50  	(-3276800)
#define    	ANGLE_P20  	( 1310720)
#define    	ANGLE_P10  	( 655360)
#define    	ANGLE_N170	(-11141120)
#define    	ANGLE_N160 	(-10485760)

#define		ANGF180 	(180*65535)      	//180度
#define 	ANGN180    	((-180)*65535)   	//-180度
#define 	ANG360     	(360 << 16)       	//360度
#define 	ANG225     	(225 << 16)       	//225度
#define 	ANG315     	(315 << 16)       	//315度
#define 	ANG120     	(120 << 16)       	//120度

#define  	TAN5     	375760949       	//tan5度*2^32
#define    	TAN10    	757308616         	//tan10度*2^32
#define    	TAN25    	2002776141        	//tan25度*2^32
#define    	TAN30     	2479700525        	//tan30度*2^32
#define    	TAN35      	3007368477         	//tan35度*2^32

/*------------------------------ 类型结构 -------------------------------------
*/

// 保护整组处理标志结构定义
struct protect_stu
{
	u32	sw;							// 保护当前处理的开关
	u32 t_rcd_bh;					// 用于5ms巡检，记录上一次轮巡时刻	
	u8	update;						// 上电
	bool  bARSTFLT;                 //整组自动复归事故总202004
};

// 保护启动标志状态标志
typedef union UBHQD
{
	DWORD  dfBHQDLogic;
	struct
	{
		DWORD    bZQD :1;			// 总启动  
		DWORD    bQD25ms:1;    		// 启动一个周波              
		DWORD    bTBQD:1;    		// 突变量电流启动 
		DWORD    bFZQD:1;    		// 幅值启动        
		DWORD	 bBHQD:1;			// 保护启动		
		DWORD    bZZFG:1;			// 整组复归
#ifdef	CUSTOMIZE_BZT //备自投	
		WORD	 bBZTQD:1;			//备自投启动
#endif
	}bFlag;
}UBHQD;

// 保护动作跳闸标志
typedef union UBHDZ
{
	WORD  dfBHDZLogic;
    struct
    {   
		WORD    bBHDZ:1;    	// 保护动作总标志
		WORD    bBHTZ:1;    	// 保护动作总标志
		WORD    bSYTz:1;		// 失压跳闸
		WORD    bBHTrip:1;    	// 保护跳闸总标志
		WORD	bTZOut:1;		// 跳闸出口
		WORD	bTZSB:1;		// 跳闸失败
		WORD	bHZOut:1;		// 合闸出口
 		WORD    bBHT:1;    		// 保护跳	      
		WORD    bBHH:1;    		// 保护合
	#ifdef SELF_OPEN_RELEASE
		WORD	bBHTKeep:1; 	// 保护跳保持标志		
	#endif
    }bFlag;
}UBHDZ;

// 保护启动标志状态标志
typedef union UOCDIR
{
	WORD  wfFlag;
	struct
	{
		WORD    Iazx:1;     	// Ia正向    
		WORD    Ibzx:1;   	// Ib正向      
		WORD    Iczx:1;       	// Ic正向    
	}bFlag;
}UOCDIR;

// 遥控、手动分合闸
typedef struct URMTSW
{
	bool	bYTExecute;		// 遥控跳闸
	bool	bYHExecute;		// 遥控合闸
	bool    bHandHz;    	// 手动合闸
	bool    bHandTz;    	// 手动分闸	 
#ifdef SELF_OPEN_RELEASE
	bool	bSwTz;			// 开关本体分闸
#endif	 
	bool    bTQHz;			// 同期合闸标志
	bool bYHExecute_fa;
	bool bYTExecute_fa;
	bool    bHandHz_fa;    	// 手动合闸
	bool    bHandTz_fa;    	// 手动分闸	
	bool	bYH_fajs_flag;	//	遥控合闸解锁标志	
	bool    bTz_Doing;  	// 合闸	 
	bool    bHz_Doing;    	// 分闸	 
#ifdef FUNC_REBOOT_BS_HA_JS_3S
	bool	b_bsha;			//	重新上电后的手分/遥分闭锁合闸标志
#endif
}URMTSW;  





typedef struct TRELAY_T  // 开关逻辑结构体定义
{
	u8	zqd;		// 总启动标志,可由突变量或幅值启动置位
	u8	fzqd;		// 幅值启动标志
	u8	fzdz;		// 幅值动作标志
	u8	fzzzdz;		// 幅值整组动作标志
	u8	tblqd;		// 突变时启动标志
	u8	tbldz;		// 突变量动作标志
	u8	tblzzdz;		// 突变量整组动作标志
	u16	gz_process;	// 故障处理流程
	u32 t_rcd_qd;	// 记录启动时刻，因为每个开关的启动时刻不同，所以跟开关对接	dTfault
	u32 t_rcd_gz;	// 用于故障处理过程，记录上一次轮巡时刻	dTRcd0
	u32 us_tbl;						// 突变量统计初始时间
	u32 us_fz;						// 幅值统计初始时间

	bool  bBSHZ;  //短时间内分闸次数到，闭锁合闸
	bool  bBSTZ;	// 闭锁跳闸

	bool  bARSTFLT; //开关自动复归事故总202004

	TFDL_T tFdl[8];	
	TOC_T 		tOC[BHOC_NUMBER];		// 过流保护相关
	TCH_T 		tCHZ;				// 重合闸

	UGLFSX	uGLFSX;										//过流反时限标志字
	FSXCS	FsxcsGL;              						//过流反时限继电器人口参数

#ifdef	CUSTOMIZE_BZT //备自投
	TBZT_T		tBzt;
#endif	
	// TVOL_T		tU0GZ;				// 零压故障
	TLOSTVOT_T	tLostVot;   		//失压标志
	TU0_T		tU0TZ;			//合后零压跳闸
	TU0_T		tXXTZ;			//选线跳闸

	TU0_T	    tOVER_U0TZ;		//过零序电压跳闸

	TJL_T           tDYJL;  //电压解列
	TJL_T            tPLJL;	//频率解列

	TTQHZ_T		tTQHz;			//同期合闸标志
	TSDHZ_T		tSDHZ;			//上电合闸标志

	TGOC_T		tgoc;				//方向过流goose
	TSWST 		tSWST;			// 开关运行状态识别
	RUN_STU_SW run_stu;

	UBHQD		uBHQD;  // 保护启动标志字 
	UBHDZ		uBHDZ;  // 保护动作标志字 
	URMTSW 		uRmtSW; // 遥控分、合闸
	THZBS_T  	thzbs;
	TIMERELAY  	tMb_yuk_time;
	TIMERELAY  	tTZZFG_5S0ms; 	// 无故障延时5s
	TIMERELAY  	tTrip_BHT40MS;  	// 跳闸脉冲计时器,跳闸开出最短时间40MS
	TIMERELAY  	tTripfail_2s;  		// 跳闸脉冲计时器,跳闸开出最短时间100MS
	TIMERELAY  	tTripfail_hz;  		// 跳闸脉冲计时器,跳闸开出最短时间100MS
#ifdef SELF_OPEN_RELEASE
	TIMERELAY	tTripBHTKeep;		// 保护跳保持继电器
#endif
	struct rt_stat tbl_stat;				// 用于突变量启动统计
	struct rt_stat tbldz_stat;			// 用于突变量动作统计
	struct rt_stat tblzzdz_stat;			// 用于突变量整组动作统计
	
	struct rt_stat fz_stat;				// 用于幅值启动统计
	struct rt_stat fzdz_stat;			// 用于幅值动作统计	
	struct rt_stat fzzzdz_stat;			// 用于幅值整组动作统计

#ifdef FUN_JDXX
	JDXX_DEF tJD;	 //小电流接地
#endif
	YC_REFRESH_EN bYcRefresh;
}TRELAY_T;  

extern TRELAY_T g_tRelay[];

/*------------------------------ 变量声明 -------------------------------------
*/
extern struct protect_stu g_protect;					// 保护整组处理过程	

/*------------------------------ 函数声明 -------------------------------------
*/
int protect_init(void);
int protect_polling(void);
int protect_tbl_qd(void);
int protect_amp_qd_js(int sw);
int protect_amp_lx_js(int sw);
int protect_stat_reset(void);
int protect_printf_process(void);
int protect_amp_lx_js(int sw);
void sw_op_fail(DWORD     dStep);
#ifdef YB_AUTO_SELECT
bool fa_yb_enable(int sw);
bool goose_yb_enable(int sw);
bool bh_yb_enable(int sw);
#endif

//#ifdef GD_AREA_ZHONGSHAN_2020  //中山要求硬压板和软压板要一一对应
#if defined GD_AREA_ZHONGSHAN_2020 || defined GD_AREA_MAIN_2020 || defined YB_AUTO_SELECT
bool fa_fun_true(int sw);
#endif

#ifdef FUNC_DRIVE
void quit_drive(void);
#endif

#endif //_APP_H

/*------------------------------ 文件结束 -------------------------------------
*/


