/**
 * @file:    $RCSfile: ied.h,v $
 * @brief:   $设备数据结构定义
 *
 * @version: $Revision: 1.1 $
 * @date:    $Date: 2018/11/24 06:54:49 $
 * @author:  $Author: lizhongming $
 * @state:   $State: Exp $
 *
 * @latest:  $Id: ied.h,v 1.1 2018/11/24 06:54:49 lizhongming Exp $
 *
 */
 
 
#ifndef _IED_STRUCT_H
#define _IED_STRUCT_H

#include "IEC60870DEF.h"
//#include "drvcommon.h"
typedef byte_t channel_size_type;

#ifdef _OS_WIN32_
#pragma pack(push,1)   
#endif 
 

#define PRV_ANA_EXTENSION	(1)				//模拟量用户扩展属性 总数
#define PRV_DIGIT_EXTENSION (3)				//遥信量用户扩展属性 总数
#define PRV_EVENT_EXTENSION (3)				//事件量用户扩展属性 总数
#define PRV_PULSE_EXTENSION (2)				//遥测量用户扩展属性 总数
//-----模拟量用户扩展---------------//
#define ANA_EXTENSION_ALARM (0)				//告警:告警等级;告警声音文件名
 
 

typedef struct analog_t analog_t; 
struct analog_t {         
    byte_t    type;                 /**< 电压/电流/有功功率/无功功率/频率/功率因素/其它 */
    float     initval;              /**< 缺省值                                         */
    float     minimum;              /**< 取值下限                                       */
    float     maximum;              /**< 取值上限                                       */
    float     step;                 /**< 步长                                           */
    byte_t    integral;             /**< precision ( n , m ) - n                        */ 
    byte_t    decimal;              /**< precision ( n , m ) - m                        */ 
    float     offset;               /**< 实际值转换基数                                 */
    float     factor;               /**< 实际值转换系数                                 */
    float     threshold;            /**< 门限值                                         */ 
    float     smooth;               /**< 平滑系数                                       */
    float     lower;                /**< 告警下限值                                     */
    float     higher;               /**< 告警上限值                                     */
    float     lowest;               /**< 下下限告警值                                   */
    float     highest;              /**< 上上限告警值                                   */
    float     blur;                 /**< 阀值模糊系数                                   */
    char      dimension[SHORTNAME]; /**< 量纲ASCII格式(A/V/kV/kvar/kW/MW etc.)          */
	void	  *ext[PRV_ANA_EXTENSION];	/**< 保护管理机扩展								*/
}ALIGNPACKED;


typedef struct ana_extention_t ana_extention_t;
struct ana_extention_t{
	int	  alarm_level;
	int	  save_flag;
	char *high_alarm_sound;
	char *low_alarm_sound;
	char *recovery_alarm_sound;
};

typedef struct digit_t digit_t;
#define DGT_TYP_UNDEF     0x00       /**< 未定义 */
#define DGT_TYP_SAMPLING  0x01       /**< 采样 */
#define DGT_TYP_EVENT     0x02       /**< 事件 */
#define DGT_TYP_ALARM     0x03       /**< 告警 */
#define DGT_TYP_OPERATE   0x04       /**< 操作 */
#define DGT_TYP_SYSTEM    0x05       /**< 系统 */ 
/** 数字量私有属性             */
struct digit_t {       
    byte_t    type;                /**< 采样/事件/告警/操作/系统        */
    byte_t    initval;             /**< default zero value(0 or 1)      */
    byte_t    level;               /**< level                           */
    byte_t    snd_timer;           /**< sound play timer (s)            */
    byte_t    rst_timer;           /**< auto restore timer (s)          */
    uint16_t  act_lim;             /**< (0 ==> 1)动作告警上限           */
    uint16_t  rst_lim;             /**< (1 ==> 0)动作告警上限           */
    uint16_t  act_num;             /**< (0 ==> 1)动作上限(不需界面录入) */
    uint16_t  rst_num;             /**< (1 ==> 0)动作上限(不需界面录入) */
	//第二版去掉
    //char      on[SHORTNAME];       /**< 0==>1动作名称(ASCII格式)        */
    //char      off[SHORTNAME];      /**< 1==>0动作名称(ASCII格式)        */
	void	  *ext[PRV_DIGIT_EXTENSION];	/**< 保护管理机扩展			*/	
}ALIGNPACKED;


#define DIGIT_STATE_0_DESCRIBE	(0)
#define DIGIT_STATE_1_DESCRIBE	(1)
#define DIGIT_STATE_2_DESCRIBE	(2)
#define DIGIT_STATE_3_DESCRIBE	(3)

#define DIGIT_OPEN_SOUND		(0)
#define DIGIT_CLOSE_SOUND		(1)
#define DIGIT_ALARM_SOUND		(2)


typedef struct state_describe_extention_t state_describe_extention_t;
struct state_describe_extention_t{
	char *state_describe[4];	/**< 状态0，1，2，3的描述				*/	
};
typedef struct sound_file_name_extention_t sound_file_name_extention_t;
 
struct sound_file_name_extention_t{
	char *sound_file_name[3];	/**< 开报警声、合报警声、事故报警声		*/
};

typedef  struct epfi_addt_extension_t  epfi_addt_extension_t;
struct epfi_addt_extension_t {
	uint32_t fun;
	uint32_t inf;
};



typedef struct pulse_t pulse_t;
/** Integrated totals private attr  */
#define PLS_TYP_UNDEF                 0x00   /**< 未定义 */
#define PLS_TYP_PLUS_POWER_HV         0x01   /**< 正向有功 */
#define PLS_TYP_PLUS_POWER_NO         0x02   /**< 正向无功 */
#define PLS_TYP_NEGATIVE_POWER_HV     0x03   /**< 反向有功 */
#define PLS_TYP_NEGATIVE_POWER_NO     0x04   /**< 反向无功 */
struct pulse_t {        
    byte_t    type;                 /**< 正向有功/正向无功/反向有功/反向无功 */
	uint32_t	save_flag;			/**< 存储标记							 */
	uint32_t  initval;              /**< default value                       */
    uint32_t  minimum;              /**< minimum value                       */
    uint32_t  maximum;              /**< maximum value                       */
    uint32_t  step;                 /**< 步长                                */
	//changed by zhancg 2017-04-05 配系数
//	uint32_t  offset;				/**< 实际值转换基数						 */
//	uint32_t  factor;               /**< 实际值转换系数                      */
//	uint32_t  threshold;            /**< 门限值                              */ 
//	uint32_t  smooth;               /**< 平滑系数                            */
	float  offset;					/**< 实际值转换基数						 */
	float  factor;					/**< 实际值转换系数                      */
	float  threshold;				/**< 门限值                              */ 
	float  smooth;					/**< 平滑系数                            */
    char      dimension[SHORTNAME]; /**< 量纲ASCII格式(kvar/kW/MW etc.)      */
	void	  *ext[PRV_PULSE_EXTENSION];
}ALIGNPACKED;
typedef struct pluse_stage_limits_extention_t pluse_stage_limits_extention_t;
struct pluse_stage_limits_extention_t{
	uint32_t	  limits[3];	/**< 峰电度限值,日电度限值,月电度限值			*/	
};
typedef struct pluse_stage_const_extention_t pluse_stage_const_extention_t;
struct pluse_stage_const_extention_t{
	char*	  stage[8];	/**< 峰时段1,峰时段2,峰时段3,峰时段4,谷时段1,谷时段2,谷时段3,谷时段4		*/	
};
  
//
typedef struct command_t command_t;
/** 命令消息结构 */
struct command_t {
    ticks_t    ticks;       /**< Ticks when command generated */
    apr_time_t tmlimit;     /**< 命令执行完成的限制时间       */
    byte_t     state;       /**< ACTIVE、FINISH or TIMEOUT    */
    byte_t     channel;     /**< command channel no           */
    byte_t     flag;        /**< General、System or Special   */
    byte_t     typ;         /**< Command TYPE(IEC60870-5-101) */
    uint32_t   ied;         /**< Controlled IED id            */
    uint32_t   group;       /**< Controlled group id          */
    uint32_t   dot;         /**< Controlled element           */
    byte_t     cot;         /**< Cause of transmission        */
    byte_t     data[255];    /**< Command data                 */
}ALIGNPACKED;
//
  

/** status_t code definiens */
#define  STATUS_NORMAL   0     /**< 正常     */
#define  STATUS_NOINIT   1     /**< 未初始化 */
#define  STATUS_OVERTIME 2     /**< 通信超时 */
#define  STATUS_BREAKOFF 3     /**< 通信中断 */
#define  STATUS_BLOCKED  4     /**< 封锁     */
#define  STATUS_TESTING  5     /**< 测试     */
#define  STATUS_NOTDEF   6     /**< 未配置（本运行状态没有配置) */

typedef uint16_t status_t;     /**< 设备或通信节点的运行状态 */
  
typedef struct alias_t alias_t;
/** 数据元素的别名结构  */ 
struct alias_t {               /**< 数据元素的别名结构  */   
    uint32_t  id;              /**< 别名信息地址        */
    uint32_t  parent;          /**< 所指代的IED         */
    uint32_t  group;           /**< 所指代的IED内的组号 */
    uint32_t  dot;             /**< 所指代的IED内的序号 */
    value_t*  value;           /**< 运行时刻实时数据    */
};
 
typedef struct ied_t     ied_t;
typedef struct group_t   group_t;
typedef struct element_t element_t;

/** 数据信息元素的结构  */
struct element_t {            
    uint32_t   id;             /**< Identification, Information Address      */
    uint32_t   flags;          /**< flags define                             */
    byte_t     type;           /**< IEC60870-5-101 TYP.(IEC60870DEF.h)       */
    byte_t     code;           /**< Data code type.(BIN/ASCII/BCD/etc.)      */
    uint32_t   parent;         /**< 隶属设备                                 */
    uint32_t   group;          /**< 数据组号                                 */
    uint32_t   dot;            /**< 数据序号                                 */
    uint16_t   size;           /**< 数据宽度(以字节为单位)                   */
    char       name[LONGNAME]; /**< 数据名称                                 */
	
	char	   *aliasname;		/**< 数据点别名，如用于中文名称对应的英文名称 ++EPFI++   */
    
	void       *owner;         /**< 私有属性结构(analog_t/digit_t/..../etc.) */
    void       *script;        /**< 关联的计算表达式                         */

    /** Runtime generate */
    value_t    value;          /**< 运行时刻实时数据缓冲区                   */
    ticks_t    last;           /**< 最后变化时间                             */
    uint32_t   state;          /**< 数据状态                                 */
    byte_t     funtype;        /**< 继承自所属组的类型，表示数据功能类型     */
    uint16_t   index;          /**< 数据元素索引                             */ 
    uint16_t   n_alias_add_1;  /**< 分配的数据别名缓冲区的大小（预留1，动态定订购用）     */ 
    uint16_t   n_alias;        /**< 数据别名数组元素个数                     */ 
    alias_t*   alias;          /**< 数据别名索引数组                         */ 
    uint16_t   alias_pos;      /**< 数据别名当前位置                         */ 
    uint32_t   offset;         /**< 数据在设备数据缓冲区内的偏移索引         */
    group_t    *grp;           /**< 所属数据组句柄                           */
    ied_t      *ied;           /**< 所属设备句柄                             */

    /* Extend property */
    void       *sys_ext;       /**< 数据点的系统扩展属性,由基本库实现        */
    void       *app_ext;       /**< 数据点的应用扩展属性,由应用库实现        */
    void       *usr_ext;       /**< 数据点的用户扩展属性,由应用程序实现      */
};

/** group_t->type definiens */
#define  GRP_CUSTOM   0       /**< User custom type      */
#define  GRP_ANALOGUE 1       /**< Analogue type         */
#define  GRP_DIGITAL  2       /**< Digital type          */
#define  GRP_PULSE    3       /**< Pulse type            */
#define  GRP_CONTROL  4       /**< Control type          */
#define  GRP_SYSTEM   5       /**< System operation type */
#define  GRP_EVENT    6       /**< Protect event type    */
#define  GRP_ALARM    7       /**< Alarm type            */
#define  GRP_SETTING  8       /**< Fixed value type      */
#define  GRP_STATUS   9       /**< State of device       */
#define  GRP_VDI      10      /**< 软压板 type           */
#define  GRP_STEPPOS  11      /**< Step position type    */
#define  GRP_COMBO    12      /**< combo/compute type    */
#define  GRP_SIMANA	  13	    /**< 模拟量 */
#define  GRP_SETAREA  14	    /**< 定值区 */
#define	 GRP_ACCANA	  15	    /**< 录波模拟量 */
#define  GRP_ACCDGT   16	    /**< 录波开关量 */
#define  GRP_SETPOINT 18       /**< Set point type for 101,104 protocol used only */
#define  GRP_STEPCONTROL 19   /**< 步位置调节组 */

/** 数据组结构              */ 
struct group_t {
    uint32_t   id;             /**< Identification, Commond Address of Set */
    uint32_t   flags;          /**< Flags definiens                        */
    byte_t     type;           /**< Analogue/Digit/Control/Event/etc.      */
    char       name[LONGNAME]; /**< 数据组的名称                           */
    uint16_t   maxelems;       /**< 允许包含elements的最大数目             */
    element_t  *elements;      /**< 数据元素定义数组                       */

    // runtime generate 
    uint16_t   count;          /**< 实际包含的数据元素数目                 */
    uint16_t   index;          /**< 数据组索引IED->groups的数组下标        */ 
    value_t    value;          /**< 数据组缓冲区，顺序存放elements的实时值 */    
    ied_t      *ied;           /**< 所属设备句柄                           */
    apr_hash_t *htdots;        /**< 数据元素定义哈希表                     */

    /* Extend property */
    void       *sys_ext;       /**< 数据组的系统扩展属性,由基本库实现      */
    void       *app_ext;       /**< 数据组的应用扩展属性,由应用库实现      */
    void       *usr_ext;       /**< 数据组的用户扩展属性,由应用程序实现    */
};

//<!-- IEDConfig id,name,flags,type,chncount,cpucount,addrsinfo,cpusinfo,station,frequency,delay,count
//							   ^^^^
/** IED type definiens */
#define IED_TYPE_REAL	  (0)
#define IED_TYPE_REMOTE   (1)
#define IED_TYPE_SYSTEM   (2)
#define IED_TYPE_VIRTUAL  (3)
#define IED_TYPE_EPFI	  (4)	/**< 保护管理机			*/


#define IED_FLAG_BLOCKED    0x00000004   /**< 是否封锁，缺省不封锁   */


#define CHANBEL_TYPE_UNKNOWN (0)
#define CHANNEL_TYPE_IPV4    (1)
#define CHANNEL_TYPE_IPV6    (2)		/**< 未用			*/
#define CHANNEL_TYPE_SERIAL  (3)		/**< 串口号			*/

#define CHANNEL_TYPE_USER_DEFINED (254)   /**< 用户自定义类型 */


typedef struct channel_t channel_t;
struct channel_t {
    uint32_t   master;          /**< 所属通信通道(Node ID) */ 

	//以下两个属性域为2008-08-16增加,支持
	int		   channel_type;			 /**< 通道地址类型          */
	char       addr_str[LONGNAME];		 /**< 通道地址的字符串表示  */

    uint32_t   addr;			/**< 通信端口地址		   */
	uint16_t   port;			/**< ip地址的端口		   */

	uint32_t   status;          /**< 通信端口状态          */
	ticks_t    last_ticks;      /**< 最近访问时间          */
	ticks_t    last_send_ticks; /**< 最近查询时间          */
	void       *connect;        /**< 通道连接句柄          */
	ied_t      *ied;            /**< 所属设备句柄          */
	int			ied_id;			/**< 所属设备id            */
};

typedef struct cpuinfo_t cpuinfo_t;
struct cpuinfo_t {
    byte_t   addr;              /**< CPU地址               */ 
    byte_t   status;            /**< CPU状态               */ 
    byte_t   templ;             /**< CPU模板               */ 
    char     name[LONGNAME];    /**< CPU名称               */
    ticks_t  last_gi;           /**< 最近总查询时间        */
    ticks_t  last_gi_send;      /**< 最近总查询发送时间    */
	ticks_t  next_gi_send;      /**< 下次总查询发送时间    */
    ticks_t  last_ticks;        /**< 最近访问时间          */
	ticks_t  last_send_ticks;   /**< 最近查询时间          */
};
 


/** IED struct definiens */
struct ied_t {
    uint32_t   id;             /**< Primy key ( = 0 系统保留IED )   */
    uint32_t   flags;          /**< Flags define                    */
    byte_t     type;           /**< Type define                     */
    byte_t     chncount;       /**< 设备通信端口总数（缺省=1）      */ 
    channel_t  *channel;       /**< 设备通信端口数组                */ 
    byte_t     cpucount;       /**< CPU总数（缺省=1）               */
    cpuinfo_t  *cpuinfo;       /**< CPU地址数组                     */
    char       name[LONGNAME]; /**< 设备名称                        */
    uint32_t   station;        /**< 所属站号<直属目录ID>            */
    uint32_t   node;           /**< 所属通信节点号                  */
    uint16_t   frequency;      /**< 通信扫描频率                    */
    uint32_t   delay;          /**< 通信响应延时(ms)                */
    uint16_t   count;          /**< 包含的数据组数目                */
    group_t    *groups;        /**< 数据组定义数组                  */
    apr_hash_t *htgroups;      /**< 数据组定义哈希表句柄            */
	uint32_t   systoken_st;	   /**< 系统令牌的状态				    */

    /* Runtime generate */
    uint16_t   index;          /**< 设备数组下标                    */ 
    status_t   status;         /**< 设备运行状态                    */ 
    ticks_t    last_ticks;     /**< 最近访问时间                    */
    ticks_t    last_gi;        /**< 最近总查询时间                  */

    /* Extend property */
    void       *sys_ext;       /**< 设备的系统扩展属性,基本库定义   */
    void       *app_ext;       /**< 设备的应用扩展属性,应用库定义   */
    void       *usr_ext;       /**< 设备的用户扩展属性,应用程序定义 */
};

#ifdef _OS_WIN32_
#pragma pack(pop)    
#endif 


#ifdef __cplusplus
extern "C" {
#endif

 
        
#ifdef __cplusplus
}
#endif

#endif /* _IED_STRUCT_H */

