/********************************************************
*
* 文 件 名： ReverseCutDataManage.c
* 版权说明： 北京交控科技有限公司
* 创建时间： 2022-06-15
* 作    者： 联锁组
* 功能描述： 倒切装置动态数据管理
* 修改记录：
*
********************************************************/

#include "ReverseCutDataManage.h"
#include "ReverseCutConfigDataManage.h"

ReverseCutDataStru gstReverseCutData[REVERSE_CUT_SUM_MAX] = { 0U };       /*定义倒切装置数据动态数据结构体*/
UINT8 gTiocSystemMode = 0U;		/*TIOC主机模式 (影子模式 主控模式)*/
UINT8 gTiocSystemCutState = 0U; /*TIOC能否倒切状态 (能否倒切或默认)*/
UINT8 gTiocCanntCutReason = 0U;	/*不可倒切原因*/


/*
* 功能描述： 获取TIOC主机可倒切状态
* 参数说明： void
* 返回值  ：REVERSE_CUT_STATE_NORMAL:    正常可倒切
*			REVERSE_CUT_STATE_EXCEPTION: 异常不可倒切
*			REVERSE_CUT_STATE_DEFAULT: 默认倒切状态(主控模式)
*/
UINT8 GetTiocSystemCutState(void)
{
	UINT8 retVal = 0u;
	
	if ((REVERSE_CUT_STATE_NORMAL == gTiocSystemCutState)
		|| (REVERSE_CUT_STATE_EXCEPTION == gTiocSystemCutState)
		|| (REVERSE_CUT_STATE_DEFAULT == gTiocSystemCutState))
	{
		retVal = gTiocSystemCutState;
	}
	else
	{
		retVal = REVERSE_CUT_STATE_DEFAULT;
	}
	return retVal;
}


/*
* 功能描述： 设置TIOC主机可倒切状态
* 参数说明： const UINT8 chSystemCutState 系统可倒切状态
* 返回值  ：无
*/
void SetTiocSystemCutState(const UINT8 chSystemCutState)
{
	if ((REVERSE_CUT_STATE_NORMAL == chSystemCutState)
		|| (REVERSE_CUT_STATE_EXCEPTION == chSystemCutState)
		|| (REVERSE_CUT_STATE_DEFAULT == chSystemCutState))
	{
		gTiocSystemCutState = chSystemCutState;
	}
	else
	{
		gTiocSystemCutState = REVERSE_CUT_STATE_EXCEPTION;
	}
}
/*
* 功能描述： 获取TIOC主机不可倒切原因
* 参数说明： void
* 返回值  ：REVERSE_REASON_OC_COMM_ERR	: 对象控制器通信异常
*			REVERSE_REASON_IVOC_COMM_ERR: IVOC通信异常
*			REVERSE_REASON_AXLE_COMM_ERR: 计轴系统通信异常
*/
UINT8 GetTiocCanntCutReason(void)
{
	UINT8 retVal = gTiocCanntCutReason;

	return retVal;
}

/*
* 功能描述： 设置TIOC主机不可倒切原因
* 参数说明： const UINT8 chCanntCutReason 不可倒切原因
* 返回值  ：无
*/
void SetTiocCanntCutReason(const UINT8 chCanntCutReason)
{
	if ((REVERSE_REASON_OC_COMM_ERR == chCanntCutReason)
		|| (REVERSE_REASON_IVOC_COMM_ERR == chCanntCutReason)
		|| (REVERSE_REASON_AXLE_COMM_ERR == chCanntCutReason))
	{
		gTiocCanntCutReason |= chCanntCutReason;
	}
	else if (0U == chCanntCutReason)
	{
		gTiocCanntCutReason = 0U;
	}
	else
	{
		gTiocCanntCutReason = REVERSE_REASON_OC_COMM_ERR | REVERSE_REASON_IVOC_COMM_ERR | REVERSE_REASON_AXLE_COMM_ERR;
	}
}

/*
* 功能描述： 设置TIOC主机模式
* 参数说明： const UINT8 chSystemMode 系统模式
* 返回值  ：无
*/
void SetTiocSystemMode(const UINT8 chSystemMode)
{
	if ((REVERSE_MODE_MAIN == chSystemMode)
		|| (REVERSE_MODE_SHADOW == chSystemMode))
	{
		gTiocSystemMode = chSystemMode;
	}
	else
	{
		gTiocSystemMode = REVERSE_MODE_SHADOW;
	}
}
/*
* 功能描述： 获取TIOC主机模式
* 参数说明： void
* 返回值  ：REVERSE_MODE_MAIN: 主控模式
*			REVERSE_MODE_SHADOW: 影子模式
*/
UINT8 GetTiocSystemMode(void)
{
	UINT8 retVal = 0u;

	if ((REVERSE_MODE_MAIN == gTiocSystemMode)
		|| (REVERSE_MODE_SHADOW == gTiocSystemMode))
	{
		retVal = gTiocSystemMode;
	}
	else
	{
		retVal = REVERSE_MODE_SHADOW;
	}
	return retVal;
}


/*
* 功能描述： 获取指定ID倒切装置状态
* 参数说明： const UINT16 wReverseCutId, 倒切ID
* 返回值  ： 0: 获取数据失败
*			REVERSE_DEVICE_CUT_STATE_UP: 倒切设备状态 吸起
*			REVERSE_DEVICE_CUT_STATE_DOWN：倒切设备状态 落下
*/
UINT8 GetReverseCutState(const UINT16 wReverseCutId)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/
	UINT8 chRetVal = CI_ERROR;

	wBufIndex = GetReverseCutCfgBufIndex(wReverseCutId);  /*获取区段数组下标*/

	if (REVERSE_CUT_SUM_MAX > wBufIndex)
	{
		chRetVal = (UINT8)gstReverseCutData[wBufIndex].wReverseState;
	}
	else
	{
		chRetVal = CI_ERROR;
	}
	return chRetVal;
}

/*
* 功能描述： 设置指定ID倒切装置状态
* 参数说明： const UINT16 wReverseCutId, 倒切ID
*			 const UINT8 chReverseCutState,倒切状态
* 返回值  ： 无
*/
void SetReverseCutState(const UINT16 wReverseCutId,const UINT8 chReverseCutState)
{
	UINT16 wBufIndex = 0u;  /*数组下标*/

	wBufIndex = GetReverseCutCfgBufIndex(wReverseCutId);  /*获取区段数组下标*/

	if (REVERSE_CUT_SUM_MAX > wBufIndex)
	{
		if ((REVERSE_DEVICE_CUT_STATE_UP == chReverseCutState)
			|| (REVERSE_DEVICE_CUT_STATE_DOWN == chReverseCutState))
		{
			gstReverseCutData[wBufIndex].wReverseState = chReverseCutState;
		}
	}
	else
	{

	}
}

/*
* 功能描述： 倒切设备数据初始化
* 参数说明： 无
* 返回值  ： 0: 设置失败
*			 1: 设置成功
*/
UINT8 ReverseCutDataManageInit(void)
{
	UINT8 ret = CI_ERROR;
	UINT16 wReverseCutSum = 0u;
	UINT16 wReverseCutId = 0u;
	UINT16 i = 0u;
	UINT16 wIndex = 0u;
	UINT8 chDsnLinSwitch = 0U;
	chDsnLinSwitch = GetCiFunctionSwitchConfig(FUNC_DSN_LINE_SWITCH);
	/* 获取本联锁边界点数量 */
	wReverseCutSum = GetReverseCutCurSum();
	if (REVERSE_CUT_SUM_MAX > wReverseCutSum)
	{
		for (i = 0u; i < wReverseCutSum; i++)
		{
			/* 获取边界点ID */
			wReverseCutId = GetCfpId(i);
			wIndex = GetReverseCutCfgBufIndex(wReverseCutId);
			gstReverseCutData[wIndex].wReverseCutId = wReverseCutId;
			gstReverseCutData[wIndex].wReverseState= REVERSE_DEVICE_CUT_STATE_DOWN;
		}
		if (FUNC_SWITCH_ON == chDsnLinSwitch)
		{
			gTiocSystemMode = REVERSE_MODE_SHADOW;
			gTiocSystemCutState = REVERSE_CUT_STATE_EXCEPTION;
			gTiocCanntCutReason = REVERSE_REASON_OC_COMM_ERR | REVERSE_REASON_IVOC_COMM_ERR | REVERSE_REASON_AXLE_COMM_ERR;
		}
		else
		{
			gTiocSystemMode = REVERSE_MODE_MAIN;
			gTiocSystemCutState = REVERSE_CUT_STATE_EXCEPTION;
			gTiocCanntCutReason = 0U;
		}
		ret = CI_SUCCESS;
	}
	else
	{
		;/* 初始化失败 */
	}


	return ret;
}