/****************************************************************************
** File name    :  HTDataStruct.h
** Description  :  define data struct
** Create date  :  2018.09.01
** Auther by    :  Liuyx
** Version info :  V1.0.01
** Copyright (C) 2002-2018 xi'an huatek, Inc Co., Ltd
** Update record:  
** DATE         AUTHER   DESC 
** -------------------------------------------------------------------------               
** 2018.09.01   Liuyx    first build
****************************************************************************/
#ifndef __HT_DATA_STRUCT_H
#define __HT_DATA_STRUCT_H
#include <map>
#include "HTConst.h"
#include "iec61850_client.h"
#include "iec61850_model.h"
#include "iec61850_dynamic_model.h"
#include "iec61850_config_file_parser.h"

#pragma pack (push ,1)

#define HT_COMTRADE_REDOWN   1  // 待下载
#define HT_COMTRADE_DOWNED   2  // 下载完成,待解析入库

// 地址装置关系
typedef struct {
    char  szMID[DEF_BUFFER_32+1];      // 主变ID
    char  szSID[DEF_BUFFER_32 + 1];      // 装置ID
    char  szSysCode[DEF_BUFFER_32 + 1]; // 装置编码,唯一
    char  szSersorID[DEF_BUFFER_32 + 1]; // 装置编码,唯一
    char  szMDevName[DEF_BUFFER_128]; // 主变名称
    char  szSubName[DEF_BUFFER_128]; // 装置名称
    char  cSlaveID;       // Modbus地址，对应一个装置的ID
    char  cDevType;       // 装置类别 1:振动装置 2:噪声装置 3:中心点装置
    char  cSide;          // 原副边 P: 原边 S:副边,仅当device_type=1时有效
    char  cPhase;         // 相位 A:A相 B:B相  C:C相  O:全相;,仅当device_type=1时有效
    char  cInOut;         // 上次侧或进出侧 I:上侧/进口侧 O:下侧/出口侧; 仅当device_type=1时有效
}ST_DEVICE_INFO;

// 设备阈值配置信息
typedef struct 
{
    char   szMID[DEF_BUFFER_32+1];       // 主变设备ID
    char   szSysCode[DEF_BUFFER_32+1];   // 主变设备system_code
    char   szMDevName[DEF_BUFFER_128];   // 主变名称

    char   szSubID[DEF_BUFFER_32 + 1];   // 传感器ID
    char   szSensorID[DEF_BUFFER_32];    // 传感器SersorID
    char   szSDevName[DEF_BUFFER_128];   // 传感器名称
    char   bDevType;                     // 1:振动装置 2:噪声装置 3:中心点装置
    //ST_THRESHOLD_ATTR stThresAttr;       // 阈值属性
    char   bSide;                        // P:原边 S:副边
    char   bPhase;                       // 相位 A、B、C、O
    char   bInOut;                       // 进口-上侧/出口-下侧
    char   szFrequency[4+1];             // 频率,50Hz~1200Hz
    double dThreshold;                   // 告警值
}ST_THRES_CONF;

// 振动装置实时数据体
typedef struct
{
    // 原边振动监测值
    double AccPri1;  // 原边A相上侧50Hz
    double AccPri2;  // 原边A相下侧50Hz
    double AccPri3;
    double AccPri4;
    double AccPri5;
    double AccPri6;
    double AccPri7;
    double AccPri8;
    double AccPri9;
    double AccPri10;
    double AccPri11;
    double AccPri12;
    double AccPri13;
    double AccPri14;
    double AccPri15;
    double AccPri16;
    double AccPri17;
    double AccPri18;
    double AccPri19;

    // 副边振动监测值
    double AccSec1;  // 副边A相上侧100Hz
    double AccSec2;
    double AccSec3;
    double AccSec4;
    double AccSec5;
    double AccSec6;
    double AccSec7;  // 副边A相上侧700Hz

    double EnvNoiPri;  // 噪声监测值(dB)
    double NeuCur;     // 中心点监测值(A)
}ST_MONI_DATA;

// 传感器控制参数
typedef struct {
    char   szMID[DEF_BUFFER_32 + 1];       // 主变设备ID
    char   szSysCode[DEF_BUFFER_32 + 1];   // 主变设备system_code
    char   szSubID[DEF_BUFFER_32 + 1];     // 传感器ID
    char   szSensorID[DEF_BUFFER_32];      // 传感器SersorID
    char   szSubName[DEF_BUFFER_128];      // 传感器名称
    // 控制参数-下设IED参数
    bool    isEnable;          // TRUE:启动传感器工作 FLASE: 禁用工作
    bool    alone;             // 独立测试, true:yes  false: no
    int     SmpProd;           // 采集频率(KHz)
    int     SmpInt;            // 采样间隔(小时)
    int     StartTime;         // 起始时间
}ST_CONTROL_CONF;

// 告警分量信息体
typedef struct {
    // 传感器及通信告警
    bool  MoDevConf;   // IED与监测设备通讯异常
    bool  MoDevDetF;   // 传感器自检异常
    bool  MoDevSigF;   // 传感器信号异常
    bool  MoDevPowF;   // 传感器供电异常
    bool  EnvNoiPriAlm;// 原边环境噪声告警
    bool  NeuCurAlm;   // 中性点电流告警

    // 原边告警分量
    bool AccPriAlm1;       // 原边50Hz告警分量
    bool AccPriAlm2;
    bool AccPriAlm3;
    bool AccPriAlm4;
    bool AccPriAlm5;
    bool AccPriAlm6;
    bool AccPriAlm7;
    bool AccPriAlm8;
    bool AccPriAlm9;
    bool AccPriAlm10;
    bool AccPriAlm11;
    bool AccPriAlm12;
    bool AccPriAlm13;
    bool AccPriAlm14;
    bool AccPriAlm15;
    bool AccPriAlm16;
    bool AccPriAlm17;
    bool AccPriAlm18;
    bool AccPriAlm19;

    // 副边告警分量
    bool AccSecAlm1;
    bool AccSecAlm2;
    bool AccSecAlm3;
    bool AccSecAlm4;
    bool AccSecAlm5;
    bool AccSecAlm6;
    bool AccSecAlm7;
}ST_WARN_ALARM;

// 传感器阈值属性
typedef struct {
    char   bSide;                        // P:原边 S:副边
    char   bPhase;                       // 相位 A、B、C、O
    char   bInOut;                       // 进口-上侧/出口-下侧
    int    iFrequency;                   // 频率,50Hz~1200Hz
    double dThreshold;                   // 告警值
}ST_THRESHOLD_ATTR;


// 链接管理结构体
typedef struct {
    char            ied_addr[32];
    int             ied_port;
    IedConnection   hConnHandle;  // 链接句柄
    bool            bIsConnect;   // 链接状态, true:connected flase:disconnect
    bool            bWarn;        // 
    time_t          iLastTime;    // 最近一次链接时间
    time_t          iLastActionTime;// 最近一次活动时间
    time_t          iLastAlaarmTime;  // 最近一次链接告警时间
    IedModel        *IedModel;    // 模型句柄
}ST_IED_CONN_HANDLE;

// iec61850 录播文件属性定义
typedef struct _comtrad_files_attrib {
    char   bstat;                 // 1:待下载 2:下载完成
    short  sNo;                   // 文件序号,系统自编
    int    iFileSize;             // 文件长度
    char   szFileName[_MAX_DIR];  // 文件路径名+文件名称    
}ST_FILES_ATTRIB;

// 录播文件格式定义
typedef struct {
    int sno;        // 序号 
    int tme;        // 时间,ms
    short A1;       // 震动装置原边A项上侧
    short A2;       // 震动装置原边A项下侧
    short B1;       // 震动装置原边B项上侧
    short B2;       // 震动装置原边B项下侧
    short C1;       // 震动装置原边C项上侧
    short C2;       // 震动装置原边C项下侧

    short a1;       // 震动装置副边A项上侧
    short a2;       // 震动装置副边A项下侧
    short b1;       // 震动装置副边B项上侧
    short b2;       // 震动装置副边B项下侧
    short c1;       // 震动装置副边C项上侧
    short c2;       // 震动装置副边C项下侧

    short nsi;      // 噪声(dB)
    short crt;      // 中心点电流(A)
}ST_COMTRAD_DATA;

// icd配置节点绑定关系
typedef struct {
    // 传感器组号,节点组号 01=原边A上 02=原边A下 03=原边B上 04=原边B下 05=原边C上 06=原边C下 
    //                    07=副边A上 08=副边A下 09=副边B上 10=副边B下 11=副边C上 12=副边C下
    int   nodeid;       // 节点/传感器ID
    char  szFrequency[5];   //频率
    char  sensorid[DEF_BUFFER_32 + 1];  // sensor_code
    char  nodename[128]; // 节点名称
    char  nodetype[4];    // 节点类型 MX,ST,SE
    char  monitype;       // 监测类型: 1=振动监测值 2=振动告警 3=噪声监测值 4=噪声告警 5=中心点监测 6=中心点告警
}ST_PARAM_BIND;

// IED返回数据体
typedef struct {
    double  MX_f;      // MX监测值,振动值、噪声、中心点 
    bool    ST_val;    // ST监测值,各项告警值
    int     SE_Val;    // SE设定值，下设参数
    time_t  t;         // 时间值
}ST_IED_VALUES;

// 传感器基本信息
typedef struct {
    char   szSubID[DEF_BUFFER_32 + 1];   // 传感器ID
    char   szSensorID[DEF_BUFFER_32];    // 传感器SersorID
    char   szSDevName[DEF_BUFFER_128];   // 传感器名称
    char   bDevType;                     // 1:振动装置 2:噪声装置 3:中心点装置
    ST_CONTROL_CONF   stControl;     // 控制参数下设

    map<int, ST_THRESHOLD_ATTR> map_stThres;       // 阈值属性,
    map<string, ST_PARAM_BIND>  map_stParamBind;   // icd配置节点绑定关系,key=nodename

    // 实时监测数据
    ST_MONI_DATA      stMoni;  // 传感器实时监测数据
    ST_WARN_ALARM     stAlarm; // 传感器告警监测数据
    ST_FILES_ATTRIB   stComtradFile; // 录播文件属性
    ST_COMTRAD_DATA   stComtradeContext;// 录播文件解析数据
  
}ST_BASE_DEVICE_INFO;

// 校时配置
typedef struct {
    int   sntp_port;        // port
    char  sntp_s_ip[32];    // sntp_server address
    bool  manual;           // true: 手动
}ST_SNTP_CONF;

// 振动装置表结构
typedef struct {
    char  file_id[DEF_BUFFER_32+1];          // 录播文件ID
    char  m_id[DEF_BUFFER_32 + 1];           // 主变ID
    char  s_id[DEF_BUFFER_32 + 1];           // 传感器ID
    char  szSensorID[DEF_BUFFER_32 + 1];     // SensorID
    char  szDevType;                         // 1:振动装置 2 : 噪声装置 3 : 中心点装置
    char  szFrequency[5];                    // 频率
    char  side;                              // 原副边P:原边 S:副边
    char  phase;                             // 相位
    char  in_out;                            // 上下侧 U:上侧 D:下侧
    double value;                            // 幅值,噪声,中心点
    time_t dtime;                            // 监测时间
}ST_DB_BODY;

// 报警表结构
typedef struct {
    char  s_id[DEF_BUFFER_32 + 1];           // 传感器ID
    char  valunit[8];                        // 采样值单位:dB,A,mm/s2
    char  szDesc[128];                       // 告警描述
    char  warn_type;                         // 告警分类 1:通信异常告警 2:装置自检异常告警 3:信号异常告警 4:供电异常告警 5:振动阈值告警 
                                             //          6:噪声阈值告警 7:中心点阈值告警 8:日增长率告警 9:月增长率告警 10:月偏差率告警 
                                             //          11:  服务器与IED通信异常
                                             //          12:传感器振动告警 13:传感器噪声告警 14:传感器中心点告警
    char  level;                             // 告警级别 0:高 1:中 2:低
    char  state;                             // 处理状态 0:已处理 1:未处理
    double value;                            // 幅值,噪声,中心点
    time_t almtime;                          // 告警时间
}ST_DB_WARN;

// IEC61850设备配置信息
typedef struct
{
    char   szMID[DEF_BUFFER_32 + 1];       // 主变设备ID
    char   szSysCode[DEF_BUFFER_32 + 1];   // 主变设备system_code
    char   szMDevName[DEF_BUFFER_128];     // 主变名称

    ST_BASE_DEVICE_INFO stBaseInfo;        // 传感器基本信息
    ST_IED_CONN_HANDLE  stConnect;         // IED链接参数
    ST_SNTP_CONF        stSntp;            // 校时配置

}ST_HT_IEC61850;

#pragma pack (pop)
#endif // end 

