21 #ifndef _AVRIO_WUSB_PACKET_H_ 22 #define _AVRIO_WUSB_PACKET_H_ 24 #include <avrio/defs.h> 44 # define WPKT_BIND_CHECKSUM_SEED 0x00 50 # define WPKT_BIND_CRC_SEED 0x0000 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,
94 #if defined(__DOXYGEN__) 100 # define WPKT_PING_PACKET_SIZE 106 # define WPKT_BINDREQ_PACKET_SIZE 112 # define WPKT_DID_OFFSET 118 # define WPKT_MID_OFFSET 128 # define WPKT_DECLARE(xVarName, xBufferSize) 137 # define WPKT_STATIC_DECLARE(xVarName, xBufferSize) 302 uint16_t
usWPktCrc (
const uint8_t *
pData, uint8_t ucLength, uint16_t Seed);
312 bool xWPktBit(uint8_t Byte, uint8_t Bit);
317 void vWPktSetBit(uint8_t * Byte, uint8_t Bit,
bool xValue);
325 # include "wusb-config.h" 326 # include <avr/pgmspace.h> 331 # define WPKT_HEADER_SIZE 1 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) 341 # define WPKT_DID_OFFSET WPKT_HEADER_SIZE 342 # define WPKT_MID_OFFSET WPKT_HEADER_SIZE 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) 351 # define WPKT_PACKET_SIZE_MAX(PayloadSize) ( \ 352 WPKT_NULL_DATA_PACKET_SIZE_MAX + \ 357 # define WPKT_DECLARE(__name,__size) \ 358 uint8_t __name ## Buffer[__size]; \ 359 xWusbPacket __name = { .pData = __name ## Buffer, \ 364 # define WPKT_STATIC_DECLARE(__name,__size) \ 365 static uint8_t __name ## Buffer[__size]; \ 366 static xWusbPacket __name = { .pData = __name ## Buffer, \ 376 uint8_t * pucWPktCurrentByte (
xWusbPacket * pxPkt);
383 bool xWPktBit(uint8_t Byte, uint8_t Bit);
384 void vWPktSetBit(uint8_t * Byte, uint8_t Bit,
bool xValue);
393 uint16_t
usWPktCrc (
const uint8_t *
pData, uint8_t ucLength, uint16_t Seed);
399 __STATIC_ALWAYS_INLINE (
void 402 pxPkt->
pData = pucBuffer;
403 pxPkt->
xSize = ucBufferSize;
408 __STATIC_ALWAYS_INLINE (uint8_t *
415 __STATIC_ALWAYS_INLINE (uint8_t
422 __STATIC_ALWAYS_INLINE (uint8_t
429 __STATIC_ALWAYS_INLINE (
void 436 __STATIC_ALWAYS_INLINE (
void 444 __STATIC_ALWAYS_INLINE (
bool 451 __STATIC_ALWAYS_INLINE (
bool 454 return (pxPkt->
xLen == 0);
458 __STATIC_ALWAYS_INLINE (
void 465 __STATIC_ALWAYS_INLINE (uint8_t
472 __STATIC_ALWAYS_INLINE (
void 479 __STATIC_ALWAYS_INLINE (
void 486 __STATIC_ALWAYS_INLINE (
bool 489 return (*pxPkt->
pData &
_BV(ucIndex)) != 0;
495 # define vWPktDbgDump(p) 498 # ifdef WUSB_WPKT_TEST 501 # define iWPktTest() (0) void vWPktSetFlag(xWusbPacket *pxPkt, uint8_t ucIndex, bool xValue)
Modifie l'état d'un bit de flag de l'entête d'un paquet.
void vWPktAddBytes_P(xWusbPacket *pxPkt, const uint8_t *pucBytes, uint8_t ucLength)
Ajoute une suite d'octets au paquet.
void vWPktSetHeader(xWusbPacket *pxPkt, uint8_t ucValue)
Modifie l'en-tête préexistant du paquet.
bool xWPktBit(uint8_t Byte, uint8_t Bit)
Renvoie l'état du bit de rang Bit de l'octet Byte.
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'une suite d'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'une suite d'octets.
Paquet réseau WirelessUSB
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'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'effacant et en ajoutant l'entête fourni.
void vWPktSetBit(uint8_t *Byte, uint8_t Bit, bool xValue)
Modifie l'état du bit de rang Bit de l'octet pointé par Byte.
uint16_t usWPktWord(xWusbPacket *pxPkt, uint8_t Offset)
Renvoie la valeur d'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'entête d'un paquet.
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'entête d'un paquet.
uint8_t xWPktLength(xWusbPacket *pxPkt)
Renvoie le nombre d'octets stockés dans le paquet.
void vWPktAddByte(xWusbPacket *pxPkt, uint8_t ucValue)
Ajoute un octet au paquet.
uint8_t ucWPktHeader(xWusbPacket *pxPkt)
Renvoie la valeur de l'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'un octet du paquet.
uint8_t ucWPktByte(xWusbPacket *pxPkt, uint8_t Offset)
Renvoie la valeur d'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.
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'octets au paquet.
void vWPktToggleFlag(xWusbPacket *pxPkt, uint8_t ucIndex)
Bascule l'état d'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'état des bits de flag de l'entête d'un paquet.
bool xWPktFlag(xWusbPacket *pxPkt, uint8_t ucIndex)
Renvoie l'état d'un drapeau du paquet.
uint32_t ulWPktDword(xWusbPacket *pxPkt, uint8_t Offset)
Renvoie la valeur d'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.