/******************************************************************************
版权所有：	
文件名称：	switch.h
文件版本：	01.01
创建作者:	sunxi
创建日期：	2013-04-15
功能说明：	DTU核心处理程序以开关为单位，循环处理。
其它说明：
修改记录：
*/
#ifndef _SWITCH_H
#define _SWITCH_H
/*------------------------------- 头文件 --------------------------------------
*/
#include "fft.h"

/*------------------------------- 宏定义 --------------------------------------
*/
#define INDEX_INVALLID		(-1)

#define DC_BOARD_150V           1
#define CFG_NAME_LEN 16

#ifdef DC_BOARD_150V
#define DC_AJUST_0			20.0
#define DC_AJUST_1			100.0
#else
#define DC_AJUST_0			10.0
#define DC_AJUST_1			50.0
#endif

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

enum
{
	SW_DI_TYPE_00 = 0,
	SW_DI_TYPE_OFF,
	SW_DI_TYPE_ON,
	SW_DI_TYPE_11
};

enum
{
	SW_DO_TYPE_OFF = 0,
	SW_DO_TYPE_ON,
	SW_DO_TYPE_SELECT_OFF,
	SW_DO_TYPE_SELECT_ON
};

enum
{
    SW_DI_KRHW = 0,  // 合位 1
    SW_DI_KRTW,      // 分位
    SW_DI_WCN,       // 弹簧未储能
    SW_DI_YCN,       // 弹簧已储能
    SW_DI_GLDZ_HW,   // 隔离刀合位
    SW_DI_GLDZ_FW,   // 隔离刀分位
    SW_DI_JDDZ_HW,   // 接地刀合位
    SW_DI_JDDZ_FW,   // 接地刀分位
    SW_DI_QYD_GJ,    // SF6气压低告警
    SW_DI_QYD_BS,    // SF6气压低闭锁 10
    SW_DI_BHZTT,     // 自动化投入
    SW_DI_BHTT,      // 常规保护
    SW_DI_JZS_TT,    // 集中式
    SW_DI_CHZ,       // 重合闸投入
    SW_DI_BSCH,      // 重合闸停用
    SW_DI_FA_TT,     // 馈线自动化
    SW_DI_FA_GOOSE,  // 智能分布式
    SW_DI_FA_BS_TT,  // 就地FA闭锁
    SW_DI_FA_LS,     // 联络/分段模式
    SW_DI_YYXH,      // 带电显示器有压
    SW_DI_YB_FZ,     // 分闸出口压板状态 20
    SW_DI_YB_HZ,     // 合闸出口压板状态
    SW_DI_SH,        // 手动合闸
    SW_DI_SF,        // 手动分闸
    SW_DI_DRIVE_ERR, // 驱动器异常
    SW_DI_YJCY_A,    // 母线侧硬件残压
    SW_DI_YJCY_B,    // 线路侧硬件残压
    SW_DI_KZDX,      // 控制回路断线
    SW_DI_HZHLJS,    // 合闸回路监视
    SW_DI_FZHLJS,    // 分闸回路监视
    SW_DI_TZWZ,      // 跳闸位置 30
    SW_DI_HZWZ,      // 合闸位置
    SW_DI_PT1SY,     // 电源侧瞬压
    SW_DI_PT2SY,     // 负荷侧瞬压
    SW_DI_KGYF,      // 开关远方
    SW_DI_IMP1,      // 脉冲计数1
    SW_DI_IMP2,      // 脉冲计数2

#ifdef DO_KOUT_CHECK
    SW_DI_KOCHK, // 开出自检
#else
    SW_DI_26,
#endif

#if defined GD_AREA_ZHUHAI_V2 || defined GD_AREA_JIEYANG || defined GD_AREA_LIAONING_2021
    SW_DI_B_SW, // 对侧开关位置
#else
    SW_DI_27,
#endif

#ifdef CUSTOMIZE_BZT // 备自投
    SW_DI_BZT,       // 备自投
    SW_DI_DL1_HW,    // #1进线合位
    SW_DI_DL1_TW,    // 1进线分位
    SW_DI_DL2_HW,    // 2进线合位
    SW_DI_DL2_TW,    // 2进线分位
    SW_DI_DL3_HW,    // 备自投-合位
    SW_DI_DL3_TW,    // 备自投-分位
    SW_DI_BSBZT,     // 闭锁备自投
    SW_DI_BZT_SY,    // 备自投-失压分闸
#endif
    SW_DI_NUM
};

#define SW_DI_NUM_ALL (SW_DI_NUM + EV_SW_NUM)

enum
{
	SW_DO_HZ = 0,	// 合闸
	SW_DO_FZ,		// 分闸
	SW_DO_BHH,		
	SW_DO_BHT,
	SW_DO_YKH,
	SW_DO_YKT,		
	SW_RST_SY,		//瞬压复归
	SW_RST_SY1,		//瞬压复归
	SW_FBT_SY,		//瞬压闭锁
	SW_DO_CN,		//储能信号//SW_DO_11,		
	SW_DO_BHDZ,		
	SW_DO_TQBS,
#ifdef GD_AREA_CHAOZHOU_CHAOAN_FUYANG
	SW_DI_TQBS_CLOSE,	//同期合闸开出-常闭"
#endif
#ifdef	CUSTOMIZE_BZT //备自投
	SW_DO_DL1_HZ,	
	SW_DO_DL1_FZ,
	SW_DO_DL2_HZ,
	SW_DO_DL2_FZ,
	SW_DO_FD_HZ,    //备自投-分段合闸
	SW_DO_FD_FZ,	//备自投-分段分闸		
	SW_DO_JX1_SY,   //备自投-进线1失压分闸
	SW_DO_JX2_SY,	//备自投-进线2失压分闸
#endif	

#if defined GD_AREA_MAIN_2020 || defined SW_FAIL_SINGLE_OUT
	SW_DO_UNSTUCK_SINGLE,
#endif

#ifdef GD_AREA_YUNAN_LP	
	SW_DO_LOST_AC,
#else
	SW_DO_14,
#endif

#ifdef GD_AREA_PROTECTOR
	SW_EQU_ERR,
#endif

	SW_DO_NUM
};


// 开关类LED类型
enum
{
	SW_LED_ZHHW = 0,// 综合合位灯,以一个灯代表双点灯
	SW_LED_ZHTW, // 综合合位灯,以一个灯代表双点灯
	SW_LED_HW,		// 合位灯
	SW_LED_TW,		// 跳位灯
	SW_LED_GL,		// 过流灯
 	SW_LED_JD,		// 接地灯
	SW_LED_CHZ,		// 重合闸灯
	SW_LED_CD,		// 充电灯(包含重合闸、联络和分布式的充电)
	SW_LED_LOCK,	// 闭锁灯
	SW_LED_XT,		// XT灯
	SW_LED_YT,		// YT灯
	SW_LED_DZ,		// 动作灯
	SW_LED_CHZBS,	// 重合闸闭锁灯
	SW_LED_WCN,		// 未储能灯
	SW_LED_LL,	// 联络
	SW_LED_FD,	// 分段	
	SW_LED_CHZBS_LOCK,	// 重合闸闭锁灯+FA闭锁合闸
	SW_LED_MODE_BH,		//保护模式
	SW_LED_MODE_FA,		//就地FA	模式
	SW_LED_MODE_GOOSE,	//智能分布式
	SW_LED_X_YT,

#if defined GD_AREA_GUANGZHOU_FTU || defined GD_AREA_ZHUHAI_V2
	SW_LED_FAULT_GJ,//故障告警灯
#endif

#ifdef GD_AREA_ZHUHAI_V2	
	SW_LED_COMMERR, //通讯异常
#endif
//#ifdef GD_AREA_ECZD_2020
#if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
	SW_LED_ZDJL,	//"自动解列功能",
	SW_LED_TYBHTT,	//"停用保护及FA",
	SW_LED_TYZDJL,	//"停用自动解列",
#endif
	SW_LED_TZ,		//跳闸灯
	SW_LED_CHZ_CD,	// 重合闸充电灯(之前的充电灯包含联络和分布式的充电状态，非单独的重合闸充电灯)

	SW_LED_GLDZ,	//隔离刀闸灯
	SW_LED_JDDZ,	//接地刀闸灯

#ifdef FUNC_DRIVE
	SW_LED_DRIVE,	//开关传动灯
#endif

	SW_LED_NUM
};

#define SW_DO_LED_NUM (SW_DO_NUM + SW_LED_NUM)


 enum
{
	SW_AC_IA = 0,	// IA
	SW_AC_IB,		// IB
	SW_AC_IC,		// IC
	SW_AC_I0,		// I0
#ifdef SW_AC_I0S_SAMPLE
	SW_AC_I0s,
#endif
	SW_AC_CIA ,	// 测量IA
	SW_AC_CIB,		// 测量IB
	SW_AC_CIC,		// 测量IC	
	SW_AC_NUM
};
enum
{
	SW_AC_IN_P= SW_AC_NUM,	
	SW_AC_IN_Pa,	
	SW_AC_IN_Pb,	
	SW_AC_IN_Pc,		
	SW_AC_IN_Q,		
	SW_AC_IN_Qa,	
	SW_AC_IN_Qb,	
	SW_AC_IN_Qc,
#ifdef FUN_YC_POWER_S		
	SW_AC_IN_S,
#endif
	SW_AC_IN_COS,	
	SW_AC_IN_BI_UNBALANCE,// 电流不平衡度
	SW_AC_IN_CI_UNBALANCE,// 电流不平衡度
	SW_AC_IN_IMP1,
	SW_AC_IN_IMP2,

	SW_AC_IN_SET_BEGIN,
	SW_AC_IN_SET2,
	SW_AC_IN_SET3,
	SW_AC_IN_SET4,
	SW_AC_IN_SET5,
	SW_AC_IN_SET6,
	SW_AC_IN_SET7,
	SW_AC_IN_SET8,
	SW_AC_IN_SET9,
	SW_AC_IN_SET10,
	SW_AC_IN_SET11,
	SW_AC_IN_SET_END,

#ifdef METERING_ENERGY	
	SW_AC_IN_XS_UAB,
	SW_AC_IN_XS_UBC,
	SW_AC_IN_XS_UCA,
	SW_AC_IN_XS_UA,
	SW_AC_IN_XS_UB,
	SW_AC_IN_XS_UC,

	SW_AC_IN_XS_IA,
	SW_AC_IN_XS_IB,
	SW_AC_IN_XS_IC,	
	SW_AC_IN_XS_I0,	
	SW_AC_IN_XS_P,
	SW_AC_IN_XS_PA,
	SW_AC_IN_XS_PB,
	SW_AC_IN_XS_PC,
	SW_AC_IN_XS_Q,
	SW_AC_IN_XS_QA,
	SW_AC_IN_XS_QB,
	SW_AC_IN_XS_QC,
	SW_AC_IN_XS_S,
	SW_AC_IN_XS_SA,
	SW_AC_IN_XS_SB,
	SW_AC_IN_XS_SC,
	SW_AC_IN_XS_COS,
	SW_AC_IN_XS_COSA,
	SW_AC_IN_XS_COSB,
	SW_AC_IN_XS_COSC,
	SW_AC_IN_XS_FREQ,
#else	
	SW_AC_IN_YC1,
	SW_AC_IN_YC2,
	SW_AC_IN_YC3,
	SW_AC_IN_YC4,
	SW_AC_IN_YC5,
	SW_AC_IN_YC6,	
	SW_AC_IN_YC7,
	SW_AC_IN_YC8,
	SW_AC_IN_YC9,
	SW_AC_IN_YC10,
	SW_AC_IN_YC11,
	SW_AC_IN_YC12,
#endif
	SW_AC_NUM_ALL
};

#ifdef SW_AC_I0S_SAMPLE
	#define SW_AC_MENU_NUM (SW_AC_IN_IMP2)  // 开关测量值在菜单中显示数目
#else
	#define SW_AC_MENU_NUM (SW_AC_IN_IMP2+1)  // 开关测量值在菜单中显示数目
#endif

enum
{
	SW_DD_NOW1=0,
	SW_DD_NOW2,
	SW_DD_NOW3,	
	SW_DD_NOW4,
	SW_DD_NOW5,
	SW_DD_NOW6,
	SW_DD_NOW7,
	SW_DD_NOW8,
	SW_DD_15M1,
	SW_DD_15M2,
	SW_DD_15M3,
	SW_DD_15M4,
	SW_DD_15M5,
	SW_DD_15M6,
	SW_DD_15M7,
	SW_DD_15M8,
	SW_DD_DAY1,
	SW_DD_DAY2,
	SW_DD_DAY3,
	SW_DD_DAY4,
	SW_DD_DAY5,
	SW_DD_DAY6,
	SW_DD_DAY7,
	SW_DD_DAY8,
	SW_DD_CHA1,
	SW_DD_CHA2,
	SW_DD_CHA3,
	SW_DD_CHA4,
	SW_DD_CHA5,
	SW_DD_CHA6,
	SW_DD_CHA7,
	SW_DD_CHA8,

#ifdef METERING_ENERGY
	SW_DD_EPA,
	SW_DD_EPB,
	SW_DD_EPC,
	SW_DD_EPAP,
	SW_DD_EPBP,
	SW_DD_EPCP,
	SW_DD_EPAN,
	SW_DD_EPBN,
	SW_DD_EPCN,
	SW_DD_EP,
	SW_DD_EQ,
#endif
	SW_DD_NUM_ALL,
};

enum
{
    PUB_DI_YF = 0, // 远方
    PUB_DI_JD,     // 就地
    PUB_DI_JX,     // 检修状态投入
    PUB_DI_GMDK,   // 柜门打开
    PUB_DI_RST,    // 复归信号
    PUB_DI_DCJLSD, // 交流失电
    PUB_DI_DCHHZT, // 电池活化状态
    PUB_DI_DCQY,   // 电池欠压
    PUB_DI_DCDYGZ, // 电源模块故障
    PUB_DI_CAP,    // 电容器动作
    PUB_DI_ZLDYQY, // 直流电源欠压
    PUB_DI_NZYC,   // 内阻异常
    PUB_DI_JS,     // FA解锁
    PUB_DI_REBOOT, // 装置复位
    PUB_DI_BHALL,  // 功能总压板
    PUB_DI_RST_JS, // 信号复归+FA解锁
    PUB_DI_FDL1,   // 非电量1
    PUB_DI_FDL2,   // 非电量2
    PUB_DI_FDL3,   // 非电量3
    PUB_DI_FDL4,   // 非电量4
    PUB_DI_FDL5,   // 非电量5
    PUB_DI_FDL6,   // 非电量6
    PUB_DI_FDL7,   // 非电量7
    PUB_DI_FDL8,   // 非电量8
    PUB_DI_1,
    PUB_DI_2,
    PUB_DI_3,
    PUB_DI_4,
    PUB_DI_5,
    PUB_DI_6,
#ifdef YX_DI_ERROR
    PUB_DI_ERROR, // 遥信自检
#else
    PUB_DI_7,
#endif
#ifdef KZ_OUT_TT
    PUB_KZ_OUT_TT, // 控制出口压板
#else
    PUB_DI_8,
#endif

    PUB_DI_NUM
};

#define PUB_DI_NUM_ALL (PUB_DI_NUM + EV_PUB_NUM)

enum
{
	PUB_DO_DCHH = 0,// 电池活化
	PUB_DO_HHTC,	// 活化退出
	PUB_DO_03,		
	PUB_DO_04,		
	PUB_DO_05,		
	PUB_DO_06,		
	PUB_DO_07,		
	PUB_DO_08,	
	PUB_DO_09,

	PUB_QUA_CLR,		
	PUB_DO_YK,		//预控
	PUB_DO_JS,		// 解除闭锁	
	PUB_DO_RESTART,	// 远方重启
	PUB_DO_RST,		// 远方复归
#ifdef YK_FG_FAJS
	PUB_DO_RST_FAJS, 	// 远方复归+FA解锁
#endif
	PUB_CHYB_HZ,		// 虚遥控，重合闸压板
	PUB_CHYB_FZ,		// 虚遥控，分闸压板	
#if defined BHFA_YB_YK || defined BHFAGS_YB_YK
	PUB_BHYB_HZ,		// 虚遥控，分闸压板
	PUB_BHYB_FZ,		// 虚遥控，分闸压板
	PUB_KZYB_HZ,		// 虚遥控，控制出口合闸压板(线路保护投停&&保护投入软压板)
	PUB_KZYB_FZ,		// 虚遥控，控制出口分闸压板(线路保护投停&&保护投入软压板)
	#ifndef BH_FA_INONE_SW
	PUB_BHYBTT_HZ,		// 虚遥控，常规保护投退合闸压板(线路保护投停&&保护投入软压板)
	PUB_BHYBTT_FZ,		// 虚遥控，常规保护投退分闸压板(线路保护投停&&保护投入软压板)
	PUB_FAYBTT_HZ,		// 虚遥控，FA保护投退合闸压板(线路保护投停&&保护投入软压板)
	PUB_FAYBTT_FZ,		// 虚遥控，FA保护投退分闸压板(线路保护投停&&保护投入软压板)
		#ifdef BHFAGS_YB_YK
		PUB_GOOSEYBTT_HZ,	// 虚遥控，goose保护投退合闸压板(线路保护投停&&保护投入软压板)
		PUB_GOOSEYBTT_FZ,	// 虚遥控，goose保护投退分闸压板(线路保护投停&&保护投入软压板)
		#endif
	#endif
#else
	PUB_BHYB_HZ,		// 虚遥控，分闸压板
	PUB_BHYB_FZ,		// 虚遥控，分闸压板
	PUB_KZYB_HZ,		// 虚遥控，控制出口合闸压板(线路保护投停&&保护投入软压板)
	PUB_KZYB_FZ,		// 虚遥控，控制出口分闸压板(线路保护投停&&保护投入软压板)
#endif

	PUB_TQ_YB_HZ,	//虚遥控，同期合闸软压板
	PUB_TQ_YB_FZ,	//虚遥控，同期合闸软压板
	PUB_JZS_YB_HZ,	//虚遥控，集中式软压板
	PUB_JZS_YB_FZ,	//虚遥控，集中式软压板
#ifdef YK_SOFT_YB
	PUB_YK_YB_HZ,	//虚遥控，遥控软压板
	PUB_YK_YB_FZ,	//虚遥控，遥控软压板
#endif
#ifdef YK_FA_ENBLE
	PUB_YK_BS_FA_HZ,	//	"FA遥控闭锁-合",
	PUB_YK_BS_FA_FZ,	//	"FA遥控闭锁-分",
#endif
#ifdef YK_FA_S_L_ENBLE
	PUB_YK_FA_S_L_HZ,	//	"分段/联络-合",
	PUB_YK_FA_S_L_FZ,	//	"分段/联络-分",
#endif

	PUB_JL_YB_HZ,   //虚遥控，自动解列软压板
	PUB_JL_YB_FZ,   //虚遥控，自动解列软压板

#ifdef METERING_ENERGY
	PUB_DD_CLR, 		// 虚遥控，电度清零
	PUB_LLSOE_CLR,		// 虚遥控，线损事件清零
#endif

#ifdef FUNC_DRIVE
	PUB_DRIVE_YB_ON,		//不停电传动软压板投入
	PUB_DRIVE_YB_OFF,		//不停电传动软压板退出
	PUB_DRIVE_HZ,			//不停电传动指令
#endif

#ifdef FUNC_DRIVE_JY
	PUB_UNSTOP_V_DRI_HZ,	//不停电传动功能
#endif

#ifdef FUNC_RESET_EQU
	PUB_RESET_EQU,			//重启装置
#endif
	PUB_DO_NUM
};

// 公共类LED类型
enum
{
	PUB_LED_POWER = 0,	// 电源灯
	PUB_LED_RUN,		// 运行灯
	PUB_LED_COMM,		// 通信灯
	PUB_LED_COMM_STATUS,// 通信状态灯
	PUB_LED_BAT,		// 电池灯
	PUB_LED_ERR,		// 异常灯
//#ifdef GD_AREA_ECZD_2020	
#if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
	PUB_LED_RUN_GJ,		// 运行告警，PT断线、气压低、GOOSE通信异常
#endif
	PUB_LED_DZ,			// 动作灯,例如电压类动作
	PUB_LED_YF,			// 远方灯
	PUB_LED_JD,			// 就地灯
	PUB_LED_232T1,
	PUB_LED_232R1,
	PUB_LED_232T2,
	PUB_LED_232R2,
	PUB_LED_232T3,
	PUB_LED_232R3,
	PUB_LED_485T1,
	PUB_LED_485R1,
	PUB_LED_485T2,
	PUB_LED_485R2,
	PUB_LED_485T3,
	PUB_LED_485R3,	
	PUB_LED_NET1,
	PUB_LED_NET2,
	PUB_LED_NET3,
#ifdef	KZ_OUT_TT
	PUB_LED_KZ_OUT,
#endif
	PUB_LED_IEC_ERR,	//"规约通信异常灯",

	PUB_LED_NUM,
};

#define PUB_DO_LED_NUM (PUB_DO_NUM + PUB_LED_NUM)  


enum
{
	PUB_AC_UA1 = 0,	
	PUB_AC_UB1,		
	PUB_AC_UC1,		
	PUB_AC_UAB1,
	PUB_AC_UBC1,
	PUB_AC_UCA1,
	PUB_AC_U01,
	PUB_AC_US1,
	PUB_AC_UA2,		
	PUB_AC_UB2,		
	PUB_AC_UC2,		
	PUB_AC_UAB2,
	PUB_AC_UBC2,
	PUB_AC_UCA2,
	PUB_AC_U02,
	PUB_AC_US2,
	PUB_AC_NUM
};

enum
{
	PUB_AC_IN_V_UNBALANCE1 = PUB_AC_NUM,// 电压组1不平衡度
	PUB_AC_IN_V_UNBALANCE2,// 电压组2不平衡度
	PUB_AC_IN_F1,
	PUB_AC_IN_F2,
	PUB_AC_IN_UZ1,
	PUB_AC_IN_UZ2,
#ifdef GD_AREA_YUNAN_LP		// 云南涞浦
	PUB_AC_IN_DLTUAB,
	PUB_AC_IN_DLTUBC,
	PUB_AC_IN_DLTUCA,
	PUB_AC_IN_ARGUAB,
	PUB_AC_IN_ARGUBC,
	PUB_AC_IN_ARGUCA,
#endif
	PUB_AC_IN_TEMP,
#ifdef TMP_CHIP_AHT20
	PUB_AC_IN_HUMI,
#endif
	PUB_AC_IN_VER,
#ifdef BATTERY_WITH_COMM
	PUB_AC_BATT_ACT_T_MAX,  // 电池活化最大放电时长
	PUB_AC_BATT_ACT_T_NOW,  // 电池活化当前放电时长
#endif
#ifdef DEV_GPS_ATGM332D
	#ifndef GPS_JWD_SPLIT
	PUB_AC_GPS_LONGITUDE,
	PUB_AC_GPS_LATITUDE,
	#else
	PUB_AC_GPS_LONGITUDE_D,
	PUB_AC_GPS_LONGITUDE_M,
	PUB_AC_GPS_LONGITUDE_S,
	PUB_AC_GPS_LATITUDE_D,
	PUB_AC_GPS_LATITUDE_M,
	PUB_AC_GPS_LATITUDE_S,
	#endif
	PUB_AC_GPS_NUM_SV,	// 卫星个数
#endif
	PUB_AC_YC1,
	PUB_AC_YC2,
	PUB_AC_YC3,
	PUB_AC_YC4,
	PUB_AC_YC5,
	PUB_AC_YC6,
	PUB_AC_YC7,
	PUB_AC_YC8,
	PUB_AC_YC9,
	PUB_AC_YC10,
	PUB_AC_YC11,
	PUB_AC_YC12,		
#ifdef BATTERY_BP_L500
	PUB_AC_BATT_R,			//电池内阻
	PUB_AC_BATT_TEMP,		//电池温度
	PUB_AC_BATT_RT_POWER,	//电池实时电量
	PUB_AC_BATT_DISCHARGE_CURRENT,	//电池放电电流
	PUB_AC_BATT_RECHARGE_CURRENT,	//电池充电电流
#endif
	PUB_AC_NUM_ALL
};

#define PUB_AC_IN_UDC	PUB_AC_IN_UZ1
#define UI_NUM			(PUB_AC_NUM+SW_AC_NUM*SWITCH_NUM_MAX)


#define PUB_AC_MENU_NUM (PUB_AC_IN_TEMP+1)  // 公共测量值在菜单中显示数目

#define MEA_MENU_MAX (SW_AC_MENU_NUM+PUB_AC_MENU_NUM)


// g_ui使用的和开关对应的索引
#define UI_SW_INDEX_BEGIN(sw)		(PUB_AC_NUM + (sw)*SW_AC_NUM)
#define UI_SW_INDEX(sw,sw_index)	(PUB_AC_NUM + (sw)*SW_AC_NUM + (sw_index))

#define UI_FLAGS_MAKE_LV1	0X0001	// 线电压1自产
#define UI_FLAGS_MAKE_LV2	0X0002	// 线电压2自产
#define UI_FLAGS_MAKE_I0	0X0004	// I0自产
#define UI_FLAGS_MAKE_IB	0X0008	// IB自产
#define UI_FLAGS_3M			0X0010	// 3表法
#define UI_FLAGS_MAKE_UCA1	0X0020	// 线电压UCA1自产
#define UI_FLAGS_MAKE_UCA2	0X0040	// 线电压UCA2自产
#define UI_FLAGS_MAKE_U01	0X0080	// 线电压UCA2自产
#define UI_FLAGS_MAKE_U02	0X0100	// 线电压UCA2自产
#define UI_FLAGS_MAKE_CIB	0X0200	//测量 IB自产

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

struct mea_desc
{
	char * 	name;
	u8		unit;
	u8 		unit_angle;
};


struct dd_v
{
	float	fv;
	struct rtc_time_t  ct;
	bool    bchanged;
};

struct sw
{
	u32		ui_flags;

	// 测量值
	qs16  	ac_in[SW_AC_NUM_ALL];
	u8		link_qds[SW_AC_NUM_ALL];
	qs16  	ac_in_buf[SW_AC_NUM_ALL];
	float 	ac_in_acc[SW_AC_NUM_ALL];

	// 电度
	struct dd_v	dd[SW_DD_NUM_ALL];
	// 遥信值
	u8    di[SW_DI_NUM+EV_SW_NUM];

	//最大最小值
	u32 m2_min;
	u32 m2_max;
	u32 fz_min;
	u32 fz_max;
	
	// 配置索引
	u16	 di_cfg_index[SW_DI_NUM];
	u16	 do_cfg_index[SW_DO_NUM];
	u16	 ac_cfg_index[SW_AC_NUM];
	u16	 led_cfg_index[SW_LED_NUM];
};

struct sw_t
{
	// 过流标识
	u32		overI_flags[3];

	// 方向
	u32		dir_flags[3];

	// 测量值
	qs16  	ac_in[3];
	float 	ac_in_acc[3];
};

struct sw_public
{
	u32			ui_flags;
	
	// 测量值
	qs16  ac_in[PUB_AC_NUM_ALL];
	qs16  ac_in_buf[PUB_AC_NUM_ALL];
	float ac_in_acc[PUB_AC_NUM_ALL];

	// 遥信值
	u8    di[PUB_DI_NUM+EV_PUB_END-EV_PUB_START];

	//最大最小值
	u32 m2_min[4];
	u32 m2_max[4];

	u32 fz_min[2];
	u32 fz_max[2];
	
	// 配置索引
	u16	 di_cfg_index[PUB_DI_NUM];
	u16	 do_cfg_index[PUB_DO_NUM];
	u16	 ac_cfg_index[PUB_AC_NUM];
	u16	 led_cfg_index[PUB_LED_NUM];
	u32  vol_qua_run_time[2];  //电压合格率 统计运行时间
	u32  vol_qua_ok_time[2];  //电压合格率 统计合格时间	
	bool bclearqua;

};


struct ui 
{
	int	 chn_index;			// 实际的ADC通道，如果没有则为CFG_ADC_CHANNEL_ZERO
	int	 ui_base_make;		// 合成UI的基础ui索引
	
	// 保护值
	struct ri_s32 ri;	
	u32		m2[CFG_ADC_DOTS_PER_PERIOD/2];				// 模值的平方
//	qs08	m2_factor; 		// 幅值自动校准后的修正系数/幅值的理论变换系数
	qs08	m2_factor_k; 	// 幅值的理论变换系数
#ifdef PROTECT_AC_ADJUST
	int 	m2_factor_c;	// 幅值自动校准后的修正系数
#else
	qs16	m2_factor_c;	// 幅值自动校准后的修正系数
#endif	

	struct rt_stat m2_stat;
	u32		fz;				//辐值

	//测量谐波
	complex h[CFG_ADC_DOTS_PER_PERIOD/2]; // 谐波
	
	// 测量有效值
	qu16	e;			// 有效值
	float	e_acc;		// 有效值累加值
	float	e_factor0; 	// 幅值自动校准后的修正系数/幅值的理论变换系数(不带温度补偿)
	float	e_factor; 	// 幅值自动校准后的修正系数/幅值的理论变换系数
	float e_ps;		//一二次变比
	struct rt_stat e_stat;	

	//测量相角
	qs16	p;			// 相角
	qs16	p_acc;		// 相角累加值
	float	p_factor; 	// 相角的理论变换系数 + 相角自动校准后的修正系数
	int		p_mark;		// 角度标志，0:没有初始化；1:角度在1、4象限；-1:角度在2、3象限.
	struct rt_stat p_stat;

	// 测量PQ
	float 	pq_factor[2];

	// 通道名称
	char 	name[CFG_NAME_LEN];
};

struct ui_jy 
{	
	struct ri_s32 ri;	
	u32		m2;				// 模值的平方
};

//正序,负序及零序
//电压,电流的实部和虚部

struct ui120		
{
	DWORD vect1;         //正序分量幅值平方
	DWORD vect2;         //负序分量幅值平方
};

struct ui_p0       //零序功率计算
{			
	float p;    //零序有功功率
	float q;    //零序无功功率
	float ps;    //零序有功功率
	float qs;    //零序无功功率

	float Pea;   //零序有功功率积分
	float Per;   //零序无功功率积分
	float Peas;   //零序有功功率积分
	float Pers;   //零序无功功率积分
};

extern int g_harmonic_num;
extern float g_harmonic_factor[CFG_ADC_DOTS_PER_PERIOD/2];
extern int g_sw_init;
extern struct ui g_ui[UI_NUM];
extern int 		 g_prot_index;	// 保护计算时，采样通道中采样点的索引

extern struct ui_jy g_ui_jy[3];

extern struct ui_p0 g_ui_p0[SWITCH_NUM_MAX]; //零序功率

extern struct sw_public g_sw_pub;
extern struct sw g_sw[];
extern struct sw_t g_sw_temp[];
extern struct ui120 Us1_120,Us2_120;

extern const s8 * g_sw_di_name[];
extern const s8 * g_sw_do_name[];
extern const s8 * g_sw_led_name[];
extern const struct mea_desc g_sw_ac_desc[];

extern const s8 * g_pub_di_name[];
extern const s8 * g_pub_do_name[];
extern const s8 * g_pub_led_name[];
extern const struct mea_desc g_pub_ac_desc[];
extern const struct mea_desc g_dd_desc[];

/*------------------------------ 函数声明 -------------------------------------
*/
int sw_init(void);
int sw_exit(void);

int sw_di_set(u32 sw,u32 no,u8 v);
int sw_di_get(u32 sw,u32 no);
int sw_do_yuk(int type);
int sw_do(u32 sw,u32 index,int type);
int sw_do_pub(u32 index,int type);
float sw_v_m2_factor_k(int id);
float  _sw_p2( float Ur, float Ui,float Ir, float Ii, float k1, float k2);
float  _sw_q2( float Ur, float Ui,float Ir, float Ii, float k1, float k2);

void sw_cal_protect(void); 		//计算全周故障量

int sw_cal_app(void);
int sw_auto_adjust(int ui_angle0);
int sw_adjust_dc_0(void);
int sw_adjust_dc_1(void);

int sw_stat_reset(void);
int sw_pub_printf(void);
int sw_pub_printf_v(void);
int sw_printf(void);
int sw_printf_v(void);
int sw_ui_printf(void);
int sw_ui_printf_e(void);
int sw_ui_printf_m(void);
int sw_ui_printf_p(void);
int sw_get_chnl_ps(int index,bool prim);
 int sw_ext_init(void);
 
void _sw_cal_Xfl120( int ui_index, struct ui120 *pII);

#endif //_SWITCH_H

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



