Codec for an NRF24L01 based protocol
swtp_codec.cpp@3:80ed23c0ae01, 2011-08-30 (annotated)
- Committer:
- ihunter
- Date:
- Tue Aug 30 21:20:23 2011 +0000
- Revision:
- 3:80ed23c0ae01
- Parent:
- 2:4dd0a9382f0d
Who changed what in which revision?
User | Revision | Line number | New 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 |