ltkcpp_frameextract.cpp

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 

Generated on Wed Jun 6 11:55:49 2012 for LTKCPP-- LLRP Toolkit C Plus Plus Library by  doxygen 1.5.9