/******************************************************************************
** 文件名:  AxisAssertDataPrepare.h 
** 描 述:   计轴故障诊断模块，计轴故障诊断模块简称aam，数据准备区
*******************************************************************************/
#ifndef AXIS_ASSERT_DATA_PREPARE_H_
#define AXIS_ASSERT_DATA_PREPARE_H_

#include "AxisAssertDefine.h"
#include "EnvelopeDefine.h"
#include "ELMDataPrepare.h"
#include "dsuEmapDefine.h"

#define AAM_LOG_FATAL 0u   /** 维护日志--维护级别 */
#define AAM_LOG_ERROR 1u  /*维护日志--错误级别*/
#define AAM_LOG_WARING 2u  /*维护日志--警告级别*/
#define AAM_LOG_DEBUG 3u   /*维护日志--调试级别*/
#define AAM_LOG_LEVEL AAM_LOG_DEBUG   /*维护日志--当前日志级别*/
#define AMM_PRINT_LEN 1280u /* 维护日志打印打印长度 1024+256 */


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

#define AAM_LOG(level,fmt,...)  aam_PrintDebugInfo(level,fmt,##__VA_ARGS__);

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




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

/**
 * @brief 获取本OC范围有共管区内计轴区段的数组索引
 * @param[out] OUT UINT16** pACIdBuff 计轴区段ID数缓存
 * @return 0 查询错误
           1~AXIS_SECTION_SUM_MAX 查询正确
 * @note 由于OC支持计轴区段ID和索引的映射关系，故直接获取即可
 */
UINT16 aam_PrepareACBuffIndexs(OUT const UINT16** pACIdBuff);


/**
 * @brief 通过计轴区段ID获取计轴区段的数组索引
 * @param[in] UINT16 ACId 计轴区段ID
 * @return 计轴区段缓存索引
 * @note 无
 */
UINT16 aam_PrepareACIndex(UINT16 ACId);

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

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

 /**
 * @brief 查询计轴前/后方计轴
 * @param[in] UINT16 ACID 基准计轴ID
 * @param[in] UINT8 dir 查询方向
 * @param[out] UINT16 arACID[AC_MAXCNT_IN_SWITCH] 相邻计轴ID
 * @param[out] UINT8* DirectionPointFlag  是否有方向变化点 DIRECTIONPOINT_FLAG_VALID
 * @return UINT8_MAX 查询失败
           0~AC_MAXCNT_IN_SWITCH  查询成功
 * @note 无
 */
UINT8 aam_PrepareAdjacentAC(UINT16 ACID, UINT8 dir, INOUT UINT16 arACID[AC_MAXCNT_IN_SWITCH], UINT8* DirectionPointFlag);

/**
 * @brief 通过计轴区段ID查找计轴区段位置
 * @param[in] UINT16 ACID 计轴区段ID
 * @param[in] UINT8 dir 查询方向
 * @param[out] ELM_AxisLocStruct* pACLoc 计轴区段位置
 * @return CI_SUCCESS 查询正确，返回成功
 *         CI_ERROR   查询错误，返回失败
 * @note 
 */
UINT8 aam_PrepareACLoc(UINT16 ACID, UINT8 dir,INOUT ELM_AxisLocStruct* pACLoc);


/**
 * @brief 通过计轴区段查找计轴区段相邻的物理区段
 * @param[in] UINT16 ACID
 * @param[out] UINT16 *PrePhyid 前方物理区段ID
 * @param[out] UINT16 *BackPhyid 后方物理区段ID 
 * @return CI_ERROR 返回错误
           CI_SUCCESS 返回正确
 * @note 
 *     1、新建，2022年4月22日，前方后方按照逻辑正方向进行确定
 */
UINT8 aam_PreparePreAndBackPhySecOFAC(UINT16 ACID,UINT16 *PrePhyid, UINT16 *BackPhyid);


/**
 * @brief 获取物理区段状态
 * @param[in] UINT16 PhyId 物理区段id
 * @param[out] 无
 * @return SECTION_OCCUPY_YES 物理区段占用
           SECTION_OCCUPY_NO 物理区段空闲
 * @note 
 */
UINT8 aam_PreparePhyOccStatus(UINT16 PhyId);


/**
 * @brief 获取计轴对应的物理区段
 * @param[in] UINT16 ACID 计轴区段ID
 * @param[out] 无
 * @return 
 * @note 
 */
UINT16 aam_PrepareACBelongPhyid(UINT16 ACID);


/**
 * @brief 判断计轴区段是否为联锁线
 * @param[in] UINT16 ACID 计轴区段ID
 * @param[out]
 * @return CI_SUCCESS 为联锁线
           CI_ERROR 不为联锁线
 * @note 
 */
UINT8 aam_PrepareACIsLinkingAxle(UINT16 ACID);


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


/**
 * @brief 获取计轴诊断冗余周期数
 * @param[in]  无
 * @param[out] 无
 * @return 计轴诊断冗余周期数
 * @note 
 */
UINT8 aam_PrepareRedunTimes(void);


/**
 * @brief 获取物理区段包含的计轴区段
 * @param[in] UINT16 PhyId 物理区段
 * @param[out] UINT8* pACCnt 计轴区段数量
 * @return const UINT16* 计轴区段存储地址
 * @note 非NULL 查询正确
         NULL 查询错误
 */
const UINT16* aam_PreparePhyRelACIds(UINT16 PhyId,UINT8* pACCnt);

/**
* @brief 获取物理区段是否属于本TIOC
* @param[in] UINT16 phyID 物理区段ID
* @param[out] UINT8 *pOCId 所属TIOCid
* @return ELM_BELONG_OTHER 属于相邻TIOC
ELM_BELONG_OWNER 属于本TIOC
其他，非法
* @note 无
*/
UINT8 aam_PreparePhyIsSelf(UINT16 phyID, UINT8 *pOCId);

/**
 * @brief 判断数值是否存在UINT16数值中 
 * @param[in] UINT16 targetValue 待查询的值
 * @param[in] const UINT16 arValue[] 冲突范围
 * @param[in] UINT16 buffsize 冲突范围大小
 * @return CI_SUCCESS 指定值在冲突范围内
 *         CI_ERROR   指定值不在冲突范围内
 * @note 无
 */
UINT8 aam_PrepareInUINT16Array(UINT16 targetValue,const UINT16 arValue[],UINT16 buffsize);

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

/**
* @brief 获取本RC通信的OCid
* @param[out] UINT8 *pOCIDbuff OCid缓存
* @return 本OC通信数量
*/
UINT8 aam_PrepareComOcId(IN const UINT8 **pOcIdBuff);

/**
* @brief 获取OC的通信状态
* @param[in] UINT8 OCID
* @return ELM_COM_STATUS_ERROR 通信状态错误
ELM_COM_STATUS_OK 通信状态正确
* @note
*/
UINT8 aam_PrepareOcCommStatus(UINT8 OcId);

/**
* @brief 获取计轴系统功能开关
* @param[in] 无
* @param[out] 无
* @return CI_SUCCESS 功能打开
CI_ERROR 功能关闭
* @note
*/
UINT8 aam_PrepareAsSwitch(void);

/**
* @brief 获取本RC通信的计轴系统id
* @param[out] UINT8 *pAsIdBuff 计轴系统id缓存
* @return 本RC通信计轴系统数量
*/
UINT8 aam_PrepareComAsId(IN const UINT8 **pAsIdBuff);

/**
* @brief 获取计轴系统的通信状态
* @param[in] UINT8 AsId
* @return AAM_COM_STATUS_ERROR 通信状态错误
AAM_COM_STATUS_OK 通信状态正确
* @note
*/
UINT8 aam_PrepareAsCommStatus(UINT8 AsId);

/**
* @brief 判断两点是否同向
* @param[in] LOD_STRU strPointA
* @param[in] LOD_STRU strPointB
* @return CI_ERROR:比较失败；FLAG_SET:同向；FLAG_UNSET:不同向
* @note 无
*/
UINT8 aam_PrepareTwoPointsSameDir(const LOD_STRU strPointA, const LOD_STRU strPointB);
#endif /*AXIS_ASSERT_DATA_PREPARE_H_*/
