/*
 * app61850.h
 *
 *  Created on: 2019-6-12
 *      Author: sunxi
 */

#ifndef APP_61850_H_
#define APP_61850_H_

#include "glbtypes.h"
#include "ac_read.h"
#include "ac_write.h"
#include "ac_set.h"

/******************************************************************************
版权所有：	通讯项目组
文件名称：	61850.h
文件版本：	V1.00
创建作者：	Mr.L
创建日期：	2013-7-29
功能说明：	IEC61850总程序入口声明
其它说明：
修改记录：
*/
/*---------------------------------- 头文件 -----------------------------------
*/

#define PRODUCT_SYMBOL_UT_5311
#define	_UT_5311_MCF

/* _UT_5311 */
#ifdef _UT_5311_MCF
    #define _DEVICE_NAME                    "UT-5311"
    #define  _UT_5311                       /* 冷火硬件平台 */
    #define  _MCF54418_FLAT                 /* 冷火平台 */
    #define _UT_BIG_ENDIAN                  /* 转换为大端模式 */
    #define _IEC61850_ON_PROCESS            /* 基于进程的IEC61850模式，可以单独运行各个模型文件 */
    #undef     SOE_TRIPHASE_MERGE          /*南网的SOE三相合并功能*/
#endif

#ifdef  _MCF54418_FLAT                   /* 冷火MCF54418平台 */
    #define _MCF54418_FLAT_MODULE
    #define _MCF54418_NIC_MODULE
    #define _MCF54418_CAN_MODULE
    #define _MCF54418_RTC_MODULE
#endif

#ifdef _UT_5311
	#define MAIN_ROUTINE_NAME   "ut531x"
#if 1
	#define DEFAULT_DIR		    "/app/IEC61850/appdata/"		/*启动默认路径*/
	#define _LOG_DIR			"/app/IEC61850/appdata/"     /* log file */
	#define _PLUGIN_DIR			"/app/IEC61850/dataflash/"     /* plugin file */
	#define IEC61850_CFG_UNZIP_TO_SHM_EN                    /* 解压到内存空间使能，和IEC61850_DEFAULT_DIR配合使用 */
	#define IEC61850_DEFAULT_DIR    "/app/" // "/app/iec61850/dataflash/"				/*启动默认路径,如果考虑提高效率或解决空间问题，可以解压到 /dev/shm */
	#define IEC61850_LOG_FILE    "/app/IEC61850/appdata/IEC61850.log"				/*默认log日志*/
	#define _BOOT_FILE		    ""						/* 启动参数文件 */
	#define _NET_CARD_NAME	    "eth"					/* 网卡名称：eth */
	#define _NET_CARD_MAX       2                       /* 最大的网卡数*/
	#define _WEB_DB_DEFAULT     "/app/IEC61850/app/web/web.db"	    /* WEB默认数据库文件，只有文件框架，用于提供空白文件 */
	#define _WEB_DEFAULT_DIR    "/app/IEC61850/dataflash/web/"
	#define _WEB_DB_FILE        "/app/IEC61850/dataflash/web/web.db"	/* WEB中间数据库文件 */
#else // 测试时使用
	#define DEFAULT_DIR		    "/tmp/IEC61850/appdata/"		/*启动默认路径*/
	#define _LOG_DIR			"/tmp/IEC61850/appdata/"     /* log file */
	#define _PLUGIN_DIR			"/tmp/IEC61850/dataflash/"     /* plugin file */
	#define IEC61850_CFG_UNZIP_TO_SHM_EN                    /* 解压到内存空间使能，和IEC61850_DEFAULT_DIR配合使用 */
	#define IEC61850_DEFAULT_DIR    "/tmp/" // "/app/iec61850/dataflash/"				/*启动默认路径,如果考虑提高效率或解决空间问题，可以解压到 /dev/shm */
	#define IEC61850_LOG_FILE    "/tmp/IEC61850/appdata/IEC61850.log"				/*默认log日志*/
	#define _BOOT_FILE		    ""						/* 启动参数文件 */
	#define _NET_CARD_NAME	    "eth"					/* 网卡名称：eth */
	#define _NET_CARD_MAX       2                       /* 最大的网卡数*/
	#define _WEB_DB_DEFAULT     "/tmp/IEC61850/app/web/web.db"	    /* WEB默认数据库文件，只有文件框架，用于提供空白文件 */
	#define _WEB_DEFAULT_DIR    "/tmp/IEC61850/dataflash/web/"
	#define _WEB_DB_FILE        "/tmp/IEC61850/dataflash/web/web.db"	/* WEB中间数据库文件 */
#endif
	#undef _UART_DEBUG_EN
	#define _UART_DEBUG_1       ""                      /* 调试串口1*/
	#define MAX_SYS_NUM					100+2		/* 系统支持的最大系统数包括串口,网络口,+2 留出2个缓冲*/
	#define		YX_MAX		    12*1024
	#define		YC_MAX		    4*1024
	#define		DD_MAX		    1*1024
	#define		BS_MAX		    1*1024
	#define		CZ_MAX		    1*1024
	#define		DXD_MAX		    1*1024
	#define     DZ_MAX          1*1024
	#define		YK_MAX		    1*1024
	#define	    SOE_RECORD_MAX	1024
	#define _RUN_LOG_MAX_MSGS   1024    /* 运行日志最大条数  run.log */
	#define _SOE_LOG_MAX_MSGS   512     /* SOE日志最大条数  soe.log */
	#define _YK_LOG_MAX_MSGS    512     /* 遥控日志最大条数  yk.log */
	#define _YXBW_LOG_MAX_MSGS  512     /* 遥信变位日志最大条数  yxbw.log */
	#define UT_OS                         UT_OS_LINUX_2_6       /*Linux OS，用于UT-5311无线通信接入单元*/
	#define UT_OS_LINUX     /*Linux 操作系统配置*/
#endif

#define INCLUDE_GOOSE_PTL
#define INCLUDE_S61850_PTL

#if defined (INCLUDE_S61850_PTL) || defined (INCLUDE_GOOSE_PTL)

#define LINUX

#define USE_RT_TYPE_2

/*---------------------------------- 宏定义 -----------------------------------
*/

/* IEC61850 子目录 */
#define		IEC61850_FOLDER			"IEC61850"

/*61850消息队列 2010-02-25 by Mr.M*/
#define MAX_MSGS (10)               /*最多消息数目*/

#define C_RD_V_MSGCODE              1                  /*ac_read_data_values()*/
#define C_WR_V_MSGCODE              2                  /*ac_write_data_values()*/
#define C_GET_SG_MSGCODE            3                 /*ac_get_SGs()*/
#define C_CNF_editSG_MSGCODE        4                  /*ac_cnf_editSG()*/
#define C_SL_activeSG_MSGCODE       5                  /*ac_select_activeSG()*/
#define C_SL_editSG_MSGCODE         6                  /*ac_select_editSG()*/
#define C_RD_SETING_V_MSGCODE       7                  /*ac_read_setting_values()*/
#define C_WR_SETING_V_MSGCODE       8                  /*ac_write_setting_values()*/
#define C_SET_RCB_MSGCODE           9                  /*ac_rpt_setRCBs()*/

#define S_CMD_RSP_MSGCODE           10                   /*as_command_resp()*/
#define S_UPDAT_PRO_MSGCODE         11                   /*as_updat_process_data()*/
#define S_UPDAT_INIOBJMEM_MSGCODE         12                   /*as_updat_initObjsMem()*/
#define S_UPDAT_INIOBJ_MSGCODE         13                   /*as_updat_objInit()*/

/* IEC61850 log 日志默认大小 字节,字符串  */
#define IEC61850_LOG_SIZE_DEFAULT           "500000"
#define IEC61850_MAX_CALLING_CONNECTIONS    "128"         /* IED主备时，折半 */
#define IEC61850_MAX_CALLED_CONNECTIONS      "8"
#define IEC61850_MAX_RFC1006_SPDU_OUTSTANDING      "186"    /* Rfc1006_Max_Spdu_Outstanding配置建议该项为 Max_Calling_Connections+ Max_Called_Connections+50 */
/*--------------------------------- 常量定义 ----------------------------------
*/

/*--------------------------------- 类型结构 ----------------------------------
*/typedef enum PROTOCOL_TYPE
{
	PTL_NULL = 0,		/*0     空协议，可用来测试通道*/
	PTL_S61850,			/*75     61850SERVER */
	PTL_C61850,			/*76     61850CLIENT */
}PROTOCOL_TYPE;

/*
* 61850 消息定义 2010-02-25 by Mr.M
*/

typedef struct _C_RD_V_INFO
{
    ST_CHAR sz_srvName[MAX_IDENT_LEN+1];            /* 服务器名字 */
    AC_READ_REQ t_readReq;        /* 请求结构 */
    ST_INT32 i_timeOut;
    ST_VOID (*u_read_req_done)(void);    /* 读命令异步请求结果回调函数指针 */
} C_RD_V_INFO;

typedef struct _C_WR_V_INFO
{
    ST_CHAR sz_srvName[MAX_IDENT_LEN+1];            /* 服务器名字 */
    AC_WRITE_REQ t_writeReq;        /* ACSI写请求结构 */
    ST_INT32 i_timeOut;
    ST_VOID (*u_write_req_done)(void);   /* 写命令异步请求结果回调函数指针 */
} C_WR_V_INFO;

typedef struct _C_GET_SG_INFO
{
    ST_CHAR sz_srvName[MAX_IDENT_LEN+1];            /* 服务器名字 */
    AC_GETSGS_REQ t_getSGsReq; /* 读定值区信息 请求结构 */
    ST_INT32 i_timeOut;
    ST_VOID(*u_getSGs_req_done)(void); /* 回调函数指针 */
} C_GET_SG_INFO;

typedef struct _C_CNF_editSG_INFO
{
    ST_CHAR sz_srvName[MAX_IDENT_LEN+1];            /* 服务器名字 */
    AC_CNFEDITSG_REQ t_cnfEditSGReq;
    ST_INT32 i_timeOut;
    ST_VOID(*u_cnfEditSG_req_done)(void); /* 回调函数指针 */
} C_CNF_editSG_INFO;

typedef struct _C_SL_activeSG_INFO
{
    ST_CHAR sz_srvName[MAX_IDENT_LEN+1];            /* 服务器名字 */
    AC_SELASG_REQ t_selasgReq;
    ST_INT32 i_timeOut;
    ST_VOID(*u_selasg_req_done)(void); /* 回调函数指针 */
} C_SL_activeSG_INFO;

typedef struct _C_SL_editSG_INFO
{
    ST_CHAR sz_srvName[MAX_IDENT_LEN+1];            /* 服务器名字 */
    AC_SELASG_REQ t_selasgReq;
    ST_INT32 i_timeOut;
    ST_VOID(*u_selasg_req_done)(void); /* 回调函数指针 */
} C_SL_editSG_INFO;

typedef struct _C_RD_SETING_V_INFO
{
    ST_CHAR sz_srvName[MAX_IDENT_LEN+1];            /* 服务器名字 */
    AC_RSETV_REQ t_rsetv_reqd;
    ST_INT32 i_timeOut;
    ST_VOID(*u_rsetv_req_done)(void); /* 回调函数指针 */
} C_RD_SETING_V_INFO;

typedef struct _C_WR_SETING_V_INFO
{
    ST_CHAR sz_srvName[MAX_IDENT_LEN+1];            /* 服务器名字 */
    AI_SETTING_INFO t_ValInfo;
    ST_INT32 i_timeOut;
    ST_VOID(*u_wsetv_req_done)(void); /* 回调函数指针 */
} C_WR_SETING_V_INFO;

typedef struct _C_SET_RCB_INFO
{
    ST_CHAR sz_srvName[MAX_IDENT_LEN+1];
    AC_SETRCB_REQ t_setRcbReq;
    ST_INT32 i_timeOut;
    ST_VOID(*u_set_rcbs_done)(void); /* 回调函数指针 */
} C_SET_RCB_INFO;


typedef struct _S_CMD_RSP_INFO
{
    AS_COMMAND_INFO *pt_command; /* 命令请求回复信息 */
    ST_INT32 i_rslt;                /* 命令执行结果 */
} S_CMD_RSP_INFO;

typedef struct _S_UPDAT_PRO_INFO
{
    ST_INT32 l_updateType;      /* 数据更新类型 */
    AI_OBJ_VAL *pt_objVals;     /* 数据更新类型 */
    ST_INT32 i_num;                 /* 数组大小 */
} S_UPDAT_PRO_INFO;


typedef union
{
	C_RD_V_INFO t_c_rdVal;					/* ReadDataValues服务 */
	C_WR_V_INFO t_c_wrVal;					/* ac_write_data_values服务 */
	C_GET_SG_INFO t_c_getSG;					/* ac_get_SGs服务 */
	C_CNF_editSG_INFO         t_c_cnfEdtSG;		/* ac_cnf_editSG服务 */
	C_SL_activeSG_INFO     t_c_slActSG;			/* ac_select_activeSG服务 */
	C_SL_editSG_INFO    t_c_slEdtSG;			/* ac_select_editSG服务 */
	C_RD_SETING_V_INFO t_c_rdSeting;		/* ac_read_setting_values服务 */
	C_WR_SETING_V_INFO  t_c_wrSeting;		/* ac_write_setting_values服务 */
    C_SET_RCB_INFO t_c_setRcb; 		        /* ac_rpt_setRCBs服务 */
	S_CMD_RSP_INFO t_s_cmdRsp;					/* as_command_resp服务 */
	S_UPDAT_PRO_INFO t_s_updatPro;					/* as_updat_process_data服务 */
    ST_INT32 i_initObj_num;					/*  as_updat_initObjsMem服务 应用最大可能使用的Obj个数*/
    AI_OBJ_VAL   t_objVal;                       /*as_updat_objInit服务  一个对象数据缓冲区，只需填充参引部分*/
} Msg61850Data;


/*2010-11-16  Mr.Z 移植天津黄骅港工程61850的相关修改begin*/
/*Mr.L*/
/* 遥控 */
#if 0 // sunxi 20190613
typedef struct _QUE_DCO_STRUCT
{
	char type;
	char OutPort;
	char DeviceNode;
	char CtrlType;
	short OutIndex;
	char sts;
} QUE_DCO_STRUCT;

typedef struct _QUE_DCO_RET_STRUCT
{
	char type;
	char TBLtype;
	char pos;
	char sts;
} QUE_DCO_RET_STRUCT;


typedef union
{
	char type;
	QUE_DCO_STRUCT		t_dco; /* 遥控 */
	QUE_DCO_RET_STRUCT	t_c_con; /* 遥控确认 */

} QUE_C61850_Data;
/*2010-11-16  Mr.Z 移植天津黄骅港工程61850的相关修改end*/

/*2010.11.22 Mr.Z 61850客户端保护定值召唤采用队列方式begin*/
typedef struct _QUE_DZ_STRUCT
{
	char srcport;
	char buf[300];
} QUE_DZ_STRUCT;

typedef struct _QUE_DZ_RET_STRUCT
{
	char srcport;
	char buf[300];
	char Send_Mode;				 /*发送模式:NOWAIT,WAIT*/
	char *Note;					 /*超级终端提示*/
} QUE_DZ_RET_STRUCT;


typedef union
{
	QUE_DZ_STRUCT Q_DZ;			 /*104转61850保护定值召唤联合体成员*/
	QUE_DZ_RET_STRUCT Q_DZ_RET;	 /*61850转104保护定值召唤应答联合体成员*/
} QUE_C61850_DZ;
/*2010.11.22 Mr.Z 61850客户端保护定值召唤采用队列方式end*/

typedef struct _QUE_YK_STRUCT
{
	char				type;
	YK_in_struct		YKin;
	char				sts;
} QUE_YK_STRUCT;

typedef struct _QUE_YK_RET_STRUCT
{
	int    type;
	int    outport;
	int	   index;
	int    sts;
	int    rslt;
} QUE_YK_RET_STRUCT;

typedef union
{
	QUE_YK_STRUCT		s_YK;	 	/*S61850遥控命令*/
	QUE_YK_RET_STRUCT	s_YK_con;   /*S61850遥控应答*/
} QUE_S61850_YK;

typedef struct _QUE_SG_STRUCT
{
	char			port;
	char 			transPort;
	unsigned char	buf[300];
	char 			*note;
} QUE_SG_STRUCT;

typedef struct _QUE_SG_RET_STRUCT
{
	char	srcport;
	char	buf[300];
} QUE_SG_RET_STRUCT;

typedef union
{
	QUE_SG_STRUCT    	Q_SG;		/*S61850保护定值召唤联合体成员*/
	QUE_SG_RET_STRUCT   Q_SG_RET;	/*S61850定值召唤应答联合体成员*/
} QUE_S61850_SG;
/*2011.1.13 Mr.Z 61850服务端遥控、保护定值召唤变量定义end*/
#endif // sunxi 20190613
enum IEC61850_LIB_INIT_ENUM{
    IEC61850_LIB_INIT_NULL = 0, // 初始状态
    IEC61850_LIB_INIT_WAITING, // 正在执行初始化
    IEC61850_LIB_INIT_SUCCESS, // 初始化成功
    IEC61850_LIB_INIT_FAILURE, // 初始化失败

};

/* 告警列表 */
enum{
    IEC61850_INITED_EVENT = 0x01, // 初始化失败
    IEC61850_MORE_EVENT,
};

/*--------------------------------- 全局变量 ----------------------------------
*/
#if 0 // sunxi 20190613
MSG_Q_ID TXJ61850MsgQID;  	/*消息发送到的消息队列名称*/

MSG_Q_ID C61850_SEND_QID; 	/*2010-11-16  Mr.Z 移植天津黄骅港工程61850的相关修改:消息发送到的消息队列名称*/
MSG_Q_ID C61850_RECV_QID;	/*2010-11-16  Mr.Z 移植天津黄骅港工程61850的相关修改:消息发送到的消息队列名称*/
MSG_Q_ID C61850_S_DZ_QID;	/*2010-11-22  Mr.Z 61850转104规约保护定值应答队列名称*/
MSG_Q_ID C61850_R_DZ_QID; 	/*2010-11-22  Mr.Z 104转61850规约保护定值召唤队列名称*/

							/*2011-01-13  Mr.Z 服务端消息队列定义*/
MSG_Q_ID S61850_S_YK_QID;	/*S61850遥控命令消息队列名称*/
MSG_Q_ID S61850_R_YK_QID;	/*S61850遥控应答消息队列名称*/
MSG_Q_ID S61850_S_SG_QID;	/*S61850保护定值召唤消息队列名称*/
MSG_Q_ID S61850_R_SG_QID;	/*S61850保护定值应答消息队列名称*/
#endif // sunxi 20190613

/* 61850 外部应用的公用变量 */
extern int gi_platelib_state;
extern AI_CALLBACK_FUN gt_callback ;

/*--------------------------------- 函数声明 ----------------------------------
*/

/***************************************************************************
作者：Mr.L
创建日期：2008-2-22
函数功能说明：读取组态数据文件,看是否存在
输入参数：dir=路径
输出参数：
返回值：成功=TRUE；失败=FALSE
函数扇出清单：
函数扇入清单：
函数体中用到的公共资源：
更新后的上述资源：
***************************************************************************/
unsigned char IEC61850_Dir_Exist(char *dir);

/******************************************************************************
函数名称：    IEC61850_get_flat_state
函数版本：    v1.00
创建作者：    Mr.L
创建日期：    2014-5-27
函数说明：    获取平台库初始化状态
输入参数：
输出参数：
返回值：      IEC61850_LIB_INIT_ENUM
修改记录：
*/
int IEC61850_get_flat_state(void);

/******************************************************************************
函数名称：    IEC61850_LibStart
函数版本：    v1.00
创建作者：    Mr.L
创建日期：    2013-3-21
函数说明：    启动IEC61850平台库
输入参数：
输出参数：
返回值：
其他说明：
修改记录：
*/
int lib61850_start_task(void *arg);
void lib61850_set_task_exit(void);


/**************************************************************************
作者：Mr.L
创建日期：2008-9-18 10:02
函数功能说明：平台库ai_iec61850_handle任务
输入参数：
输出参数：
返回值：
函数扇出清单：
函数扇入清单：
函数体中用到的公共资源：
更新后的上述资源：
修改记录:
***************************************************************************/
int iec61850_mms_handle_task(void *arg);

/******************************************************************************
函数名称：    IEC61850_processTask
函数版本：    V1.00
创建作者：    Mr.L
创建日期：    2015-12-15
函数说明：    与61850子进程交互数据的任务
输入参数：    pt_task = 任务控制块
输出参数：
返回值：
修改记录：
*/

int C61850_find_srvIndex_with_subdir(char *find_name);

extern int IEC61850_PLUGIN_sync_yx(int i_syscode,int id);
extern int IEC61850_PLUGIN_sync_comm(int i_syscode,int id);
extern int IEC61850_PLUGIN_sync_xyx(int i_syscode,int id);


#endif // defined (INCLUDE_S61850_PTL) || defined (INCLUDE_GOOSE_PTL)

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



#endif /* APP_61850_H_ */
