AvrIO  1.4.5
Bibliothèque C modulaire pour ATMEL AVR
packet.h
1 
21 #ifndef _AVRIO_WUSB_PACKET_H_
22 #define _AVRIO_WUSB_PACKET_H_
23 
24 #include <avrio/defs.h>
25 
26 __BEGIN_C_DECLS
27 /* ========================================================================== */
37 /* == <API> == public application interface ========class xWusbPacket======== */
38 /* constants ================================================================ */
39 
44 # define WPKT_BIND_CHECKSUM_SEED 0x00
45 
50 # define WPKT_BIND_CRC_SEED 0x0000
51 
52 /* types ==================================================================== */
57 typedef enum {
58 
59  WPKT_SINGLE = 0,
60  WPKT_ACK = 1,
61  WPKT_SYNC = 2,
62  WPKT_TOGGLE = 3,
63  WPKT_VALID = 2,
64  WPKT_RESP = 3,
65  WPKT_BCAST = 2
66 } eWPktFlag;
67 
72 typedef enum {
73 
74  WPKT_BIND_REQUEST_PACKET = 0x00,
75  WPKT_BIND_RESPONSE_PACKET = 0x01,
76  WPKT_PING_PACKET = 0x02,
77  WPKT_ACK_PACKET = 0x03,
78  WPKT_DATA_PACKET = 0x04,
79  NO_PACKET = 0x0F
80 } eWPktType;
81 
82 /* structures =============================================================== */
87 typedef struct xWusbPacket {
88 
89  uint8_t xSize;
90  uint8_t xLen;
91  uint8_t * pData;
92 } xWusbPacket;
93 
94 #if defined(__DOXYGEN__)
95 /* constants ================================================================ */
100 # define WPKT_PING_PACKET_SIZE
101 
106 # define WPKT_BINDREQ_PACKET_SIZE
107 
112 # define WPKT_DID_OFFSET
113 
118 # define WPKT_MID_OFFSET
119 
120 /* macros =================================================================== */
128 # define WPKT_DECLARE(xVarName, xBufferSize)
129 
137 # define WPKT_STATIC_DECLARE(xVarName, xBufferSize)
138 
142 inline void vWPktInit(xWusbPacket * pxPkt, uint8_t * pucBuffer, uint8_t ucBufferSize);
143 
147 void vWPktPrepare(xWusbPacket * pxPkt, uint8_t ucHeader);
148 
152 inline void vWPktClear(xWusbPacket * pxPkt);
153 
157 uint8_t ucWPktByte(xWusbPacket * pxPkt, uint8_t Offset);
158 
162 void vWPktSetByte(xWusbPacket * pxPkt, uint8_t Offset, uint8_t ucValue);
163 
167 void vWPktAddByte(xWusbPacket * pxPkt, uint8_t ucValue);
168 
172 void vWPktAddBytes(xWusbPacket * pxPkt, const uint8_t * pucBytes, uint8_t ucLength);
173 
177 void vWPktAddBytes_P(xWusbPacket * pxPkt, const uint8_t * pucBytes, uint8_t ucLength);
178 
182 void vWPktAddStr(xWusbPacket * pxPkt, const char* pcStr);
183 
187 void vWPktAddStr_P(xWusbPacket * pxPkt, const char* pcStr);
188 
192 uint16_t usWPktWord(xWusbPacket * pxPkt, uint8_t Offset);
193 
197 void vWPktAddWord(xWusbPacket * pxPkt, uint16_t usValue);
198 
202 uint32_t ulWPktDword(xWusbPacket * pxPkt, uint8_t Offset);
203 
207 inline uint8_t ucWPktHeader(xWusbPacket * pxPkt);
208 
212 inline void vWPktSetHeader(xWusbPacket * pxPkt, uint8_t ucValue);
213 
217 uint8_t ucWPktType(xWusbPacket * pxPkt);
218 
222 void vWPktSetType(xWusbPacket * pxPkt, uint8_t ucValue);
223 
227 inline bool xWPktFlag(xWusbPacket * pxPkt, uint8_t ucIndex);
228 
232 inline void vWPktSetFlag(xWusbPacket * pxPkt, uint8_t ucIndex, bool xValue);
233 
237 bool xWPktSetAllFlags(xWusbPacket * pxPkt, uint8_t ucFlags);
238 
242 inline void vWPktToggleFlag(xWusbPacket * pxPkt, uint8_t ucIndex);
243 
250 void vWPktAddTrailer (xWusbPacket * pxPkt, uint8_t CrcSeed, uint8_t ChecksumSeed);
251 
255 inline uint8_t * pucWPktRaw(xWusbPacket * pxPkt);
256 
261 uint8_t * pucWPktDataPayload(xWusbPacket * pxPkt);
262 
267 uint8_t xWPktDataPayloadLength(xWusbPacket * pxPkt);
268 
272 inline bool xWPktIsFull(xWusbPacket * pxPkt);
273 
277 inline bool xWPktIsEmpty(xWusbPacket * pxPkt);
278 
282 inline uint8_t xWPktLength(xWusbPacket * pxPkt);
283 
287 inline uint8_t xWPktSize(xWusbPacket * pxPkt);
288 
297 bool xWPktCheckAndRepair(xWusbPacket * pxPkt, xWusbPacket * Valid, uint8_t CrcSeed, uint8_t ChecksumSeed);
298 
302 uint16_t usWPktCrc (const uint8_t * pData, uint8_t ucLength, uint16_t Seed);
303 
307 uint8_t ucWPktChecksum (const uint8_t * pData, uint8_t ucLength, uint8_t Seed);
308 
312 bool xWPktBit(uint8_t Byte, uint8_t Bit);
313 
317 void vWPktSetBit(uint8_t * Byte, uint8_t Bit, bool xValue);
318 /* == <API-END> == public application interface ====class xWusbPacket======== */
324 #else /* __DOXYGEN__ defined */
325 # include "wusb-config.h"
326 # include <avr/pgmspace.h>
327 
328 /* constants ================================================================ */
329 
330 /* Packet sizes */
331 # define WPKT_HEADER_SIZE 1 /* Type + ucFlags */
332 # define WPKT_MID_SIZE 4
333 # define WPKT_CRC_SIZE 2
334 # define WPKT_CS_SIZE 1
335 # define WPKT_TRAILER_SIZE (WPKT_CRC_SIZE + WPKT_CS_SIZE)
336 # define WPKT_BROADCAST_PACKET_SIZE (WPKT_HEADER_SIZE + WPKT_TRAILER_SIZE)
337 # define WPKT_PING_PACKET_SIZE (WPKT_BROADCAST_PACKET_SIZE)
338 # define WPKT_BINDREQ_PACKET_SIZE (WPKT_BROADCAST_PACKET_SIZE + WPKT_MID_SIZE)
339 
340 /* Offsets */
341 # define WPKT_DID_OFFSET WPKT_HEADER_SIZE
342 # define WPKT_MID_OFFSET WPKT_HEADER_SIZE /* Pour BIND_REQUEST */
343 
344 /* Tailles dépendantes de la taille du device id */
345 # define WPKT_DID_SIZE_MAX 2
346 # define WPKT_NULL_DATA_PACKET_SIZE_MAX (WPKT_BROADCAST_PACKET_SIZE + WPKT_DID_SIZE_MAX)
347 # define WPKT_WPKT_ACK_PACKET_SIZE_MAX WPKT_NULL_DATA_PACKET_SIZE_MAX
348 # define WPKT_BIND_RESPONSE_SIZE_MAX (WPKT_NULL_DATA_PACKET_SIZE_MAX + WPKT_MID_SIZE + 2)
349 
350 /* macros =================================================================== */
351 # define WPKT_PACKET_SIZE_MAX(PayloadSize) ( \
352  WPKT_NULL_DATA_PACKET_SIZE_MAX + \
353  PayloadSize)
354 
355 
356 // -----------------------------------------------------------------------------
357 # define WPKT_DECLARE(__name,__size) \
358  uint8_t __name ## Buffer[__size]; \
359  xWusbPacket __name = { .pData = __name ## Buffer, \
360  .xSize = __size, \
361  .xLen = 0 }
362 
363 // -----------------------------------------------------------------------------
364 # define WPKT_STATIC_DECLARE(__name,__size) \
365  static uint8_t __name ## Buffer[__size]; \
366  static xWusbPacket __name = { .pData = __name ## Buffer, \
367  .xSize = __size }
368 
369  /* Checked = Ok */ uint8_t ucWPktByte(xWusbPacket *, uint8_t);
370  /* Checked = Ok */ void vWPktSetByte(xWusbPacket *, uint8_t, uint8_t);
371  /* Checked = Ok */ void vWPktAddByte(xWusbPacket * pxPkt, uint8_t ucValue);
372  /* Checked = Ok */ void vWPktAddBytes(xWusbPacket * pxPkt, const uint8_t * pucBytes, uint8_t ucLength);
373  /* Checked = Ok */ void vWPktAddStr(xWusbPacket * pxPkt, const char* pcStr);
374  /* Checked = Ok */ void vWPktAddBytes_P(xWusbPacket * pxPkt, const uint8_t * pucBytes, uint8_t ucLength);
375  /* Checked = Ok */ void vWPktAddStr_P(xWusbPacket * pxPkt, const char* pcStr);
376  /* Checked = Ok */ uint8_t * pucWPktCurrentByte (xWusbPacket * pxPkt);
377 
378  /* Checked = Ok */ uint16_t usWPktWord(xWusbPacket * pxPkt, uint8_t Offset);
379  /* Checked = Ok */ void vWPktAddWord(xWusbPacket * pxPkt, uint16_t usValue);
380 
381  /* Checked = Ok */ uint32_t ulWPktDword(xWusbPacket * pxPkt, uint8_t Offset);
382 
383  /* Checked = Ok */ bool xWPktBit(uint8_t Byte, uint8_t Bit);
384  /* Checked = Ok */ void vWPktSetBit(uint8_t * Byte, uint8_t Bit, bool xValue);
385 
386  /* Checked = Ok */ uint8_t ucWPktType(xWusbPacket *);
387  /* Checked = Ok */ void vWPktSetType(xWusbPacket *, uint8_t);
388  void xWPktSetAllFlags(xWusbPacket *, uint8_t);
389 
390  uint8_t * pucWPktDataPayload(xWusbPacket * pxPkt);
391  uint8_t xWPktDataPayloadLength(xWusbPacket * pxPkt);
392 
393  /* Checked = Ok */ uint16_t usWPktCrc (const uint8_t * pData, uint8_t ucLength, uint16_t Seed);
394  /* Checked = Ok */ uint8_t ucWPktChecksum (const uint8_t * pData, uint8_t ucLength, uint8_t Seed);
395  /* Checked = Ok */ void vWPktAddTrailer (xWusbPacket * pxPkt, uint8_t CrcSeed, uint8_t ChecksumSeed);
396  /* Checked = Ok */ bool xWPktCheckAndRepair(xWusbPacket * pxPkt, xWusbPacket * Valid, uint8_t CrcSeed, uint8_t ChecksumSeed);
397 
398  // ---------------------------------------------------------------------------
399  __STATIC_ALWAYS_INLINE (void
400  vWPktInit(xWusbPacket * pxPkt, uint8_t * pucBuffer, uint8_t ucBufferSize)) {
401 
402  pxPkt->pData = pucBuffer;
403  pxPkt->xSize = ucBufferSize;
404  pxPkt->xLen = 0;
405  }
406 
407  // ---------------------------------------------------------------------------
408  /* Checked = Ok */ __STATIC_ALWAYS_INLINE (uint8_t *
409  pucWPktRaw(xWusbPacket * pxPkt)) {
410 
411  return pxPkt->pData;
412  }
413 
414  // ---------------------------------------------------------------------------
415  /* Checked = Ok */ __STATIC_ALWAYS_INLINE (uint8_t
416  xWPktLength(xWusbPacket * pxPkt)) {
417 
418  return pxPkt->xLen;
419  }
420 
421  // ---------------------------------------------------------------------------
422  /* Checked = Ok */ __STATIC_ALWAYS_INLINE (uint8_t
423  xWPktSize(xWusbPacket * pxPkt)) {
424 
425  return pxPkt->xSize;
426  }
427 
428  // ---------------------------------------------------------------------------
429  /* Checked = Ok */ __STATIC_ALWAYS_INLINE (void
430  vWPktClear(xWusbPacket * pxPkt)) {
431 
432  pxPkt->xLen = 0;
433  }
434 
435  // ---------------------------------------------------------------------------
436  /* Checked = Ok */ __STATIC_ALWAYS_INLINE (void
437  vWPktPrepare(xWusbPacket * pxPkt, uint8_t ucHeader)) {
438 
439  vWPktClear (pxPkt);
440  vWPktAddByte (pxPkt, ucHeader);
441  }
442 
443  // ---------------------------------------------------------------------------
444  /* Checked = Ok */ __STATIC_ALWAYS_INLINE (bool
445  xWPktIsFull(xWusbPacket * pxPkt)) {
446 
447  return (pxPkt->xLen == pxPkt->xSize);
448  }
449 
450  // ---------------------------------------------------------------------------
451  /* Checked = Ok */ __STATIC_ALWAYS_INLINE (bool
452  xWPktIsEmpty(xWusbPacket * pxPkt)) {
453 
454  return (pxPkt->xLen == 0);
455  }
456 
457  // ---------------------------------------------------------------------------
458  __STATIC_ALWAYS_INLINE (void
459  vWPktSetHeader(xWusbPacket * pxPkt, uint8_t ucValue)) {
460 
461  vWPktSetByte (pxPkt, 0, ucValue);
462  }
463 
464  // ---------------------------------------------------------------------------
465  __STATIC_ALWAYS_INLINE (uint8_t
466  ucWPktHeader(xWusbPacket * pxPkt)) {
467 
468  return ucWPktByte(pxPkt, 0);
469  }
470 
471  // ---------------------------------------------------------------------------
472  /* Checked = Ok */ __STATIC_ALWAYS_INLINE (void
473  vWPktSetFlag(xWusbPacket * pxPkt, uint8_t ucIndex, bool xValue)) {
474 
475  vWPktSetBit (pxPkt->pData, ucIndex, xValue);
476  }
477 
478  // ---------------------------------------------------------------------------
479  /* Checked = Ok */ __STATIC_ALWAYS_INLINE (void
480  vWPktToggleFlag(xWusbPacket * pxPkt, uint8_t ucIndex)) {
481 
482  *pxPkt->pData ^= _BV(ucIndex);
483  }
484 
485  // ---------------------------------------------------------------------------
486  /* Checked = Ok */ __STATIC_ALWAYS_INLINE (bool
487  xWPktFlag(xWusbPacket * pxPkt, uint8_t ucIndex)) {
488 
489  return (*pxPkt->pData & _BV(ucIndex)) != 0;
490  }
491 
492 # ifdef DEBUG_ONUART
493  void vWPktDbgDump (xWusbPacket * pxPkt);
494 # else
495 # define vWPktDbgDump(p)
496 # endif /* DEBUG_ONUART defined */
497 
498 # ifdef WUSB_WPKT_TEST
499  int iWPktTest(void);
500 # else /* WUSB_WPKT_TEST defined */
501 # define iWPktTest() (0)
502 # endif /* WUSB_WPKT_TEST defined */
503 
504 #endif /* __DOXYGEN__ defined */
505 /* ========================================================================== */
506 __END_C_DECLS
507 #endif /* _AVRIO_WUSB_PACKET_H_ */
void vWPktSetFlag(xWusbPacket *pxPkt, uint8_t ucIndex, bool xValue)
Modifie l&#39;état d&#39;un bit de flag de l&#39;entête d&#39;un paquet.
void vWPktAddBytes_P(xWusbPacket *pxPkt, const uint8_t *pucBytes, uint8_t ucLength)
Ajoute une suite d&#39;octets au paquet.
void vWPktSetHeader(xWusbPacket *pxPkt, uint8_t ucValue)
Modifie l&#39;en-tête préexistant du paquet.
bool xWPktBit(uint8_t Byte, uint8_t Bit)
Renvoie l&#39;état du bit de rang Bit de l&#39;octet Byte.
uint8_t xLen
Definition: packet.h:90
bool xWPktIsEmpty(xWusbPacket *pxPkt)
Indique si le paquet est vide.
uint8_t ucWPktChecksum(const uint8_t *pData, uint8_t ucLength, uint8_t Seed)
Calcule le checksum d&#39;une suite d&#39;octets.
uint16_t usWPktCrc(const uint8_t *pData, uint8_t ucLength, uint16_t Seed)
Calcule le Crc 16 bits CCITT (X^16 + X^12 + X^5 + 1) d&#39;une suite d&#39;octets.
Paquet réseau WirelessUSB™
Definition: packet.h:87
void vWPktAddWord(xWusbPacket *pxPkt, uint16_t usValue)
Ajoute un mot de 16 bits (little endian) au paquet.
bool xWPktIsFull(xWusbPacket *pxPkt)
Indique si le paquet est plein.
uint8_t xWPktDataPayloadLength(xWusbPacket *pxPkt)
Renvoie le nombre d&#39;octets du payload.
void vWPktSetType(xWusbPacket *pxPkt, uint8_t ucValue)
Modifie le type de paquet.
void vWPktPrepare(xWusbPacket *pxPkt, uint8_t ucHeader)
Initialise le paquet en l&#39;effacant et en ajoutant l&#39;entête fourni.
void vWPktSetBit(uint8_t *Byte, uint8_t Bit, bool xValue)
Modifie l&#39;état du bit de rang Bit de l&#39;octet pointé par Byte.
uint16_t usWPktWord(xWusbPacket *pxPkt, uint8_t Offset)
Renvoie la valeur d&#39;un mot de 16 bits (little endian) du paquet.
void vWPktAddStr(xWusbPacket *pxPkt, const char *pcStr)
Ajoute une chaîne de caractères sans le zéro terminal au paquet.
bool xWPktCheckAndRepair(xWusbPacket *pxPkt, xWusbPacket *Valid, uint8_t CrcSeed, uint8_t ChecksumSeed)
Vérifie un paquet et le corrige éventuellement.
uint8_t ucWPktType(xWusbPacket *pxPkt)
Renvoie le type du paquet.
eWPktType
Identifiant du type de paquet stocké dans l&#39;entête d&#39;un paquet.
Definition: packet.h:72
uint8_t xWPktSize(xWusbPacket *pxPkt)
Renvoie la taille de la zone mémoire de stockage.
void vWPktInit(xWusbPacket *pxPkt, uint8_t *pucBuffer, uint8_t ucBufferSize)
Initialise les champs de la structure du paquet.
eWPktFlag
Index des drapeaux de l&#39;entête d&#39;un paquet.
Definition: packet.h:57
uint8_t xWPktLength(xWusbPacket *pxPkt)
Renvoie le nombre d&#39;octets stockés dans le paquet.
uint8_t xSize
Definition: packet.h:89
void vWPktAddByte(xWusbPacket *pxPkt, uint8_t ucValue)
Ajoute un octet au paquet.
uint8_t ucWPktHeader(xWusbPacket *pxPkt)
Renvoie la valeur de l&#39;en-tête du paquet.
void vWPktClear(xWusbPacket *pxPkt)
Efface un paquet.
void vWPktSetByte(xWusbPacket *pxPkt, uint8_t Offset, uint8_t ucValue)
Modifie la valeur d&#39;un octet du paquet.
uint8_t * pData
Definition: packet.h:91
uint8_t ucWPktByte(xWusbPacket *pxPkt, uint8_t Offset)
Renvoie la valeur d&#39;un octet du paquet.
void vWPktAddStr_P(xWusbPacket *pxPkt, const char *pcStr)
Ajoute une chaîne de caractères sans le zéro terminal au paquet.
#define _BV(n)
Renvoie un masque avec le bit de rang n à 1.
Definition: defs.h:76
void vWPktAddTrailer(xWusbPacket *pxPkt, uint8_t CrcSeed, uint8_t ChecksumSeed)
Ajoute le CRC et le Checksum au paquet Si le paquet est de type BIND ou PING Broadcast, le Crc et le Checksum ajoutés sont calculés avec des valeurs initiales WPKT_BIND_CRC_SEED et WPKT_BIND_CHECKSUM_SEED.
void vWPktAddBytes(xWusbPacket *pxPkt, const uint8_t *pucBytes, uint8_t ucLength)
Ajoute une suite d&#39;octets au paquet.
void vWPktToggleFlag(xWusbPacket *pxPkt, uint8_t ucIndex)
Bascule l&#39;état d&#39;un drapeau du paquet.
uint8_t * pucWPktRaw(xWusbPacket *pxPkt)
Renvoie un pointeur sur la zone mémoire où sont stockés les octets du paquet.
bool xWPktSetAllFlags(xWusbPacket *pxPkt, uint8_t ucFlags)
Modifie l&#39;état des bits de flag de l&#39;entête d&#39;un paquet.
bool xWPktFlag(xWusbPacket *pxPkt, uint8_t ucIndex)
Renvoie l&#39;état d&#39;un drapeau du paquet.
uint32_t ulWPktDword(xWusbPacket *pxPkt, uint8_t Offset)
Renvoie la valeur d&#39;un mot de 16 bits (little endian) du paquet.
uint8_t * pucWPktDataPayload(xWusbPacket *pxPkt)
Renvoie un pointeur sur la zone mémoire où sont stockés les octets du payload.