/****************************************************************************
** File name    :  HTIEC61850CSGFile.h
** Description  :  中国南方电网有限责任公司(CSG)-广东电网有限责任公司变电设备在线监测系统
**              ： 数据通信技术要求V1.5(2014-12).--谱图文件解析
** Create date  :  2019.09.01
** Auther by    :  Liuyx
** Version info :  V1.0.01
** Copyright (C) 2002-2019 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE         AUTHER   DESC
** -------------------------------------------------------------------------
** 2019.09.01   Liuyx    first build
****************************************************************************/
#ifndef __HT_IEC_61850_CSGFILE_H
#define __HT_IEC_61850_CSGFILE_H

#if defined (__cplusplus)
extern "C" {
#endif /* defined (__cplusplus) */

#pragma pack (push ,1)

    /************************************************************************************
    * 引用文件标准：广东电网有限责任公司变电设备在线监测系统-数据通信技术要求V1.5(2014.12)
    * 附录A:
    * A.3  谱图文件命名
    * 谱图文件名约定为：在线监测编码_厂家编码_谱图类型编码_创建日期时间.dat。
    * ①在线监测编码、厂家编码、谱图类型编码：参照附录B。
    * ②创建日期时间：格式为“YYYYMMDDhhmmss”
    * YYYY：4位的年份（如2010）
    * MM：2位的月份（01-12）
    * DD：2位的日期（01-31）
    * hh：2位的小时（00-23）
    * mm：2位的分钟（00-59）
    * ss：2位的秒数（00-59）
    * 示例：0312B12000042 A384 000001_001_01_20100818151010.dat
    ------------------------------------------------------------------------------------
    * 附录B:
    * B.3 变电站编码 
    *       描述变电站名称的唯一编码，即《Q/CSG11801.8.1-2008  南方电网设备信息分类与编码》中规定
    *    的厂站功能位置编码的前13位。 
    * B.4 厂家编码 
    *    描述在线监测装置厂家名称的3位编码，如表B.1所示
    * B.5 在线监测编码
    *       描述在线监测装置功能位置的23位编码，由“13位变电站编码+4位在线监测装置类型编码+6
    *    位序号”组成，该编码由远程中心根据实际情况发布。
    * B.6 在线监测装置类型编码
    *    描述在线监测装置所属类型的4位编码，如表B.2所示
    * B.7 谱图类型编码
    *    描述在线监测谱图所属类型的2位编码，如表B.3所示。
    *    表 B.3谱图类型编码
    *    谱图类型           编码
    *    局部放电谱图        01
    *    断路器监测谱图      02
    *    油中溶解气体出峰图  07
    ------------------------------------------------------------------------------------
    * 附录D:
    * D.2 文件格式要求 
    * a)  文件应采用二进制数据格式进行存储，其字节序为小端字节序（Little-Endian），即低位字节
    *     排放在低地址端、高位字节排放在高地址端； 
    * b)  文件应包括配置数据和谱图数据两部分，且两者之间增加一个分隔符“$$$$”，即0x24242424； 
    * c)  为保持文件的完整性，若配置数据部分中的可选数据项未使用，则保留其占据位置，且数据
    *     项各位全设为1，例如4个字节的float型应设为0xFFFFFFFF； 
    * d) 数据类型分为基本数据类型和聚合类型： 
    *     ①基本数据类型，如表D.1所示； 
    *       表 D.1基本数据类型 
    *         类型          长度          取值范围 
    *         char          1字节         以ASCII码形式存在的一个字符，例如'0'、'1'、…
    *                                     或 'A'、'B'、…或'a'、'b'、… 或'$'、'#'、'@'… 
    *         byte          1字节         -2^7~2^7-1，即-128~127 
    *         short         2字节         -2^15~2^15-1 
    *         int           4字节         -2^31~2^31-1 
    *         long          8字节         -2^63~2^63-1 
    *         float         4字节         -2^128~2^128 
    *         double        8字节         -2^1024~2^1024 
    *     注1：char和byte有所区别，例如表示数字1，char的值为0x31，byte的值则为0x01。 
    * 
    *     ②聚合类型包括数组（array）、结构体（struct）等。 
    * e)  文件中的中文描述采用unicode编码；
    ************************************************************************************
    D.3 文件生成要求
        a) 局部放电在线监测装置按每1监测点（传感器）生成1个局部放电谱图文件；并应在被监测
        设备可能发生局部放电的情况下生成文件，生成时间间隔为5 - 15分钟；
        b) 变压器油中溶解气体在线监测装置按每1监测点（传感器）传输1个油中溶解气体出峰图文
        件；并应周期生成文件，生成时间间隔为2小时；
        c) 断路器在线监测装置应将3相数据合并生成1个断路器监测谱图文件，不同类型的谱图应分
        开生成；并应在断路器有动作的情况下生成文件；
        d) 为便于实时监控文件传输通道的状态，在线监测装置若当日未生成任何谱图文件，则需在次
        日凌晨0点自动生成测试用的临时文件，该文件只包含配置数据，不必包含谱图数据；
        e) 谱图文件个数及文件大小：单个装置文件个数上限为60（多传感器合并上送系统可根据装置
        数乘积确定上限），单个文件大小上限为500KB，其文件应按照时间先后循环存储。
    ************************************************************************************/
    
#define CSG_NOT_USE_VALUE       0xFFFFFFFF       // float 类型的值无效-未使用
#define CSG_SPECTROGRAM_PRPD    0x30             // 二维谱图
#define CSG_SPECTROGRAM_PRPS    0x31             // 三维谱图

    /*
    * 局放文件配置数据格式定义 附录表D.2节
    */
    typedef struct _CSG_PDFILE_HEAD{
        float     fStandardVersion;    // 规范版本号,所使用的通用格式规范版本号，本要求设为1.2
        float     fFileVersion;        // 文件版本号,在线监测装置厂家内部使用的版本号，从
                                       // 1.000计起。注意与规范版本号区别开来
        short     shSpectrogramCode;   // 谱图类型编码,01:局放 02:断路器监测 07:油中溶解气体出峰图
        tint64    ilSpectrogramGenTime;// 谱图生成时间,YYYYMMDDhhmmss
        char      cTestFileFlag;       // 测试文件标志位,0:测试用文件 1:非测试文件(局放文件)
        char      szChannleName[32];   //通道名称,unicode编码,以0x00结束
        char      cFdType;             // 放电类型:0正常；1尖端放电；2悬浮放电；3沿面放电；4内部放电；5颗粒放电；6外部干扰；7其它
        char      cWarnLevel;          // 报警等级,0表示正常；1表示1级报警；2表示2级报警；3表示3级报警。其中，最高为3级报警;数字越大代表危险性越高
        char      cProbabilityFlag;    // 放电类型概率统计标志,0表示未统计，若放电类型为0（即“正常”），则不需统计，此时放电类型概率设为O；1表示已统计，若放电类型不为0，则需统计，此时放电类型概率设为M
        float     fProbability[7];     // 放电类型概率(%),1-7种发电类型的概率，放电类型0不需统计概率；若未对放电概率进行统计即只判断出属于某一种放电类型），则将对应的放电类型记为100%，0xFFFFFFFF为未使用标识
        int       iFdPhaseNum_m;       // 放电相位窗数m,工频周期被等分成m个检测时间段
        int       iAmplitude_n;        // 量化幅值n,幅值范围被等分成若干个区间，量化幅值表示第n个区间。若局放谱图类型为PRPD二维图，则n设为M，p设为O
        int       iFrequencyCycle_p;   // 工频周期数p,频周期的个数。若局放谱图类型为PRPS三维图，则p设为M，n设为O
        float     f50Relevance;        // 50Hz相关性,一个工频周期中放电信号与50Hz的相关程度，单位为%。，0xFFFFFFFF为未使用标识
        float     f100Relevance;       // 50Hz相关性,一个工频周期中放电信号与50Hz的相关程度，单位为%。，0xFFFFFFFF为未使用标识
        char      cSpectrogramType;    // 局放谱图类型标志,0表示PRPD二维图；1表示PRPS三维图。
        char      cAmplitudeUnit;      // 幅值单位,0表示dBm；1表示mV；2代表%
        float     fMinAmplitude;       // 放电幅值下限，0xFFFFFFFF为未使用标识
        float     fMaxAmplitude;       // 放电幅值上限，0xFFFFFFFF为未使用标识
        char      szSeparation[4];     // 分隔符$$$$.
    }ST_CSG_PDFILE_HEAD;

    typedef union
    {
        float f;
        int   i;
    }ST_CSG_DATA;

    // 局放谱图数据定义 附录表D.3节
    typedef struct {
        ST_CSG_DATA Data;
    }ST_CSG_PD_DATA;


    /*
    * 通道i的峰信息的结构体定义 附录表D.4节
    */
    typedef struct {
        char  szGroupName[10];          // 组分名称,峰的组分名称，例如H2、CH4、C2H2、C2H4、C2H6、CO、CO2等
        char  cPeakNumber;              // 峰号,峰编号j
        float fPeakTime;                // 峰点时间,单位与“X轴单位”一致
        float fPeakStartTime;           // 峰开始点时间,单位与“X轴单位”一致
        float fPeakStopTime;            // 峰结束点时间,单位与“X轴单位”一致
        float fPeakHigh;                // 峰高,单位与“Y轴单位”一致
        float fPeakArea;                // 峰面积,单位为“Y轴单位”和“X轴单位”的乘积。例如，“Y轴单位”为微伏，“X轴单位”为秒，则峰面积单位为微伏*秒
    }ST_YSP_INFO;

    /*
    * 通道信息的结构体定义 附录表D.4节
    */
    typedef struct {
        char  cChannelPeak_n;         // 通道i的峰数n,通道i所具有的峰个数n
        ST_YSP_INFO *pstInfo;         // 通道i的峰信息,记录通道i的n个峰的信息，通道i的第j个峰称为峰j，j为0~n - 1之间的整数。从通道i的峰0开始排列，共n个峰
    }ST_CSG_YSP_CHANNEL;
    
    /*
    * 油色谱气体出峰图数据格式定义 附录表D.4节
    */
    typedef struct {
        float     fStandardVersion;     // 规范版本号,所使用的通用格式规范版本号，本要求设为1.2
        float     fFileVersion;         // 文件版本号,在线监测装置厂家内部使用的版本号，从
                                        // 1.000计起。注意与规范版本号区别开来
        short     shSpectrogramCode;    // 谱图类型编码,01:局放 02:断路器监测 07:油中溶解气体出峰图
        tint64    ilSpectrogramGenTime; // 谱图生成时间,YYYYMMDDhhmmss
        char      cTestFileFlag;        // 测试文件标志位,0表示该文件为测试用的临时文件；
                                        // 1表示在线监测装置能正常生成谱图文件。注意，油中溶解气体出峰图周期性生成，故通常情况下设为1
        char      szDeviceName[32];     // 被监测设备名称,unicode编码,以0x00结束
        float     fX_t;                 // X轴间隔t,数据点的时间间隔t，用于绘制X轴
        float     fY_Max;               // Y轴最大值,数据点的最大值，用于绘制Y轴
        char      cXUnit;               // X轴单位,0表示秒（s）；1表示毫秒（ms）
        char      cYUnit;               // Y轴单位,0表示毫伏（mV）；1表示微伏（μV）
        int       iData_k;              // 数据点数k,数据点个数k，要求所有通道的数据点数k相同。X轴长度则为t*k
        char      cChannel_m;           // 通道数m,谱图所具有的通道数m
        ST_CSG_YSP_CHANNEL *pstChannel; // 通道信息, 记录m个通道信息，第i个通道称为通道i,i为0~m - 1之间的整数。从通道0开始排列，共m个通道
        char      szSeparation[4];      // 分隔符$$$$.
    }ST_CSG_YSPFILE_HEAD;

    // 油色谱谱图数据定义 附录表D.5节
    typedef struct {
        ST_CSG_DATA Data;
    }ST_CSG_YSP_DATA;

    /*
    * 断路器监测谱图数据定义 表 D.6
    */
    typedef struct {
        float     fStandardVersion;     // 规范版本号,所使用的通用格式规范版本号，本要求设为1.2
        float     fFileVersion;         // 文件版本号,在线监测装置厂家内部使用的版本号，从
                                        // 1.000计起。注意与规范版本号区别开来
        short     shSpectrogramCode;    // 谱图类型编码,01:局放 02:断路器监测 07:油中溶解气体出峰图
        tint64    ilSpectrogramGenTime; // 谱图生成时间,YYYYMMDDhhmmss
        char      cTestFileFlag;        // 测试文件标志位,0表示该文件为测试用的临时文件；1表示在线监测装置监测到断路器有动作
        char      szDeviceName[32];     // 被监测设备名称,unicode编码,以0x00结束
        char      cControl;             // 0表示三相机械联动且仅有1个分闸线圈；    1表示三相机械联动且有2个分闸线圈；
                                        // 2表示三相分相操作且每相仅有1个分闸线圈；3表三相分相操作且每相有2个分闸线圈。
                                        // 该项决定谱图数据的显示，若操作机构三相机械联动（即类型为0或1），波形数据只放在A相
        char      cWaveformType;        // 波形类型,0:表示分闸1线圈电流波形；1:表示分闸2线圈电流波形；2:表示合闸线圈电流波形  3:表示储能电机电流波形；4:表示开断（运行）电流波形
        float     fX_t;                 // X轴间隔t,数据点的时间间隔t，用于绘制X轴
        float     fY_Max;               // Y轴最大值,数据点的最大值，用于绘制Y轴
        char      cXUnit;               // X轴单位,0表示秒（s）；1表示毫秒（ms）
        char      cYUnit;               // Y轴单位,0表示安培（A）
        int       iData_k;              // 数据点数k,数据点个数k，要求ABC三相的数据点数k相同。X轴长度则为t*k
        char      szSeparation[4];      // 分隔符$$$$.
    }ST_CSG_DLQFILE_HEAD;

    /*
    * 断路器监测谱图的谱图数据定义 表 D.7
    */
    typedef struct {
        float *pfAWave;      // 波形数据,k为数据点数，数值表示每个数据点Y轴的值（即真实电流值）。若操作机构三相机械联动，波形数据只放在A相，此时B相、C相波形数据应省略
        float *pfBWave;      // 波形数据
        float *pfCWave;      // 波形数据
    }ST_CSG_DLQ_DATA;

    typedef struct {
        int sno;
        int tme;
        short A1;
        short A2;
        short B1;
        short B2;
        short C1;
        short C2;

        short a1;
        short a2;
        short b1;
        short b2;
        short c1;
        short c2;

        short nsi;
        short crt;
    }ST_COMTRAD_DATA;

#pragma pack (pop)


    void csgIEC61850PdFileParser(ST_FILE61850_LIST &stListFile);
    int  unGenComtrad(char *pfile);

#if defined (__cplusplus)
}
#endif /* defined (__cplusplus) */

#endif /* __HT_IEC_61850_CSGFILE_H */
