/******************************************************************************
** 文件名:  RRMDataPrepare.h
** 描 述:   远程RM模块准备函数
*******************************************************************************/
#ifndef RRM_DATA_PREPARE_H_
#define RRM_DATA_PREPARE_H_

#include "RRMDefine.h"
#include "EnvelopeDefine.h"
#include "ELMDataPrepare.h"
#include "EnvelopeManageAPI.h"
#include "TrainDataManage.h"
#include "AxisSectionConfigDataManage.h"
#include "PhysicalSectionDataManage.h"
#include "RouteDataManage.h"
#include "EnvelopeLogicProcess.h"


#define RRM_LOG_FATAL 0u   /** 维护日志--维护级别 */
#define RRM_LOG_ERROR 1u  /*维护日志--错误级别*/
#define RRM_LOG_WARING 2u  /*维护日志--警告级别*/
#define RRM_LOG_DEBUG 3u   /*维护日志--调试级别*/
#define RRM_LOG_LEVEL RRM_LOG_DEBUG   /*维护日志--当前日志级别*/
#define RRM_PRINT_LEN 1280u /* 维护日志打印打印长度 1024+256 */


/** 日志打印函数 */
#define RRM_LOG_LOC(level,fmt,...)  rrm_PrintDebugInfo(level,fmt" line:%d fun:%s.\n",##__VA_ARGS__,__LINE__,__FUNCTION__);

#define RRM_LOG(level,fmt,...)  rrm_PrintDebugInfo(level,fmt,##__VA_ARGS__);

#if (kPLATFORM==kWINDOWS) 
#define RRM_LOG_TIME(level,fmt,...)  { \
	SYSTEMTIME sys; \
	GetLocalTime(&sys); \
	rrm_PrintDebugInfo(level,fmt" time:%02d:%02d:%02d.%03d.\n",##__VA_ARGS__,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds); \
}
#else
#define RRM_LOG_TIME(level,fmt,...)  rrm_PrintDebugInfo(level,fmt" time:%08d.\n",##__VA_ARGS__,TimeStamp); 
#endif


/**
 * @brief 打印Debug信息
 * @param[in] UINT8 level 日志级别
 * @param[in] const char *fmt 打印信息
 * @return 无
 * @note 通过调用外部接口，实现本模块的打印
 */
void rrm_PrintDebugInfo(UINT8 level, const char *fmt, ...);


/**
* @brief 获取RRM功能开关
* @param[in] 无
* @param[out] 无
* @return CI_SUCCESS 功能打开
          CI_ERROR 功能关闭
* @note 无
*/
UINT8 rrm_PrepareRRMSwitch(void);


/**
* @brief 获取出站过程中支持远程RM功能开关
* @param[in] 无
* @param[out] 无
* @return CI_SUCCESS 功能打开
          CI_ERROR 功能关闭
* @note 无
*/
UINT8 rrm_PrepareRRMStaSwitch(void);

/**
 * @brief 获取列车RRM申请状态
 * @param[in] UINT16 trainID 列车ID
 * @param[out] 无
 * @return 无
 * @note 无
 */
UINT8 rrm_PrepareRRMRequest(UINT16 trainID);


/**
 * @brief 获取列车下一站台
 * @param[in] UINT16 trainID 列车ID
 * @param[out] 无
 * @return UINT16 
 * @note 无
 */
UINT16 rrm_PrepareNextStaOfTrain(UINT16 trainID);

/**
 * @brief 获取列车关联的包络 
 * @param[in] 列车ID
 * @param[out] 无
 * @return NULL 存在UCT包络或者查询失败；非NULL，查询正确
 * @note 无
 */
const EnvelopeStruct* rrm_PrepareTrainRelELM(UINT16 trainID);


/**
 * @brief 获取列车所在区域是否为正线
 * @param[in] const EnvelopeStruct* pTrainELM
 * @param[out] 无
 * @return UINT8
           CI_SUCCESS 属于正线
           CI_ERROR 不属于正线
 * @note 无
 */
UINT8 rrm_PrepareTrainAreaIsZX(IN const EnvelopeStruct* pTrainELM);


/**
 * @brief 获取计轴区段关联的ATS逻辑站台ID
 * @param[in] UINT16 ACID
 * @param[out] 无
 * @return UINT16
           0:计轴区段不为站台
		   0xffffu:查询失败
		   其他：查询正确
 * @note 无
 */
UINT16 rrm_PrepareAtsLgcStaOfAC(UINT16 ACID);

/**
 * @brief 获取计轴区段是否为折返区域
 * @param[in] UINT16 ACID
 * @param[out]无
 * @return UINT8
           CI_SUCCESS 是折返区域
           CI_ERROR 不为折返区域
 * @note 
 */
 UINT8 rrm_PrepareACisRevertArea(UINT16 ACID);


 /**
 * @brief 计轴区段防护锁闭条件检查
 * @param[in] const UINT16 wCurACID 当前计轴区段ID
 * @param[in] const UINT16 wNextACID 下一个计轴区段ID
 * @param[out]无
 * @return UINT8
           CI_SUCCESS 检查通过
           CI_ERROR 检查不通过
           CI_TRUE 无保护区段
 * @note by cgh 20240425
 */
 UINT8 rrm_PrepareACisOverlapLock(const UINT16 wCurACID, const UINT16 wNextACID);

/**
 * @brief 获取列车运行方向及激活端
 * @param[in] UINT16 trainID 列车ID
 * @param[out] UINT8 *pDir 列车方向
 * @param[out] UINT8 *pACT 列车激活端
 * @return 无
 * @note 无
 */
void rrm_PrepareTrainDirAndAct(UINT16 trainID,OUT UINT8 *pDir,OUT UINT8 *pACT); 


/**
 * @brief 获取全线紧急状态
 * @param[in] 无
 * @param[out] 无
 * @return UINT8
           CI_SUCCESS 已设置全线紧急状态
           CI_ERROR 未设置全线紧急状态
 * @note 
 */
UINT8 rrm_PrepareWLBrake(void);


/**
 * @brief 获取本车车头占压的区段前方是否存在其他车
 * @param[in] const EnvelopeStruct* pTemp 包络信息
 * @param[out] 无
 * @return UINT8
           CI_SUCCESS 前方不存在其他车
           CI_ERROR 前方存在其他车
 * @note 无
 */
UINT8 rrm_PrepareForwardTrain(IN const EnvelopeStruct* pTemp);


/**
 * @brief 获取本车车尾后方相邻计轴区段是否存在本车
 * @param[in] UINT16 trainID 列车ID
 * @param[in] const EnvelopeStruct* pTemp 包络信息
 * @param[out] 无
 * @return UINT8
           CI_SUCCESS 后方不存在本车
           CI_ERROR 后方存在本车
 * @note 
 */
UINT8 rrm_PrepareBackHaveSameTrain(UINT16 trainID,IN const EnvelopeStruct* pTemp);


/**
 * @brief 获取车尾包含的逻辑区段
 * @param[in] UINT16 trainID 列车ID
 * @param[in] const EnvelopeStruct* pTemp 包络信息
 * @param[out] 无
 * @return UINT16
           查询失败：0
		   查询成功：车尾逻辑区段
 * @note 
 */
UINT16 rrm_PrepareSecIDofTail(UINT16 trainID,IN const EnvelopeStruct* pTemp);


 /**
 * @brief 查询计轴前/后方计轴
 * @param[in] UINT16 ACID 基准计轴ID
 * @param[in] UINT8 dir 查询方向
 * @param[out] UINT16 arACID[AC_MAXCNT_IN_SWITCH] 相邻计轴ID
 * @return UINT8_MAX 查询失败
           0~AC_MAXCNT_IN_SWITCH  查询成功
 * @note 无
 */
UINT8 rrm_PrepareAdjacentAC(UINT16 ACID, UINT8 dir, INOUT UINT16 arACID[AC_MAXCNT_IN_SWITCH], OUT UINT8* directionPointFlag);


/**
  * @brief 获取计轴区段是否属于本OC 
  * @param[in] UINT16 acID 计轴区段ID
  * @param[out] UINT8 *pOCId 所属OCid
  * @return ELM_BELONG_OTHER 属于相邻OC
            ELM_BELONG_OWNER 属于本OC
			其他，非法
  * @note 无
  */
 UINT8 rrm_PrepareACIsSelf(UINT16 acID,UINT8 *pOCId);


 /**
  * @brief 获取计轴关联的已办进路
  * @param[in] UINT16 acID 计轴区段ID
  * @param[out] 无
  * @return UINT16
            0xffffu,查询失败
			0，计轴未关联已办理进路
			其他，计轴关联的已办理进路ID
  * @note 无
  */
 UINT16 rrm_PrepareAcofRoute(UINT16 acID);

  /**
  * @brief 获取进路的始端信号机开放状态
  * @param[in] UINT16 routeID 进路ID
  * @param[out] 无
  * @return UINT8
           CI_SUCCESS 信号机开放
           CI_ERROR 信号机关闭
  * @note 
  */
 UINT8 rrm_PrepareOriginSigStatOfRoute(UINT16 routeID);


 /**
 * @brief 通过计轴ID获取计轴状态
 * @param[in] UINT16 ACID 计轴区段ID
 * @return ELM_AC_OCC 计轴占用
		   ELM_AC_FREE 计轴空闲
 * @note 
 */
UINT8 rrm_PrepareACStatus(UINT16 ACID);


/**
 * @brief 获取计轴区段的锁闭状态和锁闭方向
 * @param[in] UINT16 ACID 计轴区段ID
 * @param[in] UINT16 flag 区段类型
 * @param[out] UINT8* pLockStat 计轴锁闭状态（）
 * @param[out] UINT8* pLockDir 计轴锁闭方向
 * @return 无
 * @note 无
 */
void rrm_PrepareACLockStatAndDir(UINT16 ACID,UINT8 flag,OUT UINT8* pLockStat,OUT UINT8* pLockDir);


 /**
  * @brief 获取计轴区段封锁状态和封锁原因
  * @param[in] UINT16 acID 计轴区段ID
  * @param[out] UINT8 *pFlockStatus 封锁状态
  * @param[out] UINT8 *pFlockType 封锁原因
  * @return 无
  * @note 无
  */
 void rrm_PrepareACFLockStatusAndType(UINT16 acID,OUT UINT8 *pFlockStatus,OUT UINT8 *pFlockType);

 /**
  * @brief 获取计轴关联的道岔位置是否正确
  * @param[in] UINT16 acID 计轴区段ID
  * @param[out] 无
  * @return UINT8
           CI_SUCCESS 道岔位置正确
           CI_ERROR 道岔位置不正确
  * @note 无
  */
  UINT8 rrm_PrepareSwitchStatOfAC(UINT16 acID);

 /**
  * @brief 获取计轴上关联的ESB是否按下
  * @param[in] UINT16 acID 计轴区段ID
  * @param[out] 无
  * @return UINT8
           CI_SUCCESS ESB未按下
           CI_ERROR ESB按下
  * @note 无
  */
 UINT8 rrm_PrepareESBStatOfAC(UINT16 acID);


  /**
  * @brief 获取计轴上关联的PSD是否按下
  * @param[in] UINT16 acID 计轴区段ID
  * @param[out] 无
  * @return UINT8
           CI_SUCCESS PSD未打开
           CI_ERROR PSD打开
  * @note 无
  */
 UINT8 rrm_PreparePSDStatOfAC(UINT16 acID);


 /**
  * @brief 获取区段是否进行了安全防护（是否存在安全防护区域）
  * @param[in] UINT16 acID 计轴区段ID
  * @param[out] 无
  * @return UINT8
           CI_SUCCESS 区段未进行安全防护
           CI_ERROR 区段进行了安全防护
  * @note 无
  */
 UINT8 rrm_PrepareSafeProtectOfAC(UINT16 acID);


 /**
  * @brief 获取区段是否存在侵限或者侧防风险
  * @param[in] UINT16 acID 计轴区段ID
  * @param[out]无
  * @return UINT8
           CI_SUCCESS 区段未进行安全防护
           CI_ERROR 区段进行了安全防护
  * @note 无
  */
 UINT8 rrm_PrepareVainAndLtrlDfncCheck(UINT16 acID);

 /** 
  * @brief 获取当前计轴沿查询方向的端点是否为方向变化点（预留函数：适配灯泡线功能）
  * @param[in] UINT16 acID 计轴区段ID
  * @param[in] UINT8 Dir 查询方向
  * @param[out] 无
  * @return UINT8
           DIR_CHANGE: 存在方向变化点
           DIR_UNCHANGE： 不存在方向变化点
		   UINT8_MAX 查询失败		   
  * @note 
  */
 UINT8 rrm_PrepareDirChangeOfAC(UINT16 acID,UINT8 Dir);

 
/**
 * @brief 设置列车RRM授权状态、授权不允许理由及下一TIOC ID 
 * @param[in] UINT16 trainID 列车ID
 * @param[in] UINT8 rrmReply rrm授权状态
 * @param[in] UINT8 rrmReason rrm授权理由
 * @param[in] UINT8 nextOCId 下一个TIOC ID
 * @param[out] 无
 * @return  无
 * @note  无
 */
void rrm_SetRRMResult(UINT16 trainID,UINT8 rrmReply,UINT8 rrmReason,UINT8 nextOCId);

/**
 * @brief 获取计轴区段锁闭所属进路是否存在保护区段
 * @param[in] UINT16 CurACID 当前计轴区段
 * @param[out]无
 * @return UINT8
           CI_SUCCESS 具备保护区段
           CI_ERROR 不具备保护区段
 * @note by cgh 20231102 支持下一站台内置保护区段远程RM
 */
UINT8 rrm_OverlapExistCheck(UINT16 CurACID);

/**
  * @brief 获取计轴上关联的防淹门状态
  * @param[in] UINT16 acID 计轴区段ID
  * @param[out] 无
  * @return UINT8
           CI_SUCCESS 防淹门状态检查通过
           CI_ERROR 防淹门状态检查不通过
  * @note by cgh 20240222
  */
UINT8 rrm_PrepareFGStatOfAC(UINT16 acID);

/**
  * @brief 获取计轴上关联的物理区段的区域紧急制动状态
  * @param[in] UINT16 acID 计轴区段ID
  * @param[out] 无
  * @return UINT8
           CI_SUCCESS 区域紧急制动状态检查通过
           CI_ERROR 区域紧急制动状态检查不通过
  * @note by cgh 20240222
  */
UINT8 rrm_PrepareAreaUrgentStatOfAC(UINT16 acID);

/**
* @brief 判断RC是否为正线或试车线
* @param[in] const UINT8 cRcId RC ID
* @param[out] 无
* @return CI_SUCCESS 1 正线或试车线
          CI_ERROR 0 非正线且非试车线
* @note Created By LQ 2024.02.28
*/
UINT8 rrm_PrepareRcIsZXorSCX(const UINT8 cRcId);

/**
 * @brief 检查列车是否处于分界点且未向移交RC申请RRM
 * @param[in] const UINT16 wTrainID 列车ID
 * @param[in] const EnvelopeStruct* pTemp 列车包络信息
 * @param[out] 无
 * @return CI_SUCCESS 1 成功
           CI_ERROR 0 失败
 * @note Created By LQ 2024.03.01
 */
UINT8 rrm_CfpTrainApplyCheck(const UINT16 wTrainID, IN const EnvelopeStruct* pTemp);

/**
* @brief 判断停车区域是否属于本控区
* @param[in] const UINT16 wAtsLgcStaId 停车区域ID
* @param[out] 无
* @return CI_SUCCESS 不属于本控区
          CI_ERROR   属于本控区
* @note bv cgh 20240918
*/
UINT8 rrm_PrepareAtsLgcStaIsOwn(const UINT16 wAtsLgcStaId);

#endif


 