/********************************************************
*                                                                                                            
* 文 件 名： GaragedoorConfigDataManage.c   
* 版权说明： 北京交控科技有限公司 
* 创建时间： 2014-12-17
* 作    者： 联锁组
* 功能描述： 车库门配置数据管理  
* 修改记录：   
*
********************************************************/ 

#include "GaragedoorConfigDataManage.h"
#include "LinkConfigDataManage.h"
#include "SignalConfigDataManage.h"


GaragedoorConfigDataStruct GaragedoorConfigDataStru[GARAGE_DOOR_SUM_MAX];   /*定义车库门数据配置结构体,cgh-合并CID-2539-1：此处声明不进行初始化，统一放到InitAllStaticDataStr函数中进行初始化，为解决生成内核过大得问题*/
UINT16 LocalCiGaragedoorIdBuf[GARAGE_DOOR_SUM_MAX] = {0u};                   /*定义本地联锁车库门ID映射数组*/
INT16 GaragedoorCurSum = 0;   /*车库门当前总数*/




/*
* 功能描述： 获取车库门当前总数
* 参数说明： void    
* 返回值  ： 0u: 获取数据失败
*			>0u: 车库门当前总数
*/
UINT16 GetGaragedoorSum(void)
{
	UINT16 garagedoorCurSum = 0u;

    if ((INT16)GARAGE_DOOR_SUM_MAX <= GaragedoorCurSum)
    {
        garagedoorCurSum = GARAGE_DOOR_SUM_MAX;
    }
	else if (0 > GaragedoorCurSum)
	{
		garagedoorCurSum = 0u;
	}
	else
	{
		garagedoorCurSum = (UINT16)GaragedoorCurSum;
	}
	return garagedoorCurSum;
}

/*
* 功能描述： 获取指定数组下标对应的车库门ID
* 参数说明： const UINT16 bufIndex, 数组下标    
* 返回值  ： 0u: 获取数据失败
*			>0u: 车库门ID      
*/
UINT16 GetGaragedoorId(const UINT16 bufIndex)
{
	UINT16 garagedoorId = CI_ERROR;
	if (bufIndex < GetGaragedoorSum())
	{
		garagedoorId = LocalCiGaragedoorIdBuf[bufIndex];
	}
	return garagedoorId;
}

/*
* 功能描述： 获取指定ID车库门索引号
* 参数说明： const UINT16 garagedoorId, 车库门ID
* 返回值  ： GARAGE_DOOR_SUM_MAX: 获取数据失败
*			<GARAGE_DOOR_SUM_MAX: 查找成功
*/
UINT16 GetGaragedoorConfigBufIndex(const UINT16 garagedoorId)
{
	UINT16 index = 0u;

	if ((garagedoorId >= 1u) && (garagedoorId < GARAGE_DOOR_SUM_MAX))
	{
        index = garagedoorId;
	}
	else
	{
		index = GARAGE_DOOR_SUM_MAX;
	}
	
	return index;
}

/*
* 功能描述： 获取指定ID车库门所属联锁ID
* 参数说明： const UINT16 garagedoorId, 车库门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 所属联锁ID      
*/
UINT8 GetGaragedoorBelongCiId(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 belongCiId = CI_ERROR;
	
	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/
	
	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		belongCiId = GaragedoorConfigDataStru[bufIndex].BelongCiId;
	}
	return belongCiId;
}

/*
* 功能描述： 获取指定ID车库门开门继电器ID
* 参数说明： const UINT16 garagedoorId, 车库门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 车库门开门继电器ID      
*/
UINT16 GetGaragedoorOpenRelayId(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 garagedoorRelayId = CI_ERROR;

	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		garagedoorRelayId = GaragedoorConfigDataStru[bufIndex].GardoorOpenRelayId;
	}

	return garagedoorRelayId;
}

/*
* 功能描述： 获取指定ID车库门关门继电器ID
* 参数说明： const UINT16 garagedoorId, 车库门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 车库门关门继电器ID      
*/
UINT16 GetGardoorCloseRelayId(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 garagedoorRelayId = CI_ERROR;

	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		garagedoorRelayId = GaragedoorConfigDataStru[bufIndex].GardoorCloseRelayId;
	}

	return garagedoorRelayId;
}

/*
* 功能描述： 获取指定ID车库门开门命令继电器ID
* 参数说明： const UINT16 garagedoorId, 车库门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 车库门开门命令继电器ID      
*/
UINT16 GetGardoorOpenOrderRelayId(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 garagedoorRelayId = CI_ERROR;

	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		garagedoorRelayId = GaragedoorConfigDataStru[bufIndex].GardoorOpenOrderRelayId;
	}

	return garagedoorRelayId;
}

/*
* 功能描述： 获取指定ID车库门关门命令继电器ID
* 参数说明： const UINT16 garagedoorId, 车库门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 车库门关门命令继电器ID      
*/
UINT16 GetGardoorCloseOrderRelayId(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 garagedoorRelayId = CI_ERROR;

	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		garagedoorRelayId = GaragedoorConfigDataStru[bufIndex].GardoorCloseOrderRelayId;
	}

	return garagedoorRelayId;
}

/*
* 功能描述： 获取指定ID车库门模式状态继电器ID
* 参数说明： const UINT16 garagedoorId, 车库门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 模式状态继电器ID      
*/
UINT16 GetGardoorModeStateRelayId(const UINT16 garagedoorId)
{
    UINT16 bufIndex = 0u;  /*数组下标*/
    UINT16 reVal = CI_ERROR;

    bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

    if (bufIndex < GARAGE_DOOR_SUM_MAX)
    {
        reVal = GaragedoorConfigDataStru[bufIndex].GardoorModeStateRelayId;
    }

    return reVal;
}

/*
* 功能描述： 获取指定ID车库门故障状态继电器ID
* 参数说明： const UINT16 garagedoorId, 车库门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 故障状态继电器ID      
*/
UINT16 GetGardoorFaultStateRelayId(const UINT16 garagedoorId)
{
    UINT16 bufIndex = 0u;  /*数组下标*/
    UINT16 reVal = CI_ERROR;

    bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

    if (bufIndex < GARAGE_DOOR_SUM_MAX)
    {
        reVal = GaragedoorConfigDataStru[bufIndex].GardoorFaultStateRelayId;
    }

    return reVal;
}

/*
* 功能描述： 获取指定ID车库门旁路继电器ID
* 参数说明： const UINT16 garagedoorId, 车库门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 旁路继电器ID      
*/
UINT16 GetGardoorPangLuRelayId(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		reVal = GaragedoorConfigDataStru[bufIndex].GardoorPangLuRelayId;
	}

	return reVal;
}

/*
* 功能描述： 获取指定ID车库门开关状态后节点继电器ID
* 参数说明： const UINT16 garagedoorId, 车库门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 开关后继电器ID      
*/
UINT16 GetGardoorKGHRelayId(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = CI_ERROR;

	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		reVal = GaragedoorConfigDataStru[bufIndex].GardoorKGHRelayId;
	}

	return reVal;
}


/*
* 功能描述： 获取指定ID车库门防护信号机总数
* 参数说明： const UINT16 garagedoorId, 车库门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 防护信号机总数      
*/
UINT16 GetGardoorProtectSigSum(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = 0u;

	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		reVal = GaragedoorConfigDataStru[bufIndex].signalSum;		
	}

	return reVal;
}

/*
* 功能描述： 根据下标获取指定ID车库门防护信号机ID
* 参数说明： const UINT16 garagedoorId, 车库门ID 
*            const UINT16 sigIndex, 防护信号机下标 
* 返回值  ： 0u: 获取数据失败
*			>0u: 防护信号机ID      
*/
UINT16 GetGardoorProtectSigIdByIndex(const UINT16 garagedoorId,const UINT16 sigIndex)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 reVal = 0u;

	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		if (sigIndex < GaragedoorConfigDataStru[bufIndex].signalSum)
		{
			reVal = GaragedoorConfigDataStru[bufIndex].signalIdBuff[sigIndex];
		}		 
	}
	return reVal;
}

/*
* 功能描述： 获取指定ID车库门spks总数
* 参数说明： const UINT16 garagedoorId, 车库门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: SPKS总数      
*/
UINT16 GetGarageSpksSum(const UINT16 garagedoorId)
{
    UINT16 bufIndex = 0u;  /*数组下标*/
    UINT16 reVal = 0u;

    bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

    if (bufIndex < GARAGE_DOOR_SUM_MAX)
    {
        reVal = GaragedoorConfigDataStru[bufIndex].GardoorSpksSum;		
    }

    return reVal;
}

/*
* 功能描述： 根据下标获取指定ID车库门spksID
* 参数说明： const UINT16 garagedoorId, 车库门ID 
*            const UINT16 spksIndex, spks下标 
* 返回值  ： 0u: 获取数据失败
*			>0u: SPKS ID      
*/
UINT16 GetGarageSpksIdBuff(const UINT16 garagedoorId,const UINT16 spksIndex)
{
    UINT16 bufIndex = 0u;  /*数组下标*/
    UINT16 reVal = 0u;

    bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

    if (bufIndex < GARAGE_DOOR_SUM_MAX)
    {
        if (spksIndex < GaragedoorConfigDataStru[bufIndex].GardoorSpksSum)
        {
            reVal = GaragedoorConfigDataStru[bufIndex].spksIdBuff[spksIndex];
        }	
    }

    return reVal;
}


/*
* 功能描述： 获取指定ID车库门关联的物理区段总数
* 参数说明： const UINT16 garagedoorId, 车库门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 物理区段总数      
*/
UINT16 GetGardoorphySecSum(const UINT16 garagedoorId)
{
    UINT16 bufIndex = 0u;  /*数组下标*/
    UINT16 reVal = 0u;

    bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

    if (bufIndex < GARAGE_DOOR_SUM_MAX)
    {
        reVal = GaragedoorConfigDataStru[bufIndex].GardoorphySecSum;		
    }

    return reVal;
}

/*
* 功能描述： 根据下标获取指定ID车库门物理区段ID
* 参数说明： const UINT16 garagedoorId, 车库门ID 
*            const UINT16 phyIndex, 物理区段下标 
* 返回值  ： 0u: 获取数据失败
*			>0u: 物理区段 ID      
*/
UINT16 GetGardoorphySecBuf(const UINT16 garagedoorId,const UINT16 phyIndex)
{
    UINT16 bufIndex = 0u;  /*数组下标*/
    UINT16 reVal = 0u;

    bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

    if (bufIndex < GARAGE_DOOR_SUM_MAX)
    {
        if (phyIndex < GaragedoorConfigDataStru[bufIndex].GardoorphySecSum)
        {
            reVal = GaragedoorConfigDataStru[bufIndex].GardoorphySecBuf[phyIndex];
        }	
    }

    return reVal;
}
/*
* 功能描述：	整理读入的车库门配置数据
* 参数说明：	无
* 返回值  ：	CI_SUCCESS,整理成功
*				CI_ERROR,整理失败
*/
UINT8 GaragedoorConfigDataManage(void)
{
    UINT16 ii = 0u;      /*游标*/
    UINT16 jj = 0u;      /*游标*/
    UINT16 garagedoorConfigDataSum = 0u;      /*车库门配置数据总数*/
	UINT8 returnValue = CI_SUCCESS;

    /*保存车库门ID索引数组*/
    garagedoorConfigDataSum = GetGaragedoorSum();
    if (garagedoorConfigDataSum >= GARAGE_DOOR_SUM_MAX)
    {/*配置数据总数错误*/
        
        returnValue = CI_ERROR;
	}
	else
	{
		for (ii = 0u; ii < GARAGE_DOOR_SUM_MAX; ii++)
		{
			if (jj == garagedoorConfigDataSum)
			{/*遍历有效数据完毕*/
            
				break;
			}
        
			if (GaragedoorConfigDataStru[ii].BelongCiId == GetSystemParaLocalCiId())
			{/*该部分为无效数据*/
            
				LocalCiGaragedoorIdBuf[jj] = GaragedoorConfigDataStru[ii].GaragedoorId;
				jj++; 
			}
		}
	}

    return returnValue;
}

/*
* 功能描述： 获取指定ID车库门关联进路总数
* 参数说明： const UINT16 garagedoorId, 车库门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 进路总数      
*/
UINT8 GetGardoorRouteSum(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 reVal = 0u;

	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		reVal = GaragedoorConfigDataStru[bufIndex].GardoorRouteSum;		
	}

	return reVal;
}


/*
* 功能描述： 获取指定ID车库门关联进路ID
* 参数说明： const UINT16 garagedoorId, 车库门ID  
* 返回值  ： 0u: 获取数据失败
*			>0u: 关联进路ID      
*/
UINT16* GetGardoorRouteIdBuf(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16* reVal = NULL;

	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		reVal = GaragedoorConfigDataStru[bufIndex].GardoorRouteBuf;		
	}

	return reVal;
}


/*
* 功能描述： 获取指定ID车库门所属虚拟联锁ID
* 参数说明： const UINT16 garagedoorId, 车库门ID    
* 返回值  ： 0u: 获取数据失败
*			>0u: 所属虚拟联锁ID      
*/
UINT8 GetGaragedoorBelongVirCiId(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 belongVirCiId = CI_ERROR;

	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		belongVirCiId = GaragedoorConfigDataStru[bufIndex].BelongVirCiId;
	}
	return belongVirCiId;
}

/*
* 功能描述： 获取指定ID车库门对应A库线物理区段ID
* 参数说明： const UINT16 garagedoorId, 车库门ID
* 返回值  ： 0   查找失败
			>0  A库线物理区段ID
* BY LC
*/
UINT16 GetGarageDoorAKuPhySec(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 phySecIdA = CI_ERROR;

	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		phySecIdA = GaragedoorConfigDataStru[bufIndex].phySecAKUId;
	}
	return phySecIdA;
}

/*
* 功能描述： 获取指定ID车库门属性
* 参数说明： const UINT16 garagedoorId, 车库门ID
* 返回值  ： 0   查找失败
			0x55  列检库
			0xaa  洗车库
*/
UINT8 GetGarageDoorAttribute(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT8 flag = 0U;
	UINT8 attribute = CI_ERROR;

	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		flag = GaragedoorConfigDataStru[bufIndex].depotAttribute;
	}

	if (1U == flag)
	{
		attribute = GARAGE_DOOR_ATTRIBUTE_LJK;
	}
	else if (2U == flag)
	{
		attribute = GARAGE_DOOR_ATTRIBUTE_XCK;
	}
	else
	{
		attribute = CI_ERROR;
	}
	return attribute;
}

/*
* 功能描述： 获取指定ID车库门防护信号机ID数组
* 参数说明： const UINT16 garagedoorId, 车库门ID
* 返回值  ： 0u: 获取数据失败
*			>0u: 防护信号机ID
*/
UINT16* GetGardoorProtectSigId(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16* reVal = NULL;

	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		reVal = GaragedoorConfigDataStru[bufIndex].signalIdBuff;
	}
	return reVal;
}

/*
* 功能描述： 获取指定ID车库门出库信号机防护方向
* 参数说明： const UINT16 garagedoorId, 车库门ID
* 返回值  ： 0u: 获取数据失败
*			>0u: 方向
*/
UINT8 GetGardoorProOutDir(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0U;  /*数组下标*/
	UINT16* proSignalIdBuff = NULL;
	UINT8 reVal = CI_ERROR;
	UINT8 proSignalOutDir = 0U;

	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		/*获取出库信号机防护方向*/
		proSignalIdBuff = GetGardoorProtectSigId(garagedoorId);
		if (NULL != proSignalIdBuff)
		{
			proSignalOutDir = GetSignalDirection(proSignalIdBuff[0]);
			if ((DIR_SAME == proSignalOutDir) || (DIR_CONVERT == proSignalOutDir))
			{
				reVal = proSignalOutDir;
			}
			else
			{
				/* 方向无效*/
			}
		}
		else
		{
			/*查询失败*/
		}
	}
	return reVal;
}


/*
* 功能描述： 获取指定ID车库门所在link
* 参数说明： const UINT16 garagedoorId, 车库门ID
* 返回值  ： linkID
* BY LC
*/
UINT16 GetGardoorPointLink(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT16 gdLink = 0U;


	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		gdLink = GaragedoorConfigDataStru[bufIndex].GardoorLinkId;
	}

	return gdLink;
}

/*
* 功能描述： 获取指定ID车库门所在link偏移量
* 参数说明： const UINT16 garagedoorId, 车库门ID
* 返回值  ： 偏移量
* BY LC
*/
UINT32 GetGardoorPointLinkOffset(const UINT16 garagedoorId)
{
	UINT16 bufIndex = 0u;  /*数组下标*/
	UINT32 gdLinkOffest = 0U;


	bufIndex = GetGaragedoorConfigBufIndex(garagedoorId);  /*获取数组下标*/

	if (bufIndex < GARAGE_DOOR_SUM_MAX)
	{
		gdLinkOffest = GaragedoorConfigDataStru[bufIndex].GardoorOffset;
	}

	return gdLinkOffest;
}


