/******************************************************************************
版权所有：	
文件名称：	iectable.h
文件版本：	01.01
创建作者：	xxxxxx
创建日期：	2013-05-29
功能说明：	DTU点表处理
其它说明：
修改记录：
*/
#ifndef _IECTABLE_H
#define _IECTABLE_H
/*------------------------------- 头文件 --------------------------------------
*/


/*------------------------------- 宏定义 --------------------------------------
*/
#define MAX_SPI_NUMBER		320		// 最大单点遥信个数
#define MAX_DPI_NUMBER		64		// 最大双点遥信个数
#define MAX_YC_NUMBER		1024		// 最大可配置遥测个数
#define MIX_YX_NUMBER		20		// 合并点最多可合并单点个数

#define TRANS_SZ_BUF_LEN	64 	// 转发点表字符串BUF长度
#ifdef FUN_JSON_FILE
#define HF_IEC_TAB_DIR			"/app/CONFIG/MAIN/"
#define HF_IEC_TAB_HEAD_LEN 		128
#define HF_IEC_TAB_ITEM_LEN			64
#endif

// 资源类型
enum
{
	RES_TYPE_YX,	// 遥信
	RES_TYPE_YC,	// 遥测
	RES_TYPE_YK,	// 遥控
	RES_TYPE_DD,	// 电度
	RES_TYPE_SET,	// 定值
	RES_TYPE_NUM	// 资源类型数量
};

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

//资源表文件头，16bytes
struct rsc_file_head
{
	unsigned int	signature;	//资源表文件签名
	unsigned int	version;	//资源表文件版本
	unsigned int	reserved0;	//保留0
	unsigned int	reserved1;	//保留1
};

//资源表文件头格式
struct rsc_file_head_data
{
	// 资源表文件头
	struct rsc_file_head cfh;		

	// 装置类型
	unsigned char 	equ_sw_num;
	unsigned char 	equ_brd_num;
	char 			equ_name[14];

	// 资源表头
	// 公共
	unsigned int	pub_di_addr;
	unsigned int	pub_di_num;
	unsigned int	pub_do_addr;	
	unsigned int	pub_do_num;
	unsigned int	pub_ac_addr;	
	unsigned int	pub_ac_num;
			
	// sw
	unsigned int	sw_di_addr;
	unsigned int	sw_di_num;
	unsigned int	sw_do_addr;	
	unsigned int	sw_do_num;
	unsigned int	sw_ac_addr;	
	unsigned int	sw_ac_num;

	// ac单位名称
	unsigned int	unit_addr;
	unsigned int	unit_num;

	// LED
	unsigned int	led_addr;
	unsigned int	led_num;

	// 电度
	unsigned int	dd_addr;
	unsigned int	dd_num;
	unsigned int	rsv[2];
 };


//DI资源表描述32byte
struct di_rsc
{
	u8	is_real;	//是否实点	
	u8	indexno;	//在归属中的索引号
	char name[EQU_CFG_NAME_LEN];	//DI名称
	u8	reserved[10];
}; 

//DO资源表描述32byte
struct do_rsc
{
	u8	is_real;	//是否实点	
	u8	indexno;	//在归属中的索引号
	char name[EQU_CFG_NAME_LEN];	//DO名称
	u8	reserved[10];
};

//AC资源表描述32byte
struct ac_rsc
{
	u8	is_real;	//是否实点	
	u8	indexno;	//在归属中的索引号
	char name[EQU_CFG_NAME_LEN];	//AC名称
	u8	unit;		// 单位索引
	u8	unit_angle;	// 角度单位，没有角度为0
	u16	normal;		//额定值
	u8	reserved[6];
};

//单位名称资源表描述
struct unit_rsc
{
	char name[8]; 
};

// LED资源表描述
struct led_rsc
{
	u8	owner;		// 归属：公共/开关
	u8	indexno;	// 索引号
	char name[20];	// LED名称
	u8	reserved[10];
};

//AC资源表描述32byte
struct dd_rsc
{
	u8	is_real;	//是否实点	
	u8	indexno;	//在归属中的索引号
	char name[EQU_CFG_NAME_LEN];	//AC名称
	u8	unit;		// 单位索引
	u8	unit_angle;	// 角度单位，没有角度为0
	u16	normal;		//额定值
	u8	reserved[6];
};


//点表文件头，16bytes
struct table_file_head
{
	unsigned int	signature;	//点表文件签名
	unsigned int	version;	//点表文件版本
	unsigned int	reserved0;	//保留0
	unsigned int	reserved1;	//保留1
};

//点表文件头格式
struct table_file_head_data
{
	// 点表文件头
	struct table_file_head cfh;		

	//工程文件名
	s8	prj_name[64];

	// 装置类型
	u8 	equ_sw_num;
	u8 	equ_brd_num;
	s8	equ_name[14];

	// 点表头
	// DI
	u32	di_addr;	//地址
	u32	di_num;	//个数

	// DI合并
	u32	dimerge_addr;//地址
	u32	dimerge_num;//个数
	
	// DI双点
	u32	di_db_addr;//地址
	u32	di_db_num;//个数
	
	// DO
	u32	do_addr;	//地址
	u32	do_num;	//个数
	
	// AC
	u32	ac_addr;	//地址
	u32	ac_num;	//个数

	//对应描述文件
	u32	rsc_version;	// 版本
	u32	rsc_signature;	// 签名
	u32	rsc_length;		// 长度
	u16	rsc_crc;		// CRC
	u16  Rsv;

	// 名称字符串
	u32	sz_addr;	//地址
	u32	sz_num;		//个数

	// 电度
	u32	dd_addr;	//地址
	u32	dd_num;		//个数
	u32 Rsv2[2];
};

//DI点表描述8byte
struct di_table
{
	u16	cp;			//通讯点号
	u8	owner;		//归属：开关1~开关12、公共0
	u8	link_ch;	// 级联设备通道
	u8	indexno;	//在归属中的索引号
	u8	is_inverse;	//是否取反
	u16	link_cp;	// 级联设备通讯点号	
#ifdef IECTABLE_NEWDPI_V106
	u8  dpi;
	u8 tmp[15];  //备用属性
#endif
}; 

//DI合并点表描述48byte
struct di_merge_table
{
	u16	cp;			//通讯点号
	u8  is_inv_all;	// 合并点是否取反
	u8	reserved[1];// 对齐
	u16	no[20];		// 资源表点号：高4位表示归属，次高4位表示是否实点，低8位表示索引号
	u8  is_inv[20];	// 各单点是否取反
#ifdef IECTABLE_NEWDPI_V106
	u16        link_cp[20]; // 合并点来源
	u8         link_ch[20];
	u8         tmp[12];
#endif
}; 

//DI双点点表描述(8byte)
struct di_db_table
{
	u16	cp;			//通讯点号
	u16	no[2];		// 资源表点号：高8位表示归属，低8位表示索引号。第0个为合位，第1个为分位。
	u8	is_inv[2];	// 各单点是否取反
}; 

//DO点表描述8byte
struct do_table
{
	u16	cp;			//通讯点号
	u8	owner;		//归属：开关1~开关12、公共0，以前使用2字节，目前用1字节，表示开出的两个点只能是同一个归属。
	u8	link_ch;	// 级联设备通道
	u16	link_cp;	// 级联设备通讯点号	
	u8	indexno[2];	//在归属中的索引号
//	u8 	vsq;
};

//AC点表描述32byte
struct ac_table
{
	u16	cp;			//通讯点号
	u8	owner;		//归属：开关1~开关12、公共0
	u8	rsv;		//保留
	u8	indexno;	//在归属中的索引号
	u8	link_ch;	//级联设备通道
	u16	link_cp;	//级联设备通讯点号	
	qs16 rate;		//测量系数	
	qs16 normal;	//额定值	
	qs16 dead_value;//遥测死区
	u8	reserved1[12];
};

//dd点表描述32byte
struct dd_table
{
	u16	cp;			//通讯点号
	u8	owner;		//归属：开关1~开关12、公共0
	u8	rsv;		//保留
	u8	indexno;	//在归属中的索引号
	u8	link_ch;	// 级联设备通道
	u16	link_cp;	// 级联设备通讯点号	
	qs16 rate;		//测量系数	
	qs16 normal;	//额定值	
	qs16 dead_value;//遥测死区
	u8	reserved1[12];
};

// 字符串表
struct sz_table
{
	u16	type;		// 遥信表、遥测表、遥控表（0、1、2）
	u16	index;		// 各个表中的索引
	u32	offset;		// 字符串在字符串表中的偏移
};

struct file_contrast
{
	u32	version;// 版本
	u32	signature;// 签名
	u32	length;// 长度
	u16	crc;	// CRC
};

typedef struct link_table
{
	u32 cp_s; 		// 从设备通讯点号(带通道号，高16位为通道号，低16为通讯点号)
	u32 tbl_index;	// 在对应点表中的索引
//	u16 cp_m; 	// 主设备通讯点号
//	u8  sw; 	// 开关号
//	u8  no; 	// 开关内索引
	u8   owner;
	u8   indexno;
	u8   is_inverse;
	u8   is_mix;       // 若是合并点，存入soe，但不上送
	u16 cp;
}LINK_TABLE;

/*------------------------------ 函数声明 -------------------------------------
*/
extern struct rsc_file_head_data	*g_rsc_head;
extern struct table_file_head_data	*g_table_head;
extern struct di_table				*g_di_table;
extern struct di_merge_table 		*g_di_merge_table;
extern struct di_db_table			*g_di_db_table;
extern struct do_table				*g_do_table;
extern struct ac_table				*g_ac_table;
extern struct dd_table				*g_dd_table;

extern struct file_contrast			rsc_contrast;
extern struct file_contrast		setdesc_contrast;

extern u16 g_crc_rsc;
extern u16 g_crc_rectable;

extern REMOTEYKSTATUS *g_yk_info;
#ifdef FUN_DIMER_LINK
extern struct di_table				*g_di_info_merge_table;
extern u32 g_di_info_merge_num; //个数
#endif

// 级联点表
extern u32 g_lt_di_num;
extern u32 g_lt_do_num;
extern u32 g_lt_ac_num;
extern u32 g_lt_dd_num;
extern LINK_TABLE *g_lt_di;
extern LINK_TABLE *g_lt_do;
extern LINK_TABLE *g_lt_ac;
extern LINK_TABLE *g_lt_dd;


int  tbl_init(void);
int  tbl_exit(void);

int  tbl_cp2index(u16  cp);
u8  tbl_get_dpi(int  i);
u8   tbl_get_yx(int  i,int bDPI);
int tbl_yd_yx(u16 begin,u16 num,u8 * yx_buf);
int tbl_yd_yc(u16 begin,u16 num,u8 * yc_buf);
int tbl_yd_dd(u16 begin,u16 num,u8 * dd_buf);


int  tbl_create_rsc(void);

void tbl_getdiname(WORD owner,WORD index,char *name);
void tbl_getacname(WORD owner,WORD index,char *name);
void tbl_getddname(WORD owner,WORD index,char *name);
void tbl_getdoname(WORD owner,WORD index,char *name);
void tbl_getname(WORD tbl_type, WORD tbl_index,char *name);

extern int tbl_get_sz_index_yx(u16 tbl_index);
extern int tbl_getname_sz(WORD tbl_type, WORD tbl_index,char *name);


int  tbl_printf(void);
int  tbl_printf_rsc(void);
void tbl_printf_cvs(void);

// 级联通讯点表
int tbl_link_init(void);
int tbl_link_exit(void);

LINK_TABLE *tbl_link_di(u16 ch,u16 cp);
LINK_TABLE *tbl_link_do(u16 ch,u16 cp);
LINK_TABLE *tbl_link_ac(u16 ch,u16 cp);
LINK_TABLE *tbl_link_dd(u16 ch,u16 cp);

int tbl_link_printf(void);
#ifdef FUN_JSON_FILE
int tbl_json_file_init(void);
#endif

#endif //_IECTABLE_H

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



