/**
* @file CM_Convert.c
* @brief 通用类型转换函数
* @author GT-BU
* @date 2021.02.01
* @version V1.1
* @copyright TCT
* @par 修改日志
* <table>
* <tr><th>Date        <th>Version  <th>Author     <th>Description
* <tr><td>2017.12.20  <td>V1.0     <td>MSCP项目组 <td>创建初始版本
* <tr><td>2021.02.01  <td>V1.1     <td>GT-BU      <td>TSCP项目集成、更新
* </table>
*/
#include "CM_Convert.h"

/**
* @brief 将2字节数据变为CM_UINT16,BIG endian
* @param pdata 输入数据
* @return 变换后的CM_UINT16值
*/
CM_UINT16 CM_ShortFromChar(IN const CM_UINT8 data[])
{
	CM_UINT16 tempshort = 0u;
    /*- 各字节按大端序填入结果 */
	tempshort = data[0];
	tempshort = (CM_UINT16)(tempshort << 8) + data[1];
    /*- 返回结果*/
	return tempshort;
}

/**
* @brief 将4字节数据变为CM_UINT32， BIG endian
* @param pdata 输入数据
* @return 变换后的CM_UINT32值
*/
CM_UINT32 CM_LongFromChar(IN const CM_UINT8 data[])
{
	CM_UINT32 templong = 0u;
    /*- 各字节按大端序填入结果 */
	templong = data[0];
	templong = (templong << 8) + data[1];
	templong = (templong << 8) + data[2];
	templong = (templong << 8) + data[3];
    /*- 返回结果 */
	return templong;
}

/**
* @brief 将8字节数据变为CM_UINT64， BIG endian
* @param pdata 输入数据
* @return 变换后的CM_UINT64值
*/
CM_UINT64 CM_64FromChar(IN const CM_UINT8 data[])
{
	CM_UINT64 temp = 0u;
    /*- 各字节按顺序填入结果 */
	temp = (CM_UINT64)(data[0]);
	temp = (temp * 256u) + data[1];
	temp = (temp * 256u) + data[2];
	temp = (temp * 256u) + data[3];
	temp = (temp * 256u) + data[4];
	temp = (temp * 256u) + data[5];
	temp = (temp * 256u) + data[6];
	temp = (temp * 256u) + data[7];
    /*- 返回结果 */
	return temp;
}

/**
* @brief 将2字节的整型变为字节表示  BIG endian
* @param val 输入变量
* @param *pOutput 输出数组
*/
void CM_ShortToChar(IN const CM_UINT16 val, OUT CM_UINT8 pOutput[])
{
    /*- 将输入变量按大端序填入输出数组 */
	pOutput[0] = (CM_UINT8)((val >> 8u) & 0xffu);
	pOutput[1] = (CM_UINT8)(val & 0xffu);
}

/**
* @brief 将4字节的整型变为字节表示  BIG endian
* @param val 输入变量
* @param *pOutput 输出数组
*/
void CM_LongToChar(IN const CM_UINT32 val, OUT CM_UINT8 pOutput[])
{
    /*- 将输入变量按大端序填入输出数组 */
	pOutput[0] = (CM_UINT8)((val >> 24u) & 0xffu);
    pOutput[1] = (CM_UINT8)((val >> 16u) & 0xffu);
    pOutput[2] = (CM_UINT8)((val >> 8u) & 0xffu);
    pOutput[3] = (CM_UINT8)(val & 0xffu);
}

/**
* @brief 将8字节的整型变为字节表示  BIG endian
* @param val 输入变量
* @param *pOutput 输出数组
*/
void CM_64ToChar(IN CM_UINT64 val,OUT CM_UINT8 pOutput[])
{
    /*- 将输入变量按大端序填入输出数组 */
	pOutput[7] = (CM_UINT8)(val & 0xffu);
	val /= 256u;
    pOutput[6] = (CM_UINT8)(val & 0xffu);
	val /= 256u;
    pOutput[5] = (CM_UINT8)(val & 0xffu);
	val /= 256u;
    pOutput[4] = (CM_UINT8)(val & 0xffu);
	val /= 256u;
    pOutput[3] = (CM_UINT8)(val & 0xffu);
	val /= 256u;
    pOutput[2] = (CM_UINT8)(val & 0xffu);
	val /= 256u;
    pOutput[1] = (CM_UINT8)(val & 0xffu);
	val /= 256u;
    pOutput[0] = (CM_UINT8)(val & 0xffu);
}

/**
* @brief 将2字节数据变为CM_UINT16,LITTLE endian
* @param pdata 输入数据
* @return 变换后的CM_UINT16值
*/
CM_UINT16 CM_ShortFromCharLE(IN const CM_UINT8 data[])
{
	/*- 变量初始化 */
    CM_UINT16 tempshort = 0u;
    /*- 各字节按小端序填入结果 */ 
    tempshort = data[1];
    tempshort = (CM_UINT16)(tempshort << 8) + data[0];
    /*- 返回结果*/
    return tempshort;
}

/**
* @brief 将4字节数据变为CM_UINT32， LITTLE endian
* @param pdata 输入数据
* @return 变换后的CM_UINT32值
*/
CM_UINT32 CM_LongFromCharLE(IN const CM_UINT8 data[])
{
	/*- 变量初始化 */
    CM_UINT32 templong = 0u;
    /*- 各字节按小端序填入结果 */
    templong = data[3];
    templong = (templong << 8) + data[2];
    templong = (templong << 8) + data[1];
    templong = (templong << 8) + data[0];
    /*- 返回结果 */
    return templong;
}

/**
* @brief 将8字节数据变为CM_UINT64， LITTLE endian
* @param pdata 输入数据
* @return 变换后的CM_UINT64值
*/
CM_UINT64 CM_64FromCharLE(IN const CM_UINT8 data[])
{
	/*- 变量初始化 */
    CM_UINT64 temp = 0u;
    /*- 各字节按顺序填入结果 */
    temp = data[7];
    temp = (temp * 256u) + data[6];
    temp = (temp * 256u) + data[5];
    temp = (temp * 256u) + data[4];
    temp = (temp * 256u) + data[3];
    temp = (temp * 256u) + data[2];
    temp = (temp * 256u) + data[1];
    temp = (temp * 256u) + data[0];
    /*- 返回结果 */
    return temp;
}

/**
* @brief 将2字节的整型变为字节表示  LITTLE endian
* @param val 输入变量
* @param *pOutput 输出数组
*/
void CM_ShortToCharLE(IN const CM_UINT16 val, OUT CM_UINT8 pOutput[])
{
    /*- 将输入变量按小端序填入输出数组 */
    pOutput[1] = (CM_UINT8)((val >> 8u) & 0xffu);
    pOutput[0] = (CM_UINT8)(val & 0xffu);
}

/**
* @brief 将4字节的整型变为字节表示  LITTLE endian
* @param val 输入变量
* @param *pOutput 输出数组
*/
void CM_LongToCharLE(IN const CM_UINT32 val, OUT CM_UINT8 pOutput[])
{
    /*- 将输入变量按小端序填入输出数组 */
    pOutput[3] = (CM_UINT8)((val >> 24u) & 0xffu);
    pOutput[2] = (CM_UINT8)((val >> 16u) & 0xffu);
    pOutput[1] = (CM_UINT8)((val >> 8u) & 0xffu);
    pOutput[0] = (CM_UINT8)(val & 0xffu);
}

/**
* @brief 将8字节的整型变为字节表示  LITTLE endian
* @param val 输入变量
* @param *pOutput 输出数组
*/
void CM_64ToCharLE(IN CM_UINT64 val, OUT CM_UINT8 pOutput[])
{
    /*- 将输入变量按小端序填入输出数组 */
    pOutput[0] = (CM_UINT8)(val & 0xffu);
    val /= 256u;
    pOutput[1] = (CM_UINT8)(val & 0xffu);
    val /= 256u;
    pOutput[2] = (CM_UINT8)(val & 0xffu);
    val /= 256u;
    pOutput[3] = (CM_UINT8)(val & 0xffu);
    val /= 256u;
    pOutput[4] = (CM_UINT8)(val & 0xffu);
    val /= 256u;
    pOutput[5] = (CM_UINT8)(val & 0xffu);
    val /= 256u;
    pOutput[6] = (CM_UINT8)(val & 0xffu);
    val /= 256u;
    pOutput[7] = (CM_UINT8)(val & 0xffu);
}
