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 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 };