/******************************************************************************

                  版权所有 (C), 2013-2023, 科大智能电气有限公司

 ******************************************************************************
  文 件 名   : lib60870_common.h
  版 本 号   : V1.0
  生成日期   : 2022年04月07日
  最近修改   :
  功能描述   : 101及104规约实现中的公共数据及外部服务接口模块
  函数列表   :
  修改历史   :
  1.日    期   : 2022年04月07日
    修改内容   : 创建文件
*******************************************************************************/
#ifndef SRC_INC_IEC60870_COMMON_H_
#define SRC_INC_IEC60870_COMMON_H_

#include "lib60870_inc.h"
#include "md5.h"

#ifdef __cplusplus
extern "C" {
#endif

#define COMTRADE    "COMTRADE"
#define SOEPATH     "HISTORY/SOE"
#define COPATH      "HISTORY/CO"
#define EXVPATH     "HISTORY/EXV"
#define FIXPTPATH   "HISTORY/FIXPT"
#define FRZPATH     "HISTORY/FRZ"
#define FLOWREVPATH "HISTORY/FLOWREV"
#define ULOGPATH    "HISTORY/ULOG"
#define FAULTPATH   "HISTORY/FAULT"

#define YC_TYPE_ME_NA       0   /*正常测量值*/
#define YC_TYPE_ME_NB       1   /*标度化值*/
#define YC_TYPE_ME_NC       2   /*浮点遥测*/

#define YX_TYPE_M_SP        0   /*单点遥信*/
#define YX_TYPE_M_DP        1   /*双点遥信*/

#define YK_TYPE_C_SC        0   /*单点遥控*/
#define YK_TYPE_C_DC        1   /*双点遥控*/

#define DD_TYPE_IT_NB        0   /*不带时标*/
#define DD_TYPE_IT_TC        1   /*不带时标*/

#define CONST_NUM_MSG              100
#define WAVE_MAX_TIME              360000 //6min堵塞时间
/**
 * \brief 协议类型，初始化时幅值
 */
typedef enum
{
	CS101_TYPE_S = 0,       /*CS101 从*/
	CS101_TYPE_M,           /*CS101 主*/
	CS104_TYPE_S,           /*CS104 从*/
	CS104_TYPE_M,           /*CS104 主*/
} CS10x_Type;

/**
 * \brief 协议类型，初始化时幅值
 */
typedef enum
{
	TSKID_ReSend = 0,           /*重发标识*/
	TSKID_Anomaly,              /*异常帧任务标识*/
	TSKID_RequestLink,          /*101规约请求链路状态*/
	TSKID_ResetLink,            /*101规约复位链路*/
	TSKID_MResponse,            /*101规约链路状态响应*/
	TSKID_StartLink,            /*104规约启动链路*/
	TSKID_StopLink,             /*104规约断开链路*/
	TSKID_UTest,                /*104规约测试U帧*/
	TSKID_Ack,                  /*101/104共用确认*/

	TSKID_InitFinish,           /*初始化完成*/
	TSKID_YkProcess,
	TSKID_SendCOS,              /*COS信息*/
	TSKID_SendSOE,              /*SOE*/
	TSKID_SummonYx,             /*总招遥信响应*/
	TSKID_SummonYc,             /*总招遥测响应*/
	TSKID_SummonResponse,       /*总招响应及总招下发共用*/
	TSKID_DdSummon,             /*总招电能量及响应*/
	TSKID_DdData,               /*电能量数据传输*/
	TSKID_DdTimeData,           /*电能量时标数据传输*/
	TSKID_FaultSoe,             /*故障事件*/
	TSKID_TimeSyn,              /*时钟同步*/
	TSKID_YcDisturb,            /*扰动数据*/
	TSKID_ResetProcess,         /*复位进程*/
	TSKID_HeartBeat,            /*心跳*/
	TSKID_DataTest,             /*长帧测试*/
	TSKID_ChgConst,             /*修改定值区*/
	TSKID_ReadConst,            /*读取定值区*/
	TSKID_ParamPreread,          /*参数读取*/
	TSKID_ParamPrewrite,
	/*
	*   TypeID=120-126方式  目前大部分地区不使用
	*/
	TSKID_DirReqByNode,         /*目录读取*/
	TSKID_FileReady,        /*文件就绪*/
	TSKID_NodReady,         /*节点就绪*/
	TSKID_NodeData,         /*节点数据响应*/
	TSKID_NodeEnd,          /*节点结束*/
	TSKID_FileEnd,          /*文件结束*/
	/*
	*   细则中按照 210进行文件操作
	*/
	TSKID_FilePro,
	TSKID_UpdateStart,          /*启动升级*/
	TSKID_UpdateExe,            /*执行升级*/
	TSKID_DirReqByFile,         /*读目录任务*/
	/*
	*   南网规约
	*/
	TSKID_ObtainDelay,            /*延时获得命令-南网规约*/
	TSKID_ParamRead_NanWang,      /*读参数命令-南网规约*/
	TSKID_ParamReadResponse_NanWang,/*读参数回复命令-南网规约*/
	TSKID_ParamPreset_NanWang,    /*参数预置命令-南网规约*/
	TSKID_ParamSolidify_NanWang,  /*参数固化命令-南网规约*/
	TSKID_ParamWrite_NanWang,    /*参数预置/固化命令-南网规约（类型标识 55）*/
} CS10x_TSKID;

typedef enum
{
	FILE_ST_IDLE = 0,               /*空闲*/
	FILE_ST_RD_DIR,                 /*读取目录*/
	FILE_ST_RD_DIR_RESPONE,         /*响应目录读取*/
	FILE_ST_RD_FILE_ACT,            /*读文件激活*/
	FILE_ST_RD_FILE_ACT_RESPONE,    /*读文件激活确认*/
	FILE_ST_RD_FILE_DATA,           /*读文件数据响应*/
	FILE_ST_RD_FILE_DATA_RESPONE,   /*读文件数据传输确认*/
	FILE_ST_WR_FILE_ACT,            /*写文件激活*/
	FILE_ST_WR_FILE_ACT_RESPONE,    /*写文件激活确认*/
	FILE_ST_WR_FILE_DATA,           /*写文件*/
	FILE_ST_WR_FILE_DATA_RESPONE,   /*写文件响应*/
	FILE_ST_WR_FILE_DATA_Wait,      /*文件写等待*/
} IEC_FILE_ST;

/**
 * \brief Message type IDs
 */
#define M_DP_NA     3       //不带时标的双点信息
#define M_SP_NA     1       //不带时标的单点信息
#define M_ST_NA     5       //步位置信息
#define M_BO_NA     7       //子站远动终端状态
#define M_ME_NA     9       //测量值
#define M_ME_NB     11      //标度化测量值
#define M_ME_NC     13      //测量值-短浮点数
#define M_IT_NA     15      //电能脉冲记数量
#define M_PS_NA     20      //具有状态变位检出的成组单点信息
#define M_ME_ND     21      //不带品质描述的测量值
#define M_SP_TB     30      //带长时标的单点信息
#define M_ST_TB     32      //带长时标的步位置信息
#define M_DP_TB     31      //带长时标的双点信息
#define M_BO_TB     33      //带长时标的32位位串
#define M_ME_TD     34      //带长时标的测量值
#define M_FT_NA     42      //故障事件信息
#define C_SC_NA     45      //单点遥控命令
#define C_DC_NA     46      //双点遥控命令
#define C_RC_NA     47      //升降命令
#define C_SE_NA     48      //设定命令
#define C_SP_NA     55      //参数预置-南网（类型标识55）
#define M_EI_NA     70      //初始化结束
#define C_IC_NA     100     //召唤命令
#define C_CI_NA     101     //电能脉冲召唤命令
#define C_RD_NA     102     //读数据命令
#define C_CS_NA     103     //时钟同步命令
#define C_TS_NA     104     //测试命令
#define C_RP_NA     105     //复位进程命令
#define C_CD_NA     106     //延时获得命令-南网
#define C_RS_NA_NANWANG 108 //读参数命令-南网
#define P_ME_NC  112     //参数预置-南网
#define P_AC_NA  113     //参数固化-南网
#define C_TS_TA     107     //带时标的测试命令
#define M_FA_NA     142     //FA故障信息
#define C_FA_SIM    143     //FA 模拟
#define C_SR_NA     200     //切换定值区
#define C_RS_NA     202     //读参数和定值
#define C_RR_NA     201     //读定值区号
#define C_WS_NA     203     //写参数和定值
#define M_IT_NB     206     //不带时标的累计量-短浮点
#define M_IT_TC     207     //带时标的累计量-短浮点
#define F_FR_NA     210     //文件升级
#define F_SR_NA     211     //软件升级
#define ANOMALY     255     //扩展为异常帧ID

/**
 * \brief Cause Of Transmission
 */

#define COT_PN          0x40    /*PN位 0-肯定确认 1-否认确认*/

#define COT_PERCYC      1   //周期/循环
#define COT_BACK        2   //背景扫描
#define COT_SPONT       3   //突发
#define COT_INIT        4   //初始化
#define COT_REQ         5   //请求或被请求
#define COT_ACT         6   //激活
#define COT_ACTCON      7   //激活确认
#define COT_DEACT       8   //停止激活
#define COT_DEACTCON    9   //停止激活确认
#define COT_ACTTERM     10  //激活结束
#define COT_RETREM      11  //远程命令引起的返送信息
#define COT_RETLOC      12  //当地命令引起的返送信息
#define COT_FILE        13  //文件传送
#define COT_INTROGEN    20  //响应总召唤
#define COT_INRO1       21  //响应第1组召唤
#define COT_INRO2       22  //响应第2组召唤
#define COT_INRO3       23  //响应第3组召唤
#define COT_INRO4       24  //响应第4组召唤
#define COT_INRO5       25  //响应第5组召唤
#define COT_INRO6       26  //响应第6组召唤
#define COT_INRO7       27  //响应第7组召唤
#define COT_INRO8       28  //响应第8组召唤
#define COT_INRO9       29  //响应第9组召唤
#define COT_INRO10      30  //响应第10组召唤
#define COT_INRO11      31  //响应第11组召唤
#define COT_INRO12      32  //响应第12组召唤
#define COT_INRO13      33  //响应第13组召唤
#define COT_INRO14      34  //响应第14组召唤
#define COT_INRO15      35  //响应第15组召唤
#define COT_INRO16      36  //响应第16组召唤
#define COT_REQCO1      38  //响应第1组计数量召唤
#define COT_REQCOGCN    37  //响应计数量总召唤
#define COT_REQCO2      39  //响应第2组计数量召唤
#define COT_REQCO3      40  //响应第3组计数量召唤
#define COT_REQCO4      41  //响应第4组计数量召唤
#define COT_E_SBSTA     48  //遥控执行软压板状态错误
#define COT_E_TIME      49  //遥控执行时间戳错误
#define COT_E_SIGN      50  //遥控执行数字签名认证错误
#define COT_E_TYPE      44  /**<未知的类型标识*/
#define COT_E_REASON    45  /**<未知的传送原因*/
#define COT_E_CADDR     46  /**<未知的ASDU公共地址*/
#define COT_E_IADDR     47  /**<未知的信息对象地址*/

#define QOI             20  //总召唤   召唤限定词
#define QCC             5   //总的请求电能量
#define QRP             1   //进程总复位 复位进程命令限定词
#define COI_0           0   //初始化原因 当地电源合上
#define COI_1           1   //初始化原因 当地手动复位
#define COI_2           2   //初始化原因 远方复位
#define FBP             0xAA55 //测试命令限定词

#define YKSELECT_1      0x81  //选择合 双点加1
#define YKSELECT_0      0x80  //选择分 双点加1
#define YKEXCUTE_1      0x01  //执行合 双点加1
#define YKEXCUTE_0      0x00  //执行分 双点加1
#define YKCANCEL_1      0x01  //撤销合 双点加1
#define YKCANCEL_0      0x00  //撤销分 双点加1
#define YKSTOP_1        0x01  //终止合 双点加1
#define YKSTOP_0        0x00  //终止分 双点加1

//#define YK_CLOSE        2     //遥控合
//#define YK_OPEN         1     //遥控分

#define FILE_TRANS      2  //文件传输附加数据包类型 2表示文件传输

#define PARAM_CONT_1    0x01   //参数固化后续状态位1
#define PARAM_CONT_0    0x00   //参数固化后续状态位0
#define PARAM_CR_1      0x40   //取消预置
#define PARAM_SE_1      0x80   //参数预置
#define PARAM_SE_0      0x00   //参数固化
#define READ_ALL_PARAM  0x01   //读全部参数

#define PARAM_ST_NONE       0x00   //无任务
#define PARAM_ST_START      0x01   //任务开始
#define PARAM_ST_END        0x02   //任务开始
#define PARAM_ST_OK         0x03   //任务开始
#define PARAM_ST_TIMEOUT    0x10   //超时

#define TSK_PARM_NONE    0   //无任务标识
#define TSK_PARM_USACT   1   //U&S帧激活  101/104共用
#define TSK_PARM_USTCON  2   //U&S帧激活确认

#define CONTINUE            1    //信息体地址连续
#define DISCONTINUE         0    //信息体地址不连续

#define SHORT_TYPE          2   //待发送数据为短帧
#define LONG_TYPE           1   //待发送数据为长帧
#define RESEND_TYPE         3   //待发送数据为重发帧
#define WAVE_TYPE           4   //启动录波任务

#define SETUP_SET_SUMMON    0   //设置初始化总召任务
#define SETUP_WAIT_SUMMON   1   //等待初始化总召
#define SETUP_OK_SUMMON     2   //总召任务结束
#define SETUP_SET_SYN       3   //设置初始化对时
#define SETUP_WAIT_SYN      4   //等待初始化对时
#define SETUP_OK_SYN        5   //对时完成

#define WRITE_FILE_ERR_NONE     0
#define WRITE_FILE_ERR_OTHER    1
#define WRITE_FILE_ERR_CHECK    2
#define WRITE_FILE_ERR_LEN      3
#define WRITE_FILE_ERR_ID       4

#define WRITE_PARAM_YZ      1
#define WRITE_PARAM_YZCON   2
#define WRITE_PARAM_GH      3
#define WRITE_PARAM_GHCON   4
#define WRITE_PARAM_CA      5
#define WRITE_PARAM_CACON   6
#define WRITE_PARAM_NONE    0
// #define WRITE_FILE_ERR_LEN      3
// #define WRITE_FILE_ERR_ID       4

#define PARAM_READ      1
#define PARAM_WRITE     2
#define PARAM_IDLE      0

#define MASTER_TYPE     1
#define DEV_TYPE        0
//标志操作相关定义
#define MAX_FLAGNO    128   //每个模块最多的标志位数

#define MAX_FRAME_LEN 255
#define APCI_LEN 6

#define DATATYPE_YC     1   //遥测
#define DATATYPE_YX     2   //遥信
#define DATATYPE_Yk     3   //遥控
#define DATATYPE_YXT    4   //带时标遥信

#define CURPARAMAREA    0   /*当前定值区*/
#define MINPARAMAREA    1   /*最小定值区*/
#define MAXPARAMAREA    2   /*最大定值区*/

#define IECPARAMRD      0   /*读参数定值区*/
#define IECPARAMWT      1   /*写参数定值区*/

/**
 * \brief 任务标识
 */
typedef struct
{
	unsigned char ucFlag[ MAX_FLAGNO / 8 ];    /*任务数列*/
} VFLAGS;

typedef struct
{
	unsigned char byStartCode;
	unsigned char byAPDULen;
	unsigned char byControl1;
	unsigned char byControl2;
	unsigned char byControl3;
	unsigned char byControl4;
	unsigned char byASDU[MAX_FRAME_LEN - APCI_LEN];
} VIec104Frame;

/**
* @brief  101规约短帧格式 单字节地址
*/
typedef struct
{
	unsigned char ucStart;
	unsigned char ucControl;
	unsigned char ucAddr;
	unsigned char ucCS;
	unsigned char ucTail;
} VFrame10_S;

/**
* @brief  101规约短帧格式 双字节地址
*/
typedef struct
{
	unsigned char ucStart;
	unsigned char ucControl;
	unsigned char ucAddr_L;
	unsigned char ucAddr_H;
	unsigned char ucCS;
	unsigned char ucTail;
} VFrame10;

/**
* @brief  101规约长帧格式
*/
typedef struct
{
	unsigned char ucStart1;
	unsigned char ucLength1;
	unsigned char ucLength2;
	unsigned char ucStart2;
	unsigned char ucControl;
	unsigned char ucaData[MAX_FRAME_LEN - 5];
} VFrame68;

/**
* @brief  101规约帧格式
*/
typedef union
{
	VFrame10    stFrame10;
	VFrame10_S  stFrame10_S;
	VFrame68    stFrame68;
} VIec101Frame;

/**
 * \brief 参数
 */
typedef struct
{
	unsigned char  byTskId;   //任务序号
	unsigned char  byTskSt;   //任务状态
	unsigned char  byTskRe;   //任务预留
	unsigned int   uiTskCot;
	unsigned short usTskTcn;
} ParamTsk_st;

/**
 * \brief Parameters for the CS101/CS104 application layer
 */
typedef struct CS10x_AppLayerParameters *pCS10x_AppLayerParameters;

struct CS10x_AppLayerParameters
{
	int iSzOfLinkAddr;    /*链路地址长度   CS101*/
	int iSzOfTypeId;      /* 类型长度          size of the type id (default = 1 - don't change) */
	int iSzOfVSQ;         /* VSQ长度           don't change */
	int iSzOfCOT;         /* 传输原因长度      size of COT (1/2 - default = 2 -> COT includes OA) */
	int iSzOfCA;          /* 公共地址长度      size of common address (CA) of ASDU (1/2 - default = 2) */
	int iSzOfIOA;         /* 信息体地址长度    size of information object address (IOA) (1/2/3 - default = 3) */
	int iLinkAddr;           /*链路地址*/
	int iPublicAddr;         /*公共地址*/
	int iMaxSzOfAsduLen;     /* maximum size of the ASDU that is generated - the maximum maximum value is 249 for IEC 104 and 254 for IEC 101 */
};

/**
 * \brief Parameters for CS104 connections - APCI (application protocol control information)
 */
typedef struct CS104_APCIParameters *pCS104_APCIParameters;

struct CS104_APCIParameters
{
	int iK;
	int iW;
	int iT0;
	int iT1;
	int iT2;
	int iT3;
};

/**
 * \brief 任务标识
 */
typedef struct
{
	unsigned short   usTypeID;        /*类型标识符*/
	unsigned short   usSQ;            /*连续、离散标识*/
	unsigned short   usNum;           /*信息对象个数*/
	unsigned short   usCot;           /*传送原因*/
	unsigned int     uiAddr;          /*公共地址*/
	unsigned char    *pucPayload;     /*信息对象起始位置*/
	unsigned short   usPayloadSize;   /*信息对象大小*/
	unsigned short   usCotH;          /*传送原因高字节值*/
} ASDU_Element;

/**
 * \brief 数据缓冲
 */
struct VCommBuf
{
	unsigned short   usBufSize;        /*缓冲区大小*/
	unsigned short   usReadPtr;        /*读指针*/
	unsigned short   usWritePtr;       /*写指针*/
	int   iFlag;     /*控制码(主要用于发送)*/
	unsigned char    *pBuf;            /*缓冲区*/
};

/**
 * \brief 104时间计数
 */
typedef struct
{
	bool bRun;
	unsigned short  usInitVal;
	unsigned int  uiCounter;
} VIec104Timer;

/**
 * \brief CP56Time
 */
typedef struct
{
	unsigned char ucLMs;        /*毫秒低位*/
	unsigned char ucHMs;        /*毫秒低位*/
	unsigned char ucMin;        /*分钟*/
	unsigned char ucHour;        /*小时*/
	unsigned char ucWeek;        /**< week: 0-不用,n-星期n */
	unsigned char ucMonth;        /*月*/
	unsigned char ucYear;        /*年*/
} __CP56Time2a;

/**
 * \brief Yx信息
 */
typedef struct
{
	unsigned int      uiInfoAddr;     /*信息体地址*/
	unsigned char     ucStatus;        /*状态信息*/
	unsigned char     ucStateType;     // 单点双点
} Yx_Info;

/**
 * \brief Yc信息
 */
typedef struct
{
	unsigned int    uiInfoAddr;     /*信息体地址*/
	float    fVal;           /*遥测值*/
	unsigned char ucQds;
} Yc_Info;

/**
 * \brief Yk信息
 */
typedef struct
{
	unsigned int    uiInfoAddr;     /*信息体地址*/
	unsigned char     ucStatus;           /*状态信息*/
	unsigned char     ucStateType;     // 单点遥控/双点遥控
	unsigned char     ucYkType;        // 执行/选择
} Yk_Info;

/**
 * \brief Dd信息
 */
typedef struct
{
	unsigned int    uiInfoAddr;     /*信息体地址*/
	float    fVal;           /*遥测值*/
} Dd_Info;

/**
 * \brief SOE 记录信息
 */
typedef struct
{
	unsigned int      uiInfoAddr;    /*信息体地址*/
	unsigned char     ucStatus;       /*状态位*/
	unsigned char     ucStateType;     // 单点双点
	__CP56Time2a      stCTime;       /*时间*/
} SOE_Info;

typedef struct
{
	unsigned int      uiInfoAddr;    /*信息体地址*/
	float             fVal;           /*遥测值*/
	__CP56Time2a      stCTime;       /*时间*/
} TimeDd_Info;

/**
 * \brief SOE队列信息
 */
#define MAX_SOE_QUEUE_SIZE    256     /*SOE缓冲记录最大个数*/
typedef struct
{
	unsigned short         usReadPrt;               /*确认SOE位置*/
	unsigned short         usWritePrt;              /*未确认SOE位置*/
	unsigned short         usCosPrt;                /*COS发送位置*/
	unsigned short         usSoePrt;                /*SOE发送位置*/
	unsigned short         usaSeq[MAX_SOE_QUEUE_SIZE];    /*104I帧序列号  用于主站确认*/
	SOE_Info    staInfo[MAX_SOE_QUEUE_SIZE];    /*SOE事件信息*/
} SOE_Queue;

/**
 * \brief 故障事件信息
 */
#define MAX_FAULT_EVENT_SOE_SIZE    16
#define MAX_FAULT_EVENT_YC_SIZE     16
typedef struct
{
	unsigned short   usSoeNum;    // YX数量
	SOE_Info         staSoe[MAX_FAULT_EVENT_SOE_SIZE];   /*SOE信息内容*/
	unsigned short   usYcNum;     // YC数量
	Yc_Info          staYc[MAX_FAULT_EVENT_YC_SIZE];     /*YC信息内容*/
} FAULT_EVENT_Info;

/**
 * \brief 故障事件队列信息
 */
#define MAX_FAULT_EVENT_QUEUE_SIZE  20      /*故障事件队列大小*/
typedef struct
{
	unsigned short                 usReadPrt;               /*确认故障事件位置*/
	unsigned short                 usWritePrt;              /*未确认故障事件位置*/
	unsigned short                 usSendPrt;              /*未确认故障事件位置*/
	FAULT_EVENT_Info    staFault[MAX_FAULT_EVENT_QUEUE_SIZE];     /*故障事件信息*/
} FAULT_EVENT_Queue;

/**
 * \brief 故障事件队列信息
 */
#define MAX_YC_DISTURB_QUEUE_SIZE  200      /*扰动遥测队列大小*/
typedef struct
{
	unsigned short         usReadPrt;               /*确认故障事件位置*/
	unsigned short         usWritePrt;              /*未确认故障事件位置*/
	unsigned short         usSendPrt;              /*未确认故障事件位置*/
	Yc_Info     staYc[MAX_YC_DISTURB_QUEUE_SIZE];     /*扰动遥测*/
} YC_DISTURB_Queue;

/**
 * \brief 文件目录信息
 */

#define TRANS_NULL  -1  //无文件需要传输
#define TRANS_DIR   1   //传输目录
#define TRANS_FILE  2   //传输文件

//文件传输对象
typedef struct
{
	unsigned char   ucCallFlag;     //召唤标志
	unsigned char   ucFileNameLen;  //目录/文件名字长度
	unsigned char   ucFileName[64]; //目录/文件名
	__CP56Time2a    stStartTime;    //查询起始时间
	__CP56Time2a    stEndTime;      //查询终止时间
} FileObj_T;


//召唤目录结构特点
typedef struct
{
	unsigned char   ucFileType;     //0:目录, 1:文件
	FileObj_T   stFileObj;
} TRANSFILE_OBJ_T;

typedef struct
{
	bool             bAll;                             /*读文件时间条件使能*/
	__CP56Time2a     stStartTime;                      /*读取文件起始位置*/
	__CP56Time2a     stEndTime;                        /*文件大小*/
} tIEC_FILE_TIME;

#define TRANS_TIMEOUT_MAX   60*1000 /*最大超时时间 ms*/
#define TRANS_SCH_GAP       10      /*任务调度执行频率 ms*/
#define FILE_NAME_SIZE      64
#define DIRFILE_SET_NUM     32

//文件传输服务操作码
enum
{
	OR_NULL = 0,
	OR_DIR_CALL = 1,                //召唤目录
	OR_DIR_ACK = 2,                 //召唤目录确认
	OR_FILE_ACT = 3,                //读文件激活
	OR_FILE_ACK = 4,                //读文件激活确认
	OR_FILE_TRANSUP = 5,            //读文件数据传输
	OR_FILE_TRANSUP_ACK = 6,        //读文件数据响应
	OW_FILE_ACT = 7,                //写文件激活
	OW_FILE_ACK = 8,                //写文件激活确认
	OW_FILE_TRANS = 9,              //写文件数据传输
	OW_FILE_TRANS_ACK = 10          //读文件数据响应
};

#define PROT_FILE_OBJ       0       //文件服务, 文件对象
#define PROT_DIR_OBJ        1       //文件服务, 目录对象

typedef struct
{
	unsigned char ucFileLen;
	char caFileName[FILE_NAME_SIZE];
} tFILE_NAME;

typedef struct
{
	tFILE_NAME      stFileName; //文件名与文件名长度
	unsigned char   ucAttri;    //属性 保留
	unsigned int    uiId;       //文件ID, 兼容底层接口添加
	unsigned int    uiFileSize; //文件大小
	__CP56Time2a    stTimeStamp;//文件时间
} tDIR_FILE_INFO;

//读取目录/文件服务
typedef struct
{
	unsigned char     ucDirLen;                 //根据底层读写接口, 将目录和文件分开
	char              caDirName[FILE_NAME_SIZE];
	unsigned char     ucFileLen;
	char              caFileName[FILE_NAME_SIZE];
	unsigned char     ucCallFlag;               //召唤标志 0: 目录下所有文件, 1:目录下满足搜索时间段的文件
	__CP56Time2a      stStartTime;  //查询起始时间
	__CP56Time2a      stEndTime;        //查询起始时间
	unsigned short    usFrmNum;     //目录召唤-->本帧文件数量
	unsigned short    usCurNum;     //目录召唤-->当前传输数量, 管理多次发送
	unsigned int      uiTotalSize;  //文件读取-->文件大小
	unsigned int      uiOffSetSize; //文件读取-->读文件偏移量
	//文件 & 目录共性
	unsigned int      uiId;         //目录/文件ID
	unsigned char     ucFollow;     //后续标志, 0: 无后续, 1: 有后续
	unsigned char     ucResult;     //结果描述 0:成功, 1:失败
} tFILEDIR_RD_SET;

//写文件
typedef struct
{
	unsigned char   ucFileLen;
	char            ucFileName[FILE_NAME_SIZE];
	unsigned int    uiFileId;               //文件ID
	unsigned int    uiOffSetSize;           //数据段号
	unsigned int    uiFileSize;             //文件大小
	unsigned char   ucFollow;       //后续标志, 0: 无后续, 1: 有后续
	unsigned char   ucResult;               //0：成功 1：未知错误 2.校验和错误 3.文件长度不对应 4.文件ID 与激活 ID 不一致
} tFILE_WD_SET;

/********************************************/

typedef struct
{
	unsigned char  ucType;     /*类型*/
	unsigned char  ucLen;      /*长度*/
	union
	{
		unsigned char      ucVal;      //无符号型
		char               cVal;       //有符号型
		unsigned short     usVal;      //无符号型
		short              sVal;       //有符号型
		unsigned int       ulVal;      //无符号型
		int                lVal;       //有符号型
		float              fVal;       //浮点数
		unsigned long long ullVal;      //无符号型
		long long          llVal;       //有符号型
		double             dVal;       //双精度类型
		char               caBuf[64];  //
	} unVal;

	unsigned int   uiInfoAddr;         /*信息体地址*/
} IECPARAM_T;

struct CS10x_t;
typedef struct CS10x_t *CS10xHandle_t;

/**
 * \brief GetLayerSt 获取链路层状态，检测是否满足发送条件
 * \param
 * \return
 *
 */
typedef int (*CS10x_SendCb)(unsigned char *buf, unsigned short usLen, void *arg);

/**
 * \brief SearchOneFrame 查找规约指定帧
 * \param
 * \param pBuf  数据缓冲区
 * \param usLen 数据长度
 *
 * \return
 */
typedef char (*CS10x_SearchOneFrame)(CS10xHandle_t pstSelf, unsigned char *pucBuf, unsigned short usLen);

/**
 * \brief Preprocessor 规约预处理  根据指定的规约进行数据解析，提取ASDU数据
 * \param
 *
 * \return
 */
typedef int (*CS10x_Preprocessor)(CS10xHandle_t pstSelf);

/**
 * \brief GetLayerSt 获取链路层状态，检测是否满足发送条件
 * \param
 *
 * \return
 */
typedef int (*CS10x_Send_Cb)(unsigned char *buf, unsigned short len, void *arg);

/**
 * \brief GetLayerSt 获取链路层状态，检测是否满足发送条件
 * \param
 *
 * \return
 */
typedef int (*CS10x_GetLayerSt)(CS10xHandle_t pstSelf);

/**
 * \brief EncodeASDU 打包ASDU数据域
 * \param
 *
 * \return
 */
typedef char (*CS10x_EncodeASDU)(CS10xHandle_t pstSelf);

/**
 * \brief EncodeASDU 打包ASDU数据域
 * \param
 *
 * \return
 */
typedef char (*CS10x_EncodeOther)(CS10xHandle_t pstSelf);

/**
 * \brief LinkClose 关闭链路接口
 * \param
 *
 * \return
 */
typedef int (*CS10x_LinkClose)(void *arg);

/**
 * \brief SetValue 规约更新应用数据
 * \param
 *
 * \return
 */
typedef int (*CS10x_GetTime)(__CP56Time2a *pTime);

/**
 * \brief SetValue 规约更新应用数据
 * \param
 *
 * \return
 */
typedef int (*CS10x_SetTime)(__CP56Time2a *pTime);

/**
 * \brief SetValue 规约更新应用数据
 * \param
 *
 * \return
 */
typedef int (*CS10x_SetValue)(Yc_Info *pstInfo, void *pParam);

/**
 * \brief SetStatus 规约更新应用状态
 * \param
 *
 * \return
 */
typedef int (*CS10x_SetStatus)(Yx_Info *pstInfo, void *pParam);

/**
 * \brief SetDdValue 规约更新应用数据
 * \param
 *
 * \return
 */
typedef int (*CS10x_SetDdValue)(TimeDd_Info *pstInfo, void *pParam);

/**
 * \brief AddSOE 规约添加SOE信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_AddSOE)(SOE_Info *pstInfo, void *pParam);

/**
 * \brief AddDiturbYc 规约添加遥测扰动信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_AddDiturbYc)(Yc_Info *pstInfo, void *pParam);

/**
 * \brief GET_DiturbYc_SendNum信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_GET_DiturbYc_SendNum)(void *pParam);

/**
 * \brief  Get遥测扰动信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_GetDiturbYc)(Yc_Info *pstInfo, void *pParam, unsigned int usStPos);

/**
 * \brief 扰动遥测数据主动发送查询窗口
 * \param
 *
 * \return
 */
typedef void (*CS10x_SendDiturbYc)(CS10xHandle_t pstSelf);

/**
 * \brief 向下行设备发送确认帧
 * \param
 *
 * \return
 */
typedef void (*CS10x_AckFrameNotification)(void);


/**
 * \brief 扰动遥测信息更新
 * \param
 *
 * \return
 */
typedef int (*CS10x_Updata_DiturbYc_Pout)(void *pParam, unsigned int Pos);


/**
 * \brief AddFaultEvent 规约添加故障事件信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_AddFauleEvent)(FAULT_EVENT_Info *pstInfo, void *pParam);

/**
 * \brief AddTimeDdu 规约添加电度信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_AddTimeDdu)(TimeDd_Info *pstInfo, void *pParam);

/**
 * \brief GetSoe获取SOE信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_GetSOE)(SOE_Info *pstInfo, void *pParam, unsigned int usStPos);

/**
 * \brief GetSoe获取SOE信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_GetTimeDdu)(TimeDd_Info *pstInfo, void *pParam, unsigned int usStPos);

/**
 * \brief GetSoeSendNum信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_GET_SOE_SendNum)(void *pParam);


/**
 * \brief GetEventSendNum信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_GET_Event_SendNum)(void *pParam);

/**
 * \brief GetTimeDduSendNum信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_GetTimeDdu_SendNum)(void *pParam);

/**
 * \brief GetSoe获取SOE信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_Updata_SOE_Pout)(void *pParam, unsigned int Pos);

/**
 * \brief GetTimeDdu获取Dd信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_Updata_TimeDdu_Pout)(void *pParam, unsigned int Pos);

/**
 * \brief GetFaultEvent 获取故障事件信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_GetFaultEvent)(FAULT_EVENT_Info *pstInfo, void *pParam, unsigned int usStPos);

/**
 * \brief GetFaultEvent_Pout 获取故障事件信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_GetFaultEvent_Pout)(void *pParam);

/**
 * \brief GetFaultEvent_PStart 获取故障事件信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_GetFaultEvent_Pin)(void *pParam);

/**
 * \brief Updata_FaultEvent_Pout 获取故障事件信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_Updata_FaultEvent_Pout)(void *pParam, unsigned int Pos);

/**
 * \brief CS10x_SendSoeEnent Soe及Event主动发送查询窗口
 * \param
 *
 * \return
 */
typedef void (*CS10x_SendSoeEnent)(CS10xHandle_t pstSelf);

/**
 * \brief GetYcCountByGroup 规约获取组遥测数据个数
 * \param ucGroupID 组序号
 * \param ucIdx 组内下标
 *
 * \return
 */
typedef int (*CS10x_GetYcCountByGroup)(unsigned short ucGroupID, void *pParam, unsigned int *StartInf, unsigned int *EndInf);

/**
 * \brief GetYcValueByGroup 规约获取组遥测数据
 * \param ucGroupID 组序号
 * \param ucIdx 组内下标
 *
 * \return
 */
typedef int (*CS10x_GetYcValueByGroup)(unsigned short ucGroupID, unsigned short usIdx, Yc_Info *pstInfo, void *pParam);

/**
 * \brief GetYxCountByGroup 规约获取组遥信数据个数
 * \param ucGroupID 组序号
 * \param ucIdx 组内下标
 *
 * \return
 */
typedef int (*CS10x_GetYxCountByGroup)(unsigned short ucGroupID, void *pParam, unsigned int *StartInf, unsigned int *EndInf);

/**
 * \brief GetYxStatusByGroup 规约获取组遥信数据
 * \param
 *
 * \return
 */
typedef int (*CS10x_GetYxStatusByGroup)(unsigned short ucGroupID, unsigned short usIdx, Yx_Info *pstInfo, void *pParam);

/**
 * \brief CS10x_GetYxPotPro Soe及Event主动发送查询窗口
 * \param
 *
 * \return
 */
typedef int (*CS10x_GetYxPotPro)(void *pParam, unsigned short usIdx);

/**
 * \brief GetDdCountByGroup 规约获取组遥测数据个数
 * \param ucGroupID 组序号
 * \param ucIdx 组内下标
 * \param ucTimeEn带时标
 * \return
 */
typedef int (*CS10x_GetDdCountByGroup)(unsigned short ucGroupID, void *pParam, unsigned int *StartInf, unsigned int *EndInf, unsigned char ucTimeEn);

/**
 * \brief GetDdValueByGroup 规约获取组遥测数据
 * \param ucGroupID 组序号
 * \param ucIdx 组内下标
 * \param ucTimeEn带时标
 * \return
 */
typedef int (*CS10x_GetDdValueByGroup)(unsigned short ucGroupID, unsigned short usIdx, TimeDd_Info *pstInfo, void *pParam, unsigned char ucTimeEn);

typedef unsigned short (*CS10x_GetParamArea)(unsigned char ucType, void *pParam);

typedef unsigned short (*CS10x_SetParamArea)(unsigned short usArea, void *pParam);

/**
 * \brief CS10x_AddIECParam 规约添加定值参数数据
 * \param ucAll
 * \param ucForce
 * \param ucType
 * \return
 */
typedef unsigned char (*CS10x_AddIECParam)(unsigned char ucAll, unsigned char ucForce, unsigned char ucType, IECPARAM_T *pstVal, void *pParam);

typedef unsigned char (*CS10x_RunReadIECParam)(void *pParam);

typedef unsigned char (*CS10x_RunWriteIECParam)(void *pParam);

/**
 * \brief GetParamCount 规约获取组遥测数据个数
 * \param ucIdx 组内下标
 *
 * \return
 */
typedef unsigned short (*CS10x_GetParamCount)(void *pParam);

/**
 * \brief CS10x_GetParamInfoByIndx 规约获取组遥测数据
 * \param ucIdx 组内下标
 *
 * \return
 */
typedef unsigned char (*CS10x_GetParamInfoByIndx)(unsigned char ucType, unsigned short usIdx, IECPARAM_T *pstVal, void *pParam);

/**
 * \brief CS10x_GetParamInfoByInfo 规约获取组遥测数据
 * \param ucIdx 组内下标
 *
 * \return
 */
//typedef int (*CS10x_GetParamInfoByInfo) (unsigned char byType,unsigned short usIfo, CONSTPARAM_Info *pstInfo, void *pParam);

/**
 * \brief CS10x_UpdateParamPosRwst 规约获取组参数点号状态数据
 * \param ucIdx 组内下标
 *
 * \return
 */
//typedef void(*CS10x_UpdateParamPosRwst) (unsigned char byType,CONSTPARAM_Info *pstInfo, void *pParam);
/**
 * \brief GetNumDirFile 获取目录下文件数量
 * \param caDirName 文件名
 * \param pstIecFile 条件信息
 * \return 目录文件个数
 */
typedef int (*CS10x_GetNumDirFile)(tFILEDIR_RD_SET *pstRdSet);

/**
 * \brief ReadFile 获取目录下文件属性
 * \param pstIecFile 读取文件条件
 * \param pFileSet  文件缓冲区
 * \param ucType    获取属性类型  1-通过序号获取，0-名称获取
 * \param usItem    文件序号
 * \param caDirName    文件夹名称
 * \param caFileName    文件名称
 * \return true/false
 */
typedef bool (*CS10x_GetProDirFile)(tFILEDIR_RD_SET *pstRdSet, tDIR_FILE_INFO *pstDirFileInfo, unsigned char ucType, unsigned short usItem, void *pvInfo);

/**
 * \brief ReadFile 读取文件数据
 * \param
 *
 * \return
 */
typedef int (*CS10x_ReadFile)(unsigned int uiOffset, unsigned char *pBuf, unsigned short usLen, void *pvParam);

/**
 * \brief WriteFile 读取文件数据
 * \param
 *
 * \return
 */
typedef int (*CS10x_WriteFile)(tFILEDIR_RD_SET  *pstRdSet, unsigned char *pBuf, unsigned short usLen, void *pUsrData);

/**
 * \brief SearchFileName 比对文件名
 * \param
 *
 * \return
 */
typedef bool (*CS10x_SearchFileName)(char *caDirName, char *caFileName, void *pUsrData);

/**
 * \brief CS10x_WriteFileCheck 查询待写入文件
 * \param
 *
 * \return
 */
typedef unsigned char (*CS10x_WriteFileCheck)(tFILE_WD_SET  *pstWdSet, void *pvFileWrteParam, void *pUsrData);

/**
 * \brief Write 写入文件
 * \param
 *
 * \return
 */
typedef int (*CS10x_Write)(unsigned int uiOffset, unsigned char *pBuf, unsigned short usLen, void *pvFile, void *pUsrData);

/**
 * \brief WriteFinish 写入文件完成
 * \param
 *
 * \return
 */
typedef int (*CS10x_WriteFinish)(unsigned char *pucMd5, void *pvFile, void *pUsrData);

/**
 * \brief WriteFinish 写入文件完成
 * \param
 *
 * \return
 */
typedef int (*CS10x_UpdateProc)(unsigned short usCos, unsigned char ucSe, void *pUsrData);

/**
 * \brief ParamTaskDataProcess 设置读写参数任务
 * \param
 *
 * \return
 */
typedef void (*CS10x_ParamTaskDataProcess)(unsigned char byTskId, unsigned int uiParam, void *pUsrData);

/**
 * \brief SetParamTask 设置读写参数任务
 * \param
 *
 * \return
 */
typedef void (*CS10x_SetParamTaskst)(void *pUsrData, ParamTsk_st *pTaskst);

/**
 * \brief SetParamTask 设置读写参数任务
 * \param
 *
 * \return
 */
typedef bool (*CS10x_GetandClearUlogTskst)(void *pParam);

/**
 * \brief SetParamTask 设置读写参数任务
 * \param
 *
 * \return
 */
typedef void (*CS10x_GetParamTaskst)(void *pUsrData, ParamTsk_st *pTaskst);

/**
 * \brief SetParamTask 设置读写参数任务
 * \param
 *
 * \return
 */
typedef void (*CS10x_CheckParamRWSt)(CS10xHandle_t pstSelf);

/**
 * \brief SetParamTask 设置读写参数任务
 * \param
 *
 * \return
 */
typedef void (*CS10x_CheckUlogReadSt)(CS10xHandle_t pstSelf);

/**
 * \brief SetParamTask 设置读写参数任务
 * \param
 *
 * \return
 */
typedef void (*CS10x_ParamConstUpdate)(void);



/**
 * \brief 检查文件传输状态
 * \param
 *
 * \return
 */
typedef void (*CS10x_CheckFileTransferSt)(CS10xHandle_t pstSelf);


/**
 * \brief 检查文件传输任务
 * \param
 *
 * \return
 */
typedef void (*CS10x_PollFileTransTask)(CS10xHandle_t pstSelf);


/**
 * \brief 注册文件传输任务
 * \param
 *
 * \return
 */
typedef int (*CS10x_RegFileTransObj)(void *pUsrData, FileObj_T *FileObj, unsigned char ucFileType);


/**
 * \brief 获取文件传输任务
 * \param
 *
 * \return
 */
typedef int (*CS10x_CheckTransFileObj)(tFILEDIR_RD_SET *pstRdSet, void *pUsrData);

/**
 * \brief 检测文件传输任务超时
 * \param
 *
 * \return
 */
typedef int (*CS10x_CheckTransTimeOut)(void *pUsrData);

/**
 * \brief 目录接收完成回调处理函数
 * \param
 *
 * \return
 */
typedef int (*CS10x_DirRecvFinish)(tDIR_FILE_INFO *pstDirFileSet, unsigned char ucFrmNum, unsigned char ucFollow, void *pUsrData);


/**
 * \brief GetYcValueByGroup 规约获取组遥测数据
 * \param ucGroupID 组序号
 * \param ucIdx 组内下标
 *
 * \return
 */
typedef int (*CS10x_Encrypt)(char *pBuf, unsigned short usLen);

/**
 * \brief GetYcValueByGroup 规约获取组遥测数据
 * \param ucGroupID 组序号
 * \param ucIdx 组内下标
 *
 * \return
 */
typedef void (*CS10x_Md5Result)(unsigned char *pBuf);

/**
 * \brief 104Time Out t0~t3时间管理
 * \param
 *
 * \return
 */
typedef void (*CS10x_TimeManager)(CS10xHandle_t pstSelf, unsigned short usGap);

/**
 * \brief 写入复位原因
 * \param
 *
 * \return
 */
typedef void (*CS10x_Write_ResetCOI)(unsigned char Coi);

/**
 * \brief 读出复位原因标志
 * \param
 *
 * \return
 */
typedef unsigned char (*CS10x_Read_ResetCOI)(void);

/**
 * \brief 根据地址及属性获取具体信息
 * \param
 *
 * \return
 */
typedef int (*CS10x_GetDdValue)(int infoaddr, TimeDd_Info *DdInfo, unsigned short wType);

/**
 * \brief  遥控校验
 * \param
 *
 * \return
 */
typedef unsigned char (*CS10x_YkVerify)(void *pParam);

/**
 * \brief  规约更新遥控应用状态
 * \param
 *
 * \return
 */
typedef int (*CS10x_SetYkInfor)(Yk_Info *pstInfo, void *pParam);

/**
 * \brief  规约处理下行设备遥控应答
 * \param
 *
 * \return
 */
typedef int (*CS10x_SetYkAck)(unsigned char *pucYkSe, unsigned short usReason, void *pUsrData);

/**
 * \brief  规约处理下行参数定值
 * \param
 *
 * \return
 */
typedef int (*CS10x_SetParamInfo)(IECPARAM_T *pstVal, void *pUsrData);

/**
 * \brief  获取总召延迟时间（ms），返回0表示不延迟
 * \param  pParam-用户数据指针
 * \return 延迟时间(ms)，0=不延迟
 */
typedef unsigned int (*CS10x_GetSummonSlaveDelay)(void *pParam);


/**
 * \brief CS10x
 */
typedef struct CS10x_t
{
	/**********************************************************
	*用户自定义数据
	***********************************************************/
	void            *pUsrData;/*用户自定义数据*/
	/**********************************************************
	*公共配置参数
	***********************************************************/
	CS10x_Type      eCS10x_Type;/*规约类型 CS101Master CS101Slave CS104Master CS104Slave*/
	/*通用参数类*/
	struct  CS10x_AppLayerParameters    stAppParameters;        /*规约参数*/
	bool                       bFbpType;           /* 长帧测试限定词类型 0表示发什么回什么 1表示回复固定*/
	unsigned char              ucOffLineSoeReissueEn; /*离线SOE补发使能 0链路初始化后不补发历史SOE 1链路初始化后补发历史SOE */
	unsigned char              ucSenSoeEa;         /* 发送SOE 带时标遥信使能*/ //参数关联
	unsigned char              ucSenCosEa;         /* 发送COS 不带时标遥信使能*/ //参数关联
	unsigned char              ucYKEndFrame;       /* 遥控结束帧投退*/ //参数关联
	unsigned char              ucReadFileVSQ;      /* 读文件数据传输VSQ值，部分主站无法识别0，需要投1*/
	unsigned char              ucPreSetContType;   /* 参数预置忽略无后续帧 0=标准规约 1=不校验后续帧，使用超时和固化进行取消*/
	unsigned short             usAsduPublicAddr;   /* ASDU公共地址*/
	unsigned short             usYcType;           /* 遥测类型*/
	unsigned short             usYxType;           /* 遥信类型*/
	unsigned short             usYkType;           /* 遥控类型*/
	unsigned short             usDdType;           /* 电度类型*/
	unsigned short             usWaveInfoAddr;     /* 录波完成点号*/
	unsigned short             usFaultEnable;      /* 故障事件使能*/
	unsigned int               uiSummon_Gap;    /* 总召间隔*/    //参数关联
	unsigned int               uiESummon_Gap;   /* 电能总召间隔*/    //参数关联
	unsigned int               uiSyn_Gap;       /* 同步间隔*/    //参数关联
	unsigned int               uiHeart_Gap;     /* 心跳间隔*/    //参数关联
	unsigned int               uiSend_Gap;      /* 数据发送间隔参数*/

	/*运行状态类*/
	unsigned char              ucSE;            /* 遥控选择执行标识 0=执行 1=选择*/
	unsigned char              ucQu;            /* 遥控状态  0=分 1=合*/
	unsigned int               ulYkAddr;        /* 遥控点号*/
	unsigned int               uiYxConstInfo;   /* 遥信起始地址*/   //参数关联
	unsigned int               uiYcConstInfo;   /* 遥测起始地址*/   //参数关联
	unsigned int               uiDdConstInfo;   /* 电度起始地址*/   //参数关联

	/**********************************************************
	*101规约配置参数
	***********************************************************/
	bool                       bDir;               /* 方向位*/
	bool                       bSimpleInit;        /* 简单初始化*/
	unsigned char              ucFileAckType;      /* 文件传输无应答使能 0-有应答 1-无应答*/
	unsigned char              ucReSend_Num;       /* 重发次数参数*/
	unsigned short             usReSend_Gap;       /* 超时重发间隔参数*/
	unsigned short             usResetDelay;       /* 复位进程延时*/
	/**********************************************************
	*104规约配置参数
	***********************************************************/
	unsigned char           ucMultiFrameEn;                    /* 多帧使能*/
	struct  CS104_APCIParameters        stAPCIParameters;      /*104规约参数*/

	/**********************************************************
	*函数指针
	***********************************************************/
	/*规约区分实现函数*/
	CS10x_Send_Cb           pfnSendCb;                 /*数据发送接口*/
	CS10x_Encrypt           pfnEncrypt;                /*数据是否加密*/
	CS10x_Md5Result         pfnMd5ResultCb;            /*更新文件md5接口*/
	CS10x_GetLayerSt        pfnGetLayerSt;             /*链路层状态，是否连接正常，是否可以正常发送数据*/
	CS10x_LinkClose         pfnLinkClose;             /**关闭链路接口*/
	CS10x_SearchOneFrame    pfnDecodeProcess;          /*查找响应规约数据帧函数*/
	CS10x_TimeManager       pfnTimerManager;           /*定时任务接口*/
	CS10x_EncodeASDU        pfnEncodeFrame;             /*ASDU数据打包*/
	CS10x_EncodeOther       pfnEncodeOther;            /*其他短帧数据打包*/
	CS10x_GetTime           pfnGetTime;                /*获取事件*/
	CS10x_SetTime           pfnSetTime;                /*设置事件*/
	CS10x_AckFrameNotification   pfnAckFrameNotification;   /*向下行设备发送确认帧*/
	/*对外提供数据*/
	CS10x_SetValue          pfnSetValue;              /*规约更新应用数据*/
	CS10x_SetStatus         pfnSetStatus;              /*规约更新应用状态*/
	CS10x_SetDdValue        pfnSetDdValue;            /*规约更新应用数据*/
	CS10x_AddSOE            pfnAddSOE;                /*添加SOE信息*/
	CS10x_AddFauleEvent     pfnAddEvent;               /*添加故障事件*/
	CS10x_AddDiturbYc       pfnAddDiYcVal;             /*添加扰动遥测信息*/
	CS10x_Write_ResetCOI    pfnWrite_ResetCOI;       /*规约写复位标志*/
	CS10x_AddTimeDdu        pfnAddTimeDdu;               /*添加故障事件*/
	CS10x_GetDdValue        pfnGetDdValue;
	CS10x_YkVerify          pfnFcYkVerify;              /*遥控校验*/
	CS10x_SetYkInfor        pfnSetYkInfor;              /*规约更新遥控应用数据*/
	CS10x_SetYkAck          pfnSetYkResponse;                /*规约处理下行设备遥控应答*/
	CS10x_SetParamInfo      pfnSetParamInfo;            /*规约处理下行设备参数定值*/
	/*向外获取数据*/
	CS10x_GetYcCountByGroup     pfnGetYcCountByGroup;  /*规约获取组遥测数量*/
	CS10x_GetYcValueByGroup     pfnGetYcValueByGroup;  /*规约获取组遥测数据*/
	CS10x_GetYxCountByGroup     pfnGetYxCountByGroup;  /*规约获取组遥信数量*/
	CS10x_GetYxStatusByGroup    pfnGetYxStatusByGroup;  /*规约获取组遥信数据*/
	CS10x_GetDdCountByGroup     pfnGetDdCountByGroup;
	CS10x_GetDdValueByGroup     pfnGetDdValueByGroup;
	CS10x_GetParamArea          pfnGetParamArea;       /*获取参数定值区*/
	CS10x_SetParamArea          pfnSetParamArea;       /*更新参数定值区*/
	CS10x_AddIECParam           pfnAddIECParam;
	CS10x_RunReadIECParam       pfnRunReadIECParam;
	CS10x_GetParamCount         pfnGetParamCount;
	CS10x_GetParamInfoByIndx    pfnGetParamInfoByIndx;
	CS10x_RunWriteIECParam      pfnRunWriteIECParam;

	CS10x_GetDiturbYc           pfnGetDiturbYc ;       /*规约获取扰动遥测数据*/
	CS10x_GET_DiturbYc_SendNum  pfnGetDiturbYc_SendNum;  /*获取待发送的扰动遥测数据数量*/
	CS10x_Updata_DiturbYc_Pout  pfnUpdata_DiturbYc_Pout;    /*扰动数据更新*/

	CS10x_GetSOE                 pfnGetSOE;             /*规约获取soe数据*/
	CS10x_Updata_SOE_Pout        pfnUpdata_SOE_Pout;
	CS10x_GET_SOE_SendNum        pfnGetSOE_SendNum;
	CS10x_GetFaultEvent          pfnGetFaultEvent;
	CS10x_Updata_FaultEvent_Pout pfnUpdata_FaultEvent_Pout;
	CS10x_GET_Event_SendNum      pfnGetEvent_SendNum;
	CS10x_GetTimeDdu             pfnGetTimeDdu;
	CS10x_Updata_TimeDdu_Pout    pfnUpdata_TimeDdu_Pout;
	CS10x_GetTimeDdu_SendNum     pfnGetTimeDdu_SendNum;             /*获取电度扰动数量*/
	CS10x_GetYxPotPro            pfnGetYxPotPro;
	CS10x_GetProDirFile          pfnGetProDirFile;                  /*按条件搜索目录*/
	CS10x_GetNumDirFile          pfnGetNumDirFile;                  /*按条件搜索目录*/
	CS10x_ReadFile               pfnReadFile;                       /*读取文件内容*/
	void                         *pvFileReadParam;                  /*读文件指针数据*/

	CS10x_WriteFile             pfnWriteFile;                   /*读取文件内容*/
	CS10x_SearchFileName        pfnSearchFileName;        /*按名称搜索文件*/

	CS10x_Write                 pfnWrite;                   /*写入文件内容*/
	CS10x_WriteFileCheck        pfnWriteFileCheck;          /*查询待写入文件*/
	CS10x_WriteFinish           pfnWriteFinish;             /*文件写完成*/
	void                        *pvFileWrteParam;           /*写文件指针数据*/
	CS10x_UpdateProc            pfnUpdateProc;              /*升级回调函数*/
	CS10x_Read_ResetCOI         pfnRead_ResetCOI;           /*规约读复位标志*/
	CS10x_GetSummonSlaveDelay   pfnGetSummonSlaveDelay;     /*获取总召延迟时间(ms)，NULL=不延迟立即上送 */


	/*poll查询文件升级*/
	CS10x_PollFileTransTask     pfnPollFileTransTask; //查询是否有文件升级任务
	CS10x_RegFileTransObj       pfnRegFileTransObj; //注册文件传输对象
	CS10x_CheckTransFileObj     pfnCheckTransFileObj; //获取文件传输对象
	CS10x_CheckTransTimeOut     pfnCheckTransTimeOut;   //检测文件传输超时
	CS10x_DirRecvFinish     pfnDealDirRecvFinish;   //目录接收完成回调函数

	tFILEDIR_RD_SET stRdSet;    //目录/文件传输服务
	tFILE_WD_SET    stWdSet;    //写文件服务

	/**********************************************************
	*规约公共变量
	***********************************************************/
	MD5_CTX             stMd5_Ctx;         /*加密MD5结果*/
	unsigned char       ucaMd5_Result[16];  /*文件Md5结果*/
	struct VCommBuf     stPubBuf;        /*公共数据缓冲区 目前仅用做异常帧原报文保存*/
	struct VCommBuf     stRecvBuf;       /*接收数据缓冲区*/
	struct VCommBuf     stSendBuf;       /*发送数据缓冲区*/
	struct VCommBuf     stSendBakBuf;    /*发送数据备份区*/
	ASDU_Element        stAsduElem;      /*ASDU数据域内容*/
	unsigned char ucDataBackBuf[MAX_FRAME_LEN];/*数据备份缓冲区,目前用于南网参数镜像回复*/
	unsigned char ucBackLen;

	/**********************************************************
	 *任务管理变量
	 ***********************************************************/
	VFLAGS              stTaskFlags; /*任务标识 每一任务控制标志位（目前共有128位）*/
	unsigned int        uiaTaskParam[MAX_FLAGNO]; // 每个任务是否需要配置任务参数
	unsigned char       byTaskFlagId;

	/*
	*   状态类信息
	*/
	unsigned char       ucInitStatus;    /*规约初始化状态*/
	unsigned char       ucFirstAct;      /*主站时第一次初始化任务标识*/

	unsigned int        uiFrameTmCnt;      /* 报文发送间隔时间计数 单位ms*/
	unsigned int        uiHeart_Tcn;       /* 心跳累计时间计数 */
	unsigned int        uiSummon_Tcn;      /* 定时总招时间计数 */
	unsigned int        uiESummon_Tcn;     /* 定时总招时间计数 */
	unsigned int        uiTimeSyn_Tcn;     /* 定时对时时间计数 */

	unsigned short      usYxSendNum;     /*遥信发送个数*/
	unsigned short      usYcSendNum;     /*遥测发送个数*/
	unsigned short      usDisTurbYcSendNum;     /*扰动遥测发送个数*/
	unsigned short      usDdSendNum;            /*已发送电度个数*/

	unsigned short      usSoeSendNum;
	unsigned short      usSoeSendNoAckNum;      /*Soe发送未确认数量*/
	unsigned short      usCosSendNoAckNum;      /*Soe发送未确认数量*/
	unsigned short      usEventSendNoAckNum;    /*事件发送未确认数量*/
	unsigned short      usDduSendNoAckNum;      /*时标电度发送未确认数量*/
	unsigned short      usDiturbYcSendNoAckNum; /*扰动遥测发送未确认数量*/

	unsigned short      usSoeSendSetup;    /*Soe发送步骤*/
	unsigned short      usDdSummonSetup;   /*电度总召回复*/

	unsigned char       ucParamFlag;        /*记录参数设置读取状态标识*/
	unsigned short      usParamSendNum;     /*参数发送个数*/

	unsigned char       ucPmPresetFlag;     /*参数预置*/
	unsigned int        uiPmPresetTimeout;  /*预置超时时间*/
	unsigned int        uiPreSetContCount;  /*参数预置后续帧逻辑判断*/

	unsigned char       ucPmPresetVsqFlag;

	unsigned char       ucTransStatus;      /* 文件传输状态*/
	unsigned int        uiTransTimerCur;    /* 文件传输定时器*/
	unsigned int        uiTransTimerMax;    /* 文件传输定时器*/
	bool                bContinueSendFlag;  /* continue send I Frame flag about K */

	unsigned int        uiSummonSlaveDelayRemain;   /* 从站总召延迟剩余时间(ms)，0=无延迟 */
	unsigned char       ucSummonSlaveQoi;           /* 从站总召延迟后使用的QOI值 */

	/**********************************************************
	*101规约变量
	***********************************************************/
	unsigned char        ucInitStep;         /* 链路初始化步骤  针对101规约*/
	unsigned char        ucSelf_FCB;           /*我方上次的FCB值*/
	unsigned char        ucRxAckFlag;          /* 收到确认帧标志 针对101规约*/
	unsigned char        ucRxLinkStatusFlag;   /* 收到链路状态响应帧标志 针对101规约*/
	unsigned char        ucRxLinkRequestFlag;  /* 收到链路状态请求帧标志 针对101规约*/
	unsigned char        ucRxLinkResetFlag;    /* 收到链路复位帧标志 针对101规约*/
	unsigned char        ucRxInitFinishFlag;   /* 收到初始化完成标志 针对101规约*/
	unsigned char        ucHeart_Resend_Flag;  /* 心跳重发标志 */
	unsigned char        ucFileTransFrame;     /* 文件传输帧标识 */
	unsigned short       usFileNoneAckNum;     /* 文件传输未确认帧数 */
	unsigned short       usResend_Ncn;         /* 重发次数计数 */
	unsigned int         uiResend_Tcn;         /* 重发间隔时间计数 */
	unsigned int         uiRelink_Tcn;         /* 链路超时间隔时间计数 */
	unsigned int         uiInit_Tcn;           /* 101初始化中等待时间计数 */
	unsigned int         uiReInit_Tcn;         /* 101重新初始化间隔时间计数 */
	unsigned int         uiInit_Resend_Ncn;    /* 101初始化中重发次数计数 */
	/**********************************************************
	*104规约变量
	***********************************************************/
	unsigned short       usSendNum;               /*Send Counter */
	unsigned short       usRecvNum;               /*Receive Counter*/
	unsigned short       usAckSendNum;            /*Receive Ack Counter*/
	unsigned short       usAckRecvNum;             /*Have Ack Receive Counter*/
	VIec104Timer stM_vTimer[4];             /*iec104 timer for T0 T1 T2 T3*/
} CS10x;



//***************************** 规约废弃接口 ************************************//
/**
 * @brief 获取时间接口(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetTimeHandler(CS10xHandle_t pstSelf, CS10x_GetTime cb);

/**
 * @brief 设置时间接口(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_SetTimeHandler(CS10xHandle_t pstSelf, CS10x_SetTime cb);

/**
 * @brief 设置计量模块接收遥测接口(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_SetValueHandler(CS10xHandle_t pstSelf, CS10x_SetValue cb);

/**
 * @brief 设置计量模块电度接口(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_SetDdValueHandler(CS10xHandle_t pstSelf, CS10x_SetDdValue cb);

/**
 * @brief 遥控操作校验（待删除）
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_YkVerifyHandler(CS10xHandle_t pstSelf, CS10x_YkVerify cb);

/**
 * @brief 设置组遥测数量处理函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetYcCountByGroupHandler(CS10xHandle_t pstSelf, CS10x_GetYcCountByGroup cb);

/**
 * @brief 设置组遥测值处理函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetYcValueByGroupHandler(CS10xHandle_t pstSelf, CS10x_GetYcValueByGroup cb);

/**
 * @brief 设置组遥信数量处理函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetYxCountByGroupHandler(CS10xHandle_t pstSelf, CS10x_GetYxCountByGroup cb);

/**
 * @brief 设置组遥信状态处理函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetYxStatusByGroupHandler(CS10xHandle_t pstSelf, CS10x_GetYxStatusByGroup cb);

/**
 * @brief 扰动遥测待发送数量处理函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetDiturbYc_SendNumHandler(CS10xHandle_t pstSelf, CS10x_GET_DiturbYc_SendNum cb);

/**
 * @brief 设置获取扰动遥测数据处理函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetDiturbYcHandler(CS10xHandle_t pstSelf, CS10x_GetDiturbYc cb);

/**
* @brief 设置更新遥测扰动指针处理函数（待删除）
*
* @param[out] pstSelf
* @param[in]  cb
*/
void CS10x_Updata_DiturbYc_PoutHandler(CS10xHandle_t pstSelf, CS10x_Updata_DiturbYc_Pout cb);

/**
 * @brief 设置组电度数量处理函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetDdCountByGroupHandler(CS10xHandle_t pstSelf, CS10x_GetDdCountByGroup cb);

/**
 * @brief 设置组电度数值处理函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetDdValueByGroupHandler(CS10xHandle_t pstSelf, CS10x_GetDdValueByGroup cb);

/**
 * @brief 设置参数定值区获取函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetParamAreaHandler(CS10xHandle_t pstSelf, CS10x_GetParamArea cb);

/**
 * @brief 设置参数定值区更新函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_SetParamAreaHandler(CS10xHandle_t pstSelf, CS10x_SetParamArea cb);

/**
 * @brief 设置增加参数定值缓存函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_AddIECParamHandler(CS10xHandle_t pstSelf, CS10x_AddIECParam cb);


/**
 * @brief 设置参数定值读取函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_RunReadIECParamHandler(CS10xHandle_t pstSelf, CS10x_RunReadIECParam cb);

/**
 * @brief 设置参数定值固化函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_RunWriteIECParamHandler(CS10xHandle_t pstSelf, CS10x_RunWriteIECParam cb);

/**
 * @brief 参数数量获取处理函数（待删除）
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetParamCountHandler(CS10xHandle_t pstSelf, CS10x_GetParamCount cb);

/**
 * @brief 参数信息获取处理函数（待删除）
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetParamInfoByIndxHandler(CS10xHandle_t pstSelf, CS10x_GetParamInfoByIndx cb);

/**
 * @brief 设置获取soe数据处理函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetSOEHandler(CS10xHandle_t pstSelf, CS10x_GetSOE cb);

/**
 * @brief 设置更新SOE指针待发数量函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetSOE_SendNumHandler(CS10xHandle_t pstSelf, CS10x_GET_SOE_SendNum cb);

/**
 * @brief 设置更新SOE指针处理函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_Updata_SOE_PoutHandler(CS10xHandle_t pstSelf, CS10x_Updata_SOE_Pout cb);

/**
 * @brief 获取故障事件数量处理函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetEvent_SendNumHandler(CS10xHandle_t pstSelf, CS10x_GET_Event_SendNum cb);

/**
 * @brief 设置获取故障事件数据处理函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetFaultEventHandler(CS10xHandle_t pstSelf, CS10x_GetFaultEvent cb);

/**
 * @brief 设置更新故障事件处理函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_Updata_FaultEvent_PoutHandler(CS10xHandle_t pstSelf, CS10x_Updata_FaultEvent_Pout cb);

/**
 * @brief 获取电度时间指针待发数量函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetTimeDdu_SendNumHandler(CS10xHandle_t pstSelf, CS10x_GetTimeDdu_SendNum cb);

/**
 * @brief 更新时标电度处理函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_Updata_TimeDdu_PoutHandler(CS10xHandle_t pstSelf, CS10x_Updata_TimeDdu_Pout cb);

/**
 * @brief 获取时标电度数据处理函数(待删除)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetTimeDduHandler(CS10xHandle_t pstSelf, CS10x_GetTimeDdu cb);

/**
 * @brief 读文件(待删除)
 *
 * @param pstSelf
 * @param cbGetPro
 * @param cbGetNum
 * @param cbRead
 * @param *pvParam
 */
void CS10x_FileReadOprtHandler(CS10xHandle_t pstSelf,
                               CS10x_GetProDirFile cbGetPro,
                               CS10x_GetNumDirFile cbGetNum,
                               CS10x_ReadFile cbRead,
                               void *pvParam);

/**
 * @brief 写文件(待删除)
 *
 * @param pstSelf
 * @param cbWrite
 * @param cbCheck
 * @param cbFinish
 * @param *pvParam
 */
void CS10x_FileWriteOprtHandler(CS10xHandle_t pstSelf,
                                CS10x_Write cbWrite,
                                CS10x_WriteFileCheck cbCheck,
                                CS10x_WriteFinish cbFinish,
                                void *pvParam);

/**
 * @brief 升级处理流程（待删除）
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_UpdateProcHandler(CS10xHandle_t pstSelf, CS10x_UpdateProc cb);

//************************************************ 未使用接口*****************************************//
/**
* @brief 设置遥控类型(未使用)
*
* @param[out] pstSelf
* @param[in]  usType
*/
void CS10x_SetYkType(CS10xHandle_t pstSelf, unsigned short usType);

/**
* @brief 设置录波完成点号关联(未使用)
*
* @param[out] pstSelf
* @param[in]  usAddr
*/
void CS10x_SetWaveInfoAddr(CS10xHandle_t pstSelf, unsigned short usAddr);

/**
 * @brief 设置接收遥信接口(未使用)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_SetStatusHandler(CS10xHandle_t pstSelf, CS10x_SetStatus cb);

/**
 * @brief 设置接收SOE处理函数(未使用)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_AddSOEHandler(CS10xHandle_t pstSelf, CS10x_AddSOE cb);

/**
 * @brief 设置故障事件处理函数(未使用)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_AddEventHandler(CS10xHandle_t pstSelf, CS10x_AddFauleEvent cb);
/**
 * @brief 设置接收TimeDdu处理函数(未使用)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_AddTimeDduHandler(CS10xHandle_t pstSelf, CS10x_AddTimeDdu cb);

/**
 * @brief 设置电度信息接口(未使用)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetDdValueHandler(CS10xHandle_t pstSelf, CS10x_GetDdValue cb);

/**
 * @brief 设置扰动遥测处理函数（未使用）
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_AddDiYcValueHandler(CS10xHandle_t pstSelf, CS10x_AddDiturbYc cb);

/**
 * @brief 设置遥信点点号状态处理函数(未使用)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetYxPotProHandler(CS10xHandle_t pstSelf, CS10x_GetYxPotPro cb);

/**
 * @brief 设置搜索目录获取属性处理函数(未使用)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetProDirFileHandler(CS10xHandle_t pstSelf, CS10x_GetProDirFile cb);

/**
 * @brief 设置搜索目录获取数量处理函数(未使用)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetNumDirFileHandler(CS10xHandle_t pstSelf, CS10x_GetNumDirFile cb);

/**
 * @brief 设置读取文件处理函数(未使用)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_ReadFileHandler(CS10xHandle_t pstSelf, CS10x_ReadFile cb);

/**
 * @brief 设置写文件处理函数(未使用)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_WriteFileHandler(CS10xHandle_t pstSelf, CS10x_WriteFile cb);

/**
 * @brief 设置文件名比对文件函数(未使用)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_SearchFileNameHandler(CS10xHandle_t pstSelf, CS10x_SearchFileName cb);

/**
 * @brief 设置待写入文件查询处理函数(未使用)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_WriteFileCheckHandler(CS10xHandle_t pstSelf, CS10x_WriteFileCheck cb);

/**
 * @brief 文件写入函数(未使用)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_WriteHandler(CS10xHandle_t pstSelf, CS10x_Write cb);

/**
 * @brief 文件写完成(未使用)
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_WriteFinishHandler(CS10xHandle_t pstSelf, CS10x_WriteFinish cb);

/**
 * @brief 设置注册文件传输任务函数（未使用）
 *
 * @param[out] pstSelf
 * @param[in]  cb
*/
void CS10x_RegFileTransHandler(CS10xHandle_t pstSelf, CS10x_RegFileTransObj cb);

/**
 * @brief 设置获取传输文件对象函数（未使用）
*
* @param[out] pstSelf
* @param[in]  cb
*/
void CS10x_GetTransFileHandler(CS10xHandle_t pstSelf, CS10x_CheckTransFileObj cb);

/**
 * @brief 设置检测文件传输超时函数（未使用）
 *
 * @param self
 * @param cb
 */
void CS10x_TransTimeOutHandler(CS10xHandle_t pstSelf, CS10x_CheckTransTimeOut cb);

/**
 * @brief 设置目录召唤接收完成处理函数（未使用）
 *
 * @param self
 * @param cb
 */
void CS10x_DirRecvFinishHandler(CS10xHandle_t pstSelf, CS10x_DirRecvFinish cb);

/**
 * @brief 设置链路关闭接口
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_LinkCloseHandler(CS10xHandle_t pstSelf, CS10x_LinkClose cb);

/**
 * @brief 设置向下行设备发送确认帧接口
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_AckFrameNotificationHandler(CS10xHandle_t pstSelf, CS10x_AckFrameNotification cb);

//*********************************** 规约参数配置函数 *************************************//
/**
* @brief 设置规约参数
*
* @param[out] pstSelf
* @param[in]  pstParam  规约参数
*/
void CS10x_SetAppParameters(CS10xHandle_t pstSelf, struct  CS10x_AppLayerParameters *pstParam);

/**
* @brief 设置104APCI参数
*
* @param[out] pstSelf
* @param[in]  pstParam
*/
void CS10x_SetAPCIParameters(CS10xHandle_t pstSelf, struct  CS104_APCIParameters *pstParam);

/**
* @brief 设置遥测类型
*
* @param[out] pstSelf
* @param[in]  usType
*/
void CS10x_SetYcType(CS10xHandle_t pstSelf, unsigned short usType);

/**
* @brief 设置遥信类型
*
* @param[out] pstSelf
* @param[in]  usType
*/
void CS10x_SetYxType(CS10xHandle_t pstSelf, unsigned short usType);

/**
* @brief 设置电度类型
*
* @param[out] pstSelf
* @param[in]  usType
*/
void CS10x_SetDdType(CS10xHandle_t pstSelf, unsigned short usType);

/**
* @brief 设置总召定时间隔关联
*
* @param[out] pstSelf
* @param[in]  uiGap
*/
void CS10x_SetSummonGap(CS10xHandle_t pstSelf, unsigned int uiGap);

/**
* @brief 设置电能量总召定时间隔关联
*
* @param[out] pstSelf
* @param[in]  uiGap
*/
void CS10x_SetESummonGap(CS10xHandle_t pstSelf, unsigned int uiGap);

/**
* @brief 设置心跳间隔时间参数
*
* @param[out] pstSelf
* @param[in]  uiGap
*/
void CS10x_SetHeartTimeGap(CS10xHandle_t pstSelf, unsigned int uiGap);

/**
* @brief 设置报文发送间隔关联
*
* @param[out] pstSelf
* @param[in]  uiGap
*/
void CS10x_FrameGap(CS10xHandle_t pstSelf, unsigned int uiGap);

/**
 * @brief 101规约初始化类型
 * @param[out] pstSelf
 * @param[in]  bType
 */
void CS10x_SetInitType(CS10xHandle_t pstSelf, bool bType);

/**
 * @brief 101规约文件传输是否需要确认帧
 * @param[out] pstSelf
 * @param[in]  ucEn
 */
void CS10x_SetFileAckType(CS10xHandle_t pstSelf, unsigned char ucEn);

/**
* @brief 101规约重发间隔时间参数输入
* @param[out] pstSelf
* @param[in]  uiGap
*/
void CS10x_ResendGap(CS10xHandle_t pstSelf, unsigned int uiGap);

/**
* @brief 101规约重发次数参数输入
* @param[out] pstSelf
* @param[in]  uiCnt
*/
void CS10x_ResendCnt(CS10xHandle_t pstSelf, unsigned int uiCnt);

/**
* @brief 故障事件接口使能
* @param[out] pstSelf
* @param[in]  usEnable
*/
void CS10x_FaultEventEn(CS10xHandle_t pstSelf, unsigned short usEnable);

/**
* @brief 发送SOE使能
* @param[out] pstSelf
* @param[in]  usEnable
*/
void CS10x_SetSendSoe(CS10xHandle_t pstSelf, unsigned char ucEnable);

/**
* @brief 发送COS使能
* @param[out] pstSelf
* @param[in]  usEnable
*/
void CS10x_SetSendCos(CS10xHandle_t pstSelf, unsigned char ucEnable);
/**
* @brief 遥控-结束帧投退
* @param[out] pstSelf
* @param[in]  usEnable
*/
void CS10x_SetYKEendFrame(CS10xHandle_t pstSelf, unsigned char ucEnable);

/**
* @brief 离线SOE补发投退
* @param[out] pstSelf
* @param[in]  usEnable
*/
void CS10x_SetOfflineSoeReissue(CS10xHandle_t pstSelf, unsigned char ucEnable);
/**
* @brief 读文件数据传输 VSQ 值：部分主站无法识别0，需要投1
* @param[out] pstSelf
* @param[in]  usEnable
*/
void CS10x_SetReadFileVSQ(CS10xHandle_t pstSelf, unsigned char usEnable);

/**
* @brief 参数预置忽略后缀帧字段
* @param[out] pstSelf
* @param[in]  ucType
*/
void CS10x_SetPresetContType(CS10xHandle_t pstSelf, unsigned char ucType);

/**
* @brief 104多帧数据传输设置
* @param[out] pstSelf
* @param[in]  usEnable
*/
void CS10x_SetMultFrameEn(CS10xHandle_t pstSelf, unsigned char usEnable);

/**
* @brief 设置对时同步间隔关联
*
* @param[out] pstSelf
* @param[in]  uiGap
*/
void CS10x_SetSynTimeGap(CS10xHandle_t pstSelf, unsigned int uiGap);

/**
* @brief 设置101主站方向位
*
* @param[out] pstSelf
* @param[in]  ucMasterDirect
*/
void CS10x_SetMasterDirect(CS10xHandle_t pstSelf, unsigned char ucMasterDirect);

//*********************************************规约接口配置函数******************************//
/**
 * @brief 设置解密接口
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_EncryptHandler(CS10xHandle_t pstSelf, CS10x_Encrypt cb);

/**
 * @brief 设置文件MD5接口
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_Md5ResultHandler(CS10xHandle_t pstSelf, CS10x_Md5Result cb);

/**
 * @brief 时间设置读取接口
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_TimeRWHandler(CS10xHandle_t pstSelf, CS10x_GetTime cbGetTime, CS10x_SetTime cbSetTime);

/**
 * @brief 复位原因限定词，读写函数接口
 * @param pstSelf 规约实体
 * @param Read_cb 读函数指针
 * @param Write_cb 写函数指针
 */
void CS10x_WR_ResetHandler(CS10xHandle_t pstSelf, CS10x_Read_ResetCOI Read_cb, CS10x_Write_ResetCOI Write_cb);

/**
 * @brief 设置组遥测数量及数值处理函数
 *
 * @param pstSelf
 * @param cbGetYcCount,cbGetYcValue
 */
void CS10x_S_GetYcByGroupHandler(CS10xHandle_t pstSelf, CS10x_GetYcCountByGroup cbGetYcCount, CS10x_GetYcValueByGroup cbGetYcValue);

/**
 * @brief 设置组遥信数量及状态处理函数
 *
 * @param pstSelf
 * @param cbGetYxCount,cbGetYxStatus
 */
void CS10x_S_GetYxByGroupHandler(CS10xHandle_t pstSelf, CS10x_GetYxCountByGroup cbGetYxCount, CS10x_GetYxStatusByGroup cbGetYxStatus);

/**
 * @brief 设置获取扰动遥测处理函数
 *
 * @param pstSelf
 * @param cbGetDiturbYc,cbSendNum,cbUpdataPout
 */
void CS10x_S_DiturbYcHandler(CS10xHandle_t pstSelf, CS10x_GetDiturbYc cbGetDiturbYc, CS10x_GET_DiturbYc_SendNum cbSendNum, CS10x_Updata_DiturbYc_Pout cbUpdataPout);

/**
 * @brief 设置组电度数量及数值处理函数
 *
 * @param pstSelf
 * @param cbGetDdCount，cbGetDdValue
 */
void CS10x_S_GetDdByGroupHandler(CS10xHandle_t pstSelf, CS10x_GetDdCountByGroup cbGetDdCount, CS10x_GetDdValueByGroup cbGetDdValue);

/**
 * @brief 设置soe处理函数
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_S_SOEHandler(CS10xHandle_t pstSelf, CS10x_GetSOE cbGetSOE, CS10x_GET_SOE_SendNum cbSendNum, CS10x_Updata_SOE_Pout cbUpdataSOEPout);

/**
 * @brief 扰动电度处理函数
 *
 * @param pstSelf
 * @param cbGetTimeDdu,cbcbSendNum,cbcbUpdataPout
 */
void CS10x_S_DiturbDduHandler(CS10xHandle_t pstSelf, CS10x_GetTimeDdu cbGetTimeDdu, CS10x_GetTimeDdu_SendNum cbSendNum, CS10x_Updata_TimeDdu_Pout cbUpdataPout);

/**
 * @brief 设置故障事件处理函数
 *
 * @param pstSelf
 * @param cbSendNum,cbGetFaultEvent,cbUpdataPout
 */
void CS10x_S_FaultEventHandler(CS10xHandle_t pstSelf, CS10x_GET_Event_SendNum cbSendNum, CS10x_GetFaultEvent cbGetFaultEvent, CS10x_Updata_FaultEvent_Pout cbUpdataPout);

/**
 * @brief 遥控操作校验
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_S_YkVerifyHandler(CS10xHandle_t pstSelf, CS10x_YkVerify cb);

/**
 * @brief 参数定值区获取与设置接口
 *
 * @param pstSelf
 * @param cbGetParamArea 参数定值区获取
 * @param cbSetParamArea 参数定值区设置
 */
void CS10x_S_ParamAreaHandler(CS10xHandle_t pstSelf, CS10x_GetParamArea cbGetParamArea, CS10x_SetParamArea cbSetParamArea);

/**
 * @brief 增加/读取/写入参数定值函数
 *
 * @param pstSelf
 * @param cbAddIECParam， cbReadIECParam，cbWriteIECParam
 */
void CS10x_S_IECParamHandler(CS10xHandle_t pstSelf, CS10x_AddIECParam cbAddIECParam, CS10x_RunReadIECParam cbReadIECParam, CS10x_RunWriteIECParam cbWriteIECParam);


/**
 * @brief 参数数量及信息获取处理函数
 *
 * @param pstSelf
 * @param cbGetParamCount， cbGetParamInfo
 */
void CS10x_S_GetParamInfoHandler(CS10xHandle_t pstSelf, CS10x_GetParamCount cbGetParamCount, CS10x_GetParamInfoByIndx cbGetParamInfo);

/**
 * @brief 读文件
 *
 * @param pstSelf
 * @param cbGetPro
 * @param cbGetNum
 * @param cbRead
 * @param *pvParam
 */
void CS10x_S_FileReadOprtHandler(CS10xHandle_t pstSelf,
                                 CS10x_GetProDirFile cbGetPro,
                                 CS10x_GetNumDirFile cbGetNum,
                                 CS10x_ReadFile cbRead,
                                 void *pvParam);

/**
 * @brief 写文件
 *
 * @param pstSelf
 * @param cbWrite
 * @param cbCheck
 * @param cbFinish
 * @param *pvParam
 */
void CS10x_S_FileWriteOprtHandler(CS10xHandle_t pstSelf,
                                  CS10x_Write cbWrite,
                                  CS10x_WriteFileCheck cbCheck,
                                  CS10x_WriteFinish cbFinish,
                                  void *pvParam);

/**
 * @brief 升级
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_S_UpdateProcHandler(CS10xHandle_t pstSelf, CS10x_UpdateProc cb);

/**
 * @brief 设置计量接口处理
 *
 * @param pstSelf
 * @param cbSetValue,cbSetDdValue
 */
void CS10x_M_SetDdHandler(CS10xHandle_t pstSelf, CS10x_SetValue cbSetValue, CS10x_SetDdValue cbSetDdValue);

/**
 * @brief 设置接收遥控接口
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_SetYkInforHandler(CS10xHandle_t pstSelf, CS10x_SetYkInfor cb);
/**
 * @brief 设置下行设备遥控应答接口
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_SetYkAckHandler(CS10xHandle_t pstSelf, CS10x_SetYkAck cb);
/**
 * @brief 设置下行设备上传参数定值接收接口
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_SetParamRecvHandle(CS10xHandle_t pstSelf, CS10x_SetParamInfo cb);
/**
 * @brief 设置获取总召延迟时间回调接口
 *
 * @param pstSelf
 * @param cb
 */
void CS10x_GetSummonSlaveDelayHandler(CS10xHandle_t pstSelf, CS10x_GetSummonSlaveDelay cb);

//***************************************内部函数*******************************//
char *GetIEC60870Version(void);
float  GetStationDataSendNum(void);

//****************************************规约公共接收函数******************************//
void CS10x_DoRecv(CS10xHandle_t pstSelf, char *pBuf, unsigned int usLength);

//****************************************规约定时任务调度函数******************************//
void CS10x_TimerHandle(CS10xHandle_t pstSelf, unsigned short usGap);
void GetBakData(CS10xHandle_t pstSelf);
void SaveSendData(CS10xHandle_t pstSelf);

#ifdef __cplusplus
}

#endif

#endif /* SRC_INC_IEC60870_COMMON_H_ */
