/****************************************************************************/
/* Copyright (c) 2007,许继集团有限公司                                      */
/* All rights reserved.                                                     */
/*                                                                          */
/*  模块描述：                                                              */
/** 对象id管理
 *  @file  ai_objid.h                                                       */
/*                                                                          */
/* 日期         作者    注释                                                */
/* 2007/07/18   TYJ     创建文件                                            */
/****************************************************************************/                                                                  
#ifndef IEC61850_AI_OBJID_INCLUDE
#define IEC61850_AI_OBJID_INCLUDE

#include "sysincs.h"
#include "glbtypes.h"
#include "mvl_defs.h"
#include "ai_def.h"
#include "ai_obj.h"

#ifdef __cplusplus
extern "C" {
#endif

/** 
 *获取ied下所有对象的个数，包括ld ln ds fco
 *@param ied  ied对象
 *@return  对象的个数
 */
ST_INT  ai_get_ied_obj_num(AI_IED_CTRL *ied);
	
/** 
 * 获取对象空间中所有ld的个数
 * @param  ied	    对象空间结构
 * @return 成功返回对象的个数, 失败返回0
 * @author guoqiangm@xjgc.com
 */
ST_INT ai_get_ld_num(AI_IED_CTRL *ied);

/** 
 * 获取对象空间中所有ln的个数
 * @param  ied	    对象空间结构
 * @return 成功返回对象的个数, 失败返回0  
 * @author guoqiangm@xjgc.com
 */
ST_INT ai_get_ln_num(AI_IED_CTRL *ied);

/** 
 * 获取对象空间中所有ds的个数
 * @param  ied	    对象空间结构
 * @return 成功返回对象的个数, 失败返回0  
 * @author guoqiangm@xjgc.com
 */
ST_INT ai_get_ds_num(AI_IED_CTRL *ied);

/** 
 * 通过对象的参引和数据类型获得其对象id
 * @param  ied		  对象空间的结构指针 
 * @param  obj_ref	  对象的参引
 * @return 成功返回对象id, 失败返回-1                                                 
 */
AI_OBJ_ID ai_obj_ref_to_id(AI_IED_CTRL *ied, ST_CHAR *obj_ref);

/** 
 * 通过对象id获得对象的参引.
 * 传出的对象参引的格式如：
 * E1Q1SB1C1、E1Q1SB1C1/LLN0$ST$Mod、E1Q1SB1C1/LLN0$myDsName、@myDsName
 * @param  ied		  对象空间的结构指针 
 * @param  obj_id	  对象id
 * @param  obj_ref	  对象的参引
 * @return 成功返回SD_SUCCESS, 失败返回SD_FAILURE                                                 
 */
ST_RET ai_obj_id_to_ref(AI_IED_CTRL *ied, AI_OBJ_ID obj_id, ST_CHAR *obj_ref);

/** 
 * 通过对象id获得对象的名称结构
 * @param  vmd		  对象空间的结构指针 
 * @param  obj_id	  对象id
 * @param  obj_name	  对象的名称结构，调用者申请内存后传入，obj_name结构中的数据内存由接口申请
 * @return 成功返回SD_SUCCESS, 失败返回SD_FAILURE                                                 
 */
ST_RET ai_obj_id_to_objName(AI_IED_CTRL *ied, AI_OBJ_ID obj_id, OBJECT_NAME *obj_name);

/** 
 * 通过对象的参引获得对象的名称结构
 * @param  vmd		  对象空间的结构指针 
 * @param  obj_ref	  对象的参引
 * @param  obj_name	  对象的名称结构，调用者申请内存后传入，obj_name结构中的数据内存由接口申请
 * @return 成功返回SD_SUCCESS, 失败返回SD_FAILURE                                                 
 */
ST_RET ai_obj_ref_to_objName(ST_CHAR *obj_ref, OBJECT_NAME *obj_name);

/** 
 * 通过对象的名称结构获得对象的参引.
 * 传出的对象参引的格式如：
 * E1Q1SB1C1、E1Q1SB1C1/LLN0$ST$Mod、E1Q1SB1C1/LLN0$myDsName、@myDsName 
 * @param  obj_name	  对象的名称结构
 * @param  obj_ref	  对象的参引
 * @return 成功返回SD_SUCCESS, 失败返回SD_FAILURE                                                 
 */
ST_RET ai_objName_to_ref(OBJECT_NAME *obj_name, ST_CHAR *obj_ref);

/** 
 * 释放对象名称结构obj name的内存.
 * 释放obj name中的time_id所申请的内存，domain_id指针没有申请内存，它指向dom对象的name属性
 * @param  obj_name	  对象的名称结构
 * @return ST_VOID                                             
 */
ST_VOID ai_cleanup_objName(OBJECT_NAME *obj_name);

/** 
 * 通过对象的id获得对象的管理结构
 * @param  ied	    对象空间结构
 * @param  obj_id	对象id
 * @return 成功返回对象管理结构指针, 失败返回NULL                                               
 */
AI_OBJ_IDCTRL *ai_get_obj_id_ctrl(AI_IED_CTRL *ied, AI_OBJ_ID obj_id);

/** 
 * 通过对象的id获得对象的数据结构，支持ied ld ln ds四种类型的对象
 * @param  ied	    对象空间结构
 * @param  id	对象id
 * @return 成功返回对象结构指针, 失败返回NULL                                               
 */
AI_COMMON_OBJ *ai_obj_id_to_cobj(AI_IED_CTRL *ied, AI_OBJ_ID id);

/** 
 * 通过obj_id获取该对象下的基本数据类型的对象的个数
 * @param  ied	    对象空间
 * @param  obj_id	对象id，可以为ld、LN、FCO的id
 * @return ST_INT   返回基本类型数据数目                                              
 */
ST_INT ai_get_prim_val_num(AI_IED_CTRL *ied, AI_OBJ_ID obj_id);

/** 
 * 通过obj_id获取该对象下的基本类型数据的id数组
 * @param  ied	        对象空间
 * @param  obj_id	    对象id,可以为ld、LN、D0、DA的id
 * @param  prim_obj_num	保存返回的基本类型数据数目
 * @return AI_OBJ_ID    基本类型数据的id数组                                             
 */
AI_OBJ_ID *ai_get_prim_sub_ids(AI_IED_CTRL *ied, AI_OBJ_ID obj_id, ST_INT *prim_obj_num);

/** 
 * 获取runtime type结构中数据成员的个数
 * @param  rt	 runtime type数据类型结构
 * @return 成功返回rt中数据成员个数, 失败返回0                                                 
 */
ST_INT ai_get_rt_num(RUNTIME_TYPE *rt);

/** 
 * 通过对象id获得对象的名称.
 * @param  ied		对象空间的结构指针 
 * @param  obj_id	对象id
 * @param  name		传出参数，对象的名称，用户需事先分配好存放名称的空间
 * @return 成功返回SD_SUCCESS, 失败返回SD_FAILURE  
 * @author guoqiangm@xjgc.com
 */
ST_RET ai_obj_id_to_name(AI_IED_CTRL *ied, AI_OBJ_ID obj_id, ST_CHAR *name);

/**
 * 创建ied的idctrl控制机制.
 * 给每个对象分配一个id号，和对应的idctrl结构，保存到ied的id_ctrl数组中，
 * 以对象的id为下标，即可在id ctrl数组中取到对象的idctrl结构
 */
ST_RET  ai_create_ied_idctrl(AI_IED_CTRL *ied);

/**
 * 在61850对象指针数组里查找对象.
 * @param obj_tbl 对象指针数组，用户调用时将特定对象指针数组强制类型转换成基本对象指针数组类型
 * @param obj_num 数组中的对象指针的个数
 * @param obj_name 要查找的对象的名字
 * @return 找到的对象指针或NULL
 */
AI_COMMON_OBJ *ai_cobj_find(AI_COMMON_OBJ **obj_tbl, ST_INT obj_num, ST_CHAR *obj_name);
/** 
 * 查找对象的某个子对象，返回子对象的id
 * @param ied  ied对象
 * @param obj_id 在此对象中查找，支持ied ld ln fco
 * @param child_name 子对象的名字
 * @return 返回子对象的id或-1
 */
AI_OBJ_ID  ai_find_obj_child(AI_IED_CTRL *ied, AI_OBJ_ID obj_id, ST_CHAR *child_name);

/**
 * 释放AI_PRIM_VAL结构成员DATA所占资源。
 * @param  obj_val   对象值内存指针
 * @return ST_VOID
 */
ST_VOID ac_cleanup_objVals_data(AI_OBJ_VAL *obj_val);


/** 
 * 获取对象类型
 * 先找到Obj_id对应的idctrl,然后返回idctrl中的类型，失败时返回OBJECT_TYPE_UNKNOWN
 */
AI_OBJ_TYPE  ai_get_obj_type(AI_IED_CTRL *ied, AI_OBJ_ID obj_id);

/** 
 * 获取ln对象的lntype，失败时返回AI_LNTYPE_UNKNOWN
 */
AI_FCO_SUBTYPE  ai_get_fco_subtype(AI_IED_CTRL *ied, AI_OBJ_ID fco_id);

/** 
 * 查找对象的父对象，返回父对象的id
 * @param ied  ied对象
 * @param obj_id 对象的id
 * @return 返回父对象的id或-1
 */
AI_OBJ_ID  ai_find_obj_parent(AI_IED_CTRL *ied, AI_OBJ_ID obj_id);


//对象空间中保存desc
ST_RET  ai_create_iedDesc(AI_IED_CTRL *ied, SCL_INFO *scl_info);


/** 
 * 通过obj_id获得obj的desc, 支持ld、ln、do对象，当取ld、ln的desc时，传入的do_name应为NULL，
 * 当取do的desc时，传入ln的obj_id和do_name，如果取的是嵌套子do，则do_name为父do与子do的名字的字符串，如do1$sdo1
 * @param ied  ied对象
 * @param obj_id 对象的id
 * @return desc字符串地址
 */
const ST_CHAR* ai_get_obj_desc(AI_IED_CTRL *ied, ST_INT obj_id, ST_CHAR *do_name);

AI_OBJ_ID ac_get_next_rcbInst_id(AI_IED_CTRL *ied, AI_OBJ_ID rcb_id);

/** 
 * 查找da对象的父do对象
 * @param ied  ied对象
 * @param obj_id da对象的id，如果传入的不是da，则返回-1
 * @return 返回父do对象的id或-1
 */
AI_OBJ_ID  ai_find_da_parentDo(AI_IED_CTRL *ied, AI_OBJ_ID da_id);

/** 
 * 通过obj_id获得obj的dU
 * 当取do的desc时，传入ln的obj_id和do_name，如果取的是嵌套子do，则do_name为父do与子do的名字的字符串，如do1$sdo1
 * @param ied  ied对象
 * @param ln_id lnid
 * @param do_name do名字
 * @return dudu的值
 */
const ST_CHAR* ai_get_obj_du_val(AI_IED_CTRL *ied, ST_INT ln_id, ST_CHAR *do_name);
#ifdef __cplusplus
}
#endif


#endif /** IEC61850_AI_OBJID_INCLUDE */









