LTKCPP-- LLRP Toolkit C Plus Plus Library
|
00001 00002 /* 00003 ***************************************************************************** 00004 * * 00005 * IMPINJ CONFIDENTIAL AND PROPRIETARY * 00006 * * 00007 * This source code is the sole property of Impinj, Inc. Reproduction or * 00008 * utilization of this source code in whole or in part is forbidden without * 00009 * the prior written consent of Impinj, Inc. * 00010 * * 00011 * (c) Copyright Impinj, Inc. 2007,2008. All rights reserved. * 00012 * * 00013 *****************************************************************************/ 00014 00015 00016 00017 #include <assert.h> 00018 #include <stdio.h> 00019 00020 #include "ltkcpp_platform.h" 00021 #include "ltkcpp_base.h" 00022 #include "ltkcpp_frame.h" 00023 00024 00025 namespace LLRP 00026 { 00027 00028 CFrameExtract::CFrameExtract (void) 00029 { 00030 memset(this, 0, sizeof *this); 00031 } 00032 00033 CFrameExtract::CFrameExtract ( 00034 const unsigned char * pBuffer, 00035 unsigned int nBuffer) 00036 { 00037 memset(this, 0, sizeof *this); 00038 00039 if(10u > nBuffer) 00040 { 00041 m_MessageLength = 10u; 00042 m_nBytesNeeded = m_MessageLength - nBuffer; 00043 m_eStatus = NEED_MORE; 00044 } 00045 else 00046 { 00047 llrp_u16_t VersType; 00048 00049 VersType = pBuffer[0]; 00050 VersType <<= 8u; 00051 VersType |= pBuffer[1]; 00052 00053 m_MessageLength = pBuffer[2]; 00054 m_MessageLength <<= 8u; 00055 m_MessageLength |= pBuffer[3]; 00056 m_MessageLength <<= 8u; 00057 m_MessageLength |= pBuffer[4]; 00058 m_MessageLength <<= 8u; 00059 m_MessageLength |= pBuffer[5]; 00060 00061 /* 00062 * Should we be picky about reserved bits? 00063 */ 00064 00065 m_MessageType = VersType & 0x3FFu; 00066 m_ProtocolVersion = (VersType >> 10u) & 0x7u; 00067 00068 m_MessageID = pBuffer[6]; 00069 m_MessageID <<= 8u; 00070 m_MessageID |= pBuffer[7]; 00071 m_MessageID <<= 8u; 00072 m_MessageID |= pBuffer[8]; 00073 m_MessageID <<= 8u; 00074 m_MessageID |= pBuffer[9]; 00075 00076 if(10u > m_MessageLength) 00077 { 00078 m_nBytesNeeded = 0; 00079 m_eStatus = FRAME_ERROR; 00080 } 00081 else if(nBuffer >= m_MessageLength) 00082 { 00083 m_nBytesNeeded = 0; 00084 m_eStatus = READY; 00085 } 00086 else 00087 { 00088 m_nBytesNeeded = m_MessageLength - nBuffer; 00089 m_eStatus = NEED_MORE; 00090 } 00091 } 00092 } 00093 00094 00095 }; /* namespace LLRP */ 00096