/****************************************************************************/
/* Copyright (c) 2007,许继集团有限公司                                      */
/* All rights reserved.                                                     */
/*                                                                          */
/*  模块描述：                                                              */
/** 对象模型定义，对象空间管理，及对象空间的操作接口
 *  @file  ai_obj.h                                                         */
/*                                                                          */
/* 日期         作者    注释                                                */
/* 2007/07/16   DJF     创建文件                                            */
/****************************************************************************/
#ifndef IEC61850_AI_OBJ_INCLUDED
#define IEC61850_AI_OBJ_INCLUDED

#include "glbtypes.h"
#include "scl.h"
#include "mvl_defs.h"
#include "mms_mp.h"
#include "ai_def.h"

#ifdef __cplusplus
extern "C" {
#endif

#define  AI_MAX_AA_DS_NUM   20  /**< 每个ied下最大可创建的属于AA_SPEC空间的ds个数 */

/**
 * 61850基本对象结构定义     
 */
typedef struct ai_common_obj
{
	ST_CHAR		name[MAX_IDENT_LEN+1];
	ST_CHAR		desc[MAX_IDENT_LEN+1];
	AI_OBJ_TYPE	type;
	ST_INT		id;
	struct ai_common_obj  *parent;
}AI_COMMON_OBJ;

/**
 * 数据集结构定义    
 */
typedef struct
{
	AI_COMMON_OBJ	cobj;

	ST_INT  mb_num;
	ST_INT	*mb_ids;
	AI_OBJ_REF	*mb_refs;
	ST_BOOLEAN	deletable;
}AI_DS_CTRL;

typedef struct 
{
	ST_CHAR do_name[MAX_IDENT_LEN+1]; //do的名字，如果是嵌套do，则是do$sdo
	ST_CHAR desc[MAX_IDENT_LEN+1]; //描述
}AI_DO_DESC;

/**
 * ln结构定义   
 */
typedef struct
{
	AI_COMMON_OBJ	cobj;

	ST_INT	type_id;
	ST_VOID	*data;
	
	ST_INT	sub_obj_num;
	ST_INT	*sub_ids;

	ST_INT  do_desc_num;
	AI_DO_DESC *do_descs;

}AI_LN_CTRL;

/**
 * ld结构定义    
 */
typedef struct
{
	AI_COMMON_OBJ	cobj;
	
	ST_INT		max_num_ds;
	ST_INT		num_ds;
	AI_DS_CTRL	**ds_tbl; // 这里可能包含动态创建的ds 

	ST_INT		max_num_ln;
	ST_INT		num_ln;
	AI_LN_CTRL	**ln_tbl;
}AI_LD_CTRL;

/**
 * fco IDCTRL定义    
 */
typedef struct
{
	AI_FCO_SUBTYPE  type; /**< 详细do或da或ln类型，如AI_LNTYPE_PTOC AI_DOTYPE_SPS AI_DATYPE_BOOLEAN等 */
	RUNTIME_TYPE *rt; 
	AI_LN_CTRL *ln;/**< 对象所属ln */
}AI_FCO_IDCTRL;

/**
 * ln IDCTRL定义    
 */
typedef struct
{
	AI_FCO_SUBTYPE  type; //ln类型 如LLN0  LPHD PTOC等
	AI_LN_CTRL *ln;
}AI_LN_IDCTRL;

/**
 * ld IDCTRL定义    
 */
typedef struct
{
	AI_LD_CTRL *ld;
}AI_LD_IDCTRL;

/**
 * ds IDCTRL定义    
 */
typedef struct
{	
	AI_DS_CTRL *ds;
}AI_DS_IDCTRL;

/**
 * ied IDCTRL定义    
 */
typedef struct
{
	struct ai_ied_ctrl *ied;
}AI_IED_IDCTRL;

/**
 * objid_ctrl定义  
 */
typedef struct
{
	AI_OBJ_TYPE obj_type;    /**< 对象类型 */
	union
	{
        AI_FCO_IDCTRL fco_idctrl;	/**< fcn fcd fcda对象id管理 */
		AI_DS_IDCTRL ds_idctrl;		/**< 数据集的对象id管理 */
        AI_LD_IDCTRL ld_idctrl;		/**< LD的对象id管理 */
		AI_LN_IDCTRL ln_idctrl;		/**< LN的对象id管理 */		
		AI_IED_IDCTRL ied_idctrl;	/**< IED的对象id管理 */		
	}u;
	ST_VOID  *user_info;	/**< 应用层保存的信息 */
}AI_OBJ_IDCTRL;

/**
 * ied 结构定义    
 */
typedef struct ai_ied_ctrl
{
	AI_COMMON_OBJ	cobj;

	ST_INT		max_num_ld;
	ST_INT		num_ld;
	AI_LD_CTRL	**ld_tbl;

	ST_INT		max_aa_ds;		/**< 最大面向关联的ds的个数*/	
	ST_INT		num_aa_ds;
	AI_DS_CTRL	**aa_ds_tbl;	/**< 保存面向关联的dataset  */
	
	ST_INT		obj_num;        /**< ied下的静态对象个数 */
	ST_INT		max_dyn_num;	/**< 最大可创建的动态ds的个数 */
	AI_OBJ_IDCTRL	*id_ctrl;	/**< 数组，大小为obj_num+max_dyn_num */
}AI_IED_CTRL;

/**
 * 通过名字查找逻辑装置
 * @param   ld_name		  逻辑装置名字
 * @param   ied		      对象空间结构
 */
AI_LD_CTRL *ai_find_ld(ST_CHAR *ld_name, AI_IED_CTRL *ied);
/**
 * 通过名字添加逻辑装置
 * @param   ld_name		  逻辑装置名字
 * @param   ied		    对象空间结构
 */
AI_LD_CTRL *ai_add_ld(ST_CHAR *ld_name, AI_IED_CTRL *ied);
/**
 * 创建一个ln对象，并添加到ld中
 * @param    name		 逻辑装置名字
 * @param   type_id	     数据类型ID
 * @param    ld          逻辑装置
 */
AI_LN_CTRL *ai_add_ln(ST_CHAR *ln_name, ST_INT type_id, AI_LD_CTRL *ld);
/**
 * 添加数据集
 * @param   name	数据集名称	  
 * @param   mb_num	成员个数      
 * @param   mb_refs	   ds成员参引  
 * @param   deletable	 是否可删除   
 * @param   parent  	所属结构
 */
AI_DS_CTRL *ai_add_ds(ST_CHAR *ds_name, ST_INT mb_num, AI_OBJ_REF *mb_refs, ST_BOOLEAN deletable, AI_COMMON_OBJ *parent);
/**
 * 删除数据集 
 * @param   ds_id	数据集id	 
 * @param   ied	     对象空间结构
 */
ST_RET  ai_delete_ds(ST_INT  ds_id, AI_IED_CTRL *ied);
/**
 * 创建61850对象,根据传入的类型创建相应的对象，以基本对象指针的形式传出结果
 * @param   type	数据类型	 
 * @param   name     
 */
AI_COMMON_OBJ *ai_create_obj(AI_OBJ_TYPE type, ST_CHAR *name);
/**
 * 释放对象空间
 * @param  ied	     对象空间结构	      
 */
ST_VOID  ai_destroy_ied(AI_IED_CTRL *ied);
/**
 * 查找数据集
 * @param  ied	     对象空间结构	
 * @param  ds_ref	   数据集参引
 */
AI_DS_CTRL *ai_find_ds(ST_CHAR *ds_ref, AI_IED_CTRL *ied);


#ifdef __cplusplus
}
#endif

#endif	/** !IEC61850_AI_MSOBJ_INCLUDED	*/
