/******************************************************************************
版权所有：	
文件名称：	sys.h
文件版本：	01.01
创建作者：	xxxxxx
创建日期：	2014-12-29
功能说明：	
其它说明：
修改记录：
*/
#ifndef _SYS_H
#define _SYS_H
/*------------------------------- 头文件 --------------------------------------
*/
#include "SOE.h"

/*------------------------------- 宏定义 --------------------------------------
*/
#define INTER_PASSWORD  	321
#define PASS_WORD 		  	1234  // 万能密码
#define INIT_PASSWORD     	0000

#define INIT_PASSWORD_STR     	"Z0000000"
#define PASSWORD_LEN			8
#define INTER_PASSWORD_STR  	"03210000"
#define PASS_WORD_STR 		  	"FUSIONOK"  // 万能密码
#define PASSWORD_STR_ZERO     	"00000000"

#define INTER_PASSWORD_STR_4  	"0321"
#define PASS_WORD_STR_4         "1234"  // 万能密码
#define INIT_PASSWORD_STR_4     "0000"
#define PASSWORD_STR_ZERO_4     "0000"


/**************eeprom空间分配*******************************
每个保存在eeprom中的信息都有装置类型及crc校验 10个字节

密码4字节+8 =12
通道系数 8*8+8=72
压板 4+8=12
装置参数  40*4+10=168
测控参数  40*4+10=168
内部定值  40*4+10=168
装置配置  1*4+10=12
定值区信息 10+10=18
每个定值区占240个字节+8个字节校验码 6个区共1488 (2K)

SOE 512个，
操作信息 512个
每个SOE占28个字节，共计28*512=14k
*/

#define EEP_SET_BASE   (64*1024)
#define EEP_PRJNAME_ADDR		(0+EEP_SET_BASE)      // 下载参数保存区域

#define EEP_PASSWORD_ADDR		(64+EEP_SET_BASE)       //密码保存 10字节
#define EEP_PASSWORD2_ADDR	(64+12+EEP_SET_BASE)       //密码保存 10字节

#define EEP_UEUQ_ADDR		(96+EEP_SET_BASE)       //电压合格率 保存地址 16+2 18个字节


#define EEP_EQUIP_PARA_ADDR		(128+EEP_SET_BASE)       //装置参数  128字节:(1024-128)/4=224pcs

#define EEP_CSTSET_ADDR			(1024+EEP_SET_BASE)       //内部定值:800/4=200pcs

#define EEP_SETGROUP_ADDR			(1024+800+EEP_SET_BASE)       // 定值索引:(1024-800)/4=56pcs


#if defined GD_AREA_ZHONGSHAN_2020 || defined GD_AREA_ZHONGSHAN_2020_ZC
	#define EEP_PUB_ADDR			((2*1024)+EEP_SET_BASE)     //公共定值开始位置
	#define EEP_SET_ADDR			((5*1024)+EEP_SET_BASE)     //开关定值开始位置(此值于中山新增备用定值后更改)
#elif defined GD_AREA_ECZD_2020
	#define EEP_PUB_ADDR			((2*1024)+EEP_SET_BASE)     //公共定值开始位置
	#define EEP_SET_ADDR			((4*1024)+EEP_SET_BASE)     //开关定值开始位置
#else
	#define EEP_PUB_ADDR			((2*1024)+EEP_SET_BASE)     //公共定值开始位置
	#define EEP_SET_ADDR			((3*1024)+EEP_SET_BASE)     //开关定值开始位置
#endif

//系统运行信息保存，占用256字节
#define EEP_SYSTEM_DATA_START 	((63*1024)+EEP_SET_BASE)
#define EEP_SYSTEM_DATA_END		(256+EEP_SYSTEM_DATA_START)
#define EEP_SYSTEM_DATA_SIZE 	(EEP_SYSTEM_DATA_END - EEP_SYSTEM_DATA_START)

#ifdef SOE_PARA_ALL_SAVE
#define EEP_SOE_BASE   (128*1024)
#define EEP_SOE_ADDR			(0*1024+EEP_SOE_BASE)  	// 从0开始32空间
#define EEP_OPERATE_ADDR		(64*1024+EEP_SOE_BASE)  	// 从32开始14k空间
#define EEP_VIP_ADDR			(96*1024+EEP_SOE_BASE)  	// 从32开始14k空间
#else
#define EEP_SOE_BASE   (0*1024)
#define EEP_SOE_ADDR			(0*1024)  	// 从0开始32空间
#define EEP_OPERATE_ADDR		(32*1024)  	// 从32开始14k空间

#define EEP_VIP_ADDR			(48*1024)  	// 从32开始14k空间
#endif


#define IECTABLE_ADDR			(96+EEP_SET_BASE) 	//从64k开始1k空间

#ifdef ADD_DEBUG_RECORD_FUN
#ifdef SOE_PARA_ALL_SAVE
#define EEP_OTHER_DATA_SAVE_BASE       (256*1024)    //256k开始位置用于存储其他的数据
#else
#define EEP_OTHER_DATA_SAVE_BASE       (128*1024)    //128k开始位置用于存储其他的数据
#endif
#define EEP_DEBUG_RECORD_ADDR		   (0*1024+EEP_OTHER_DATA_SAVE_BASE)  //预留32K用于存储调试记录包括全参数或者非全参数
#else
#define EEP_DEBUG_RECORD_ADDR	       EEP_VIP_ADDR   //若无定义调试记录则默认显示关键记录
#endif

#ifdef METERING_ENERGY
#define EEP_DD_DATA 			(260+EEP_SYSTEM_DATA_START)
#endif

#define TEST_MASK_BIT(object, mask) (((object) & (mask))?true:false)
#define TEST_BIT(object, bit)  (((object>>bit)&1)>0?true:false)

//系统错误标志位(System Error Register)
//
#define SER_RAMERR			(1 << 0)		//RAM错误
#define SER_ROMERR			(1 << 1 )		//ROM错误
#define SER_EEPERR			(1 << 3 )		//EEP错误
#define SER_SETERR			(1 << 5 )		//定值错误
#define SER_EQUIPPARAERR	(1 << 6 )		//装置参数错误
#define SER_CSTSETERR		(1 << 8 )		//内部定值错误
#define SER_FACTORERR		(1 << 10 )		//通道系数错误
#define SER_DIERR			(1 << 11 )		//开入错误
#define SER_DOERR			(1 << 12)		//开出错误
#define SER_ADERR			(1 << 13 )		//AD错误
#define SER_FLASHERR		(1<<14) 		//FLASH闪存错误
#define SER_EQUIPCFG		(1<<15) 		//装置配置错误

// 告警信息定义 
#define GER_ZEROSHIFT		(1<<0)		//零漂越限
#define GER_PTDX			(1<<1) 		//PT断线
#define GER_PTNEG			(1<<2) 		//PT反序
#define GER_TZSB			(1<<3) 		//跳闸失败
#define GER_THWCN			(1<<4)		//弹簧未储能
#define GER_LXGJ 			(1 << 5)	//零序告警
#define GER_TWYL			(1 << 6)	//跳位有流
#define GER_BSHZGJ    		(1 << 7)     	      //大电流闭锁合闸告警

#define GER_UOVER    		(1 << 8)     	     
#define GER_ULOW    		(1 << 9)     	     

#define GER_IOVER    		(1 << 10)     	     
#define GER_ILOW    		(1 << 11)     	     
#define GER_U0GJ    		(1 << 12)     


//遥控操作命令码
enum EREMOTEOPCODE
{
    RCODE_OPERATE=0x5A,   // 合
    RCODE_RESET=0xA5         // 分
};

enum
{
	YK_VAL_HZ=1,
	YK_VAL_TZ,
	YK_TYPE_SEL,
	YK_TYPE_EXE,
	YK_TYPE_CANCEL,	
};

//遥控操作顺序
enum
{
    YK_STATUS_NONE=0,	//没有遥控操作
    YK_STATUS_SEL,		//遥控选择
    YK_STATUS_EXE,		//遥控执行
    YK_STATUS_TIMEOUT,	//遥控超时
};

/*------------------------------ 类型结构 -------------------------------------
*/
typedef struct EQUIP_INF
{
	WORD wType;       	// 保护类型码    
	WORD wVerH;       	// 软件版本号
	WORD wVerL;       	// 软件的发布号及特殊版本号，高字节为发布号，低字节为特殊版本号
	WORD wCrc;         	// 保存信息的校验码
	WORD wdescCrc;		// set_desc.bin文件的CRC
}EQUIP_INF;

//遥控操作结构
typedef struct REMOTEYKSTATUS
{
    BYTE yk_st;//操作顺序，1选择或2执行、3撤消
    BYTE no;//编号
    BYTE val;
    BYTE owner;
    WORD wMaster;	//主站编号或ID
    DWORD dTStart;//遥控选择的开始时间
}REMOTEYKSTATUS;

#pragma pack(1)
typedef struct SYSTEM_DATA
{
	BYTE bWriteFlag;			//写数据标志
	BYTE bWriteLock;			//写数据锁		
	WORD wSwTzCount;		//开关故障跳闸次数
	WORD wSwHzCount;		//开关合闸次数
	DWORD dwDD[8];               // 8个电度值
	float fwDD[8];
	WORD res[92];			//！！！备用(92*2)字节
	WORD wCrc;				//校验码
}SYSTEM_DATA;//此结构体不允许超过 EEP_SYSTEM_DATA_SIZE->256字节
#pragma pack()

#if defined FUNC_DRIVE || defined FUNC_DRIVE_JY
typedef struct YK_DRIVE
{
	bool b_drive_on;			//不停电传动功能标志
	bool b_fa_drive;			//FA模式允许传动功能
	bool b_err;					//装置异常
	bool b_warning;				//装置告警
	bool b_drive_soe;			//用于判断传动功能SOE
	bool bTz_Doing;				//传动功能跳闸中
	bool bHz_Doing;				//传动功能合闸中
	bool bQuit;					//退出传动软压板标志
	bool b_drive_process;		//传动功能进行中
	#ifdef FUNC_DRIVE_PULSE
		bool b_set_pulse;		//设置分合闸脉宽标志
		bool b_unset_pulse;		//恢复分合闸脉宽标志
	#endif
	TIMERELAY tQDTime_hz; 		//合闸时间继电器
	TIMERELAY tQDTime_fz; 		//分闸时间继电器
	TIMERELAY tQDTime_fz_end; 		//分闸结束传动时间继电器
	TIMERELAY tQDTime_hz_end; 		//合闸结束传动时间继电器
	
	#ifdef FUNC_DRIVE_JY
		bool b_bh_reclose;			//启动重合闸
		bool b_drive_on_check;		//重新传动检测
		bool b_fa_reclose;			//FA分段模式再次合闸
		bool b_clear_bs;			//需等合闸拒动SOE时间标志
		bool b_drive_success;		//用于判断传动成功
		bool b_drive_success_again; //用于判断补发合闸后传动成功
		TIMERELAY tDriveUa1Time;	//UA1持续时间
		TIMERELAY tDriveUa2Time;	//UA2持续时间
		TIMERELAY tDriveU0Time; 	//U0持续时间
		TIMERELAY tDriveITime;		//I持续时间
		TIMERELAY tDriveI0Time; 	//I0持续时间
		TIMERELAY tDriveFaBSTime;	//等合闸拒动SOE时间
		TIMERELAY tDriveAgainTime;	//再次传动时间
	#endif
}YK_DRIVE;
#endif


/*------------------------------ 变量声明 -------------------------------------
*/
extern  volatile DWORD  dTCounter;    //系统定时器
extern DWORD g_dw_led[];  //  灯状态
extern DWORD g_dw_ledsave[];  //  灯状态
extern bool bTestMode;
extern bool bMaintain;
extern bool bMaintain_test;//测试模式，如开入开出测试，避免受应用影响，顺利完成测试
extern unsigned short	m_CodeCrc;
#if defined FUNC_DRIVE || defined FUNC_DRIVE_JY
	extern YK_DRIVE gb_drive;
#endif

/*------------------------------ 函数声明 -------------------------------------
*/
void SystemInit(void);
int Get_Code_CRC(void);
void Delayms(DWORD dT,DWORD count);
void SignalReset(int rstsw,bool blnk);
void ResetHzLed(int rstsw);
char *RmtCtrl_Err(int err_code);
int RemoteCtrl(BYTE,BYTE,BYTE,WORD);
void  CtrlPolling(void);
void ResetRctrl(WORD wID);
void AppPolling(void);
int send_rmt_yc(u8 *buf);
int send_rmt_dd(u8 *buf);
int send_rmt_yx(u8 *buf);
int send_rmt_yk(u8 *buf);

char *get_comm_name(int index);
char *get_yk_owner(u8 owner);
int bat_begin_time(void);
bool check_fault(void);

#ifdef FUNC_RESET_EQU
extern bool gb_ResetEqu;
extern void equ_PowerRest(void);
#endif

#endif //_SYS_H

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