Codec for an NRF24L01 based protocol
Diff: swtp_codec.cpp
- Revision:
- 1:c189b357fc3c
- Parent:
- 0:b61d45ff9b8e
- Child:
- 2:4dd0a9382f0d
--- a/swtp_codec.cpp Tue Aug 30 10:30:50 2011 +0000 +++ b/swtp_codec.cpp Tue Aug 30 17:45:12 2011 +0000 @@ -1,8 +1,80 @@ #include "mbed.h" +#include <string.h> +#include <stdlib.h> #include "swtp_codec.h" +//////////////////////////////////// +// First byte for INFO packets... + +// Hdr Ctl |--- Version --| +// X X X X X X X X + +#define CONTROL_PKT_IND_BIT (1<<6) +#define HEADER_PKT_IND_BIT (1<<7) + +#define VERSION_MASK (0x3F) // 00111111 +#define CONTROL_PKT_IND_MASK (0xBF) // 10111111 +#define HEADER_PKT_IND_MASK (0x7F) // 01111111 +//////////////////////////////////// + extern Serial pc; -void encodeHeaderPacket(char* packetToFill, int mimeType, int payloadLengthBytes, int startPayloadSequenceNumber) { - pc.puts("Encoding header\n\r"); +/** + * Encodes a given HeaderPacket data structure into byte buffer suitable for transmission. + * @param packetToFill Byte array to be encoded into. + * @param packetSize Size of byte buffer + * @param headerData Structure giving the data that is to be packed. + */ +void encodeHeaderPacket(unsigned char* packetToFill, int packetSize, PacketData* headerData) { + + for (int i = 0; i < packetSize; i++) packetToFill[i] = 0; + + // Control Byte + packetToFill[0] = (SWTP_VERSION & VERSION_MASK); // bits 0:5 + packetToFill[0] |= (CONTROL_PKT_IND_MASK); // bit 6 = 0 + packetToFill[0] &= (HEADER_PKT_IND_BIT); // bit 7 = 1 + + // Mime Type + packetToFill[1] = (headerData->messageHeader.mimeType & 0x00FF); + packetToFill[2] = (headerData->messageHeader.mimeType & 0xFF00) >> 8; + + // Content length + packetToFill[3] = (headerData->messageHeader.payloadLengthBytes >> 0) & 0xFF; + packetToFill[4] = (headerData->messageHeader.payloadLengthBytes >> 8) & 0xFF; + packetToFill[5] = (headerData->messageHeader.payloadLengthBytes >> 16) & 0xFF; + packetToFill[6] = (headerData->messageHeader.payloadLengthBytes >> 24) & 0xFF; + + // First payload sequence number + packetToFill[7] = (headerData->messageHeader.startPayloadSequenceNumber & 0x00FF); + packetToFill[8] = (headerData->messageHeader.startPayloadSequenceNumber & 0xFF00) >> 8; + } + +/** + * Decodes a byte array of data into a HeaderPacket. + * @param packet Byte array to decode from. + * @param packetSize Number of bytes in array + * @param headerDataToFill Structure of PacketData to populate + */ +void decodeHeaderPacket(uint8* packet, int packetSize, PacketData* headerDataToFill) { + + headerDataToFill->version = (packet[0] & VERSION_MASK); + headerDataToFill->isMessageHeader = (packet[0] & HEADER_PKT_IND_BIT); + headerDataToFill->isControlPacket = (packet[0] & CONTROL_PKT_IND_BIT); + + if (headerDataToFill->isMessageHeader) { + headerDataToFill->messageHeader.mimeType = (packet[2] << 8) | packet[1]; + headerDataToFill->messageHeader.payloadLengthBytes = + (packet[3] << 0) | + (packet[4] << 8) | + (packet[5] << 16) | + (packet[6] << 24) + ; + headerDataToFill->messageHeader.startPayloadSequenceNumber = (packet[8] << 8) | packet[7]; + } else if (headerDataToFill->isControlPacket) { + } else { // A message payload packet + + } + +} +