Senet Packet API
Diff: senet_packet.h
- 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__
+