Codec for an NRF24L01 based protocol

swtp_codec.cpp

Committer:
ihunter
Date:
2011-08-30
Revision:
3:80ed23c0ae01
Parent:
2:4dd0a9382f0d

File content as of revision 3:80ed23c0ae01:

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

/**
 * 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 decodePacket(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

    }

}