/****************************************************************************/
/* Copyright (c) 2007,许继集团有限公司                                      */
/* All rights reserved.                                                     */
/*                                                                          */
/*  模块描述：                                                              */
/** 数据转换模块实现MMS数据〈----〉primval数组之间的转换接口函数
 *  @file  ai_objval.h                                                       */
/*                                                                          */
/* 日期         作者    注释                                                */
/* 2007/07/16   YH     创建文件                                            */
/****************************************************************************/
#ifndef IEC61850_AI_OBJVAL_INCLUDED
#define IEC61850_AI_OBJVAL_INCLUDED

#include "ai_obj.h"
#include "sx_log.h"
#include "mvl_log.h"
#include "ai_objid.h"
#include "ai_objrw.h"
#include "mmsobj.h"
#include "ai_log.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
  *基本类型数据信息
*/
typedef struct ai_prim_info
{
	ST_INT prim_total_num;  
	ST_INT prim_num;        
	ST_INT prim_offset;     
}AI_PRIM_INFO;

/**
 * 释放对象信息存储内存接口
 * @param  objVals	        对象结构指针
 * @return ST_VOID
 */
ST_VOID ai_cleanup_objVals(AI_OBJ_VAL *objVal);

/**
 * 由简单类型的rt得到AI_VAL_TYPE类型及长度
 */
ST_RET ai_get_type_info_by_primRt(RUNTIME_TYPE *rt, AI_VAL_TYPE *type_out, ST_INT *len_out);

/**
 * 由基本数据类型DA的AI_PRIM_VAL数组生成 MMS数据缓冲区数据Data
 * @param  valist       以数组形式申请内存空间
 * @param  num_var      数组大小
 * @param  data         MMS数据缓冲区地址指针,输出
 * @param  type_id      MMS数据类型ID
 * @retval SD_SUCCESS   成功
 * @retval SD_FAILURE   失败
*/
ST_RET ai_primVals_to_compVal(AI_PRIM_VAL *valist, ST_INT num_var, ST_VOID *data, ST_INT type_id);

/**
 * MMS数据缓冲区数据Data的解析函数，生成基本数据类型DA的AI_PRIM_VAL数组。  
 * *valist的内存由函数内部申请，由本接口使用者释放，一般可调用ai_cleanup_objVals接口函数清理。
 * @param  data         MMS数据缓冲区地址指针
 * @param  type_id      MMS数据类型ID
 * @param  valist       传出的解析结果，以数组形式申请内存空间
 * @param  num_out      数组大小，传出参数
 * @retval SD_SUCCESS   成功
 * @retval SD_FAILURE   失败
*/
ST_RET ai_compVal_to_primVals(ST_VOID *data, ST_INT type_id, AI_PRIM_VAL **valist, ST_INT *num_out);

/**
 * 获取对象的某个属性的值，这个属性必须是简单数据类型
 * @param ied  ied对象
 * @param obj_id  对象id
 * @param attr_name  属性的名字
 * @param data_size  属性的值所占内存的大小，用户必须事先知道此值
 * @param *data  属性值缓冲区，调用者分配内存
 */
ST_RET ai_get_obj_attr_val(AI_IED_CTRL *ied, AI_OBJ_ID obj_id, 
								 ST_CHAR *attr_name, ST_INT data_size, ST_VOID *data);

/** 
 * 克隆对象数据，AI_OBJ_VAL类型的数据，用户需释放最终得到的dest，调用ai_cleanup_obj_val
 * 释放dest数组中的每个obj_val，然后再释放dest指针
 * @param dest  目标obj_vals，数组
 * @param src   源obj_vals，数组
 * @param num   对象值的个数
 */
ST_VOID  ai_clone_obj_vals(AI_OBJ_VAL **dest, AI_OBJ_VAL *src, ST_INT num);

/**
 *获取基本数据类型长度
 */
ST_INT ai_get_Data_Len(AI_VAL_TYPE type);


#ifdef __cplusplus
}
#endif

#endif	/** !IEC61850_AI_OBJVAL_INCLUDED	*/
