
/*******************************************************************************
* 文件名    ：  CommonRecord.c
* 版权说明  ：  
* 版本号    ：  1.0  
* 创建时间  ：  2009.11.12
* 作者      ：  车载及协议部
* 功能描述  ：  记录函数的源文件，可调用该文件中的函数将字符型或二进制型的数据写入记录数组
                记录数组前两位为当前写入数组的字节数，从第三个字节开始为需要写入记录数组的数据
* 使用注意  ： 
                无
* 修改记录  ：  
                无
*******************************************************************************/


#include "CommonRecord.h"


static const CHAR HexTable[16] = {(UINT8)'0',(UINT8)'1',(UINT8)'2',(UINT8)'3',
	(UINT8)'4',(UINT8)'5',(UINT8)'6',(UINT8)'7',(UINT8)'8',(UINT8)'9',(UINT8)'A',(UINT8)'B',(UINT8)'C',(UINT8)'D',(UINT8)'E',(UINT8)'F'};

/******************************************************************************************
* 功能描述      : 以字符形式向文件记录数组中写入一个字符，该种形式的记录可直接查看，
                  记录数组中存储的是需要记录的数据的ASCII码。
                  如{'a'}，存储为{97,即0x61}
* 输入参数      : UINT16 RecArraySize            记录数组大小
                  UINT8 c                        需要写入的字符
* 输入输出参数  : UINT8 *RecArray                记录数组的头指针
* 输出参数      :
* 全局变量      : 
* 返回值        : 写入正常返回1，记录空间不够返回0        
*******************************************************************************************/
UINT8 PrintFilec(UINT8 RecArray[], UINT16 RecArraySize, UINT8 c)/* %RELAX<MISRA_8_10> */
{
    UINT16  ArrayIndex = 0u;
    UINT8  ret = 0u;
    
    if(NULL == RecArray)
    {
    	ret = 0u;
    }
	else
	{
		ArrayIndex = ShortFromChar(RecArray) + 2u;
		if(10u > (RecArraySize - ArrayIndex))
		{
			ret = 0u;
		}
		else
		{
			RecArray[ArrayIndex++] = c;
			ShortToChar((UINT16) (ArrayIndex - 2u),RecArray);
			ret = 1u;
		}

	}
    
    return ret;
}


/******************************************************************************************
* 功能描述      : 以字符形式向文件记录数组中写入N个Hex，该种形式的记录可直接查看，
                  记录数组中存储的是需要记录的数据的ASCII码。
                  如{0x12,0x34}，存储为{0x31，0x32，0x33，0x34}
* 输入参数      : UINT16 RecArraySize            记录数组大小
                  UINT8 *HexSrc                  需要写入Hex数据的头指针
                  UINT16 Length                  需要写入Hex数据的长度
* 输入输出参数  : UINT8 *RecArray                记录数组的头指针
* 输出参数      :
* 全局变量      : 
* 返回值        : 写入正常返回1，记录空间不够返回0        
*******************************************************************************************/
UINT8 PrintFileHex(UINT8 *RecArray, UINT16 RecArraySize, UINT8 *HexSrc, UINT16 Length)/* %RELAX<MISRA_8_10> */
{
    UINT16 i = 0u;
    UINT8 ret = 0u;
	UINT8 PrintFilecRtn = 0u;

	if((NULL == RecArray) || (NULL == HexSrc))
	{
		ret = 0u;
		
	}
	else
	{
		for(i = 0u; i < Length; i++)
		{
			PrintFilecRtn = PrintFilec(RecArray, RecArraySize, (UINT8)HexTable[*HexSrc>>4u]);
			if(0u == PrintFilecRtn)
			{
				ret = 0u;
			}
			else
			{
				/*写入成功*/
				ret = 1u;
			}
        
			if(0u!= ret)
			{
				PrintFilecRtn = PrintFilec(RecArray, RecArraySize, (UINT8)HexTable[*HexSrc & 0x0fu]);
				if(0u == PrintFilecRtn)
				{
					ret = 0u;
				}
				else
				{
					/*写入成功*/ 
					ret = 1u;
				}
			}
        
			if(0u!= ret)
			{
				PrintFilecRtn = PrintFilec(RecArray, RecArraySize,' ');
				if(0u == PrintFilecRtn)
				{
					ret = 0u;
				}
				else
				{
					/*写入成功*/  
					ret = 1u;
					HexSrc++;
				}
			}
			if(0u == ret)
			{
				break;
			}
       
		}

	}
	return ret;
}


/******************************************************************************************
* 功能描述      : 以字符形式向文件记录数组中写入一个字符串，该种形式的记录可直接查看，
                  记录数组中存储的是需要记录的数据的ASCII码。
                  如"1234"，存储为{0x31，0x32，0x33，0x34}={"1234"}
* 输入参数      : UINT16 RecArraySize            记录数组大小
                  CHAR *StringSrc                需要写入字符串的头指针
* 输入输出参数  : UINT8 *RecArray                记录数组的头指针
* 输出参数      :
* 全局变量      : 
* 返回值        : 写入正常返回1，记录空间不够返回0        
*******************************************************************************************/
UINT8 PrintFiles(UINT8 *RecArray, UINT16 RecArraySize, CHAR *StringSrc)/* %RELAX<MISRA_8_10> */
{
    UINT8 ret = 0u;
    UINT8 PrintFilecRtn = 0u;
	if((NULL == RecArray) || (NULL == StringSrc))
	{
		ret = 0u;
	}
	else
	{
		while(0u != *StringSrc)
		{
			PrintFilecRtn = PrintFilec(RecArray, RecArraySize, (UINT8)*StringSrc);
			if(0u == PrintFilecRtn)
			{
				ret = 0u;
				break;
			}
			else
			{
				/*写入成功*/  
				ret = 1u;
			}
        
			StringSrc++;
		}
	}
	return ret;
}



/******************************************************************************************
* 功能描述      : 以字符形式向文件记录数组中写入一个Hex型的short(16bit)，该种形式的记录可直接查看，
                  记录数组中存储的是需要记录的数据的ASCII码。
                  如{0x1234}，存储为{0x31，0x32，0x33，0x34}
* 输入参数      : UINT16 RecArraySize            记录数组大小
                  UINT16 HexSrc                  需要写入的Short型数据
* 输入输出参数  : UINT8 *RecArray                记录数组的头指针
* 输出参数      :
* 全局变量      : 
* 返回值        : 写入正常返回1，记录空间不够返回0        
*******************************************************************************************/
UINT8 PrintFileU16Hex(UINT8 *RecArray, UINT16 RecArraySize, UINT16 HexSrc)/* %RELAX<MISRA_8_10> */
{
    UINT16 j = 0u;
	CHAR TempChar[7] ={0};
    UINT8 ret = 0u;
	UINT8 PrintFilesRtn = 0u;
  
	if(NULL == RecArray)
	{
		ret = 0u;
	}
	else
	{

		for(j = 4u; j > 0u; j--)
		{
			TempChar[j] = HexTable[HexSrc & 0x0fu];
			HexSrc = HexSrc >> 4u;
		}
		TempChar[0] = 'x';
		TempChar[5] = ' ';
		TempChar[6] = '\0';
		
		PrintFilesRtn = PrintFiles(RecArray, RecArraySize, TempChar);
		if(0u == PrintFilesRtn)
		{
			ret = 0u;
		}
		else
		{
			/*写入成功*/ 
			ret = 1u;
		}

	}
	return ret;
}


/******************************************************************************************
* 功能描述      : 以字符形式向文件记录数组中写入一个Hex型的long(32bit)，该种形式的记录可直接查看，
                  记录数组中存储的是需要记录的数据的ASCII码。
                  如{0x12345678}，存储为{0x31，0x32，0x33，0x34,0x35,0x36,0x37,0x38}
* 输入参数      : UINT16 RecArraySize            记录数组大小
                  UINT32 HexSrc                  需要写入的long型数据
* 输入输出参数  : UINT8 *RecArray                记录数组的头指针
* 输出参数      :
* 全局变量      : 
* 返回值        : 写入正常返回1，记录空间不够返回0        
*******************************************************************************************/
UINT8 PrintFileU32Hex(UINT8 *RecArray, UINT16 RecArraySize, UINT32 HexSrc)/* %RELAX<MISRA_8_10> */
{
    UINT16 j = 0u;
	CHAR TempChar[11] = {0};
    UINT8 ret = 0u;
    UINT8 PrintFilesRtn = 0u;

	if(NULL == RecArray)
	{
		ret = 0u;
	}
	else
	{

		for(j = 8u; j > 0u; j--)
		{
			TempChar[j] = HexTable[HexSrc & 0x0fu];
			HexSrc = HexSrc >> 4u;
		}
		TempChar[0] = 'x';
		TempChar[9] = ' ';
		TempChar[10] = '\0';
    
		PrintFilesRtn = PrintFiles(RecArray, RecArraySize, TempChar);
		if(0u == PrintFilesRtn)
		{
			ret = 0u;
		}
		else
		{
			/*无操作*/ 
			ret = 1u;
		}
	}
    return ret;
}



/******************************************************************************************
* 功能描述      : 以字符形式向文件记录数组中写入一个Int型的long(16bit)，该种形式的记录可直接查看，
                  记录数组中存储的是需要记录的数据的ASCII码。
                  如{305397760，十六进制表示为0x12340000}，存储为{0x31，0x32，0x33，0x34,0x30,0x30,0x30,0x30}
* 输入参数      : UINT16 RecArraySize            记录数组大小
                  UINT32 IntSrc                  需要写入的int型数据
* 输入输出参数  : UINT8 *RecArray                记录数组的头指针
* 输出参数      :
* 全局变量      : 
* 返回值        : 写入正常返回1，记录空间不够返回0        
*******************************************************************************************/
UINT8 PrintFileU32Int(UINT8 *RecArray, UINT16 RecArraySize, UINT32 IntSrc)/* %RELAX<MISRA_8_10> */
{
    INT16 i = 0;
    CHAR char_temp[11]={0};
    UINT8 ret = 0u;
    UINT8 PrintFilesRtn = 0u;

	if(NULL == RecArray)
	{
		ret = 0u;
	}
	else
	{
		for(i=9;i>=0;i--)
		{
			char_temp[i]='0'+ (UINT8)(IntSrc%10u);
			IntSrc/=10u;
		} 
		for(i=0;i<9;i++)
		{
			if('0' != char_temp[i])
			{
				break;    
			}
			else
			{
				/*无操作*/    
			}        
		}
		char_temp[10u] = '\0';
		PrintFilesRtn = PrintFiles(RecArray, RecArraySize, &char_temp[i]);
		if(0u == PrintFilesRtn)
		{
			ret = 0u;
		}
		else
		{
			/*无操作*/
			ret = 1u;
		}
		
	}
    return ret;
}



/******************************************************************************************
* 功能描述      : 以二进制形式向文件记录数组中写入一个字节
                  二进制形式举例：{0x12}，存储为{0x12}
* 输入参数      : UINT16 RecArraySize            记录数组大小
                  UINT8 ByteData                 需要写入的字节
* 输入输出参数  : UINT8 *RecArray                记录数组的头指针
* 输出参数      :
* 全局变量      : 
* 返回值        : 写入正常返回1，记录空间不够返回0        
*******************************************************************************************/
UINT8 PrintRecArrayByte(UINT8 RecArray[], UINT16 RecArraySize,  UINT8 ByteData)/* %RELAX<MISRA_8_10> */
{
    register UINT16 RecLength = 0u;
    UINT8 ret = 0u;
    
	if(NULL == RecArray)
	{
		ret = 0u;
	}
	else
	{
		RecLength = ShortFromChar(RecArray);
		RecLength += 2u;

		if((RecLength + 1u) > RecArraySize)   /*得到数组长度，前一语句长度+ 2，是记录的数据加长度占据的空间再加1字节写入的 > RecArraySize 则不能继续写入*/
		{
			ret = 0u;
		}
		else
		{
			RecArray[RecLength] = ByteData;
			RecLength--;    /*减去长度字节再+1*/
			ShortToChar(RecLength,RecArray);
			ret = 1u;
			
		}
	}
	return ret;
}



/******************************************************************************************
* 功能描述      : 以二进制形式小端方式向文件记录数组中写入两个字节
                  二进制形式举例：{0x1234}，存储为{0x34，0x12}
* 输入参数      : UINT16 RecArraySize            记录数组大小
                  UINT16 BytesData               需要写入的字节
* 输入输出参数  : UINT8 *RecArray                记录数组的头指针
* 输出参数      :
* 全局变量      : 
* 返回值        : 写入正常返回1，记录空间不够返回0        
*******************************************************************************************/
UINT8 PrintRecArray2ByteL(UINT8 RecArray[], UINT16 RecArraySize, UINT16 BytesData)/* %RELAX<MISRA_8_10> */
{
    register UINT16 RecLength = 0u;
    UINT8 ret = 0u;
    
	if(NULL == RecArray)
	{
		ret = 0u;
	}
	else
	{

		RecLength = ShortFromChar(RecArray);
		RecLength += 2u;
  
		if(RecLength + 2u > RecArraySize)
		{
			ret = 0u;
		}
		else
		{
			RecArray[RecLength++] = (UINT8)(BytesData & 0xffu);
			RecArray[RecLength] = (UINT8)((BytesData >> 8u) & 0xffu);
			RecLength--;
			ShortToChar(RecLength,RecArray);
			ret = 1u;
			
		}
	}
	return ret;
}



/******************************************************************************************
* 功能描述      : 以二进制形式大端方式向文件记录数组中写入两个字节
                  二进制形式举例：{0x1234}，存储为{0x12，0x34}
* 输入参数      : UINT16 RecArraySize            记录数组大小
                  UINT16 BytesData               需要写入的字节
* 输入输出参数  : UINT8 *RecArray                记录数组的头指针
* 输出参数      :
* 全局变量      : 
* 返回值        : 写入正常返回1，记录空间不够返回0        
*******************************************************************************************/
UINT8 PrintRecArray2ByteB(UINT8 RecArray[], UINT16 RecArraySize, UINT16 BytesData)/* %RELAX<MISRA_8_10> */
{
    register UINT16 RecLength;
    UINT8 ret = 0u;
    
	if(NULL == RecArray)
	{
		ret = 0u;
	}
	else
	{

		RecLength = ShortFromChar(RecArray);
		RecLength += 2u;

		if(RecLength + 2u > RecArraySize)
		{
			ret = 0u;
		}
		else
		{
			RecArray[RecLength++] = (UINT8)((BytesData >> 8u) & 0xffu);
			RecArray[RecLength] = (UINT8)(BytesData & 0xffu);
			RecLength--;
			ShortToChar(RecLength,RecArray);
			ret = 1u;
		}
	}
	return ret;
}



/******************************************************************************************
* 功能描述      : 以二进制形式小端方式向文件记录数组中写入四个字节
                  二进制形式举例：{0x12345678}，存储为{0x78，0x56，0x34，0x12}
* 输入参数      : UINT16 RecArraySize            记录数组大小
                  UINT32 BytesData               需要写入的字节
* 输入输出参数  : UINT8 *RecArray                记录数组的头指针
* 输出参数      :
* 全局变量      : 
* 返回值        : 写入正常返回1，记录空间不够返回0        
*******************************************************************************************/
UINT8 PrintRecArray4ByteL(UINT8 RecArray[], UINT16 RecArraySize, UINT32 BytesData)/* %RELAX<MISRA_8_10> */
{
    register UINT16 RecLength;
    UINT8 ret = 0u;
    
	if(NULL == RecArray)
	{
		ret = 0u;
	}
	else
	{
		RecLength = ShortFromChar(RecArray);
		RecLength += 2u;

		if(RecLength + 4u > RecArraySize)
		{
			ret = 0u;
		}
		else
		{
			RecArray[RecLength++] = (UINT8) (BytesData & 0xffu);
			RecArray[RecLength++] = (UINT8) ((BytesData >> 8u) & 0xffu);
			RecArray[RecLength++] = (UINT8) ((BytesData >> 16u) & 0xffu);
			RecArray[RecLength] = (UINT8) ((BytesData >> 24u) & 0xffu);
			RecLength--;
			ShortToChar(RecLength,RecArray);
			ret = 1u;
		}
	}
	return ret;
}



/******************************************************************************************
* 功能描述      : 以二进制形式大端方式向文件记录数组中写入四个字节
                  二进制形式举例：{0x12345678}，存储为{0x12，0x34,0x56,0x78}
* 输入参数      : UINT16 RecArraySize            记录数组大小
                  UINT32 BytesData               需要写入的字节
* 输入输出参数  : UINT8 *RecArray                记录数组的头指针
* 输出参数      :
* 全局变量      : 
* 返回值        : 写入正常返回1，记录空间不够返回0        
*******************************************************************************************/
UINT8 PrintRecArray4ByteB(UINT8 RecArray[], UINT16 RecArraySize, UINT32 BytesData)/* %RELAX<MISRA_8_10> */
{
    register UINT16 RecLength;
    UINT8 ret = 0u;
    
	if(NULL == RecArray)
	{
		ret = 0u;
	}
	else
	{
		RecLength = ShortFromChar(RecArray);
		RecLength += 2u;

		if(RecLength + 4u > RecArraySize)
		{
			ret = 0u;
		}
		else
		{
			RecArray[RecLength++] = (UINT8) ((BytesData >> 24u) & 0xffu);
			RecArray[RecLength++] = (UINT8) ((BytesData >> 16u) & 0xffu);
			RecArray[RecLength++] = (UINT8) ((BytesData >> 8u) & 0xffu);
			RecArray[RecLength] = (UINT8) (BytesData & 0xffu);
			RecLength--;
			ShortToChar(RecLength,RecArray);
			ret = 1u;
		}
	}
	return ret;

}



/******************************************************************************************
* 功能描述      : 以二进制形式向文件记录数组中写入N个字节
                  二进制形式举例：{0x12,0x34}，存储为{0x12，0x34}
* 输入参数      : UINT16 RecArraySize            记录数组大小
                  UINT8 *pBytesData              需要写入的数据的头指针
                  UINT16 Length                  需要写入的字节数
* 输入输出参数  : UINT8 *RecArray                记录数组的头指针
* 输出参数      :
* 全局变量      : 
* 返回值        : 写入正常返回1，记录空间不够返回0        
*******************************************************************************************/
UINT8 PrintRecArrayNByte(UINT8 *RecArray, UINT16 RecArraySize,UINT8 *pBytesData, UINT16 Length)/* %RELAX<MISRA_8_10> */
{
    register UINT16 RecLength;
    UINT16 i = 0u;
    UINT8 ret = 0u;
    
	if((NULL == RecArray) || (NULL == pBytesData))
	{
		ret = 0u;
	}
	else
	{
		RecLength = ShortFromChar(RecArray);
		RecLength += 2u;
  
		if(RecLength + Length > RecArraySize)
		{
			ret = 0u;
		}
		else
		{
			for(i = 0u; i < Length; i++)
			{
				RecArray[RecLength++] = *(pBytesData++);
			}
			RecLength -= 2u;
			ShortToChar(RecLength,RecArray);
			ret = 1u;
		}
	}
	return ret;
}

