Senet Packet API
senet_packet.h
- Committer:
- shaunkrnelson
- Date:
- 2016-03-05
- Revision:
- 0:08689149c8e3
- Child:
- 1:c4435fed9eb9
File content as of revision 0:08689149c8e3:
/*
* =====================================================================================
*
* 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);
};