⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 amt_cmd.c

📁 lab windows uart driver
💻 C
字号:
/****************************************************************
*  COPYRIGHT DaTang Mobile Communications Equipment CO.,LTD		*
****************************************************************/
/****************************************************************
 * FileName:	amt_cmd.c
 * version: 1.00
 * Purpose: 
 * Authors: songbingfeng	2005-3-8 16:11:13
 * Notes: 
 ****************************************************************/

#include <stdio.h>
#include "amthead.h"

/*******************************************************
** 函数名	: amt_clear_buf
** 功能描述	: 清空缓冲区
** 输入参数	: void* cmdbuf_ptr
** 输入参数	: UINT32 nLength
** 输出参数	: 无
** 返回值	: void 
** 备注	:
*******************************************************/
void amt_clear_buf(void* cmdbuf_ptr,USINT32 nLength)
{
	memset(cmdbuf_ptr,0,nLength);
}

/*******************************************************
** 函数名	: amt_get_atom_point
** 功能描述	: 获得属性的起始地址
** 输入参数	: void* cmdbuf_ptr
** 输入参数	: MAN_AMT_ATOM atom_en
** 输出参数	: 无
** 返回值	: CHAR* 
** 备注	: 返回的指针仅仅包含长度和数据
*******************************************************/
CHAR* amt_get_atom_point(void* cmdbuf_ptr,MAN_AMT_ATOM atom_en)
{
	UINT16 nLength = 0;
	UINT16 nCount = 0;
	UINT8 uHead = 0;
	UINT16 uSize = 0;
	
	CHAR* pCommand = NULL;
	CHAR* cmd_ptr = (CHAR*)cmdbuf_ptr;
	pCommand = cmd_ptr + 4;
	
	memcpy(&nLength,pCommand,2);
	pCommand += 2;
	
	while (nCount < nLength)
	{
		memcpy(&uHead,pCommand,1);
		if (uHead != AMT_ATOM_HEAD)
			return NULL;
		
		pCommand += 1;
		memcpy(&uHead,pCommand,1);
		
		pCommand += 1 + 1;
		if (atom_en == uHead)
		{
			return pCommand;
		}
		else
		{
			memcpy(&uSize,pCommand,2);
			pCommand += uSize + 2;
			nCount += uSize + 1 + 1 + 1 + 2;
		}
	}
	
	return NULL;
}

/*******************************************************
** 函数名	: amt_add_msglength
** 功能描述	: 写入总长度和命令长度
** 输入参数	: void* cmdbuf_ptr
** 输入参数	: USINT32 nLength
** 输出参数	: 无
** 返回值	: void 
** 备注	:
*******************************************************/
void amt_add_msglength(void* cmdbuf_ptr,USINT32 nLength)
{
	CHAR* cmd_ptr = (CHAR*)cmdbuf_ptr;
	UINT16 uLength = (UINT16)amt_get_buf_length(cmdbuf_ptr);
	
	uLength += nLength;
	memcpy(cmd_ptr,&uLength,2);
	
	cmd_ptr += 4;
	uLength -= 6;
	memcpy(cmd_ptr,&uLength,2);
}

/*******************************************************
** 函数名	: amt_get_end_point
** 功能描述	: 获得已经使用的缓冲区末尾指针
** 输入参数	: void* cmdbuf_ptr
** 输出参数	: 无
** 返回值	: CHAR* 
** 备注	:
*******************************************************/
CHAR* amt_get_end_point(void* cmdbuf_ptr)
{
	CHAR* cmd_ptr = (CHAR*)cmdbuf_ptr;
	UINT16 uLength = (UINT16)amt_get_buf_length(cmdbuf_ptr);
	
	cmd_ptr += uLength;
	return cmd_ptr;
}

/*******************************************************
** 函数名	: amt_set_commandtype
** 功能描述	: 写入命令类型
** 输入参数	: void* cmdbuf_ptr
** 输入参数	: MAN_AMT_COMMAND Command_en
** 输出参数	: 无
** 返回值	: void 
** 备注	: 格式为 整个长度 | 命令标识 | 命令枚举 | 命令长度
					2			1			1		2
*******************************************************/
void amt_set_commandtype(void* cmdbuf_ptr, MAN_AMT_COMMAND Command_en)
{
	UINT8 uCmdHead = AMT_COMMAND_HEAD;
	UINT8 uCmd = Command_en;
	CHAR* cmd_ptr = (CHAR*)cmdbuf_ptr;
	
	amt_clear_buf(cmdbuf_ptr,AMT_COMMAND_BUF_LENGTH);
	
	cmd_ptr += 2;
	memcpy(cmd_ptr,&uCmdHead,1);
	cmd_ptr += 1;
	memcpy(cmd_ptr,&uCmd,1);
	cmd_ptr += 1;
	
	amt_add_msglength(cmdbuf_ptr,6);
}

/*******************************************************
** 函数名	: amt_set_int
** 功能描述	: 
** 输入参数	: void* cmdbuf_ptr
** 输入参数	: MAN_AMT_ATOM atom_en
** 输入参数	: USINT32 nData
** 输出参数	: 无
** 返回值	: void 
** 备注	: 格式为:
			属性标识	1
			属性号		1
			属性类型	1
			属性长度	2
			属性内容	4
*******************************************************/
void amt_set_int(void* cmdbuf_ptr,MAN_AMT_ATOM atom_en,USINT32 nData)
{
	UINT8 uAtomHead = AMT_ATOM_HEAD;
	UINT8 uType = AMT_INTTYPE;
	UINT8 uAtom = atom_en;
	UINT16 uSize = 4;
	
	CHAR* cmd_ptr = amt_get_end_point(cmdbuf_ptr);
	
	memcpy(cmd_ptr,&uAtomHead,1);
	cmd_ptr += 1;
	memcpy(cmd_ptr,&uAtom,1);
	cmd_ptr += 1;
	memcpy(cmd_ptr,&uType,1);
	cmd_ptr += 1;
	memcpy(cmd_ptr,&uSize,2);
	cmd_ptr += 2;
	memcpy(cmd_ptr,&nData,4);
	
	uSize = 1 + 1 + 1 + 2 + 4;
	amt_add_msglength(cmdbuf_ptr,uSize);
}

/*******************************************************
** 函数名	: amt_set_bool
** 功能描述	: 
** 输入参数	: void* cmdbuf_ptr
** 输入参数	: MAN_AMT_ATOM atom_en
** 输入参数	: BOOL bData
** 输出参数	: 无
** 返回值	: void 
** 备注	: 格式为:
			属性标识	1
			属性号		1
			属性类型	1
			属性长度	2
			属性内容	1
*******************************************************/
void amt_set_bool(void* cmdbuf_ptr,MAN_AMT_ATOM atom_en,BOOL bData)
{
	UINT8 uAtomHead = AMT_ATOM_HEAD;
	UINT8 uType = AMT_BOOLTYPE;
	UINT8 uAtom = atom_en;
	UINT16 uSize = 1;
	
	CHAR* cmd_ptr = amt_get_end_point(cmdbuf_ptr);
	
	memcpy(cmd_ptr,&uAtomHead,1);
	cmd_ptr += 1;
	memcpy(cmd_ptr,&uAtom,1);
	cmd_ptr += 1;
	memcpy(cmd_ptr,&uType,1);
	cmd_ptr += 1;
	memcpy(cmd_ptr,&uSize,2);
	cmd_ptr += 2;
	memcpy(cmd_ptr,&bData,1);
	
	uSize = 1 + 1 + 1 + 2 + 1;
	amt_add_msglength(cmdbuf_ptr,uSize);
}

/*******************************************************
** 函数名	: amt_set_bytes
** 功能描述	: 
** 输入参数	: void* cmdbuf_ptr
** 输入参数	: MAN_AMT_ATOM atom_en
** 输入参数	: void* pBuf
** 输入参数	: USINT32 nLength
** 输出参数	: 无
** 返回值	: void 
** 备注	:
*******************************************************/
void amt_set_bytes(void* cmdbuf_ptr,MAN_AMT_ATOM atom_en,void* pBuf,USINT32 nLength)
{
	UINT8 uAtomHead = AMT_ATOM_HEAD;
	UINT8 uType = AMT_BYTETYPE;
	UINT8 uAtom = atom_en;
	UINT16 uSize = nLength;
	
	CHAR* cmd_ptr = amt_get_end_point(cmdbuf_ptr);
	
	memcpy(cmd_ptr,&uAtomHead,1);
	cmd_ptr += 1;
	memcpy(cmd_ptr,&uAtom,1);
	cmd_ptr += 1;
	memcpy(cmd_ptr,&uType,1);
	cmd_ptr += 1;
	memcpy(cmd_ptr,&uSize,2);
	cmd_ptr += 2;
	memcpy(cmd_ptr,pBuf,nLength);
	
	uSize = 1 + 1 + 1 + 2 + nLength;
	amt_add_msglength(cmdbuf_ptr,uSize);
}

/*******************************************************
** 函数名	: amt_set_string
** 功能描述	: 
** 输入参数	: void* cmdbuf_ptr
** 输入参数	: MAN_AMT_ATOM atom_en
** 输入参数	: const CHAR* pBuf
** 输出参数	: 无
** 返回值	: void 
** 备注	:
*******************************************************/
void amt_set_string(void* cmdbuf_ptr,MAN_AMT_ATOM atom_en,const CHAR* pBuf)
{
	UINT8 uAtomHead = AMT_ATOM_HEAD;
	UINT8 uType = AMT_STRINGTYPE;
	UINT8 uAtom = atom_en;
	UINT16 uSize = 0;
	
	CHAR* cmd_ptr = amt_get_end_point(cmdbuf_ptr);
	uSize = strlen(pBuf);
	
	memcpy(cmd_ptr,&uAtomHead,1);
	cmd_ptr += 1;
	memcpy(cmd_ptr,&uAtom,1);
	cmd_ptr += 1;
	memcpy(cmd_ptr,&uType,1);
	cmd_ptr += 1;
	memcpy(cmd_ptr,&uSize,2);
	cmd_ptr += 2;
	memcpy(cmd_ptr,pBuf,uSize);
	
	uSize = 1 + 1 + 1 + 2 + uSize;
	amt_add_msglength(cmdbuf_ptr,uSize);
}

/*******************************************************
** 函数名	: amt_get_commandtype
** 功能描述	: 
** 输入参数	: void* cmdbuf_ptr
** 输出参数	: 无
** 返回值	: MAN_AMT_COMMAND 
** 备注	:
*******************************************************/
MAN_AMT_COMMAND amt_get_commandtype(void* cmdbuf_ptr)
{
	UINT8 uType = 0;
	CHAR* cmd_ptr = (CHAR*)cmdbuf_ptr;
	cmd_ptr += 2 + 1;
	
	memcpy(&uType,cmd_ptr,1);
	return uType;
}

/*******************************************************
** 函数名	: amt_get_int
** 功能描述	: 
** 输入参数	: void* cmdbuf_ptr
** 输入参数	: MAN_AMT_ATOM atom_en
** 输出参数	: 无
** 返回值	: USINT32 
** 备注	:
*******************************************************/
USINT32 amt_get_int(void* cmdbuf_ptr,MAN_AMT_ATOM atom_en)
{
	USINT32 nData = 0;
	CHAR* atom_addr_ptr = amt_get_atom_point(cmdbuf_ptr,atom_en);
	if (atom_addr_ptr)
	{
		UINT16 nAtomLength = 0;
		memcpy(&nAtomLength,atom_addr_ptr,2);
		
		atom_addr_ptr += 2;
		memcpy(&nData,atom_addr_ptr,nAtomLength);
	}
	
	return nData;
}

/*******************************************************
** 函数名	: amt_get_bool
** 功能描述	: 
** 输入参数	: void* cmdbuf_ptr
** 输入参数	: MAN_AMT_ATOM atom_en
** 输出参数	: 无
** 返回值	: BOOL
** 备注	:
*******************************************************/
BOOL amt_get_bool(void* cmdbuf_ptr,MAN_AMT_ATOM atom_en)
{
	BOOL bData = TRUE;
	CHAR* atom_addr_ptr = amt_get_atom_point(cmdbuf_ptr,atom_en);
	if (atom_addr_ptr)
	{
		UINT16 nAtomLength = 0;
		memcpy(&nAtomLength,atom_addr_ptr,2);
		
		atom_addr_ptr += 2;
		memcpy(&bData,atom_addr_ptr,nAtomLength);
	}
	
	return bData;
}

/*******************************************************
** 函数名	: amt_get_bytes
** 功能描述	: 
** 输入参数	: void* cmdbuf_ptr
** 输入参数	: MAN_AMT_ATOM atom_en
** 输入参数	: USINT32 nLength
** 输出参数	: void* pBuf
** 返回值	: USINT32 
** 备注	: 
*******************************************************/
USINT32 amt_get_bytes(void* cmdbuf_ptr,MAN_AMT_ATOM atom_en,void* pBuf,USINT32 nLength)
{
	CHAR* atom_addr_ptr = amt_get_atom_point(cmdbuf_ptr,atom_en);
	if (atom_addr_ptr)
	{
		UINT16 nAtomLength = 0;
		memcpy(&nAtomLength,atom_addr_ptr,2);
		if (nLength == 0)
			return nAtomLength;
		
		memset(pBuf,0,nLength);
		if (nLength < nAtomLength)
			nAtomLength = nLength;
		
		atom_addr_ptr += 2;
		memcpy(pBuf,atom_addr_ptr,nAtomLength);
		return nAtomLength;
	}
	
	return 0;
}

/*******************************************************
** 函数名	: amt_get_string
** 功能描述	: 
** 输入参数	: void* cmdbuf_ptr
** 输入参数	: MAN_AMT_ATOM atom_en
** 输入参数	: USINT32 nLength
** 输出参数	: void* recivebuf_prt
** 返回值	: USINT32 
** 备注	:
*******************************************************/
USINT32 amt_get_string(void* cmdbuf_ptr,MAN_AMT_ATOM atom_en,void* recivebuf_prt,USINT32 nLength)
{
	CHAR* atom_addr_ptr = amt_get_atom_point(cmdbuf_ptr,atom_en);
	if (atom_addr_ptr)
	{
		UINT16 nAtomLength = 0;
		memcpy(&nAtomLength,atom_addr_ptr,2);
		if (nLength == 0)
			return nAtomLength + 1;
		
		memset(recivebuf_prt,0,nLength);
		if (nLength < nAtomLength)
			nAtomLength = nLength - 1;
		
		atom_addr_ptr += 2;
		memcpy(recivebuf_prt,atom_addr_ptr,nAtomLength);
		return nAtomLength;
	}
	
	return 0;
}

/*******************************************************
** 函数名	: amt_get_commandbuf
** 功能描述	: 从缓冲区中取出命令字节流
** 输入参数	: void* cmdbuf_ptr
** 输入参数	: USINT32 nLength
** 输出参数	: void* pBuf
** 返回值	: USINT32 
** 备注	:
*******************************************************/
USINT32 amt_get_commandbuf(void* cmdbuf_ptr,void* pBuf,USINT32 nLength)
{
	//先获得总长度
	UINT16 uBufLen = 0;
	memcpy(&uBufLen,cmdbuf_ptr,2);
	
	if (nLength == 0)
		return uBufLen;
	
	memset(pBuf,0,nLength);
	if (uBufLen > nLength)
	{
		printf("buffer is too small!!! [amt_get_commandbuf]\n");
		return 0;
	}
	
	memcpy(pBuf,cmdbuf_ptr,uBufLen);
	return uBufLen;
}

/*******************************************************
** 函数名	: amt_put_commandbuf
** 功能描述	: 将命令字节流放到缓冲区中,准备进行解析
** 输入参数	: void* cmdbuf_ptr
** 输入参数	: USINT32 nLength
** 输出参数	: void* pBuf
** 返回值	: void 
** 备注	: 实行内存拷贝
*******************************************************/
void amt_put_commandbuf(void* cmdbuf_ptr,void* pBuf,USINT32 nLength)
{
	amt_clear_buf(cmdbuf_ptr,AMT_COMMAND_BUF_LENGTH);
	if (nLength < AMT_COMMAND_BUF_LENGTH)
	{
		memcpy(cmdbuf_ptr,pBuf,nLength);
	}
	else
	{
		printf("command size is larger than buffer!!! [amt_put_commandbuf]\n");
	}
}

/*******************************************************
** 函数名	: amt_get_buf_length
** 功能描述	: 获得整个缓冲区实际使用的长度
** 输入参数	: void* cmdbuf_prt
** 输出参数	: 无
** 返回值	: USINT32 
** 备注	:
*******************************************************/
USINT32 amt_get_buf_length(void* cmdbuf_ptr)
{
	CHAR* cmd_ptr = (CHAR*)cmdbuf_ptr;
	UINT16 uLength = 0;
	memcpy(&uLength,cmd_ptr,2);
	return uLength;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -