/******************************************************************************
** 文件名:  EnvelopeDefine.h
** 描 述:   列车包络管理模块相关定义头文件，列车包络管理模块简称elm

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

#ifndef ENVELOPE_DEFINE_H_
#define ENVELOPE_DEFINE_H_

#include "../Section/SectionDefine.h"
#include "CommonTypes.h"
#include "dquVobcCommonStru.h"
#include "dsuEmapDefine.h"
#include "CiSystemDefine.h"
#include "CommonMemory.h"
#include "TrainDefine.h"

#ifdef WIN32
#define ELM_DEBUG 1
#endif

/** ===========================宏定义================================== */
#define LINE_MAX_TRAIN (255u)                                                                 /* 线路上最大的列车数量,也为隐藏车ID(开区间) */
#define TRAIN_SUM_MAX_IN_OC (40u)                                                             /*OC控区包含的列车数量(开区间)*/
#define RESERVE_SUM_MAX (10u)                                                                 /*预留的包络个数*/
#define ENVELOPE_SUM_MAX (AXIS_SECTION_SUM_MAX + TRAIN_SUM_MAX_IN_OC + RESERVE_SUM_MAX)       /*列车包络最大个数(开区间)*/

#define TRAIN_IN_ENVELOPE_SUM_MAX (15u)                                                       /*列车包络中包含的列车最大数量(开区间)*/
#define SECTION_IN_ENVELOPE_SUM_MAX (10u)                                                     /*列车包络中包含的区段最大个数(开区间)*/
#define SECTION_REL_ENVELOPE_SUM_MAX (15u)                                                    /*区段关联的包络最大个数(开区间)*/
#define OTHER_RC_SEND_ENVELOPE_SUM_MAX (50u)                                                    /*相邻联锁发送最大包络数量*/
#define TRAIN_REL_ENVELOPE_SUM_MAX (15u)                                                      /*列车关联的包络最大个数(开区间)*/
#define MAX_ENVELOPE_LOG_NUM  (10000U)														  /*包络日志打印缓存大小*/

#define ENVELOPE_UNEXIT (0x00u)                                                               /*包络地址空间未使用，即包络不存在*/
#define ENVELOPE_EXIT (0xaau)                                                                 /*包络地址空间已使用，即包络存在*/

#define TYPE_CT_ENVELOPE (1u)                                                                 /*通信车车包络*/
#define TYPE_UCT_ENVELOPE (2u)                                                                /*丢失通信车包络*/
#define TYPE_UKT_ENVELOPE (3u)                                                                /*隐藏车包络*/

#define ENVELOPE_UNVAILD_INDEX (0u)                                                           /*无效的包络ID*/

#define OP_ADD (0x55u)                                                                        /*操作方式为增加*/
#define OP_DEL (0xaau)                                                                        /*操作方式为删除*/

#define  ELM_WORK_OK (0x55u)                                                                  /*包络管理模块可正常处理*/
#define  ELM_WORK_ERROR (0xaau)                                                               /*包络管理模块不可正常处理*/

#define  ELM_NO_SHUTDOWN (0x55u)                                                              /*包络管理模块不需要宕机*/
#define  ELM_NEED_SHUTDOWN (0xaau)                                                            /*包络管理模块需要宕机*/


#define ELM_BODY (0x00u)                                                                      /*包络体*/
#define ELM_HEAD (0x55u)                                                                      /*包络头*/
#define ELM_TAIL (0xaau)                                                                      /*包络尾*/
#define ELM_HEAD_AND_TAIL (0xccu)                                                             /** 包络头和尾 */

#define ELM_TRUE (1u == 1u)                                                                   /*真值*/
#define ELM_FALSE (0u == 1u)                                                                  /*假值*/

#define ELM_DIR_SAME EMAP_SAME_DIR                                                                 /* 包络方向相同 */
#define ELM_DIR_CONVERT EMAP_CONVER_DIR                                                            /* 包络方向不相同 */

#define AC_MAXCNT_IN_SWITCH  (5u)

#define SHUT_DOWN_ALARM_TIME  (5u)                         /*飞车宕机报警五个周期 第五周期超参数 报警完就宕*/


/** ===========================宏函数定义================================== */

/* 函数返回--会导致函数出口不唯一，仅用于入口参数判断 */
#define ASSERT_RET_NO_VALUE(condition,errorCode) if((condition)) { \
								  ELM_LOG_LOC(0u,"errno:0x%08x info:Input error.",errorCode);\
	                              return; \
								} \
								else { \
								/** 继续处理*/ \
								}
/* 函数返回--会导致函数出口不唯一，仅用于入口参数判断 */
#define ASSERT_RET_VALUE(condition,ret,errorCode) if((condition)) { \
									ELM_LOG_LOC(0u,"errno:0x%08x info:Input error.",errorCode);\
									return (ret);\
								}\
								else { \
								/** 继续处理*/ \
								}	


/*循环终止,条件为真时跳出循环*/
#define ASSERT_BREAK(condition,err,errNo) if((condition)) { \
                                    (err) = (err) + (errNo); \
									break; \
                                } \
                                else { \
									/** 无问题*/ \
                                }

/*返回值设置，条件为真时，返回值为CI_SUCCESS，否则为CI_ERROR*/
#define ASSERT_SETRET(condition,ret,retOK,retError) if((condition)) { \
	                                  (ret) = (retOK); \
								} \
								else { \
								      (ret) = (retError); \
								}

/*错误码设置*/
#define ASSER_ERROR(condition,err,errNo) if((condition)) { \
	                                    (err) = (err) + (errNo); \
								} \
								else { \
								/** 无问题*/ \
								}

/* 错误打印 */
#define ASSER_DEBUG(condition,fun) if((condition)) { \
									fun; \
								} \
								else { \
								/** 无问题*/ \
								}


/** ===========================结构体定义================================== */
/** 列车包络结构定义  特别需要注意：如果此结果体变化，一定要注意修改跟随函数*/
typedef struct{
	UINT8 exitFlag;                                    /*包络存在标识*/
	UINT8 envelopeType;                                /*包络类型*/
	UINT16 id;                                         /*包络标识*/
	UINT16 headTrainID;                                /*包络前端列车ID*/
	UINT16 tailTrainID;                                /*包络后端列车ID*/
	LOD_STRU startPos;                                 /*始端位置*/
	LOD_STRU endPos;                                   /*终端位置*/
	UINT8 trianCnt;                                    /*包络中包含的列车数量*/
	UINT16 trainID[TRAIN_IN_ENVELOPE_SUM_MAX];		   /*包络中包含的列车ID*/
	UINT8 ACTPort[TRAIN_IN_ENVELOPE_SUM_MAX];          /*包络中列车激活端 */
	UINT8 ACCnt;                                       /*包含的AC数量*/
	UINT16 ACID[SECTION_IN_ENVELOPE_SUM_MAX];          /*包含的AC ID*/
	UINT32 dwUCTToUKTStartCycNum;                      /*UCT转UKT起始周期，根据全线通信车确定*/
} EnvelopeStruct;

/** 定义接口使用的包络*/
typedef struct{
	UINT8 envelopeType;        /*包络类型*/
	UINT16 id;                 /*列车ID*/
	UINT8 suspicHead;          /*前端可疑*/
	UINT8 suspicTail;          /*后端可疑*/
	LOD_STRU startPos;         /*始端位置*/
	LOD_STRU endPos;           /*终端位置*/
	UINT8 trianCnt;                                    /*包络中包含的列车数量*/
	UINT16 trainID[TRAIN_IN_ENVELOPE_SUM_MAX];		   /*包络中包含的列车ID*/
} InfEnvelopeStruct;


#endif /*ENVELOPE_DEFINE_H_*/

