Senet Packet API
Diff: senet_packet.cpp
- Revision:
- 1:c4435fed9eb9
- Parent:
- 0:08689149c8e3
- Child:
- 2:6b85f72fe93b
--- a/senet_packet.cpp Sat Mar 05 21:56:20 2016 +0000
+++ b/senet_packet.cpp Mon Mar 07 12:08:34 2016 -0500
@@ -13,27 +13,32 @@
*
* =====================================================================================
*/
+#include "senet_packet.h"
+#include <assert.h>
+#include <stdio.h>
+
+#define ASSERT(_expr) assert(_expr)
-#include "senet_packet.h"
-// #include <cstddef>
-
-
-int32_t SenetLoRaPacket::
+int32_t SenetPacket::
PacketHeader::serialize(uint8_t *frame, int32_t len)
{
- ASSERT(len > 2);
+ int32_t serializedLen = 0;
- frame[0] = version;
- frame[1] = type;
+ if(len >= PacketHeader::HEADER_SIZE)
+ {
+ frame[0] = version;
+ frame[1] = type;
+ serializedLen = PacketHeader::HEADER_SIZE;
+ }
- return 2;
+ return serializedLen;
}
-bool SenetLoRaPacket::
+bool SenetPacket::
PacketHeader::deserialize(uint8_t *frame, int32_t len)
{
- if((frame != NULL) && (len >= 2))
+ if((frame != NULL) && (len >= PacketHeader::HEADER_SIZE))
{
version = frame[0];
type = frame[1];
@@ -42,6 +47,63 @@
return false;
}
+
+SenetPacket::SenetPacket(uint8_t senetPktType, uint8_t *_buffer, uint8_t _buflen)
+{
+ header.type = senetPktType;
+ header.version = VERSION;
+ pktLen = 0;
+
+ if(_buffer != NULL)
+ {
+ buffer = _buffer;
+ bufferLen = _buflen;
+ ownBuffer = false;
+ }
+ else
+ {
+ if(_buflen != 0)
+ bufferLen = _buflen;
+ else
+ bufferLen = MAX_FRAME_SIZE;
+
+ buffer = new uint8_t[bufferLen];
+ ASSERT(buffer != NULL);
+ ownBuffer = true;
+ }
+ memset(buffer, 0, bufferLen);
+}
+
+
+SenetPacket::~SenetPacket()
+{
+ if(ownBuffer == true)
+ delete buffer;
+}
+
+
+int32_t SenetPacket::serialize()
+{
+ pktLen = header.serialize(buffer, bufferLen);
+ ASSERT(pktLen > 0);
+
+ if(pktLen > 0)
+ {
+ int32_t payloadLen = serializePayload(buffer + pktLen, bufferLen - pktLen);
+
+ ASSERT(payloadLen > 0);
+
+ if(payloadLen > 0)
+ {
+ pktLen += payloadLen;
+ return pktLen;
+ }
+ }
+
+ return -1;
+}
+
+
bool SensorPacket::addSensorValue(uint8_t position, uint8_t type, uint16_t value)
{
if (position < MAX_SENSOR_VALUES)
@@ -55,7 +117,7 @@
return false;
}
-int32_t SensorPacket::serializeData(uint8_t *buffer, int32_t len)
+int32_t SensorPacket::serializePayload(uint8_t *buffer, int32_t len)
{
int32_t bytes = 0;
int32_t dataLen = 0;
@@ -138,65 +200,73 @@
return retVal;
}
-int32_t SelfIdPacket::serializeData(uint8_t *frame, int32_t len)
+int32_t SelfIdPacket::serializePayload(uint8_t *frame, int32_t len)
{
-#define SELFID_PACKET_LEN 8
+ int32_t out = -1;
- ASSERT(SELFID_PACKET_LEN <= len);
+ if(SELFID_PAYLOAD_LEN <= len)
+ {
+ frame[0] = (deviceType>>16) & 0xff;
+ frame[1] = (deviceType>>8) & 0xff;
+ frame[2] = deviceType & 0xff;
- frame[0] = (deviceType>>16) & 0xff;
- frame[1] = (deviceType>>8) & 0xff;
- frame[2] = deviceType & 0xff;
+ frame[3] = (swVersion >> 24) & 0xff;
+ frame[4] = (swVersion >> 16) & 0xff;
+ frame[5] = (swVersion >> 8) & 0xff;
+ frame[6] = swVersion & 0xff;
- frame[3] = (swVersion >> 24) & 0xff;
- frame[4] = (swVersion >> 16) & 0xff;
- frame[5] = (swVersion >> 8) & 0xff;
- frame[6] = swVersion & 0xff;
+ frame[7] = powerMask;
- frame[7] = powerMask;
+ out = SELFID_PAYLOAD_LEN;
+ }
- return SELFID_PACKET_LEN;
+ return out;
}
-int32_t ConfigWordPacket::serializeData(uint8_t *frame, int32_t len)
+int32_t ConfigWordPacket::serializePayload(uint8_t *frame, int32_t len)
{
-#define CONTROL_PACKET_LENGTH 9
+ int32_t out = -1;
- ASSERT(CONTROL_PACKET_LENGTH <= len);
+ if(CONTROL_PAYLOAD_LENGTH <= len)
+ {
+ frame[0] = (config>>24) & 0xff;
+ frame[1] = (config>>16) & 0xff;
+ frame[2] = (config>>8) & 0xff;
+ frame[3] = config & 0xff;
- frame[0] = (config>>24) & 0xff;
- frame[1] = (config>>16) & 0xff;
- frame[2] = (config>>8) & 0xff;
- frame[3] = config & 0xff;
+ frame[4] = (mask>>24) & 0xff;
+ frame[5] = (mask>>16) & 0xff;
+ frame[6] = (mask>>8) & 0xff;
+ frame[7] = mask & 0xff;
- frame[4] = (mask>>24) & 0xff;
- frame[5] = (mask>>16) & 0xff;
- frame[6] = (mask>>8) & 0xff;
- frame[7] = mask & 0xff;
+ frame[8] = authKey;
+ out = CONTROL_PAYLOAD_LENGTH;
+ }
- frame[8] = authKey;
-
- return CONTROL_PACKET_LENGTH;
+ return out;
}
-int32_t BootInfoPacket::serializeData(uint8_t *frame, int32_t len)
+int32_t BootInfoPacket::serializePayload(uint8_t *frame, int32_t len)
{
-#define BOOT_PACKET_LENGTH 8
+ int32_t out = -1;
- ASSERT(BOOT_PACKET_LENGTH <= len);
-
- frame[0] = (bootCount<<8) & 0xff;
- frame[1] = bootCount & 0xff;
+ if(BOOT_PAYLOAD_LENGTH <= len)
+ {
+ frame[0] = (bootCount<<8) & 0xff;
+ frame[1] = bootCount & 0xff;
- frame[2] = (resetCount<<8) & 0xff;
- frame[3] = resetCount & 0xff;
+ frame[2] = (resetCount<<8) & 0xff;
+ frame[3] = resetCount & 0xff;
- frame[4] = (lastBootReason<<24) & 0xff;
- frame[5] = (lastBootReason<<16) & 0xff;
- frame[6] = (lastBootReason<<8) & 0xff;
+ frame[4] = (lastBootReason<<24) & 0xff;
+ frame[5] = (lastBootReason<<16) & 0xff;
+ frame[6] = (lastBootReason<<8) & 0xff;
- return BOOT_PACKET_LENGTH;
+ out = BOOT_PAYLOAD_LENGTH;
+ }
+
+ return out;
}
bool GpsPacket::setCoordinates(uint32_t _latitude, uint32_t _longitude, uint16_t _elevation)
@@ -208,61 +278,82 @@
latitude = _latitude;
longitude = _longitude;
elevation = _elevation;
+
+ return true;
}
-int32_t GpsPacket::serializeData(uint8_t *frame, int32_t len)
+int32_t GpsPacket::serializePayload(uint8_t *frame, int32_t len)
{
-#define GPS_PACKET_LENGTH 7
+ int32_t out = -1;
- if(len < GPS_PACKET_LENGTH )
- return -1;
+ if(GPS_PAYLOAD_LENGTH <= len)
+ {
+ frame[0] = (latitude>>16) & 0xff;
+ frame[1] = (latitude>>8) & 0xff;
+ frame[2] = latitude & 0xff;
- frame[0] = (latitude>>16) & 0xff;
- frame[1] = (latitude>>8) & 0xff;
- frame[2] = latitude & 0xff;
+ frame[3] = (longitude>>16) & 0xff;
+ frame[4] = (longitude>>8) & 0xff;
+ frame[5] = longitude & 0xff;
+
+ frame[6] = (elevation>>8) & 0xff;
+ frame[7] = elevation & 0xff;
- frame[3] = (longitude>>16) & 0xff;
- frame[4] = (longitude>>8) & 0xff;
- frame[5] = longitude & 0xff;
+ frame[8] = txPower;
- frame[6] = txPower;
+ out = GPS_PAYLOAD_LENGTH;
+ }
- return GPS_PACKET_LENGTH;
+ return out;
}
-int32_t RFDataPacket::serializeData(uint8_t *frame, int32_t len)
+int32_t RFDataPacket::serializePayload(uint8_t *frame, int32_t len)
{
-#define RFDATA_PACKET_LEN 8
-
- ASSERT(len > RFDATA_PACKET_LEN);
+ int32_t out = -1;
- frame[0] = channel;
- frame[1] = txpower;
- frame[2] = datarate;
- frame[3] = snr;
- frame[4] = rssi;
- frame[5] = (timestamp >> 16)& 0xff;
- frame[6] = (timestamp >> 8)& 0xff;
- frame[7] = timestamp & 0xff;
- return RFDATA_PACKET_LEN;
+ if(RFDATA_PAYLOAD_LEN <= len)
+ {
+ frame[0] = channel;
+ frame[1] = txpower;
+ frame[2] = datarate;
+ frame[3] = snr;
+ frame[4] = rssi;
+ frame[5] = (timestamp >> 16)& 0xff;
+ frame[6] = (timestamp >> 8)& 0xff;
+ frame[7] = timestamp & 0xff;
+ out = RFDATA_PAYLOAD_LEN;
+ }
+ return out;
+}
+
+OctetStringPacket::OctetStringPacket(uint8_t size) :
+ SenetPacket(OCTET_STRING_PACKET, NULL, size + SenetPacket::PacketHeader::HEADER_SIZE)
+{
+ max = size;
+ oslen = 0;
}
bool OctetStringPacket::setOctetString(uint8_t *os, uint8_t len)
{
- if(len > maxSize)
+ if(len > max)
return false;
- memcpy(osptr, os, len);
oslen = len;
+ memcpy(buffer+PacketHeader::HEADER_SIZE, os, oslen);
return true;
}
-int32_t OctetStringPacket::serializeData(uint8_t *frame, int32_t len)
+int32_t OctetStringPacket::serializePayload(uint8_t *frame, int32_t len)
{
- if(len < oslen)
- oslen = len;
- memcpy(frame, osptr, oslen);
- return oslen;
+ int32_t out = -1;
+
+ if(oslen >= len)
+ {
+ memcpy(frame, buffer + PacketHeader::HEADER_SIZE, oslen);
+ out = oslen;
+ }
+
+ return out;
}