Senet Packet API

Revision:
1:c4435fed9eb9
Parent:
0:08689149c8e3
--- a/senet_packet.h	Sat Mar 05 21:56:20 2016 +0000
+++ b/senet_packet.h	Mon Mar 07 12:08:34 2016 -0500
@@ -14,11 +14,13 @@
  *
  * =====================================================================================
  */
+
+#ifndef __SENET_PACKET__
+#define __SENET_PACKET__
+
 #include <stdint.h>
-#include <assert.h>
 #include <string.h>
 
-#define ASSERT(_expr) assert(_expr)
 
 // Senet packet types
 enum SenetPacketT
@@ -36,19 +38,33 @@
 
 /*
  * =====================================================================================
- *        Class:  SenetLoRaPacket
+ *        Class:  SenetPacket
  *  Description:  Senet Packet Base class 
  * =====================================================================================
  */
-struct SenetLoRaPacket
+struct SenetPacket
 {
     static const uint32_t MAX_FRAME_SIZE = 242;
     static const uint8_t  VERSION        = 1;
 
+    /*
+     *--------------------------------------------------------------------------------------
+     *       Class:  SenetPacket
+     *      Method:  serialize
+     * Description:  Packet serializer 
+     *--------------------------------------------------------------------------------------
+     */
+    int32_t serialize();
 
+    inline const uint8_t* payload() { return buffer;}
+                 uint8_t  length () { return pktLen; }
+
+    protected:
     // Common packet header
     struct PacketHeader
     {
+        static const uint8_t HEADER_SIZE = 2;
+
         uint8_t version; // packet format versioni
         uint8_t type;    // Senet packet type
 
@@ -62,45 +78,22 @@
         bool    deserialize(uint8_t *frame, int32_t len);
     } header;
 
-    uint8_t pkt[MAX_FRAME_SIZE]; // serialized packet buffer
-    uint8_t pktLen;              // serialized packet length
+    uint8_t  pktLen;   
+    uint8_t *buffer;
+    uint8_t  bufferLen;
+    bool     ownBuffer;
 
-    SenetLoRaPacket(uint8_t senetPktType)
-    {
-        header.type    = senetPktType;
-        header.version = VERSION;
-        pktLen         = 0;
-    }
+    SenetPacket(uint8_t senetPktType, uint8_t *_buffer=NULL, uint8_t _buflen=0);
+   ~SenetPacket();
 
     /*
      *--------------------------------------------------------------------------------------
-     *       Class:  SenetLoRaPacket
-     *      Method:  serialize
-     * Description:  Packet serializer 
+     *       Class:  SenetPacket
+     *      Method:  serializePayload
+     * Description:  Each unique packet type implements this to serialize its payload   
      *--------------------------------------------------------------------------------------
      */
-    virtual int32_t serialize()
-    {
-        pktLen = header.serialize(pkt, MAX_FRAME_SIZE);
-
-        int32_t payloadLen = serializeData(pkt + pktLen, MAX_FRAME_SIZE - pktLen);
-        if(payloadLen > 0)
-        {
-            pktLen += payloadLen;
-            return pktLen;
-        }
-        return -1;
-    }
-
-    
-    /*
-     *--------------------------------------------------------------------------------------
-     *       Class:  SenetLoRaPacket
-     *      Method:  serializeData
-     * Description:  Each unique packet type implements this to serialize its data   
-     *--------------------------------------------------------------------------------------
-     */
-    virtual int32_t serializeData(uint8_t *frame, int32_t len) {return 0;}
+    virtual int32_t serializePayload(uint8_t *frame, int32_t len) = 0; 
 
 };
 
@@ -111,14 +104,16 @@
  *  Description:  Device Boot information packet
  * =====================================================================================
  */
-struct BootInfoPacket : public SenetLoRaPacket
+struct BootInfoPacket : public SenetPacket
 {
+    static const uint8_t BOOT_PAYLOAD_LENGTH = 8;
+
     uint16_t bootCount;       // number of device boots
     uint16_t resetCount;      // number of device resets
     uint32_t lastBootReason;  // last boot reason
 
-    BootInfoPacket() :
-        SenetLoRaPacket(BOOT_INFO_PACKET)
+    BootInfoPacket(uint8_t *_buffer=NULL, uint8_t _buflen=0) :
+        SenetPacket(BOOT_INFO_PACKET, _buffer, _buflen)
     {
         bootCount      = 0; 
         resetCount     = 0;
@@ -129,11 +124,11 @@
     /*
      *--------------------------------------------------------------------------------------
      *       Class:  BootInfoPacket
-     *      Method:  serializeData
+     *      Method:  serializePayload
      * Description:  Serialize packet data
      *--------------------------------------------------------------------------------------
      */
-    int32_t serializeData(uint8_t *frame, int32_t len); 
+    virtual int32_t serializePayload(uint8_t *frame, int32_t len); 
 };
 
 
@@ -143,10 +138,12 @@
  *  Description:  Packet to configure device
  * =====================================================================================
  */
-struct ConfigWordPacket : public SenetLoRaPacket
+struct ConfigWordPacket : public SenetPacket
 {
-    ConfigWordPacket() :
-        SenetLoRaPacket(CONTROL_PACKET) { config = 0; mask = 0; authKey = 0; }
+    static const uint8_t CONTROL_PAYLOAD_LENGTH = 9;
+
+    ConfigWordPacket(uint8_t *_buffer=NULL, uint8_t _buflen=0) :
+        SenetPacket(CONTROL_PACKET, _buffer, _buflen) { config = 0; mask = 0; authKey = 0; }
 
     uint32_t config;  // configuration word
     uint32_t mask;    // valid bit mask applied to configuration word
@@ -155,11 +152,11 @@
     /*
      *--------------------------------------------------------------------------------------
      *       Class:  ConfigWordPacket 
-     *      Method:  serializeData
+     *      Method:  serializePayload
      * Description:  Serialize packet data
      *--------------------------------------------------------------------------------------
      */
-    int32_t serializeData(uint8_t *frame, int32_t len);
+    virtual int32_t serializePayload(uint8_t *frame, int32_t len);
 };
 
 
@@ -169,13 +166,16 @@
  *  Description:  Transmit device location in Decimal degress (http://www.en.wikipedia.org/wiki/Decimal_degrees)
  * =====================================================================================
  */
-struct GpsPacket : public SenetLoRaPacket
+struct GpsPacket : public SenetPacket
 {
+    static const uint8_t GPS_PAYLOAD_LENGTH = 9;
+
            bool setCoordinates(uint32_t latitude, uint32_t longitude, uint16_t elevation);
     inline void setTxPower(uint8_t dBm) { txPower = dBm; }
 
-    GpsPacket():
-        SenetLoRaPacket(GPS_PACKET)
+
+    GpsPacket(uint8_t* _buffer=NULL, uint8_t _buflen=0):
+        SenetPacket(GPS_PACKET, _buffer, _buflen)
     {
         latitude   = 0;
         longitude  = 0;
@@ -192,11 +192,11 @@
     /*
      *--------------------------------------------------------------------------------------
      *       Class:  GpsPacket
-     *      Method:  serializeData
+     *      Method:  serializePayload
      * Description:  Serialize the data 
      *--------------------------------------------------------------------------------------
      */
-    int32_t serializeData(uint8_t *frame, int32_t len); 
+    virtual int32_t serializePayload(uint8_t *frame, int32_t len); 
 };
 
 
@@ -206,36 +206,29 @@
  *  Description:  Variable length Octet String packet 
  * =====================================================================================
  */
-struct OctetStringPacket : public SenetLoRaPacket
+struct OctetStringPacket : public SenetPacket
 {
     bool setOctetString(uint8_t *os, uint8_t len);
 
-    OctetStringPacket(uint8_t size) 
-        : SenetLoRaPacket(OCTET_STRING_PACKET)
-    { 
-        osptr = new uint8_t[size];
-        ASSERT(osptr != NULL);
-        maxSize = size;
-        oslen   = 0;
-    }
+    OctetStringPacket(uint8_t size); 
 
     protected:
-    uint8_t *osptr;
-    uint8_t  maxSize;
     uint8_t  oslen;
+    uint8_t  max;
 
-    virtual int32_t serializeData(uint8_t *frame, int32_t len);
+    virtual int32_t serializePayload(uint8_t *frame, int32_t len);
 };
 
-
 /*
  * =====================================================================================
  *        Class:  RFDataPacket
  *  Description: Radio Data packet 
  * =====================================================================================
  */
-struct RFDataPacket : public SenetLoRaPacket
+struct RFDataPacket : public SenetPacket
 {
+    static const uint8_t RFDATA_PAYLOAD_LEN = 8;
+
     uint8_t  channel;   //  The channel the device sent on
     uint8_t  txpower;   //  The transmit power in dBm used by the device
     uint8_t  datarate;  //  The datarate used by the device
@@ -243,8 +236,8 @@
     uint8_t  rssi;      //  RSSI of the last frame received
     uint32_t timestamp; //  The device's current timestamp
 
-    RFDataPacket():
-        SenetLoRaPacket(RF_PACKET)
+    RFDataPacket(uint8_t *_buffer=NULL, uint8_t _buflen=0):
+        SenetPacket(RF_PACKET, _buffer, _buflen)
     { 
         channel   = 0;
         txpower   = 0;
@@ -257,11 +250,11 @@
     /*
      *--------------------------------------------------------------------------------------
      *       Class:  RFDataPacket
-     *      Method:  serializeData
+     *      Method:  serializePayload
      * Description:  Serialize the data 
      *--------------------------------------------------------------------------------------
      */
-    int32_t serializeData(uint8_t *frame, int32_t len);
+    virtual int32_t serializePayload(uint8_t *frame, int32_t len);
 };
 
 
@@ -271,12 +264,13 @@
  *  Description:  
  * =====================================================================================
  */
-struct SelfIdPacket : public SenetLoRaPacket
+struct SelfIdPacket : public SenetPacket
 {
     const static uint8_t EXT_POWER_SUPPLY_ID_MAX = 2;
     const static uint8_t EXT_POWER_SUPPLY_1      = 1;
     const static uint8_t EXT_POWER_SUPPLY_2      = 2;
     const static uint8_t BATTERY_LEVEL_MAX       = 7;
+    const static uint8_t SELFID_PAYLOAD_LEN      = 8;
 
     bool setDeviceType          (uint32_t model, uint8_t revision);
     bool setSwVersion           (uint8_t major, uint8_t minor, uint8_t point, uint16_t build, uint8_t developer);
@@ -284,8 +278,8 @@
     bool setBatteryLevel        (uint8_t level);
     bool setExtPowerSupplyState (uint8_t id, bool isPresent);
 
-    SelfIdPacket() :
-        SenetLoRaPacket(SELF_ID_PACKET) { deviceType = 0; swVersion = 0; powerMask = 0; }
+    SelfIdPacket(uint8_t *_buffer=NULL, uint8_t _buflen=0) :
+        SenetPacket(SELF_ID_PACKET, _buffer, _buflen) { deviceType = 0; swVersion = 0; powerMask = 0; }
 
     protected:
     uint32_t deviceType;
@@ -295,11 +289,11 @@
     /*
      *--------------------------------------------------------------------------------------
      *       Class:  SelfIdPacket 
-     *      Method:  serializeData
+     *      Method:  serializePayload
      * Description:  Serialize the data 
      *--------------------------------------------------------------------------------------
      */
-    virtual int32_t serializeData(uint8_t *frame, int32_t len); 
+    virtual int32_t serializePayload(uint8_t *frame, int32_t len); 
 };
 
 
@@ -309,14 +303,14 @@
  *  Description:  
  * =====================================================================================
  */
-struct SensorPacket : public SenetLoRaPacket
+struct SensorPacket : public SenetPacket
 {
     bool setPrimarySensor(uint16_t value) { return addSensorValue(0,1, value);};
     bool setTemperature  (uint16_t value) { return addSensorValue(1,2, value);}
     void reset();
 
-    SensorPacket() :
-        SenetLoRaPacket(SENSOR_PACKET) {}
+    SensorPacket(uint8_t *_buffer=NULL, uint8_t _buflen=0) :
+        SenetPacket(SENSOR_PACKET, _buffer, _buflen) {}
 
     protected:
     static const uint8_t MAX_SENSOR_VALUES = 2;
@@ -346,10 +340,13 @@
     /*
      *--------------------------------------------------------------------------------------
      *       Class:  SelfIdPacket 
-     *      Method:  serializeData
+     *      Method:  serializePayload
      * Description:  Serialize the data 
      *--------------------------------------------------------------------------------------
      */
-    virtual int32_t serializeData(uint8_t *frame, int32_t len);
+    virtual int32_t serializePayload(uint8_t *frame, int32_t len);
 
 };
+
+#endif // __SENET_PACKET__ 
+