LTKCPP-- LLRP Toolkit C Plus Plus Library
Library/ltkcpp_frame.h
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 
00029 namespace LLRP
00030 {
00031 class CFrameExtract;
00032 class CFrameDecoder;
00033 class CFrameDecoderStream;
00034 class CFrameEncoder;
00035 class CFrameEncoderStream;
00036 
00037 class CFrameExtract
00038 {
00039   public:
00040     enum {
00041         UNKNOWN,
00042         READY,
00043         FRAME_ERROR,
00044         NEED_MORE
00045     }                           m_eStatus;
00046 
00047     llrp_u32_t                  m_MessageLength;
00048     llrp_u16_t                  m_MessageType;
00049     llrp_u8_t                   m_ProtocolVersion;
00050     llrp_u32_t                  m_MessageID;
00051 
00052     unsigned int                m_nBytesNeeded;
00053 
00054     CFrameExtract (void);
00055 
00056     CFrameExtract (
00057       const unsigned char *     pBuffer,
00058       unsigned int              nBuffer);
00059 };
00060 
00061 class CFrameDecoder : public CDecoder
00062 {
00063     friend class CFrameDecoderStream;
00064 
00065   public:
00066     CFrameDecoder (
00067       const CTypeRegistry *     pTypeRegistry,
00068       unsigned char *           pBuffer,
00069       unsigned int              nBuffer);
00070 
00071     ~CFrameDecoder (void);
00072 
00073     CMessage *
00074     decodeMessage (void);
00075 
00076   private:
00077     unsigned char *             m_pBuffer;
00078     unsigned int                m_nBuffer;
00079 
00080     unsigned int                m_iNext;
00081     unsigned int                m_BitFieldBuffer;
00082     unsigned int                m_nBitFieldResid;
00083 
00084     llrp_u8_t
00085     next_u8(void);
00086 
00087     llrp_u16_t
00088     next_u16(void);
00089 
00090     llrp_u32_t
00091     next_u32(void);
00092 
00093     llrp_u64_t
00094     next_u64(void);
00095 };
00096 
00097 class CFrameDecoderStream : public CDecoderStream
00098 {
00099     friend class CFrameDecoder;
00100 
00101   public:
00102     /*
00103      * 8-bit types
00104      */
00105 
00106     llrp_u8_t
00107     get_u8 (
00108       const CFieldDescriptor *  pFieldDescriptor);
00109 
00110     llrp_s8_t
00111     get_s8 (
00112       const CFieldDescriptor *  pFieldDescriptor);
00113 
00114     llrp_u8v_t
00115     get_u8v (
00116       const CFieldDescriptor *  pFieldDescriptor);
00117 
00118     llrp_s8v_t
00119     get_s8v (
00120       const CFieldDescriptor *  pFieldDescriptor);
00121 
00122     /*
00123      * 16-bit types
00124      */
00125 
00126     llrp_u16_t
00127     get_u16 (
00128       const CFieldDescriptor *  pFieldDescriptor);
00129 
00130     llrp_s16_t
00131     get_s16 (
00132       const CFieldDescriptor *  pFieldDescriptor);
00133 
00134     llrp_u16v_t
00135     get_u16v (
00136       const CFieldDescriptor *  pFieldDescriptor);
00137 
00138     llrp_s16v_t
00139     get_s16v (
00140       const CFieldDescriptor *  pFieldDescriptor);
00141 
00142     /*
00143      * 32-bit types
00144      */
00145 
00146     llrp_u32_t
00147     get_u32 (
00148       const CFieldDescriptor *  pFieldDescriptor);
00149 
00150     llrp_s32_t
00151     get_s32 (
00152       const CFieldDescriptor *  pFieldDescriptor);
00153 
00154     llrp_u32v_t
00155     get_u32v (
00156       const CFieldDescriptor *  pFieldDescriptor);
00157 
00158     llrp_s32v_t
00159     get_s32v (
00160       const CFieldDescriptor *  pFieldDescriptor);
00161 
00162     /*
00163      * 64-bit types
00164      */
00165 
00166     llrp_u64_t
00167     get_u64 (
00168       const CFieldDescriptor *  pFieldDescriptor);
00169 
00170     llrp_s64_t
00171     get_s64 (
00172       const CFieldDescriptor *  pFieldDescriptor);
00173 
00174     llrp_u64v_t
00175     get_u64v (
00176       const CFieldDescriptor *  pFieldDescriptor);
00177 
00178     llrp_s64v_t
00179     get_s64v (
00180       const CFieldDescriptor *  pFieldDescriptor);
00181 
00182     /*
00183      * Special types
00184      */
00185 
00186     llrp_u1_t
00187     get_u1 (
00188       const CFieldDescriptor *  pFieldDescriptor);
00189 
00190     llrp_u1v_t
00191     get_u1v (
00192       const CFieldDescriptor *  pFieldDescriptor);
00193 
00194     llrp_u2_t
00195     get_u2 (
00196       const CFieldDescriptor *  pFieldDescriptor);
00197 
00198     llrp_u96_t
00199     get_u96 (
00200       const CFieldDescriptor *  pFieldDescriptor);
00201 
00202     llrp_utf8v_t
00203     get_utf8v (
00204       const CFieldDescriptor *  pFieldDescriptor);
00205 
00206     llrp_bytesToEnd_t
00207     get_bytesToEnd (
00208       const CFieldDescriptor *  pFieldDescriptor);
00209 
00210     /*
00211      * Enumerated types of various sizes
00212      */
00213 
00214     int
00215     get_e1 (
00216       const CFieldDescriptor *  pFieldDescriptor);
00217 
00218     int
00219     get_e2 (
00220       const CFieldDescriptor *  pFieldDescriptor);
00221 
00222     int
00223     get_e8 (
00224       const CFieldDescriptor *  pFieldDescriptor);
00225 
00226     int
00227     get_e16 (
00228       const CFieldDescriptor *  pFieldDescriptor);
00229 
00230     int
00231     get_e32 (
00232       const CFieldDescriptor *  pFieldDescriptor);
00233 
00234     llrp_u8v_t
00235     get_e8v (
00236       const CFieldDescriptor *  pFieldDescriptor);
00237 
00238     /*
00239      * Reserved types are some number of bits
00240      */
00241 
00242     void
00243     get_reserved (
00244       unsigned int              nBit);
00245 
00246   private:
00247     CFrameDecoder *             m_pDecoder;
00248     CFrameDecoderStream *       m_pEnclosingDecoderStream;
00249     const CTypeDescriptor *     m_pRefType;
00250     unsigned int                m_iBegin;
00251     unsigned int                m_iLimit;
00252 
00253     CFrameDecoderStream (
00254       CFrameDecoder *           pDecoder);
00255 
00256     CFrameDecoderStream (
00257       CFrameDecoderStream *     pEnclosingDecoderStream);
00258 
00259     /* no destructor necessary */
00260 
00261     CMessage *
00262     getMessage (void);
00263 
00264     CParameter *
00265     getParameter (void);
00266 
00267     unsigned int
00268     getRemainingByteCount (void);
00269 
00270     llrp_bool_t
00271     checkAvailable (
00272       unsigned int              nByte,
00273       const CFieldDescriptor *  pFieldDescriptor);
00274 
00275     unsigned int
00276     getBitField (
00277       unsigned int              nBit,
00278       const CFieldDescriptor *  pFieldDescriptor);
00279 
00280     llrp_u16_t
00281     getVarlenCount (
00282       const CFieldDescriptor *  pFieldDescriptor);
00283 
00284     llrp_bool_t
00285     verifyVectorAllocation (
00286       const void *              pValue,
00287       const CFieldDescriptor *  pFieldDescriptor);
00288 };
00289 
00290 class CFrameEncoder : public CEncoder
00291 {
00292   friend class CFrameEncoderStream;
00293 
00294   public:
00295     CFrameEncoder (
00296       unsigned char *           pBuffer,
00297       unsigned int              nBuffer);
00298 
00299     ~CFrameEncoder (void);
00300 
00301     void
00302     encodeElement (
00303       const CElement *          pElement);
00304 
00305     unsigned int
00306     getLength(void);
00307 
00308   private:
00309     unsigned char *             m_pBuffer;
00310     unsigned int                m_nBuffer;
00311 
00312     unsigned int                m_iNext;
00313     unsigned int                m_BitFieldBuffer;
00314     unsigned int                m_nBitFieldResid;
00315 
00316     void
00317     next_u8 (
00318       llrp_u8_t                 Value);
00319 
00320     void
00321     next_u16 (
00322       llrp_u16_t                Value);
00323 
00324     void
00325     next_u32 (
00326       llrp_u32_t                Value);
00327 
00328     void
00329     next_u64 (
00330       llrp_u64_t                Value);
00331 };
00332 
00333 class CFrameEncoderStream : public CEncoderStream
00334 {
00335   friend class CFrameEncoder;
00336 
00337   public:
00338     void
00339     putRequiredSubParameter (
00340       const CParameter *        pParameter,
00341       const CTypeDescriptor *   pRefType);
00342 
00343     void
00344     putOptionalSubParameter (
00345       const CParameter *        pParameter,
00346       const CTypeDescriptor *   pRefType);
00347 
00348     void
00349     putRequiredSubParameterList (
00350       const tListOfParameters * pParameterList,
00351       const CTypeDescriptor *   pRefType);
00352 
00353     void
00354     putOptionalSubParameterList (
00355       const tListOfParameters * pParameterList,
00356       const CTypeDescriptor *   pRefType);
00357 
00358     /*
00359      * 8-bit types
00360      */
00361 
00362     void
00363     put_u8 (
00364       llrp_u8_t                 Value,
00365       const CFieldDescriptor *  pFieldDescriptor);
00366 
00367     void
00368     put_s8 (
00369       llrp_s8_t                 Value,
00370       const CFieldDescriptor *  pFieldDescriptor);
00371 
00372     void
00373     put_u8v (
00374       llrp_u8v_t                Value,
00375       const CFieldDescriptor *  pFieldDescriptor);
00376 
00377     void
00378     put_s8v (
00379       llrp_s8v_t                Value,
00380       const CFieldDescriptor *  pFieldDescriptor);
00381 
00382     /*
00383      * 16-bit types
00384      */
00385 
00386     void
00387     put_u16 (
00388       llrp_u16_t                Value,
00389       const CFieldDescriptor *  pFieldDescriptor);
00390 
00391     void
00392     put_s16 (
00393       llrp_s16_t                Value,
00394       const CFieldDescriptor *  pFieldDescriptor);
00395 
00396     void
00397     put_u16v (
00398       llrp_u16v_t               Value,
00399       const CFieldDescriptor *  pFieldDescriptor);
00400 
00401     void
00402     put_s16v (
00403       llrp_s16v_t               Value,
00404       const CFieldDescriptor *  pFieldDescriptor);
00405 
00406     /*
00407      * 32-bit types
00408      */
00409 
00410     void
00411     put_u32 (
00412       llrp_u32_t                Value,
00413       const CFieldDescriptor *  pFieldDescriptor);
00414 
00415     void
00416     put_s32 (
00417       llrp_s32_t                Value,
00418       const CFieldDescriptor *  pFieldDescriptor);
00419 
00420     void
00421     put_u32v (
00422       llrp_u32v_t               Value,
00423       const CFieldDescriptor *  pFieldDescriptor);
00424 
00425     void
00426     put_s32v (
00427       llrp_s32v_t               Value,
00428       const CFieldDescriptor *  pFieldDescriptor);
00429 
00430     /*
00431      * 64-bit types
00432      */
00433 
00434     void
00435     put_u64 (
00436       llrp_u64_t                Value,
00437       const CFieldDescriptor *  pFieldDescriptor);
00438 
00439     void
00440     put_s64 (
00441       llrp_s64_t                Value,
00442       const CFieldDescriptor *  pFieldDescriptor);
00443 
00444     void
00445     put_u64v (
00446       llrp_u64v_t               Value,
00447       const CFieldDescriptor *  pFieldDescriptor);
00448 
00449     void
00450     put_s64v (
00451       llrp_s64v_t               Value,
00452       const CFieldDescriptor *  pFieldDescriptor);
00453 
00454     /*
00455      * Special types
00456      */
00457 
00458     void
00459     put_u1 (
00460       llrp_u1_t                 Value,
00461       const CFieldDescriptor *  pFieldDescriptor);
00462 
00463     void
00464     put_u1v (
00465       llrp_u1v_t                Value,
00466       const CFieldDescriptor *  pFieldDescriptor);
00467 
00468     void
00469     put_u2 (
00470       llrp_u2_t                 Value,
00471       const CFieldDescriptor *  pFieldDescriptor);
00472 
00473     void
00474     put_u96 (
00475       llrp_u96_t                Value,
00476       const CFieldDescriptor *  pFieldDescriptor);
00477 
00478     void
00479     put_utf8v (
00480       llrp_utf8v_t              Value,
00481       const CFieldDescriptor *  pFieldDescriptor);
00482 
00483     void
00484     put_bytesToEnd (
00485       llrp_bytesToEnd_t         Value,
00486       const CFieldDescriptor *  pFieldDescriptor);
00487 
00488     /*
00489      * Enumerated types of various sizes
00490      */
00491 
00492     void
00493     put_e1 (
00494       int                       eValue,
00495       const CFieldDescriptor *  pFieldDescriptor);
00496 
00497     void
00498     put_e2 (
00499       int                       eValue,
00500       const CFieldDescriptor *  pFieldDescriptor);
00501 
00502     void
00503     put_e8 (
00504       int                       eValue,
00505       const CFieldDescriptor *  pFieldDescriptor);
00506 
00507     void
00508     put_e16 (
00509       int                       eValue,
00510       const CFieldDescriptor *  pFieldDescriptor);
00511 
00512     void
00513     put_e32 (
00514       int                       eValue,
00515       const CFieldDescriptor    *pFieldDescriptor);
00516 
00517     void
00518     put_e8v (
00519       llrp_u8v_t                Value,
00520       const CFieldDescriptor *  pFieldDescriptor);
00521 
00522     /*
00523      * Reserved types are some number of bits
00524      */
00525 
00526     void
00527     put_reserved (
00528       unsigned int              nBits);
00529 
00530   private:
00531     CFrameEncoder *             m_pEncoder;
00532     CFrameEncoderStream *       m_pEnclosingEncoderStream;
00533     const CTypeDescriptor *     m_pRefType;
00534     unsigned int                m_iBegin;
00535 
00536     CFrameEncoderStream (
00537       CFrameEncoder *           pEncoder);
00538 
00539     CFrameEncoderStream (
00540       CFrameEncoderStream *     pEnclosingEncoderStream);
00541 
00542     /* no destructor needed */
00543 
00544     void
00545     putElement (
00546       const CElement *          pElement);
00547 
00548     llrp_bool_t
00549     checkAvailable (
00550       unsigned int              nByte,
00551       const CFieldDescriptor *  pFieldDescriptor);
00552 
00553     llrp_bool_t
00554     putBitField (
00555       unsigned int              nBit,
00556       unsigned int              Value,
00557       const CFieldDescriptor *  pFieldDescriptor);
00558 };
00559 
00560 
00561 };