/********************************************************
*                                                                                                            
* 文 件 名： ErrorDataManage.c   
* 版权说明： 北京交控科技有限公司 
* 创建时间： 2012-04-11
* 作    者： 联锁组
* 功能描述： 错误数据管理  
* 修改记录：   
*
********************************************************/ 

#include "ErrorDataManage.h"
#include "../LogicManage/InterlockLogicManage.h"


/* 故障数据每周期有效  周期结束时清除 */
ErrorDataStruct ErrorDataStru[ERROR_DATA_SUM_MAX];   /*定义错误数据结构体*/

UINT16 ErrorDataCurSum = 0u; /*错误数据当前总数*/


/*
* 功能描述： 获取错误数据当前总数
* 参数说明： void    
* 返回值  ： 0: 获取数据失败
*			>0: 错误数据当前总数
*/
UINT16 GetErrorDataCurSum(void)
{
	UINT16 reVal = 0u;
    if (ErrorDataCurSum >= ERROR_DATA_SUM_MAX)
    {
        reVal = 0u;
    }
    else
    {
        reVal = ErrorDataCurSum;
    }
	return reVal;
}


/*
* 功能描述： 获取错误数据
* 参数说明： const UINT16 bufIndex, 数组索引下标    
* 返回值  ： NULL: 获取数据失败
*			!NULL: 错误数据
*/
ErrorDataStruct* GetErrorData(const UINT16 bufIndex)
{
	ErrorDataStruct* reVal = NULL;
    ErrorDataStruct *pErrorData = NULL;  /* 返回值 */

    if (bufIndex >= ERROR_DATA_SUM_MAX)
    {
        reVal = NULL;
    }
	else
	{
		if (ErrorDataStru[bufIndex].FunctionId != 0u)
		{
			/* 故障数据有效 */
			pErrorData = &ErrorDataStru[bufIndex];
			reVal = pErrorData;
		}
		else
		{
			/* 故障数据无效 */
			pErrorData = NULL;
			reVal = pErrorData;
		}
	}
	return reVal;
}


/*
* 功能描述： 设置错误数据
* 参数说明： const UINT8 functionId, 函数ID  
*			 const UINT8 DeviceType, 设备类型
*			 const UINT16 DeviceId, 设备ID
*			 const UINT8 DeviceStateType, 设备状态类型
*			 const UINT8 DeviceState, 设备状态
*			 const UINT8 SendLevel, 发送级别
* 返回值  ： 无
*			       
*/
void SetErrorData(const UINT8 FunctionId, const UINT8 DeviceType, const UINT16 DeviceId, 
                   const UINT8 DeviceStateType, const UINT8 DeviceState,
                   const UINT8 SendLevel)
{
    UINT16 tempErrorDataIndex = 0u;  /*记录数据寻址*/

    tempErrorDataIndex = ErrorDataCurSum;
    if (tempErrorDataIndex < ERROR_DATA_SUM_MAX)
    {
		if (ETYPE_PS_FLOCK_SPKSCMD_STATE == DeviceStateType)
		{
			SetPhySecSpksCmdFlockErrorData(FunctionId, DeviceType, DeviceId, DeviceStateType, DeviceState, SendLevel);
		}
		else
		{
			/* 记录新数据 */
			ErrorDataStru[tempErrorDataIndex].FunctionId = FunctionId;
			ErrorDataStru[tempErrorDataIndex].DeviceType = DeviceType;
			ErrorDataStru[tempErrorDataIndex].DeviceId = DeviceId;
			ErrorDataStru[tempErrorDataIndex].DeviceStateType = DeviceStateType;
			ErrorDataStru[tempErrorDataIndex].DeviceState = DeviceState;
			ErrorDataStru[tempErrorDataIndex].SendLevel = SendLevel;

			/* 记录未满寻址指向新数据 */
			ErrorDataCurSum = (UINT16)(tempErrorDataIndex + 1u);
		}

    }
    else
    {
        /* 记录失败 */
    } 
}


/*
* 功能描述： 清除错误数据，每周期结束调用
* 参数说明： void
* 返回值  ： void     
*/
void ClearErrorData(void)
{
    UINT16 i = 0u;
    
    /* 清除故障数据*/
    ErrorDataCurSum = 0u;
    for (i = 0u; i< ERROR_DATA_SUM_MAX; i++)
    {
        ErrorDataStru[i].FunctionId = 0u;
        ErrorDataStru[i].DeviceStateType = 0u; 
        ErrorDataStru[i].DeviceId = 0u;      
	    ErrorDataStru[i].DeviceState = 0u;
        ErrorDataStru[i].SendLevel = 0u;
        ErrorDataStru[i].DeviceType = 0u;
		ErrorDataStru[i].VirCIid = 0u;
    }
}


/*
* 功能描述： 删除错误信息
* 参数说明： const UINT16 Index  索引编号
* 返回值  ： void     
*/
void DeleteErrorData(const UINT16 Index)
{
	ErrorDataStru[Index].FunctionId = 0u;
	ErrorDataStru[Index].DeviceStateType = 0u; 
	ErrorDataStru[Index].DeviceId = 0u;      
	ErrorDataStru[Index].DeviceState = 0u;
	ErrorDataStru[Index].SendLevel = 0u;
	ErrorDataStru[Index].DeviceType = 0u;
	ErrorDataStru[Index].VirCIid = 0u;
	ErrorDataCurSum--;
}

/*
* 功能描述： 设置错误数据的虚拟联锁ID
* 参数说明：
*			const UINT16 preErrorNum, 之前Error数目
*			const UINT8 virCIid, 虚拟联锁ID
* 返回值  ：void
* cgh-合并CID-2349-5：
*/
void SetErrorDataBelongVirCiId(const UINT16 preErrorNum, const UINT8 virCIid)
{
	UINT16 tempErrorDataNum = 0u;  /*记录数据寻址*/
	UINT16 ii = 0u;

	tempErrorDataNum = GetErrorDataCurSum(); /*返回值小于ERROR_DATA_SUM_MAX*/
	if ((0u < tempErrorDataNum) && (ERROR_DATA_SUM_MAX > preErrorNum))
	{

		for (ii = preErrorNum; ii < tempErrorDataNum; ii++)/*批量处理*/
		{
			ErrorDataStru[ii].VirCIid = virCIid;/*记录最新ErrorData的虚拟联锁ID*/
		}

	}
	else
	{
		/*不做处理*/
	}

}

/*
* 功能描述： 设置物理区段封锁类型为SPKS按下且命令封锁时的错误数据
* 参数说明： const UINT8 functionId, 函数ID
*			 const UINT8 DeviceType, 设备类型
*			 const UINT16 DeviceId, 设备ID
*			 const UINT8 DeviceStateType, 设备状态类型
*			 const UINT8 DeviceState, 设备状态
*			 const UINT8 SendLevel, 发送级别
* 返回值  ： 无
*cgh-合并CID-2539-1：
*/
void SetPhySecSpksCmdFlockErrorData(const UINT8 FunctionId, const UINT8 DeviceType, const UINT16 DeviceId,
	const UINT8 DeviceStateType, const UINT8 DeviceState,
	const UINT8 SendLevel)
{
	UINT16 tempErrorDataIndex = 0u;  /*记录数据寻址*/
	UINT16 spksId = 0u;       /*SPKS ID*/
	UINT8 spksState = 0u;      /*SPKS 状态*/
	UINT8 checkResult = 0u;   /*检查结果*/
	tempErrorDataIndex = ErrorDataCurSum;
	if (tempErrorDataIndex < ERROR_DATA_SUM_MAX)
	{

		/* 记录物理区段命令封锁的错误码数据 */
		ErrorDataStru[tempErrorDataIndex].FunctionId = FunctionId;
		ErrorDataStru[tempErrorDataIndex].DeviceType = DeviceType;
		ErrorDataStru[tempErrorDataIndex].DeviceId = DeviceId;
		ErrorDataStru[tempErrorDataIndex].DeviceStateType = ETYPE_PS_FLOCK_STATE;
		ErrorDataStru[tempErrorDataIndex].DeviceState = DeviceState;
		ErrorDataStru[tempErrorDataIndex].SendLevel = SendLevel;

		tempErrorDataIndex++;

		checkResult = CheckPhysecFlockReasonSpksId(DeviceId, &spksId, &spksState);/*获取物理区段封锁是由于那个spks落下导致的*/
		if (CI_SUCCESS == checkResult)
		{
			/* 记录物理区段SPKS封锁的错误码数据 */
			ErrorDataStru[tempErrorDataIndex].FunctionId = FunctionId;
			ErrorDataStru[tempErrorDataIndex].DeviceType = CI_DEVICE_TYPE_SPKS;
			ErrorDataStru[tempErrorDataIndex].DeviceId = spksId;
			ErrorDataStru[tempErrorDataIndex].DeviceStateType = ETYPE_SPKS_STATE_UP;
			ErrorDataStru[tempErrorDataIndex].DeviceState = spksState;
			ErrorDataStru[tempErrorDataIndex].SendLevel = SendLevel;

			tempErrorDataIndex++;
		}
		/* 记录未满寻址指向新数据 */
		ErrorDataCurSum = (UINT16)(tempErrorDataIndex);
	}
	else
	{
		/*不做处理*/
	}

}






