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__ +