#ifndef _APP_S61850_H
#define _APP_S61850_H

/*************************************************************************
版权所有：通讯项目组 
版本号：1.00
文件名：S61850.H
生成日期：2007.1.7
作者：Mr.L
功能说明：	变电站通信网络和系统 子站规约			
与所属工程文件的关系：
其它说明：
修改记录：

记录1：
修改者：
修改日期：
修改内容：
修改原因：

备注：
	../../TXJ/I80486gnu/VxTxj3.a ../../PUB/I80486gnu/PUB.a ../../IEC61850/srv61850_l.a ../../IEC61850/I80486gnu/VxIEC61850.a 
	-VXWORKS -MOSI -TP0_ENABLED -LEAN_T -MVL_UCA -MMS_LITE -DEBUG_SISCO
	-IE:/TXJ_PRJ/TXJ3/PVCS/IEC61850/extend/inc -IE:/TXJ_PRJ/TXJ3/PVCS/IEC61850/mmslite/inc 

2011-01-13 Mr.Z 遥控、保护定值数据交换采用队列消息方式，增加宏和函数定义；
*************************************************************************/
#include <app_61850.h>

#ifdef INCLUDE_S61850_PTL   /* 定义了INCLUDE_S61850_PTL后才编译以下全部代码 */

/***********************************************************
*	shenlan - s61850 - 平台库编译开关 begin
***********************************************************/
#ifdef UT_OS_VXWORKS
#define VXWORKS 
#else
#define LINUX 
#endif

#if 0
#define MOSI 
#define TP0_ENABLED 
#define LEAN_T  
#define MVL_UCA 
#define MMS_LITE
#define DEBUG_SISCO
#endif


/***********************************************************
*	调试功能
***********************************************************/
#define _S61850_DEBUG_DOWN		0x0001	/*可观查下载数据的基本过程*/
#define _S61850_DEBUG_INIT		0x0002	/*初始化*/
#define _S61850_DEBUG_CMD	 	0x0004
#define _S61850_DEBUG_MON		0x0008
#define _S61850_DEBUG_YX	 	0x0010
#define _S61850_DEBUG_YC		0x0020
#define _S61850_DEBUG_MC		0x0040
#define _S61850_DEBUG_SOE		0x0080
#define _S61850_DEBUG_OBJ		0x0100
#define _S61850_DEBUG_ALL		0xFFFF	/*可观查所有函数调用过程*/


/***********************************************************
*	应用初始化缓冲空间分配宏定义
***********************************************************/
#define		S61850_PRIMNUM_MAX		5		/* 最大primval个数 */
#define		S61850_NETSTAT_MAX		55		/* 最大可连接客户端 */
#define		S61850_OBJ_MAX			200		/* 最大OBJ个数 */
#define		S61850_DATA_MAX			(1024*10)
#define		S61850_FILE_MAX			20

/***********************************************************
*	品质描述宏定义
***********************************************************/
#ifdef _UT_BIG_ENDIAN  // 大端模式      
    #define		S61850_QUALITY_GOOD		     0x000D0000	    /* 前两个字节表示位长度，后两个位串 */
    #define		S61850_QUALITY_INVALID		 0x000D4000
    #define		S61850_QUALITY_RESERVED		 0x000D8000
    #define		S61850_QUALITY_QUESTIONABLE	 0x000DC000
#else
    #define		S61850_QUALITY_GOOD		     0x0000000D		/* 前两个字节表示位串，后两个位长度 */
    #define		S61850_QUALITY_INVALID		 0x0040000D
    #define		S61850_QUALITY_RESERVED		 0x0080000D
    #define		S61850_QUALITY_QUESTIONABLE	 0x00C0000D
#endif

#define		S61850_ST_QUALITY			APP_BIT_STRING
#define		S61850_QUALITY_ELESIZE		4
#define		S61850_QUALITY_ELELEN		13 
#define		S61850_ST_TIME				APP_UTC_TIME

//定义时间同步状态
#define        S61850_TIME_SYN          0       //已同步
#define        S61850_TIME_NOT_SYN     1       //未同步
#define        S61850_TO_TIME_FLAG(isSyn) ((isSyn) ? S61850_TIME_SYN : S61850_TIME_NOT_SYN)

/***********************************************************
*	数据类型宏定义
***********************************************************/
#define		S61850_APP_DPS				APP_DPS
#define		S61850_APP_FP32				APP_FP32	
#define		S61850_APP_BOOL				APP_BOOL

/***********************************************************
*	平台库命令返回标志宏定义
***********************************************************/
#define		S61850_CO_IDLE				0
#define		S61850_CO_SUCCESS			1
#define		S61850_CO_FAILURE			2
#define		S61850_CO_WAITING			3
#define		S61850_CO_ERROR				4 

/***********************************************************
*	平台库遥控类型标志 与组态工具的宏定义必须一致
***********************************************************/
#define		S61850_DCO		0
#define		S61850_SCO		1
#define		S61850_MCO		2

#define		S61850_YK_NORMAL			0
#define		S61850_YK_OFF				1
#define		S61850_YK_ON				2

#define		S61850_YK_HIGHER			0
#define		S61850_YK_LOWER				1
#define		S61850_YK_STOP				2

/***********************************************************
*	回调模式
***********************************************************/
#define		S61850_CB_INIT				0x01  /* call back 回掉 */
#define		S61850_CB_MONITOR			0x02  /* call back 监视 */

/***********************************************************
*	读定值类型标志
***********************************************************/
#define		S61850_BH_CALL_LIST			0x001
#define		S61850_BH_CALL_DESC			0x002
#define		S61850_BH_CALL_VAL			0x003

/***********************************************************
*	录波参引
***********************************************************/
#define		S61850_FR_RcdMadeVal			"$ST$RcdMade$stVal"
#define		S61850_FR_FltNumVal				"$ST$FltNum$stVal"
#define		S61850_FR_RcdMadeDesc			"$DC$RcdMade$d"

/*2011.01.17 Mr.Z增加遥控消息队列宏定义*/
/***********************************************************
*	遥控消息队列类型标志
***********************************************************/
#define S61850_YK_SELECT	     1
#define S61850_YK_OPERATE	     2
#define S61850_YK_CANCEL	     3
#define S61850_YK_SELECT_reply	 4
#define S61850_YK_OPERATE_reply	 5
#define S61850_YK_CANCEL_reply	 6

/*********************************************************
*	结构与组态工具的<61850数据模型映射表>相对应。
*	用于平台库叶子参引与应用的数据点之间的相互关联
*	遥信配置表
*********************************************************/
typedef struct _S61850_YX_table_struct 
{
	char 	*sz_ldName;			/* 叶子所在装置 */
	char  	*sz_obj_ref;   		/* 对象参引名称,定义到哪层就是哪层 */
	char  	*sz_leafName;   	/* 叶子参引名称(属性) */
	short 	w_tabType;			/* 总表类型 */
	short	w_position;			/* 该类表的索引*/
	char	c_val;				/* 备份点值 */
    unsigned char	uc_quality;				/* 备份品质 */
} S61850_YX_table_struct;

/********************************************************
*          遥测配置表
**********************************************************/
typedef struct _S61850_YC_table_struct 
{
	char 	*sz_ldName;			/* 叶子所在装置 */
	char  	*sz_obj_ref;   		/* 对象参引名称,定义到哪层就是哪层 */
	char  	*sz_leafName;   	/* 叶子参引名称(属性) */
	float	f_xishu;			/* 遥测系数 */
	short 	w_tabType;			/* 总表类型 */
	short	w_position;			/* 该类表的索引*/
	
	/*2011.1.4 Mr.Z 修改遥测值定义*/
	/*float	f_val;				 备份点值 */
	unsigned char	uc_quality;				/* 备份品质 */
} S61850_YC_table_struct;

/********************************************************
*          脉冲配置表
**********************************************************/
typedef struct _S61850_MC_table_struct 
{
	char 	*sz_ldName;			/* 叶子所在装置 */
	char  	*sz_obj_ref;   		/* 对象参引名称,定义到哪层就是哪层 */
	char  	*sz_leafName;   	/* 叶子参引名称(属性) */
	short 	w_tabType;			/* 总表类型 */
	short	w_position;			/* 该类表的索引*/

    unsigned char uc_quality;       //品质位
} S61850_MC_table_struct;

/********************************************************
*          遥控配置表
**********************************************************/
typedef struct _S61850_YK_table_struct 
{
	char 	*sz_ldName;			/* 叶子所在装置 */
	char  	*sz_obj_ref;   		/* 对象参引名称,定义到哪层就是哪层 */
	char  	*sz_leafName;   	/* 叶子参引名称(属性) */
	char	w_ctrlMode;			/* 控制类型 */
	char	w_ctrlState;		/* 控制状态 */
	short 	w_tabType;			/* 总表类型 */
	short	w_position;			/* 该类表的索引*/
} S61850_YK_table_struct;

/****************************************************************************
*	此映射表是在组态中配置的，它把定值表与61850的叶子参引关联起来。用于在txj应用程序中，
*	当装置回应定值数据时，	用定值识别码w_index查得对应的定值参引，组成定值参引数组，然后递给平台库。
*	在这个数据结构中，端口号和装置地址唯一对应一个IED，它按功能（也就是定值组号）分为不同的LD,
*	在这个LD中的定值都是同一组号的定值
*******************************************************************************/
typedef struct _S61850_SG_table_struct 
{
	char 	*sz_ldName;			/* 叶子所在装置 */
	char  	*sz_obj_ref;   		/* 对象参引名称,定义到哪层就是哪层 */
	char  	*sz_leafName;   	/* 叶子参引名称(属性) */
	short 	w_tabType;			/* 总表类型 */
	short 	w_position;			/* 定值总表中的索引*/

	short	w_leafDataType;		/* XML定值的数据类型*/	
	short	w_leafEleSize;
	short	w_update;
	char	sz_value[32];

	int		i_GIN;		/* 保护装置的GIN */
	int		i_dataType; /* 保护装置的定义数据类型 */

} S61850_SG_table_struct;

/********************************************************
*          故障录波配置表
**********************************************************/
typedef struct _S61850_FR_table_struct 
{
	char 	*sz_ldName;			/* 逻辑装置 */
	char 	*sz_lnName;			/* 逻辑节点 */
	short 	w_port;   			/* 系统号 */
	short 	w_deviceNode;		/* 装置序号 */

} S61850_FR_table_struct;
/********************************************************
*          网络管理
**********************************************************/
typedef struct _S61850_NetStat_struct 
{
	int		i_used;				/* 当前节点是否处于连接状态 */
	int 	i_hSocket;			/* 网络连接端口 */
	int		year;				/* 网络连接时间：年 */
	char	month;				/* 网络连接时间：月 */
	char	day;				/* 网络连接时间：日 */
	char	hour;				/* 网络连接时间：时 */
	char	min;				/* 网络连接时间：分 */
	char	sec;				/* 网络连接时间：秒 */

} S61850_NetStat_struct;


/********************************************************
*     Server 服务器表
**********************************************************/
typedef struct Comp_ServerTable_Struct
{
    char sz_name[16];				/* server 名称 */
    int  i_yx_offset;				/* 遥信 表偏移 */
	int  i_yx_num;					/* 遥信 表个数 */
    int  i_yc_offset;				/* 遥测 表偏移 */
	int  i_yc_num;					/* 遥测 表个数 */
    int  i_mc_offset;				/* 脉冲 表偏移 */
	int  i_mc_num;					/* 脉冲 表个数 */
    int  i_yk_offset;				/* 遥控 表偏移 */
	int  i_yk_num;					/* 遥控 表个数 */
    int  i_dz_offset;				/* 定值 表偏移 */
	int  i_dz_num;					/* 定值 表个数 */
    int  i_fr_offset;				/* 录波 表偏移 */
	int  i_fr_num;					/* 录波 表个数 */
	char by[32];
}Comp_ServerTable_Struct;

/********************************************************
*    结点配置表(关联数据库信息,常量配置)
**********************************************************/
typedef struct Comp_NodeRefTable_Struct 
{
	int 	i_ldName;   	/* 逻辑装置名称 */
	int 	i_varName;   	/* 对象名称 */
	int 	i_leafName;   	/* 叶子名称 */
	short 	w_tabType;		/* 总表类型 */
	short	w_position;		/* 对应总表的序号 */
	float	f_para[6];		/* 结点参数,根据 tag 属性来确定具体内容 */
	char	by[24];
}Comp_NodeRefTable_Struct;


typedef struct Comp_FileCfgTable_Struct{
	int 	i_ldName;		/* 逻辑装置名称 */
	int 	i_lnName;		/* 逻辑节点名称 */
	short 	w_port;   		/* 系统号 */
	short 	w_deviceNode;   /* 装置序号 */
	char	by[8];
}Comp_FileCfgTable_Struct;

#if 0 // sunxi 20190625
/********************************************************
*     定值召唤过程中的中间变量
**********************************************************/
typedef struct SG_Inf_struct {
	int i_hSocket;
	int i_cmdType;
	char sz_ldName[64];
	char sz_varName[64];

	int i_port;
	int i_addr;
	int i_cpu;
	int i_zone;
	int i_cmdFlag; /* 区分召唤的是描述还是值 */
	int i_cmdGIN;  /* 区分召唤的是定值还是投退 */

	int i_DzZoneDataType;	/* 定值区号的数据类型 */

	int i_DzZoneId;		/* 定值区组号 */
	int i_DzGroupId;	/* 定值组号 */
	int i_CtrlGroupId;	/* 控制字组号 */
	int i_TtGroupId;	/* 投退组号 */

	int i_ActZone;
	int i_ActGIN;

	int i_EditZone;
	int i_EditGIN;

	int i_CnfGIN; /* 固化定值的组号 */

	int i_NumOfSG;
	int i_NumGIN;

	int i_PreSetZone;

	int i_EditIndex;
	int i_EditItems;		/* 写定值个数 */

} SG_Inf_struct;

/********************************************************
*     控制过程中的中间变量
**********************************************************/
typedef struct YK_Inf_struct {
	int i_port;
	int i_addr;

} YK_Inf_struct;

/********************************************************
*     命令执行唤过程中的中间变量
**********************************************************/
typedef struct CMD_deviceInf_struct {
	int i_status; /* 命令状态是否在有效期 */
	int i_hSocket;
	int i_cmdType;
	int i_objNum;
	int i_moreFollow;
	char sz_ldName[64];
	char sz_varName[64];

	SG_Inf_struct t_dz;
	YK_Inf_struct t_yk;
}CMD_deviceInf_struct;

/********************************************************
*     录波的中间变量
**********************************************************/
typedef struct FILE_struct {
	char flag[S61850_FILE_MAX];
	char name[S61850_FILE_MAX][64];
}FILE_struct;

/********************************************************
*     61850 基本远动规约配置数据结构
**********************************************************/
typedef struct S61850CNF_struct 
{
	char	srvName[16];		/* 关联的SERVER */
	long  	yxtime;				/* 遥信扫描周期[秒] */
	long	yctime;				/* 遥测扫描周期[秒] */
	long	mctime;				/* 脉冲扫描周期[秒] */
	long	yktime;				/* 遥控超时时间[秒] */

	long	synctime;			/* 数据同步周期[分] */

	char	by[92];				/* 备用*/ 
} S61850CNF_struct;

#endif // sunxi 20190625

/*********************************************************
*	子站61850应用数据结构
*********************************************************/
typedef struct S61850_app_struct {
	char	powerOn;			/* 子站上电标志 */

	int		i_debugPort;		/* 调试口 */
	int		i_MsgWatchSocket;	/* 报文监视 */
	
	unsigned char	c_port;		/* 对应系统号 */
	char	sz_srvName[32];

	S61850_NetStat_struct	t_inetstat[S61850_NETSTAT_MAX];	/* 网络连接信息 */

	int		i_yx_num;			/* 遥信配置表的个数 */
	int 	i_yc_num;			/* 遥测配置表的个数 */
	int 	i_mc_num;			/* 脉冲配置表的个数 */
	int 	i_yk_num;			/* 遥控配置表的个数 */
	int 	i_dz_num;			/* 定值配置表的个数 */
	int 	i_fr_num;			/* 录波配置表的个数 */

	S61850_YX_table_struct *p_yxTable;		/* 遥信表链表 */
	S61850_YC_table_struct *p_ycTable;		/* 遥测表链表 */
	S61850_MC_table_struct *p_mcTable;		/* 脉冲表链表 */
	S61850_YK_table_struct *p_ykTable;		/* 脉冲表链表 */
	S61850_SG_table_struct *p_dzTable;		/* 定值表链表 */
	S61850_FR_table_struct *p_frTable;		/* 录波表链表 */

    char   timeSynFlagBackup;       //时间同步标识备份

	char	c_ctrlFlag;
	char	ctrlbuf[256];
	int		ctrlen;

	/*2011.1.4 Mr.Z 修改遥测值变量定义*/
	float	yc_val[2047];
	float	mc_val[2047];       //2013-11-26 Mr.C，开普实验

	// add by sunxi
	short yxindex[300]; //短地址在相应类型总总表中的位置
	short ycindex[100];
	short ykindex[20];
	short dzindex[200];	
} S61850_app_struct;


/**********************************************************
* S61850 规约的相关接口
**********************************************************/
#if 0 // sunxi 20190625
extern int S61850_remote_cmd_req(AS_COMMAND_INFO *pt_command);
extern void S61850_send_MsgWatch(SOCKET hSocket, unsigned char *msg,long i_len);
extern void S61850_recv_MsgWatch(SOCKET hSocket, unsigned char *msg,long i_len);
extern void S61850_client_connect(int hSocket);
extern void S61850_client_disconnect(int hSocket);
extern int S61850_get_connectCount();

extern int S61850_terminal_PrintNetStat(char port);
extern int S61850_terminal_SetMsgWatch(char port,int id);
extern int S61850_terminal_ClrMsgWatch();

extern void S61850_SG_BH_Resp(char port, char* buf);
extern int S61850_YK_Confirm_SelectWithValue(int port,int i_index,int sts,int i_rslt);
extern int S61850_YK_Confirm_Operate(int port,int i_index,int sts,int i_rslt);
extern int S61850_YK_Confirm_Cancel(int port,int i_index,int sts,int i_rslt);

extern int S61850_File_Save(unsigned char port,int i_deviceNode,char *buf,int i_len,char *filename);
#endif // sunxi 20190625

extern int S61850_main(char port);
extern void S61850_main_exit(void);
extern void S61850_Debug(char port);

#if 0 // sunxi 20190625
/*2011-01-13 Mr.Z S61850遥控命令数据交换采用队列消息方式begin*/
extern void manager_lib_YK(char type,struct YK_in_struct *YK,char c_sts);	
extern void manager_app_YK(void);												
extern void S61850_app_YK_reply(int type,int outport,int index,int sts,int rslt);
extern void S61850_lib_YK_reply(void);
/*2011-01-13 Mr.Z S61850遥控命令数据交换采用队列消息方式end*/


/*2011-06-14 Mr.Z S61850定值召唤数据交换采用队列消息方式begin*/
extern void S61850_lib_SG_send(char port,char transPort,unsigned char *buf,char *note);	
extern void S61850_app_SG_send(void);												
extern void S61850_app_SG_reply(char port, char* buf);
extern void S61850_lib_SG_reply(void);
/*2011-06-14 Mr.Z S61850定值召唤数据交换采用队列消息方式end*/

/******************************************************************************
函数名称：    S61850_set_debug_mask
函数版本：    V1.00
创建作者：    Mr.L
创建日期：    2015-1-15
函数说明：    修改调试开关的掩码，限制调试输出范围
输入参数：
              set_argc = 参数个数 set_argv=参数指针
输出参数：
返回值：      0=成功 -1=失败 
修改记录：
*/
int S61850_set_debug_mask(int set_argc, char *set_argv[]);

#endif // sunxi 20190625

int S61850_App_init(void);




/****************add by sunxi 20190412*************************/


#define SADDR_STR_LENTH 20
typedef struct tbl_saddr_cfg   //从保护传来的数据信息及数据
{
	int sAddrnum;
	int yxnum;
	int ycnum;
	int yknum;
	int setnum;
	int gseoutnum;
	int gseinnum;

	unsigned int commstate;
	unsigned int frameseqnum;  //报文连续帧计数，计数到一定值报通信异常

	/*下面缓冲区内数据用于和保护交互数据*/
	struct gse_tbl  *p_outtbl;
	struct gse_tbl  *p_intbl;
	int gseoutval[GOOSE_SEND_TBL_NUMBER];
	int gseinval[GOOSE_RECV_TBL_NUMBER];
	int   b_gseinnew;		//有接收数据更新
	
}SRV_TLB_SADDR_CFG;

extern SRV_TLB_SADDR_CFG g_tTbl;
extern int srv_get_tbl_cfg(void);


/*****************************end sunxi*******************************/












/**********************************************************
*		END
**********************************************************/

#endif

#endif
