/********************************************************
*                                                                                                            
* 文 件 名： SpksDataManage.c   
* 版权说明： 北京交控科技有限公司 
* 创建时间： 2014-12-05
* 作    者： 联锁组
* 功能描述： SPKS开关相关配置  
* 函数包括： 
* 使用注意：
* 修改记录：   
*
********************************************************/ 
#include "SpksDataManage.h"
#include "SpksConfigDataManage.h"
#include "../System/CiSystemDefine.h"

SpksDataStruct spksDataBuff[SPKS_SUM_MAX];		/* 配置数据 */

/*
* 功能描述： 获取指定SPKS数据
* 参数说明：     
* 返回值  ： 
            SpksDataStruct*    
*/
SpksDataStruct * GetSpksData(void)
{
	return spksDataBuff;
}

/*
* 功能描述： 获取指定ID spks按钮状态
* 参数说明： const UINT16 spksId, spks ID    
* 返回值  ： 0: 获取数据失败
*			>0: spks按钮状态      
*/
UINT8 GetSpksState(const UINT16 spksId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 status = CI_ERROR;

	bufIndex = GetSpksConfigBufIndex(spksId);  /*获取数组下标*/

	if (bufIndex < SPKS_SUM_MAX)
	{
		status =  spksDataBuff[bufIndex].status;
	}
	
	return status;
}

/*
* 功能描述： 设置指定ID Spks按钮状态
* 参数说明： const UINT16 spksId, 按钮ID
*			 const UINT8 spksState, 按钮状态   
* 返回值  ： 0: 设置失败
*			 1: 设置成功  
*/
UINT8 SetSpksState(const UINT16 spksId, const UINT8 spksState)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 ret = CI_ERROR;

	bufIndex = GetSpksConfigBufIndex(spksId);  /*获取数组下标*/

	if (bufIndex < SPKS_SUM_MAX)
	{
		if ((SPKS_STATUS_NO == spksState) || (SPKS_STATUS_YES == spksState))
		{
			spksDataBuff[bufIndex].status = spksState;  

			ret = CI_SUCCESS;
		}
		else
		{
			ret =  CI_ERROR;
		}
	}
	else
	{
		ret = CI_ERROR;
	}

	return ret;
}

/*
* 功能描述： 获取指定ID spks旁路状态
* 参数说明： const UINT16 spksId, spks ID    
* 返回值  ： 0: 获取数据失败
*			>0: spks按钮状态      
*/
UINT8 GetSpksCutState(const UINT16 spksId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 status = CI_ERROR;

	bufIndex = GetSpksConfigBufIndex(spksId);  /*获取数组下标*/

	if (bufIndex < SPKS_SUM_MAX)
	{
		status =  spksDataBuff[bufIndex].cutStatus;
	}

	return status;
}

/*
* 功能描述： 设置指定ID Spks旁路状态
* 参数说明： const UINT16 spksId, 按钮ID
*			 const UINT8 spksCutState, 旁路状态   
* 返回值  ： 无
*			    
*/
void SetSpksCutState(const UINT16 spksId, const UINT8 spksCutState)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	bufIndex = GetSpksConfigBufIndex(spksId);  /*获取数组下标*/

	if (bufIndex < SPKS_SUM_MAX)
	{
		if ((SPKS_STATUS_NO == spksCutState) || (SPKS_STATUS_YES == spksCutState))
		{
			spksDataBuff[bufIndex].cutStatus = spksCutState;  
		}
		else
		{
			/*不做处理*/
		}
	}
	else
	{
		/*不做处理*/
	}
}


/*
* 功能描述： SPKS状态初始化
* 参数说明： 无
* 返回值  ： 0: 设置失败
*			 1: 设置成功  
*/
UINT8 SpksDataManageInit(void)
{
	UINT8 ret = CI_ERROR;
	UINT16 tmpSpksSum = 0U;
	UINT16 ii = 0U;
	UINT16 spksId = 0U;

	tmpSpksSum = GetTotalSpksCurNum();/*相邻联锁发送给本联锁以及本联锁的SPKS总数目,大于等于SPKS_SUM_MAX返回0*/
	for (ii = 0U; ii < tmpSpksSum; ii++)
	{
		spksId = GetSpksIdByIndex(ii);
		spksDataBuff[spksId].spksId = spksId;   /*设置spks ID*/
		if (SPKS_VIRTUAL_ATTR_YES == GetSpksVirtualAttribute(spksId))
		{/*虚拟SPKS，初始化为未按下*/
			spksDataBuff[spksId].status = SPKS_STATUS_NO;
		}
		else
		{/*非虚拟SPKS，初始化为按下*/
			spksDataBuff[spksId].status = SPKS_STATUS_YES;
		}
		spksDataBuff[spksId].cutStatus = SPKS_CUT_NO;  /*spks旁路未按下*/
		spksDataBuff[spksId].flockStartNum = 0U;
		spksDataBuff[spksId].TotalSpksDriveOutDis = TOTALSPKSDRIVE_INVALID;/*无效*/
		spksDataBuff[spksId].dwSpksBtnPressCycNum = 0U;
	}
	ret = CI_SUCCESS;
	
	return ret;
}

/*
* 功能描述： 设置指定ID Spks 封锁物理区段起始周期
* 参数说明： const UINT16 spksId, 按钮ID
*			 const UINT32 spksCutState, 封锁物理区段起始周期
*/
void SetSpksflockStartNum(const UINT16 spksId, const UINT32 flockStartNum)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	bufIndex = GetSpksConfigBufIndex(spksId);  /*获取数组下标*/

	if (bufIndex < SPKS_SUM_MAX)
	{
		if (0u == flockStartNum)/*清0值*/
		{
			spksDataBuff[bufIndex].flockStartNum = flockStartNum;
		}
		else
		{
			if (0u == spksDataBuff[bufIndex].flockStartNum)/*之前为0*/
			{
				spksDataBuff[bufIndex].flockStartNum = flockStartNum;
			}
		}
	}
	else
	{

	}
}

/*
* 功能描述： 获取指定ID Spks 封锁物理区段起始周期
* 参数说明： const UINT16 spksId, 按钮ID
*
* 返回值：封锁起始周期
*/
UINT32 GetSpksflockStartNum(const UINT16 spksId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT32 ret = CI_ERROR;

	bufIndex = GetSpksConfigBufIndex(spksId);  /*获取数组下标*/

	if (bufIndex < SPKS_SUM_MAX)
	{
		ret = spksDataBuff[bufIndex].flockStartNum;
	}
	else
	{
	}
	return ret;
}

/*
* 功能描述： 设置总SPKS驱动分SPKS的室外灯标志
* 参数说明： const UINT16 spksId, 按钮ID
*            const UINT8 driveFlag 设置标志
* 返回值：无
*/
void SetDriveOutDisFlag(const UINT16 spksId,const UINT8 driveFlag)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	bufIndex = GetSpksConfigBufIndex(spksId);  
	if(SPKS_SUM_MAX > bufIndex)
	{
		if((TOTALSPKSDRIVE_YES == driveFlag)||(TOTALSPKSDRIVE_NO == driveFlag)||(TOTALSPKSDRIVE_INVALID == driveFlag))
		{
			spksDataBuff[bufIndex].TotalSpksDriveOutDis = driveFlag;
		}
	}
	else
	{
		/*不做处理*/
	}

}
/*
* 功能描述： 获取总SPKS驱动分SPKS的室外灯标志
* 参数说明： const UINT16 spksId, 按钮ID
*            
* 返回值：设置标志
*/
UINT8 GetDriveOutDisFlag(const UINT16 spksId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 ret = 0u;
	bufIndex = GetSpksConfigBufIndex(spksId); 
	if(SPKS_SUM_MAX > bufIndex)
	{
		ret = spksDataBuff[bufIndex].TotalSpksDriveOutDis;
	}
	else
	{
		/*不做处理*/
	}
	return ret;
}

/*
* 功能描述：获取SPKS按钮按下起始周期
* 参数说明：const UINT16 spksId SPKS编号
* 返 回 值：SPKS按钮按下起始周期
* Created By LQ 2025.06.26
*/
UINT32 GetSpksPressCycNum(const UINT16 spksId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT32 dwRetVal = 0U;

	bufIndex = GetSpksConfigBufIndex(spksId);  /*获取数组下标*/

	if (bufIndex < SPKS_SUM_MAX)
	{
		dwRetVal = spksDataBuff[bufIndex].dwSpksBtnPressCycNum;
	}
	else
	{
		/*不处理*/
	}

	return dwRetVal;
}

/*
* 功能描述：设置SPKS按钮按下起始周期
* 参数说明：const UINT16 spksId SPKS编号
*			const UINT32 dwCycNum 周期号
* 返 回 值：无
* Created By LQ 2025.06.26
*/
void SetSpksPressCycNum(const UINT16 spksId, const UINT32 dwCycNum)
{
	UINT16 bufIndex = 0u;  /*数组下标*/

	bufIndex = GetSpksConfigBufIndex(spksId);  /*获取数组下标*/

	if (bufIndex < SPKS_SUM_MAX)
	{
		spksDataBuff[bufIndex].dwSpksBtnPressCycNum = dwCycNum;
	}
	else
	{
		/*不做处理*/
	}
}