/*******************************************************************************
*
* 文件名  ：dsuRpFunc.c
* 版权说明：北京瑞安时代科技有限责任公司
* 版本号  ：1.0  
* 创建时间：2009.11.20
* 作者    ：车载及协议部
* 功能描述：与Rp协议相关的dsu查询函数函数体
* 使用注意：无
* 修改记录：无
*
*******************************************************************************/

#include "dsuRpFunc.h"
#include "CommonMemory.h"
#include "dfsDataRead.h"
#include "dquDataTypeDefine.h"

#define DSU_COMM_PROTCL_STRU_SIZE 3
#define DSU_IP_INFO_STRU_SIZE 30 /*设备IP地址表列占字节长度*/

DSU_BOOK_IP_INFO_STRU DsuBookIpInfoStru;     /*初始化之后用于保存初始化之后的数据的变量*/

/**
 * @brief dsuIpInit 初始化读取数据参数
 * @param pFsName FS文件 取值范围：字节数组
 * @param interfaceType 接口类型 取值范围:0x55:发送/接收标识为4字节;其他(默认值):发送/接收标识为2字节
 * @return 0:失败 1:成功
 */
UINT8 dsuIpInit(UINT8* pFsName, UINT8 interfaceType)
{
	UINT8 rtn = 0U; /*-< 设置函数返回值为失败*/
	UINT8 readRtn = 0U; /*调用函数返回值*/
	UINT8* pData = NULL; /*读出的数据*/
	UINT32 dataLen = 0U; /*读出的数据长度*/
	UINT32 mallocLen = 0U; /*分配空间大小*/
	UINT32 offset = 0U;	/*-< 设置数据下标为0*/
	UINT32 i = 0U; /*用于循环*/

	if (NULL != pFsName) /*-< 输入参是否非空*/
	{
		readRtn = dquGetConfigData((CHAR*)pFsName, DSU_DEVICE_IP_CONFIG_TYPE, DSU_DATA_IP_COMM_PROTCL_ID, &pData, &dataLen); /*-< 调用函数读取设备通信协议表*/
		if ((1U == readRtn) && (DSU_COMM_PROTCL_STRU_SIZE <= dataLen) && (0U == (dataLen % DSU_COMM_PROTCL_STRU_SIZE))) /*-< 调用函数是否成功 且有数据行 且数据长度是行整数倍*/
		{
			DsuBookIpInfoStru.CommProtclStruLen = (UINT16)(dataLen / DSU_COMM_PROTCL_STRU_SIZE); /*-< 计算得到行数*/
			mallocLen = sizeof(DSU_COMM_PROTCL_STRU) * (DsuBookIpInfoStru.CommProtclStruLen); /*-< 计算需分配空间大小*/
			DsuBookIpInfoStru.pCommProtclStru = (DSU_COMM_PROTCL_STRU*)malloc(mallocLen); /*-< 调用函数分配空间*/
			if (NULL != DsuBookIpInfoStru.pCommProtclStru) /*-< 调用函数是否成功*/
			{
				CommonMemSet(DsuBookIpInfoStru.pCommProtclStru, mallocLen, 0, mallocLen); /*-< 清零设备通信协议表*/

				for (i = 0U; i < DsuBookIpInfoStru.CommProtclStruLen; i++) /*-< 行下标是否小于行数*/
				{
					DsuBookIpInfoStru.pCommProtclStru[i].EmitterType = pData[offset]; /*-< 设置本方设备类型*/
					offset++; /*-< 数据下标自增1*/

					DsuBookIpInfoStru.pCommProtclStru[i].ReceptorType = pData[offset]; /*-< 设置对方设备类型*/
					offset++; /*-< 数据下标自增1*/

					DsuBookIpInfoStru.pCommProtclStru[i].CommuType = pData[offset]; /*-< 设置协议类型*/
					offset++; /*-< 数据下标自增1*/
				}
				if (offset == dataLen) /*-< 数据下标是否等于表数据长度*/
				{
					rtn = 1U; /*-< 设置函数返回值为成功*/
				}
			}
		}

		if ((1U == rtn) && (INTERFACE_TYPE_FOUR == interfaceType)) /*-< 函数返回值是否成功 且接口类型是否发送/接收标识为4字节*/
		{
			rtn = 0U; /*-< 设置函数返回值为失败*/
			offset = 0U; /*-< 设置数据下标为0*/

			readRtn = dquGetConfigData((CHAR*)pFsName, DSU_DEVICE_IP_CONFIG_TYPE, DSU_DATA_IP_IP_ID, &pData, &dataLen); /*-< 调用函数读取设备IP配置表*/
			if ((1U == readRtn) && (DSU_IP_INFO_STRU_SIZE <= dataLen) && (0U == (dataLen % DSU_IP_INFO_STRU_SIZE))) /*-< 调用函数是否成功 且有数据行 且数据长度是行整数倍*/
			{
				DsuBookIpInfoStru.devTypeIdHlhtIdLen = (UINT16)(dataLen / DSU_IP_INFO_STRU_SIZE); /*-< 计算得到行数*/
				mallocLen = sizeof(DEV_TYPE_ID_HLHT_ID) * (DsuBookIpInfoStru.devTypeIdHlhtIdLen); /*-< 计算需分配空间大小*/
				DsuBookIpInfoStru.pDevTypeIdHlhtId = (DEV_TYPE_ID_HLHT_ID*)malloc(mallocLen); /*-< 调用函数分配空间*/
				if (NULL != DsuBookIpInfoStru.pDevTypeIdHlhtId) /*-< 调用函数是否成功*/
				{
					CommonMemSet(DsuBookIpInfoStru.pDevTypeIdHlhtId, mallocLen, 0, mallocLen); /*-< 清零设备通信协议表*/

					for (i = 0; i < DsuBookIpInfoStru.devTypeIdHlhtIdLen; i++) /*-< 行下标是否小于行数*/
					{
						DsuBookIpInfoStru.pDevTypeIdHlhtId[i].devTypeId = ShortFromChar(&pData[offset]); /*-< 设置设备类型ID*/
						offset += 2u; /*-< 数据下标自增2*/

						DsuBookIpInfoStru.pDevTypeIdHlhtId[i].hlhtId = LongFromChar(&pData[offset]); /*-< 设置互联互通ID*/
						offset += 4u; /*-< 数据下标自增4*/

						offset += (DSU_IP_INFO_STRU_SIZE - 6u); /*-< 数据下标自增其余行长度*/
					}
					if (offset == dataLen) /*-< 数据下标是否等于表数据长度*/
					{
						rtn = 1U; /*-< 设置函数返回值为成功*/
					}
				}
			}
		}
	}

	return rtn; /*-< 返回函数返回值*/
}

/*
*函数名:	dsuRpGetDevType
*功能描述:	根据设备名称获取设备类型
*输入参数:	UINT16 DevName	设备名称
*输入出参:	无
*输出参数:	无
*返回值:	设备类型
*/
UINT8 dsuRpGetDevType(UINT16 DevName)
{
	UINT8 devType;
	devType=(UINT8)(DevName>>8);

	return devType;
}

/*
*函数名:	dsuRpTypeId2DevName
*功能描述:	根据类型 ID获取设备名称
*输入参数:	UINT8 Type	设备类型
*			UINT8 Id	设备ID
*输入出参:	无
*输出参数:	UINT16 DevName	设备名称
*返回值:	无
*/
void dsuRpTypeId2DevName(UINT8 Type, UINT8 Id, UINT16* pDevName)
{
	*pDevName = Type;
	*pDevName = (*pDevName)*0x100 + Id;
}

/*
*函数名:	dsurRpGetProtclType
*功能描述:	根据本方名称对方名称获取协议类型
*输入参数:	UINT16 LocalName	本方名称
*			UINT16 DestName	对方名称
*输入出参:	无
*输出参数:	UINT8* protclTye	协议类型
*返回值:	1:成功;0失败
*/
UINT8 dsurRpGetProtclType(UINT16 LocalName, UINT16 DestName,UINT8* protclTye)
{
	UINT8 chReturnValue;/*函数返回值*/
	UINT16 i;/*循环用*/

	UINT8 TempEmitterType;/*发送者设备类型*/
	UINT8 TempReceptorType;/*接受者设备类型*/

	DSU_COMM_PROTCL_STRU *pTempCommProtclStru;/*通信协议表临时变量*/

	/*获取输入参数的设备类型*/
	TempEmitterType=dsuRpGetDevType(LocalName);
	TempReceptorType=dsuRpGetDevType(DestName);

	pTempCommProtclStru=DsuBookIpInfoStru.pCommProtclStru;
	for (i=0;i<DsuBookIpInfoStru.CommProtclStruLen;i++)
	{
		if ((pTempCommProtclStru->EmitterType==TempEmitterType)&&(pTempCommProtclStru->ReceptorType == TempReceptorType))
		{

			*protclTye=pTempCommProtclStru->CommuType;
			break;
		}
		pTempCommProtclStru++;
	}

	if (i==DsuBookIpInfoStru.CommProtclStruLen)
	{
		/*没有查找到需要的通信类型*/
		chReturnValue=0;
		return chReturnValue;
	}

	chReturnValue =1;
	return chReturnValue;
}

/**
 * @brief GetHlhtId 根据设备类型ID获取互联互通ID
 * @param devTypeId 设备类型ID 取值范围:0x0000-0xFFFF
 * @return 互联互通ID 取值范围:0x00000000-0xFFFFFFFF
 */
UINT32 GetHlhtId(UINT16 devTypeId)
{
	UINT32 rtnVal = 0U; /*-< 设置调用函数返回值为0*/
	UINT16 i = 0U; /*-< 设置设备类型ID对应互联互通ID数组下标为0*/

	if (NULL != DsuBookIpInfoStru.pDevTypeIdHlhtId) /*-< 设备类型ID对应互联互通ID数组是否非空*/
	{
		for (i = 0U; i < DsuBookIpInfoStru.devTypeIdHlhtIdLen; i++) /*-< 设备类型ID对应互联互通ID数组下标是否小于设备类型ID对应互联互通ID数组长度*/
		{
			if (DsuBookIpInfoStru.pDevTypeIdHlhtId[i].devTypeId == devTypeId) /*-< 设置设备类型ID对应互联互通ID数组下标的设备类型ID是否等于传入的设备类型ID*/
			{
				rtnVal = DsuBookIpInfoStru.pDevTypeIdHlhtId[i].hlhtId; /*-< 设备类型ID对应互联互通ID数组下标的互联互通ID赋值给函数返回值*/
				break; /*-< 退出遍历*/
			}
		}
	}

	return rtnVal; /*-< 返回函数返回值*/
}

/**
 * @brief GetDevTypeId 根据互联互通ID获取设备类型ID
 * @param hlhtId 互联互通ID 取值范围:0x00000000-0xFFFFFFFF
 * @return 设备类型ID 取值范围:0x0000-0xFFFF
 */
UINT16 GetDevTypeId(UINT32 hlhtId)
{
	UINT16 rtnVal = 0U; /*-< 设置调用函数返回值为0*/
	UINT16 i = 0U; /*-< 设置设备类型ID对应互联互通ID数组下标为0*/

	if (NULL != DsuBookIpInfoStru.pDevTypeIdHlhtId) /*-< 设备类型ID对应互联互通ID数组是否非空*/
	{
		for (i = 0U; i < DsuBookIpInfoStru.devTypeIdHlhtIdLen; i++) /*-< 设备类型ID对应互联互通ID数组下标是否小于设备类型ID对应互联互通ID数组长度*/
		{
			if (DsuBookIpInfoStru.pDevTypeIdHlhtId[i].hlhtId == hlhtId) /*-< 设置设备类型ID对应互联互通ID数组下标的互联互通ID是否等于传入的互联互通ID*/
			{
				rtnVal = DsuBookIpInfoStru.pDevTypeIdHlhtId[i].devTypeId; /*-< 设备类型ID对应互联互通ID数组下标的设备类型ID赋值给函数返回值*/
				break; /*-< 退出遍历*/
			}
		}
	}

	return rtnVal; /*-< 返回函数返回值*/
}