Codec for an NRF24L01 based protocol

Committer:
ihunter
Date:
Tue Aug 30 18:20:47 2011 +0000
Revision:
2:4dd0a9382f0d
Parent:
1:c189b357fc3c

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ihunter 0:b61d45ff9b8e 1 #include "mbed.h"
ihunter 1:c189b357fc3c 2 #include <string.h>
ihunter 1:c189b357fc3c 3 #include <stdlib.h>
ihunter 0:b61d45ff9b8e 4 #include "swtp_codec.h"
ihunter 0:b61d45ff9b8e 5
ihunter 1:c189b357fc3c 6 ////////////////////////////////////
ihunter 1:c189b357fc3c 7 // First byte for INFO packets...
ihunter 1:c189b357fc3c 8
ihunter 1:c189b357fc3c 9 // Hdr Ctl |--- Version --|
ihunter 1:c189b357fc3c 10 // X X X X X X X X
ihunter 1:c189b357fc3c 11
ihunter 1:c189b357fc3c 12 #define CONTROL_PKT_IND_BIT (1<<6)
ihunter 1:c189b357fc3c 13 #define HEADER_PKT_IND_BIT (1<<7)
ihunter 1:c189b357fc3c 14
ihunter 1:c189b357fc3c 15 #define VERSION_MASK (0x3F) // 00111111
ihunter 1:c189b357fc3c 16 #define CONTROL_PKT_IND_MASK (0xBF) // 10111111
ihunter 1:c189b357fc3c 17 #define HEADER_PKT_IND_MASK (0x7F) // 01111111
ihunter 1:c189b357fc3c 18 ////////////////////////////////////
ihunter 1:c189b357fc3c 19
ihunter 0:b61d45ff9b8e 20 extern Serial pc;
ihunter 0:b61d45ff9b8e 21
ihunter 1:c189b357fc3c 22 /**
ihunter 1:c189b357fc3c 23 * Encodes a given HeaderPacket data structure into byte buffer suitable for transmission.
ihunter 1:c189b357fc3c 24 * @param packetToFill Byte array to be encoded into.
ihunter 1:c189b357fc3c 25 * @param packetSize Size of byte buffer
ihunter 1:c189b357fc3c 26 * @param headerData Structure giving the data that is to be packed.
ihunter 1:c189b357fc3c 27 */
ihunter 1:c189b357fc3c 28 void encodeHeaderPacket(unsigned char* packetToFill, int packetSize, PacketData* headerData) {
ihunter 1:c189b357fc3c 29
ihunter 1:c189b357fc3c 30 for (int i = 0; i < packetSize; i++) packetToFill[i] = 0;
ihunter 1:c189b357fc3c 31
ihunter 1:c189b357fc3c 32 // Control Byte
ihunter 1:c189b357fc3c 33 packetToFill[0] = (SWTP_VERSION & VERSION_MASK); // bits 0:5
ihunter 1:c189b357fc3c 34 packetToFill[0] |= (CONTROL_PKT_IND_MASK); // bit 6 = 0
ihunter 1:c189b357fc3c 35 packetToFill[0] &= (HEADER_PKT_IND_BIT); // bit 7 = 1
ihunter 1:c189b357fc3c 36
ihunter 1:c189b357fc3c 37 // Mime Type
ihunter 1:c189b357fc3c 38 packetToFill[1] = (headerData->messageHeader.mimeType & 0x00FF);
ihunter 1:c189b357fc3c 39 packetToFill[2] = (headerData->messageHeader.mimeType & 0xFF00) >> 8;
ihunter 1:c189b357fc3c 40
ihunter 1:c189b357fc3c 41 // Content length
ihunter 1:c189b357fc3c 42 packetToFill[3] = (headerData->messageHeader.payloadLengthBytes >> 0) & 0xFF;
ihunter 1:c189b357fc3c 43 packetToFill[4] = (headerData->messageHeader.payloadLengthBytes >> 8) & 0xFF;
ihunter 1:c189b357fc3c 44 packetToFill[5] = (headerData->messageHeader.payloadLengthBytes >> 16) & 0xFF;
ihunter 1:c189b357fc3c 45 packetToFill[6] = (headerData->messageHeader.payloadLengthBytes >> 24) & 0xFF;
ihunter 1:c189b357fc3c 46
ihunter 1:c189b357fc3c 47 // First payload sequence number
ihunter 1:c189b357fc3c 48 packetToFill[7] = (headerData->messageHeader.startPayloadSequenceNumber & 0x00FF);
ihunter 1:c189b357fc3c 49 packetToFill[8] = (headerData->messageHeader.startPayloadSequenceNumber & 0xFF00) >> 8;
ihunter 1:c189b357fc3c 50
ihunter 0:b61d45ff9b8e 51 }
ihunter 1:c189b357fc3c 52
ihunter 1:c189b357fc3c 53 /**
ihunter 1:c189b357fc3c 54 * Decodes a byte array of data into a HeaderPacket.
ihunter 1:c189b357fc3c 55 * @param packet Byte array to decode from.
ihunter 1:c189b357fc3c 56 * @param packetSize Number of bytes in array
ihunter 1:c189b357fc3c 57 * @param headerDataToFill Structure of PacketData to populate
ihunter 1:c189b357fc3c 58 */
ihunter 2:4dd0a9382f0d 59 void decodePacket(uint8* packet, int packetSize, PacketData* headerDataToFill) {
ihunter 1:c189b357fc3c 60
ihunter 1:c189b357fc3c 61 headerDataToFill->version = (packet[0] & VERSION_MASK);
ihunter 1:c189b357fc3c 62 headerDataToFill->isMessageHeader = (packet[0] & HEADER_PKT_IND_BIT);
ihunter 1:c189b357fc3c 63 headerDataToFill->isControlPacket = (packet[0] & CONTROL_PKT_IND_BIT);
ihunter 1:c189b357fc3c 64
ihunter 1:c189b357fc3c 65 if (headerDataToFill->isMessageHeader) {
ihunter 1:c189b357fc3c 66 headerDataToFill->messageHeader.mimeType = (packet[2] << 8) | packet[1];
ihunter 1:c189b357fc3c 67 headerDataToFill->messageHeader.payloadLengthBytes =
ihunter 1:c189b357fc3c 68 (packet[3] << 0) |
ihunter 1:c189b357fc3c 69 (packet[4] << 8) |
ihunter 1:c189b357fc3c 70 (packet[5] << 16) |
ihunter 1:c189b357fc3c 71 (packet[6] << 24)
ihunter 1:c189b357fc3c 72 ;
ihunter 1:c189b357fc3c 73 headerDataToFill->messageHeader.startPayloadSequenceNumber = (packet[8] << 8) | packet[7];
ihunter 1:c189b357fc3c 74 } else if (headerDataToFill->isControlPacket) {
ihunter 1:c189b357fc3c 75 } else { // A message payload packet
ihunter 1:c189b357fc3c 76
ihunter 1:c189b357fc3c 77 }
ihunter 1:c189b357fc3c 78
ihunter 1:c189b357fc3c 79 }
ihunter 1:c189b357fc3c 80