📄 amt_cmd.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 + -