Codec for an NRF24L01 based protocol

Files at this revision

API Documentation at this revision

Comitter:
ihunter
Date:
Tue Aug 30 17:45:12 2011 +0000
Parent:
0:b61d45ff9b8e
Child:
2:4dd0a9382f0d
Commit message:
Completed Codec for Message Header Packet

Changed in this revision

swtp_codec.cpp Show annotated file Show diff for this revision Revisions of this file
swtp_codec.h Show annotated file Show diff for this revision Revisions of this file
--- 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
+
+    }
+
+}
+
--- a/swtp_codec.h	Tue Aug 30 10:30:50 2011 +0000
+++ b/swtp_codec.h	Tue Aug 30 17:45:12 2011 +0000
@@ -1,8 +1,35 @@
 #ifndef SWTP_CODEC
 #define SWTP_CODEC
 
+#define SWTP_VERSION (0)
+
+// I cant bear these '_t'
+typedef uint8_t  uint8;
+typedef uint16_t uint16;
+typedef uint32_t uint32;
+typedef int8_t   sint8;
+typedef int16_t  sint16;
+typedef int32_t  sint32;
+
+typedef struct  {
+    uint16 mimeType;
+    uint32 payloadLengthBytes;
+    uint16 startPayloadSequenceNumber;
+} MessageHeader;
+
+typedef struct {
+    bool isMessageHeader;
+    bool isControlPacket;
+    uint8  flags;
+    uint8  version;
+    union {
+        MessageHeader messageHeader;
+    };
+} PacketData;
+
 extern "C" {
-    void encodeHeaderPacket(char* packetToFill, int mimeType, int payloadLengthBytes, int startPayloadSequenceNumber);
+    void encodeHeaderPacket(uint8* packetToFill, int packetSize, PacketData* headerData);
+    void decodeHeaderPacket(uint8* packet,       int packetSize, PacketData* headerDataToFill);
 }
 
-#endif
\ No newline at end of file
+#endif /* SWTP_CODEC */
\ No newline at end of file