/****************************************************************************
** File name    :  HTIEC61850Data.h
** Description  :  define iec 61850 dat file parser api
** 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_ISO_DATA_H
#define __HT_IEC_61850_ISO_DATA_H

#if defined (__cplusplus)
extern "C" {
#endif /* defined (__cplusplus) */
#pragma pack (push ,1)


    /***********************************************************************************
    * cmtr_dat_smpdot - 数据文件中的采样点数据信息.
    * @index: 端口序号（只是编号，解析时不做序号用）；
    * @time: 采样点采样时间偏移量，单位微妙；
    * @analogs: 模拟量信息，一般为有符号整数，国内有些变态的仪器会生成浮点数(在此不支持)；
    * @digits: 数字量信息，为有符号整数；
    *
    ************************************************************************************/
    typedef struct {
        int index;
        int time;
        int analogs[CMTR_ANALOG_MAX_COUNT];
        char digits[CMTR_DIGIT_MAX_COUNT];
    }ST_CMTR_DAT_SMPDOT;

    /************************************************************************************
    * cmtr_cfg_analog - 配置文件模拟量信息
    * @index: 模拟量端口序号（只是编号，解析时不做序号用）；
    * @name: 模拟量端口名称；
    * @phase: 模拟量端口相标识,值如（A、B、C、N等）；
    * @element：标识（还未知，待补充），一般为空；
    * @unit: 模拟量端口数值的单位，该单位常用来区分该端口是电压还是电流，值如：kV、V、A、mA等；
    * @factor_a: 系数a，一般为整数，可以是浮点数；
    * @factor_b: 系数b，一般为整数，可以是浮点数；
    * @offset_time: 时间偏移,指第一个点的时间偏移量，一般为0；
    * @smp_min: 通道的最小采用值，一般为整数,国内有些变态的仪器会生成浮点数(在次不支持)；
    * @smp_max: 通道的最大采用值，一般为整数,国内有些变态的仪器会生成浮点数(在次不支持)；
    *
    * 通道采样的实际值计算方法：实际值 = factor_a * smp_value + factor_b；所以根据该公式，可以计算
    * 通道的最小值为：factor_a * smp_min + factor_b，最大值为：factor_a * smp_max + factor_b。
    *
    * 注：本来smp_min、smp_max为两个字节的一个数据（即最大为65535），但不同厂家会生成很大的四字节数据，
    *    所以采用int类型；factor_a、factor_b用double类型，用float可能会丢精度；为了提供解析程序的适
    *    应性，以适应国内各种变态的有标准不遵循的厂家的仪器生成的cmtr文件。
    *
    ************************************************************************************/
    typedef struct  {
        unsigned int index;
        unsigned char name[CMTR_STRING_MAX_LENGTH];
        unsigned char phase[CMTR_STRING_MAX_LENGTH];
        unsigned char element[CMTR_STRING_MAX_LENGTH];
        unsigned char unit[CMTR_STRING_MAX_LENGTH];
        double factor_a;
        double factor_b;
        int offset_time;
        int smp_min;
        int smp_max;
    }ST_CMTR_CFG_ANALOG;

    /************************************************************************************
    * cmtr_cfg_digit - 配置文件数字量信息
    * @index: 数字量端口序号（只是编号，解析时不做序号用）；
    * @name: 数字量端口名称；
    * @state: 数字量起始状态值，一般为1或者0，很少情况下会为2；
    *
    ************************************************************************************/
    typedef struct {
        int index;
        unsigned char name[CMTR_STRING_MAX_LENGTH];
        char state;
    }ST_CMTR_CFG_DIGIT;

    /************************************************************************************
    * cmtr_cfg_smprate_info - 配置文件采样点信息
    * @rate: 采样率，一般为整数，也有小数表示的；
    * @point: 该采样率下采样的点数，为整数；
    *
    ************************************************************************************/
    typedef struct {
        float rate;
        int point;
    }ST_CMTR_CFG_SMPRATE;

    /************************************************************************************
    * cmtr_cfg_info - 配置文件信息。
    * @station_name: 厂站名称；
    * @kymograph_id: 录波器编号；
    * @analog_count: 模拟量个数；
    * @digit_count: 数字量个数；
    * @analogs: 模拟量信息；
    * @digits: 数字量信息；
    * @frequency: 基本频率，一般为额定频率，指的是电网频率；
    * @smprate_count: 采样率个数；
    * @smprates: 采样率信息；
    * @begin_time: 录波开始时间；
    * @end_time: 录波结束时间；
    * @file_type: 数据文件类型，可以“ASCII”和“Binary”，ASCII类型为dat文件可以用记事本打开看详
    *             细的采样信息；binary格式的只能用特殊的工具查看，为二进制数据文件；
    ************************************************************************************/
    typedef struct  {
        unsigned char station_name[CMTR_STRING_MAX_LENGTH];
        unsigned char kymograph_id[CMTR_STRING_MAX_LENGTH];
        int analog_count;
        int digit_count;
        ST_CMTR_CFG_ANALOG analogs[CMTR_ANALOG_MAX_COUNT];
        ST_CMTR_CFG_DIGIT digits[CMTR_DIGIT_MAX_COUNT];
        float frequency;
        int smprate_count;
        ST_CMTR_CFG_SMPRATE smprates[CMTR_SMPRATE_MAX_COUNT];
        unsigned char begin_time[CMTR_STRING_MAX_LENGTH];
        unsigned char end_time[CMTR_STRING_MAX_LENGTH];
        unsigned char file_type[CMTR_STRING_MAX_LENGTH];
    }ST_CMTR_CFG_INFO;







#pragma pack (pop)
#if defined (__cplusplus)
}
#endif /* defined (__cplusplus) */

#endif /* __HT_IEC61850_DATA_H */
