LTKCPP-- LLRP Toolkit C Plus Plus Library
ltkcpp_frame.h
Go to the documentation of this file.
1 
2 /*
3  *****************************************************************************
4  * *
5  * IMPINJ CONFIDENTIAL AND PROPRIETARY *
6  * *
7  * This source code is the sole property of Impinj, Inc. Reproduction or *
8  * utilization of this source code in whole or in part is forbidden without *
9  * the prior written consent of Impinj, Inc. *
10  * *
11  * (c) Copyright Impinj, Inc. 2007,2008. All rights reserved. *
12  * *
13  *****************************************************************************/
14 
29 namespace LLRP
30 {
31 class CFrameExtract;
32 class CFrameDecoder;
33 class CFrameDecoderStream;
34 class CFrameEncoder;
35 class CFrameEncoderStream;
36 
37 class CFrameExtract
38 {
39  public:
40  enum {
41  UNKNOWN,
42  READY,
43  FRAME_ERROR,
44  NEED_MORE
45  } m_eStatus;
46 
47  llrp_u32_t m_MessageLength;
48  llrp_u16_t m_MessageType;
49  llrp_u8_t m_ProtocolVersion;
50  llrp_u32_t m_MessageID;
51 
52  unsigned int m_nBytesNeeded;
53 
54  CFrameExtract (void);
55 
56  CFrameExtract (
57  const unsigned char * pBuffer,
58  unsigned int nBuffer);
59 };
60 
61 class CFrameDecoder : public CDecoder
62 {
63  friend class CFrameDecoderStream;
64 
65  public:
66  CFrameDecoder (
67  const CTypeRegistry * pTypeRegistry,
68  unsigned char * pBuffer,
69  unsigned int nBuffer);
70 
71  ~CFrameDecoder (void);
72 
73  CMessage *
74  decodeMessage (void);
75 
76  private:
77  unsigned char * m_pBuffer;
78  unsigned int m_nBuffer;
79 
80  unsigned int m_iNext;
81  unsigned int m_BitFieldBuffer;
82  unsigned int m_nBitFieldResid;
83 
84  llrp_u8_t
85  next_u8(void);
86 
87  llrp_u16_t
88  next_u16(void);
89 
90  llrp_u32_t
91  next_u32(void);
92 
93  llrp_u64_t
94  next_u64(void);
95 };
96 
97 class CFrameDecoderStream : public CDecoderStream
98 {
99  friend class CFrameDecoder;
100 
101  public:
102  /*
103  * 8-bit types
104  */
105 
106  llrp_u8_t
107  get_u8 (
108  const CFieldDescriptor * pFieldDescriptor);
109 
110  llrp_s8_t
111  get_s8 (
112  const CFieldDescriptor * pFieldDescriptor);
113 
114  llrp_u8v_t
115  get_u8v (
116  const CFieldDescriptor * pFieldDescriptor);
117 
118  llrp_s8v_t
119  get_s8v (
120  const CFieldDescriptor * pFieldDescriptor);
121 
122  /*
123  * 16-bit types
124  */
125 
126  llrp_u16_t
127  get_u16 (
128  const CFieldDescriptor * pFieldDescriptor);
129 
130  llrp_s16_t
131  get_s16 (
132  const CFieldDescriptor * pFieldDescriptor);
133 
134  llrp_u16v_t
135  get_u16v (
136  const CFieldDescriptor * pFieldDescriptor);
137 
138  llrp_s16v_t
139  get_s16v (
140  const CFieldDescriptor * pFieldDescriptor);
141 
142  /*
143  * 32-bit types
144  */
145 
146  llrp_u32_t
147  get_u32 (
148  const CFieldDescriptor * pFieldDescriptor);
149 
150  llrp_s32_t
151  get_s32 (
152  const CFieldDescriptor * pFieldDescriptor);
153 
154  llrp_u32v_t
155  get_u32v (
156  const CFieldDescriptor * pFieldDescriptor);
157 
158  llrp_s32v_t
159  get_s32v (
160  const CFieldDescriptor * pFieldDescriptor);
161 
162  /*
163  * 64-bit types
164  */
165 
166  llrp_u64_t
167  get_u64 (
168  const CFieldDescriptor * pFieldDescriptor);
169 
170  llrp_s64_t
171  get_s64 (
172  const CFieldDescriptor * pFieldDescriptor);
173 
174  llrp_u64v_t
175  get_u64v (
176  const CFieldDescriptor * pFieldDescriptor);
177 
178  llrp_s64v_t
179  get_s64v (
180  const CFieldDescriptor * pFieldDescriptor);
181 
182  /*
183  * Special types
184  */
185 
186  llrp_u1_t
187  get_u1 (
188  const CFieldDescriptor * pFieldDescriptor);
189 
190  llrp_u1v_t
191  get_u1v (
192  const CFieldDescriptor * pFieldDescriptor);
193 
194  llrp_u2_t
195  get_u2 (
196  const CFieldDescriptor * pFieldDescriptor);
197 
198  llrp_u96_t
199  get_u96 (
200  const CFieldDescriptor * pFieldDescriptor);
201 
202  llrp_utf8v_t
203  get_utf8v (
204  const CFieldDescriptor * pFieldDescriptor);
205 
206  llrp_bytesToEnd_t
207  get_bytesToEnd (
208  const CFieldDescriptor * pFieldDescriptor);
209 
210  /*
211  * Enumerated types of various sizes
212  */
213 
214  int
215  get_e1 (
216  const CFieldDescriptor * pFieldDescriptor);
217 
218  int
219  get_e2 (
220  const CFieldDescriptor * pFieldDescriptor);
221 
222  int
223  get_e8 (
224  const CFieldDescriptor * pFieldDescriptor);
225 
226  int
227  get_e16 (
228  const CFieldDescriptor * pFieldDescriptor);
229 
230  int
231  get_e32 (
232  const CFieldDescriptor * pFieldDescriptor);
233 
234  llrp_u8v_t
235  get_e8v (
236  const CFieldDescriptor * pFieldDescriptor);
237 
238  /*
239  * Reserved types are some number of bits
240  */
241 
242  void
243  get_reserved (
244  unsigned int nBit);
245 
246  private:
247  CFrameDecoder * m_pDecoder;
248  CFrameDecoderStream * m_pEnclosingDecoderStream;
249  const CTypeDescriptor * m_pRefType;
250  unsigned int m_iBegin;
251  unsigned int m_iLimit;
252 
253  CFrameDecoderStream (
254  CFrameDecoder * pDecoder);
255 
256  CFrameDecoderStream (
257  CFrameDecoderStream * pEnclosingDecoderStream);
258 
259  /* no destructor necessary */
260 
261  CMessage *
262  getMessage (void);
263 
264  CParameter *
265  getParameter (void);
266 
267  unsigned int
268  getRemainingByteCount (void);
269 
270  llrp_bool_t
271  checkAvailable (
272  unsigned int nByte,
273  const CFieldDescriptor * pFieldDescriptor);
274 
275  unsigned int
276  getBitField (
277  unsigned int nBit,
278  const CFieldDescriptor * pFieldDescriptor);
279 
280  llrp_u16_t
281  getVarlenCount (
282  const CFieldDescriptor * pFieldDescriptor);
283 
284  llrp_bool_t
285  verifyVectorAllocation (
286  const void * pValue,
287  const CFieldDescriptor * pFieldDescriptor);
288 };
289 
290 class CFrameEncoder : public CEncoder
291 {
292  friend class CFrameEncoderStream;
293 
294  public:
295  CFrameEncoder (
296  unsigned char * pBuffer,
297  unsigned int nBuffer);
298 
299  ~CFrameEncoder (void);
300 
301  void
302  encodeElement (
303  const CElement * pElement);
304 
305  unsigned int
306  getLength(void);
307 
308  private:
309  unsigned char * m_pBuffer;
310  unsigned int m_nBuffer;
311 
312  unsigned int m_iNext;
313  unsigned int m_BitFieldBuffer;
314  unsigned int m_nBitFieldResid;
315 
316  void
317  next_u8 (
318  llrp_u8_t Value);
319 
320  void
321  next_u16 (
322  llrp_u16_t Value);
323 
324  void
325  next_u32 (
326  llrp_u32_t Value);
327 
328  void
329  next_u64 (
330  llrp_u64_t Value);
331 };
332 
333 class CFrameEncoderStream : public CEncoderStream
334 {
335  friend class CFrameEncoder;
336 
337  public:
338  void
339  putRequiredSubParameter (
340  const CParameter * pParameter,
341  const CTypeDescriptor * pRefType);
342 
343  void
344  putOptionalSubParameter (
345  const CParameter * pParameter,
346  const CTypeDescriptor * pRefType);
347 
348  void
349  putRequiredSubParameterList (
350  const tListOfParameters * pParameterList,
351  const CTypeDescriptor * pRefType);
352 
353  void
354  putOptionalSubParameterList (
355  const tListOfParameters * pParameterList,
356  const CTypeDescriptor * pRefType);
357 
358  /*
359  * 8-bit types
360  */
361 
362  void
363  put_u8 (
364  llrp_u8_t Value,
365  const CFieldDescriptor * pFieldDescriptor);
366 
367  void
368  put_s8 (
369  llrp_s8_t Value,
370  const CFieldDescriptor * pFieldDescriptor);
371 
372  void
373  put_u8v (
374  llrp_u8v_t Value,
375  const CFieldDescriptor * pFieldDescriptor);
376 
377  void
378  put_s8v (
379  llrp_s8v_t Value,
380  const CFieldDescriptor * pFieldDescriptor);
381 
382  /*
383  * 16-bit types
384  */
385 
386  void
387  put_u16 (
388  llrp_u16_t Value,
389  const CFieldDescriptor * pFieldDescriptor);
390 
391  void
392  put_s16 (
393  llrp_s16_t Value,
394  const CFieldDescriptor * pFieldDescriptor);
395 
396  void
397  put_u16v (
398  llrp_u16v_t Value,
399  const CFieldDescriptor * pFieldDescriptor);
400 
401  void
402  put_s16v (
403  llrp_s16v_t Value,
404  const CFieldDescriptor * pFieldDescriptor);
405 
406  /*
407  * 32-bit types
408  */
409 
410  void
411  put_u32 (
412  llrp_u32_t Value,
413  const CFieldDescriptor * pFieldDescriptor);
414 
415  void
416  put_s32 (
417  llrp_s32_t Value,
418  const CFieldDescriptor * pFieldDescriptor);
419 
420  void
421  put_u32v (
422  llrp_u32v_t Value,
423  const CFieldDescriptor * pFieldDescriptor);
424 
425  void
426  put_s32v (
427  llrp_s32v_t Value,
428  const CFieldDescriptor * pFieldDescriptor);
429 
430  /*
431  * 64-bit types
432  */
433 
434  void
435  put_u64 (
436  llrp_u64_t Value,
437  const CFieldDescriptor * pFieldDescriptor);
438 
439  void
440  put_s64 (
441  llrp_s64_t Value,
442  const CFieldDescriptor * pFieldDescriptor);
443 
444  void
445  put_u64v (
446  llrp_u64v_t Value,
447  const CFieldDescriptor * pFieldDescriptor);
448 
449  void
450  put_s64v (
451  llrp_s64v_t Value,
452  const CFieldDescriptor * pFieldDescriptor);
453 
454  /*
455  * Special types
456  */
457 
458  void
459  put_u1 (
460  llrp_u1_t Value,
461  const CFieldDescriptor * pFieldDescriptor);
462 
463  void
464  put_u1v (
465  llrp_u1v_t Value,
466  const CFieldDescriptor * pFieldDescriptor);
467 
468  void
469  put_u2 (
470  llrp_u2_t Value,
471  const CFieldDescriptor * pFieldDescriptor);
472 
473  void
474  put_u96 (
475  llrp_u96_t Value,
476  const CFieldDescriptor * pFieldDescriptor);
477 
478  void
479  put_utf8v (
480  llrp_utf8v_t Value,
481  const CFieldDescriptor * pFieldDescriptor);
482 
483  void
484  put_bytesToEnd (
485  llrp_bytesToEnd_t Value,
486  const CFieldDescriptor * pFieldDescriptor);
487 
488  /*
489  * Enumerated types of various sizes
490  */
491 
492  void
493  put_e1 (
494  int eValue,
495  const CFieldDescriptor * pFieldDescriptor);
496 
497  void
498  put_e2 (
499  int eValue,
500  const CFieldDescriptor * pFieldDescriptor);
501 
502  void
503  put_e8 (
504  int eValue,
505  const CFieldDescriptor * pFieldDescriptor);
506 
507  void
508  put_e16 (
509  int eValue,
510  const CFieldDescriptor * pFieldDescriptor);
511 
512  void
513  put_e32 (
514  int eValue,
515  const CFieldDescriptor *pFieldDescriptor);
516 
517  void
518  put_e8v (
519  llrp_u8v_t Value,
520  const CFieldDescriptor * pFieldDescriptor);
521 
522  /*
523  * Reserved types are some number of bits
524  */
525 
526  void
527  put_reserved (
528  unsigned int nBits);
529 
530  private:
531  CFrameEncoder * m_pEncoder;
532  CFrameEncoderStream * m_pEnclosingEncoderStream;
533  const CTypeDescriptor * m_pRefType;
534  unsigned int m_iBegin;
535 
536  CFrameEncoderStream (
537  CFrameEncoder * pEncoder);
538 
539  CFrameEncoderStream (
540  CFrameEncoderStream * pEnclosingEncoderStream);
541 
542  /* no destructor needed */
543 
544  void
545  putElement (
546  const CElement * pElement);
547 
548  llrp_bool_t
549  checkAvailable (
550  unsigned int nByte,
551  const CFieldDescriptor * pFieldDescriptor);
552 
553  llrp_bool_t
554  putBitField (
555  unsigned int nBit,
556  unsigned int Value,
557  const CFieldDescriptor * pFieldDescriptor);
558 };
559 
560 
561 };