Senet Packet API
Diff: senet_packet.h
- Revision:
- 0:08689149c8e3
- Child:
- 1:c4435fed9eb9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/senet_packet.h Sat Mar 05 21:56:20 2016 +0000 @@ -0,0 +1,355 @@ +/* + * ===================================================================================== + * + * Filename: senet_packet.h + * + * Description: Senet Packet types + * + * Version: 1.0 + * Created: 03/05/2016 03:13:20 PM + * Revision: 1 + * + * Author: Shaun Nelson, coder extraodinaire + * Company: Senet, Inc + * + * ===================================================================================== + */ +#include <stdint.h> +#include <assert.h> +#include <string.h> + +#define ASSERT(_expr) assert(_expr) + +// Senet packet types +enum SenetPacketT +{ + SELF_ID_PACKET = 0, + RF_PACKET = 1, + GPS_PACKET = 2, + CONTROL_PACKET = 3, + BOOT_INFO_PACKET = 4, + SENSOR_PACKET = 8, + OCTET_STRING_PACKET = 126, + UTF_8_STRING = 127 +}; + + +/* + * ===================================================================================== + * Class: SenetLoRaPacket + * Description: Senet Packet Base class + * ===================================================================================== + */ +struct SenetLoRaPacket +{ + static const uint32_t MAX_FRAME_SIZE = 242; + static const uint8_t VERSION = 1; + + + // Common packet header + struct PacketHeader + { + uint8_t version; // packet format versioni + uint8_t type; // Senet packet type + + PacketHeader(uint8_t _type=0) + { + version = VERSION; + type = _type; + } + + int32_t serialize (uint8_t *frame, int32_t len); + bool deserialize(uint8_t *frame, int32_t len); + } header; + + uint8_t pkt[MAX_FRAME_SIZE]; // serialized packet buffer + uint8_t pktLen; // serialized packet length + + SenetLoRaPacket(uint8_t senetPktType) + { + header.type = senetPktType; + header.version = VERSION; + pktLen = 0; + } + + /* + *-------------------------------------------------------------------------------------- + * Class: SenetLoRaPacket + * Method: serialize + * Description: Packet serializer + *-------------------------------------------------------------------------------------- + */ + 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;} + +}; + + +/* + * ===================================================================================== + * Class: BootInfoPacket + * Description: Device Boot information packet + * ===================================================================================== + */ +struct BootInfoPacket : public SenetLoRaPacket +{ + 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) + { + bootCount = 0; + resetCount = 0; + lastBootReason = 0; + } + + protected: + /* + *-------------------------------------------------------------------------------------- + * Class: BootInfoPacket + * Method: serializeData + * Description: Serialize packet data + *-------------------------------------------------------------------------------------- + */ + int32_t serializeData(uint8_t *frame, int32_t len); +}; + + +/* + * ===================================================================================== + * Class: ControlWordPacket + * Description: Packet to configure device + * ===================================================================================== + */ +struct ConfigWordPacket : public SenetLoRaPacket +{ + ConfigWordPacket() : + SenetLoRaPacket(CONTROL_PACKET) { config = 0; mask = 0; authKey = 0; } + + uint32_t config; // configuration word + uint32_t mask; // valid bit mask applied to configuration word + uint8_t authKey; // Downlink authentication key + + /* + *-------------------------------------------------------------------------------------- + * Class: ConfigWordPacket + * Method: serializeData + * Description: Serialize packet data + *-------------------------------------------------------------------------------------- + */ + int32_t serializeData(uint8_t *frame, int32_t len); +}; + + +/* + * ===================================================================================== + * Class: GpsPacket + * Description: Transmit device location in Decimal degress (http://www.en.wikipedia.org/wiki/Decimal_degrees) + * ===================================================================================== + */ +struct GpsPacket : public SenetLoRaPacket +{ + bool setCoordinates(uint32_t latitude, uint32_t longitude, uint16_t elevation); + inline void setTxPower(uint8_t dBm) { txPower = dBm; } + + GpsPacket(): + SenetLoRaPacket(GPS_PACKET) + { + latitude = 0; + longitude = 0; + elevation = 0; + txPower = 0; + } + + protected: + uint32_t latitude; + uint32_t longitude; + uint16_t elevation; + uint8_t txPower; + + /* + *-------------------------------------------------------------------------------------- + * Class: GpsPacket + * Method: serializeData + * Description: Serialize the data + *-------------------------------------------------------------------------------------- + */ + int32_t serializeData(uint8_t *frame, int32_t len); +}; + + +/* + * ===================================================================================== + * Class: OctetStringPacket + * Description: Variable length Octet String packet + * ===================================================================================== + */ +struct OctetStringPacket : public SenetLoRaPacket +{ + 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; + } + + protected: + uint8_t *osptr; + uint8_t maxSize; + uint8_t oslen; + + virtual int32_t serializeData(uint8_t *frame, int32_t len); +}; + + +/* + * ===================================================================================== + * Class: RFDataPacket + * Description: Radio Data packet + * ===================================================================================== + */ +struct RFDataPacket : public SenetLoRaPacket +{ + 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 + uint8_t snr; // Signal to Noise ratio of the last frame received + uint8_t rssi; // RSSI of the last frame received + uint32_t timestamp; // The device's current timestamp + + RFDataPacket(): + SenetLoRaPacket(RF_PACKET) + { + channel = 0; + txpower = 0; + datarate = 0; + snr = 0; + rssi = 0; + timestamp = 0; + } + + /* + *-------------------------------------------------------------------------------------- + * Class: RFDataPacket + * Method: serializeData + * Description: Serialize the data + *-------------------------------------------------------------------------------------- + */ + int32_t serializeData(uint8_t *frame, int32_t len); +}; + + +/* + * ===================================================================================== + * Class: SelfIdPacket + * Description: + * ===================================================================================== + */ +struct SelfIdPacket : public SenetLoRaPacket +{ + 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; + + 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); + void setBatteryFailState (bool failed); + bool setBatteryLevel (uint8_t level); + bool setExtPowerSupplyState (uint8_t id, bool isPresent); + + SelfIdPacket() : + SenetLoRaPacket(SELF_ID_PACKET) { deviceType = 0; swVersion = 0; powerMask = 0; } + + protected: + uint32_t deviceType; + uint32_t swVersion; + uint8_t powerMask; + + /* + *-------------------------------------------------------------------------------------- + * Class: SelfIdPacket + * Method: serializeData + * Description: Serialize the data + *-------------------------------------------------------------------------------------- + */ + virtual int32_t serializeData(uint8_t *frame, int32_t len); +}; + + +/* + * ===================================================================================== + * Class: SensorPacket + * Description: + * ===================================================================================== + */ +struct SensorPacket : public SenetLoRaPacket +{ + 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) {} + + protected: + static const uint8_t MAX_SENSOR_VALUES = 2; + + struct SensorValue + { + uint8_t type; + uint16_t value; + bool isSet; + + SensorValue() { type = 0; value = 0; isSet = false;} + + int32_t serialize(uint8_t *frame, int32_t len) + { + if(len < 3) + return -1; + + frame[0] = type; + frame[1] = (value >> 8) & 0xff; + frame[2] = value & 0xff; + return 3; + } + } sensorValue[MAX_SENSOR_VALUES]; + + bool addSensorValue(uint8_t position, uint8_t type, uint16_t value); + + /* + *-------------------------------------------------------------------------------------- + * Class: SelfIdPacket + * Method: serializeData + * Description: Serialize the data + *-------------------------------------------------------------------------------------- + */ + virtual int32_t serializeData(uint8_t *frame, int32_t len); + +};