Senet Packet API

Dependents:   MTDOT-UDKDemo_Senet Senet NAMote mDot-IKS01A1 unh-hackathon-example ... more

Committer:
dkjendal
Date:
Tue Aug 23 16:01:03 2016 +0000
Revision:
6:17e4e5f99d0c
Parent:
4:7d43feca0e3d
Add SensorPacket deserialization routines

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shaunkrnelson 0:cc9f4010bba6 1 /*
shaunkrnelson 0:cc9f4010bba6 2 * =====================================================================================
shaunkrnelson 0:cc9f4010bba6 3 *
shaunkrnelson 0:cc9f4010bba6 4 * Filename: senet_packet.cpp
shaunkrnelson 0:cc9f4010bba6 5 *
shaunkrnelson 0:cc9f4010bba6 6 * Description: Senet Packet Types implementation file
shaunkrnelson 0:cc9f4010bba6 7 *
shaunkrnelson 0:cc9f4010bba6 8 * Version: 1.0
shaunkrnelson 0:cc9f4010bba6 9 * Created: 03/05/2016 04:23:40 PM
shaunkrnelson 0:cc9f4010bba6 10 *
shaunkrnelson 0:cc9f4010bba6 11 * Author: S. Nelson
shaunkrnelson 0:cc9f4010bba6 12 * Company: Senet, Inc
shaunkrnelson 0:cc9f4010bba6 13 *
shaunkrnelson 0:cc9f4010bba6 14 * =====================================================================================
shaunkrnelson 0:cc9f4010bba6 15 */
shaunkrnelson 0:cc9f4010bba6 16 #include "senet_packet.h"
shaunkrnelson 0:cc9f4010bba6 17 #include <stdio.h>
shaunkrnelson 0:cc9f4010bba6 18
shaunkrnelson 4:7d43feca0e3d 19 #define ASSERT(_expr)
shaunkrnelson 0:cc9f4010bba6 20
shaunkrnelson 0:cc9f4010bba6 21
shaunkrnelson 0:cc9f4010bba6 22 int32_t SenetPacket::
shaunkrnelson 0:cc9f4010bba6 23 PacketHeader::serialize(uint8_t *frame, int32_t len)
shaunkrnelson 0:cc9f4010bba6 24 {
shaunkrnelson 1:3e0cc8ad24f1 25 int32_t serializedLen = -1;
shaunkrnelson 0:cc9f4010bba6 26
shaunkrnelson 0:cc9f4010bba6 27 if(len >= PacketHeader::HEADER_SIZE)
shaunkrnelson 0:cc9f4010bba6 28 {
shaunkrnelson 1:3e0cc8ad24f1 29 serializedLen = 0;
shaunkrnelson 1:3e0cc8ad24f1 30 frame[serializedLen++] = version;
shaunkrnelson 1:3e0cc8ad24f1 31 frame[serializedLen++] = type;
shaunkrnelson 1:3e0cc8ad24f1 32
shaunkrnelson 1:3e0cc8ad24f1 33 ASSERT(serializedLen == PacketHeader::HEADER_SIZE);
shaunkrnelson 0:cc9f4010bba6 34 }
shaunkrnelson 0:cc9f4010bba6 35
shaunkrnelson 0:cc9f4010bba6 36 return serializedLen;
shaunkrnelson 0:cc9f4010bba6 37 }
shaunkrnelson 0:cc9f4010bba6 38
shaunkrnelson 1:3e0cc8ad24f1 39 int32_t SenetPacket::
shaunkrnelson 0:cc9f4010bba6 40 PacketHeader::deserialize(uint8_t *frame, int32_t len)
shaunkrnelson 0:cc9f4010bba6 41 {
shaunkrnelson 0:cc9f4010bba6 42 if((frame != NULL) && (len >= PacketHeader::HEADER_SIZE))
shaunkrnelson 0:cc9f4010bba6 43 {
shaunkrnelson 1:3e0cc8ad24f1 44 int32_t offset = 0;
shaunkrnelson 1:3e0cc8ad24f1 45 version = frame[offset++];
shaunkrnelson 1:3e0cc8ad24f1 46 type = frame[offset++];
shaunkrnelson 1:3e0cc8ad24f1 47
shaunkrnelson 1:3e0cc8ad24f1 48 ASSERT(offset == PacketHeader::HEADER_SIZE);
shaunkrnelson 1:3e0cc8ad24f1 49
shaunkrnelson 1:3e0cc8ad24f1 50 return PacketHeader::HEADER_SIZE;
shaunkrnelson 0:cc9f4010bba6 51 }
shaunkrnelson 0:cc9f4010bba6 52 return false;
shaunkrnelson 0:cc9f4010bba6 53 }
shaunkrnelson 0:cc9f4010bba6 54
shaunkrnelson 0:cc9f4010bba6 55
shaunkrnelson 0:cc9f4010bba6 56 SenetPacket::SenetPacket(uint8_t senetPktType, uint8_t *_buffer, uint8_t _buflen)
shaunkrnelson 0:cc9f4010bba6 57 {
shaunkrnelson 0:cc9f4010bba6 58 header.type = senetPktType;
shaunkrnelson 0:cc9f4010bba6 59 header.version = VERSION;
shaunkrnelson 0:cc9f4010bba6 60 pktLen = 0;
shaunkrnelson 0:cc9f4010bba6 61
shaunkrnelson 0:cc9f4010bba6 62 if(_buffer != NULL)
shaunkrnelson 0:cc9f4010bba6 63 {
shaunkrnelson 0:cc9f4010bba6 64 buffer = _buffer;
shaunkrnelson 0:cc9f4010bba6 65 bufferLen = _buflen;
shaunkrnelson 0:cc9f4010bba6 66 ownBuffer = false;
shaunkrnelson 0:cc9f4010bba6 67 }
shaunkrnelson 0:cc9f4010bba6 68 else
shaunkrnelson 0:cc9f4010bba6 69 {
shaunkrnelson 0:cc9f4010bba6 70 if(_buflen != 0)
shaunkrnelson 0:cc9f4010bba6 71 bufferLen = _buflen;
shaunkrnelson 0:cc9f4010bba6 72 else
shaunkrnelson 0:cc9f4010bba6 73 bufferLen = MAX_FRAME_SIZE;
shaunkrnelson 0:cc9f4010bba6 74
shaunkrnelson 0:cc9f4010bba6 75 buffer = new uint8_t[bufferLen];
shaunkrnelson 0:cc9f4010bba6 76 ASSERT(buffer != NULL);
shaunkrnelson 0:cc9f4010bba6 77 ownBuffer = true;
shaunkrnelson 0:cc9f4010bba6 78 }
shaunkrnelson 0:cc9f4010bba6 79 memset(buffer, 0, bufferLen);
shaunkrnelson 0:cc9f4010bba6 80 }
shaunkrnelson 0:cc9f4010bba6 81
shaunkrnelson 0:cc9f4010bba6 82
shaunkrnelson 0:cc9f4010bba6 83 SenetPacket::~SenetPacket()
shaunkrnelson 0:cc9f4010bba6 84 {
shaunkrnelson 0:cc9f4010bba6 85 if(ownBuffer == true)
shaunkrnelson 0:cc9f4010bba6 86 delete buffer;
shaunkrnelson 0:cc9f4010bba6 87 }
shaunkrnelson 0:cc9f4010bba6 88
shaunkrnelson 0:cc9f4010bba6 89
shaunkrnelson 0:cc9f4010bba6 90 int32_t SenetPacket::serialize()
shaunkrnelson 0:cc9f4010bba6 91 {
shaunkrnelson 0:cc9f4010bba6 92 pktLen = header.serialize(buffer, bufferLen);
shaunkrnelson 0:cc9f4010bba6 93 ASSERT(pktLen > 0);
shaunkrnelson 0:cc9f4010bba6 94
shaunkrnelson 0:cc9f4010bba6 95 if(pktLen > 0)
shaunkrnelson 0:cc9f4010bba6 96 {
shaunkrnelson 0:cc9f4010bba6 97 int32_t payloadLen = serializePayload(buffer + pktLen, bufferLen - pktLen);
shaunkrnelson 0:cc9f4010bba6 98
shaunkrnelson 0:cc9f4010bba6 99 ASSERT(payloadLen > 0);
shaunkrnelson 0:cc9f4010bba6 100
shaunkrnelson 0:cc9f4010bba6 101 if(payloadLen > 0)
shaunkrnelson 0:cc9f4010bba6 102 {
shaunkrnelson 0:cc9f4010bba6 103 pktLen += payloadLen;
shaunkrnelson 0:cc9f4010bba6 104 return pktLen;
shaunkrnelson 0:cc9f4010bba6 105 }
shaunkrnelson 0:cc9f4010bba6 106 }
shaunkrnelson 0:cc9f4010bba6 107
shaunkrnelson 0:cc9f4010bba6 108 return -1;
shaunkrnelson 0:cc9f4010bba6 109 }
shaunkrnelson 0:cc9f4010bba6 110
shaunkrnelson 1:3e0cc8ad24f1 111 int32_t SenetPacket::deserialize(uint8_t *frame, int32_t len)
shaunkrnelson 1:3e0cc8ad24f1 112 {
shaunkrnelson 1:3e0cc8ad24f1 113 int32_t bytes = 0;
shaunkrnelson 1:3e0cc8ad24f1 114
shaunkrnelson 1:3e0cc8ad24f1 115 bytes = header.deserialize(frame, len);
shaunkrnelson 1:3e0cc8ad24f1 116 if(bytes > 0)
shaunkrnelson 1:3e0cc8ad24f1 117 {
shaunkrnelson 1:3e0cc8ad24f1 118 int32_t payloadLen = deserializePayload(frame, len - bytes);
shaunkrnelson 1:3e0cc8ad24f1 119 if(payloadLen > 0)
shaunkrnelson 1:3e0cc8ad24f1 120 bytes += payloadLen;
shaunkrnelson 1:3e0cc8ad24f1 121 else
shaunkrnelson 1:3e0cc8ad24f1 122 bytes = payloadLen;
shaunkrnelson 1:3e0cc8ad24f1 123
shaunkrnelson 1:3e0cc8ad24f1 124 }
shaunkrnelson 1:3e0cc8ad24f1 125 return bytes;
shaunkrnelson 1:3e0cc8ad24f1 126 }
shaunkrnelson 1:3e0cc8ad24f1 127
shaunkrnelson 0:cc9f4010bba6 128
shaunkrnelson 0:cc9f4010bba6 129 bool SensorPacket::addSensorValue(uint8_t position, uint8_t type, uint16_t value)
shaunkrnelson 0:cc9f4010bba6 130 {
shaunkrnelson 0:cc9f4010bba6 131 if (position < MAX_SENSOR_VALUES)
shaunkrnelson 0:cc9f4010bba6 132 {
shaunkrnelson 0:cc9f4010bba6 133 sensorValue[position].type = type;
shaunkrnelson 0:cc9f4010bba6 134 sensorValue[position].value = value;
shaunkrnelson 0:cc9f4010bba6 135 sensorValue[position].isSet = true;
shaunkrnelson 0:cc9f4010bba6 136 return true;
shaunkrnelson 0:cc9f4010bba6 137 }
shaunkrnelson 0:cc9f4010bba6 138 else
shaunkrnelson 0:cc9f4010bba6 139 return false;
shaunkrnelson 0:cc9f4010bba6 140 }
shaunkrnelson 0:cc9f4010bba6 141
shaunkrnelson 0:cc9f4010bba6 142 int32_t SensorPacket::serializePayload(uint8_t *buffer, int32_t len)
shaunkrnelson 0:cc9f4010bba6 143 {
shaunkrnelson 0:cc9f4010bba6 144 int32_t bytes = 0;
shaunkrnelson 0:cc9f4010bba6 145 int32_t dataLen = 0;
shaunkrnelson 0:cc9f4010bba6 146
shaunkrnelson 0:cc9f4010bba6 147 for(int32_t i = 0; i < MAX_SENSOR_VALUES; i++)
shaunkrnelson 0:cc9f4010bba6 148 {
shaunkrnelson 0:cc9f4010bba6 149 if(sensorValue[i].isSet == true)
shaunkrnelson 0:cc9f4010bba6 150 {
shaunkrnelson 0:cc9f4010bba6 151 dataLen = sensorValue[i].serialize(buffer+bytes, len - bytes);
shaunkrnelson 0:cc9f4010bba6 152 if(dataLen == -1)
shaunkrnelson 0:cc9f4010bba6 153 return -1;
shaunkrnelson 0:cc9f4010bba6 154 bytes += dataLen;
shaunkrnelson 0:cc9f4010bba6 155 }
shaunkrnelson 0:cc9f4010bba6 156 }
shaunkrnelson 0:cc9f4010bba6 157 return bytes;
shaunkrnelson 0:cc9f4010bba6 158 }
dkjendal 6:17e4e5f99d0c 159 int32_t SensorPacket::deserializePayload(uint8_t *frame, int32_t len)
dkjendal 6:17e4e5f99d0c 160 {
dkjendal 6:17e4e5f99d0c 161 int32_t num_sensors = 0;
dkjendal 6:17e4e5f99d0c 162 for(int i = 0;i < MAX_SENSOR_VALUES;i++)
dkjendal 6:17e4e5f99d0c 163 {
dkjendal 6:17e4e5f99d0c 164 if(len < 3)
dkjendal 6:17e4e5f99d0c 165 break;
dkjendal 6:17e4e5f99d0c 166 sensorValue[i].type = frame[i*3+0];
dkjendal 6:17e4e5f99d0c 167 sensorValue[i].value= (frame[i*3+1]<<8)|frame[i*3+2];
dkjendal 6:17e4e5f99d0c 168 sensorValue[i].isSet= true;
dkjendal 6:17e4e5f99d0c 169 len-=3;
dkjendal 6:17e4e5f99d0c 170 num_sensors++;
dkjendal 6:17e4e5f99d0c 171 }
dkjendal 6:17e4e5f99d0c 172 return(num_sensors);
dkjendal 6:17e4e5f99d0c 173 }
shaunkrnelson 0:cc9f4010bba6 174 bool SelfIdPacket::setDeviceType(uint32_t model, uint8_t revision)
shaunkrnelson 0:cc9f4010bba6 175 {
shaunkrnelson 0:cc9f4010bba6 176 if((model & 0x00FFFFFF) != model)
shaunkrnelson 0:cc9f4010bba6 177 return false;
shaunkrnelson 0:cc9f4010bba6 178
shaunkrnelson 0:cc9f4010bba6 179 deviceType = (model<<8)|revision;
shaunkrnelson 0:cc9f4010bba6 180 return true;
shaunkrnelson 0:cc9f4010bba6 181 }
shaunkrnelson 0:cc9f4010bba6 182
shaunkrnelson 0:cc9f4010bba6 183 bool SelfIdPacket::setSwVersion(uint8_t major, uint8_t minor, uint8_t point, uint16_t build, uint8_t developerId)
shaunkrnelson 0:cc9f4010bba6 184 {
shaunkrnelson 0:cc9f4010bba6 185 uint8_t _major = major & 0xf;
shaunkrnelson 0:cc9f4010bba6 186 uint8_t _minor = minor & 0xf;
shaunkrnelson 0:cc9f4010bba6 187 uint8_t _point = point & 0x3f;
shaunkrnelson 0:cc9f4010bba6 188 uint16_t _build = build & 0x3ff;
shaunkrnelson 0:cc9f4010bba6 189 uint8_t _devid = developerId & 0xff;
shaunkrnelson 0:cc9f4010bba6 190
shaunkrnelson 0:cc9f4010bba6 191 if((_major != major) || (_minor != minor) || (_point != point) || (_build != build) || (_devid != developerId))
shaunkrnelson 0:cc9f4010bba6 192 return false;
shaunkrnelson 0:cc9f4010bba6 193
shaunkrnelson 0:cc9f4010bba6 194 swVersion = (_major << 28) | (_minor << 24) | (_point << 18) | (_build << 8) | _devid;
shaunkrnelson 0:cc9f4010bba6 195 return true;
shaunkrnelson 0:cc9f4010bba6 196 }
shaunkrnelson 0:cc9f4010bba6 197
shaunkrnelson 0:cc9f4010bba6 198 void SelfIdPacket::setBatteryFailState(bool failed)
shaunkrnelson 0:cc9f4010bba6 199 {
shaunkrnelson 0:cc9f4010bba6 200 if(failed == true)
shaunkrnelson 0:cc9f4010bba6 201 powerMask |= 1 << 3;
shaunkrnelson 0:cc9f4010bba6 202 else
shaunkrnelson 0:cc9f4010bba6 203 powerMask &= ~(1 << 3);
shaunkrnelson 0:cc9f4010bba6 204 }
shaunkrnelson 0:cc9f4010bba6 205
shaunkrnelson 0:cc9f4010bba6 206 bool SelfIdPacket::setBatteryLevel(uint8_t level)
shaunkrnelson 0:cc9f4010bba6 207 {
shaunkrnelson 0:cc9f4010bba6 208 uint8_t _level = level & 0x7;
shaunkrnelson 0:cc9f4010bba6 209
shaunkrnelson 0:cc9f4010bba6 210 if(level != _level)
shaunkrnelson 0:cc9f4010bba6 211 return false;
shaunkrnelson 0:cc9f4010bba6 212
shaunkrnelson 0:cc9f4010bba6 213 powerMask &= 0xf8;
shaunkrnelson 0:cc9f4010bba6 214 powerMask |= _level;
shaunkrnelson 0:cc9f4010bba6 215
shaunkrnelson 0:cc9f4010bba6 216 return true;
shaunkrnelson 0:cc9f4010bba6 217 }
shaunkrnelson 0:cc9f4010bba6 218
shaunkrnelson 0:cc9f4010bba6 219 bool SelfIdPacket::setExtPowerSupplyState(uint8_t id, bool isPresent)
shaunkrnelson 0:cc9f4010bba6 220 {
shaunkrnelson 0:cc9f4010bba6 221 bool retVal = false;
shaunkrnelson 0:cc9f4010bba6 222 if(id == EXT_POWER_SUPPLY_1)
shaunkrnelson 0:cc9f4010bba6 223 {
shaunkrnelson 0:cc9f4010bba6 224 powerMask &= 0x7F;
shaunkrnelson 0:cc9f4010bba6 225 if(isPresent)
shaunkrnelson 0:cc9f4010bba6 226 powerMask |= 0x80;
shaunkrnelson 0:cc9f4010bba6 227 retVal = true;
shaunkrnelson 0:cc9f4010bba6 228 }
shaunkrnelson 0:cc9f4010bba6 229 else if(id == EXT_POWER_SUPPLY_2)
shaunkrnelson 0:cc9f4010bba6 230 {
shaunkrnelson 0:cc9f4010bba6 231 powerMask &= 0xBF;
shaunkrnelson 0:cc9f4010bba6 232 if(isPresent)
shaunkrnelson 0:cc9f4010bba6 233 powerMask |= 0x40;
shaunkrnelson 0:cc9f4010bba6 234 retVal = true;
shaunkrnelson 0:cc9f4010bba6 235 }
shaunkrnelson 0:cc9f4010bba6 236 return retVal;
shaunkrnelson 0:cc9f4010bba6 237 }
shaunkrnelson 0:cc9f4010bba6 238
shaunkrnelson 0:cc9f4010bba6 239 int32_t SelfIdPacket::serializePayload(uint8_t *frame, int32_t len)
shaunkrnelson 0:cc9f4010bba6 240 {
shaunkrnelson 0:cc9f4010bba6 241 int32_t out = -1;
shaunkrnelson 0:cc9f4010bba6 242
shaunkrnelson 0:cc9f4010bba6 243 if(SELFID_PAYLOAD_LEN <= len)
shaunkrnelson 0:cc9f4010bba6 244 {
shaunkrnelson 2:9c971be7692b 245 frame[0] = (deviceType>>24) & 0xff;
shaunkrnelson 2:9c971be7692b 246 frame[1] = (deviceType>>16) & 0xff;
shaunkrnelson 2:9c971be7692b 247 frame[2] = (deviceType>>8) & 0xff;
shaunkrnelson 2:9c971be7692b 248 frame[3] = deviceType & 0xff;
shaunkrnelson 0:cc9f4010bba6 249
shaunkrnelson 2:9c971be7692b 250 frame[4] = (swVersion >> 24) & 0xff;
shaunkrnelson 2:9c971be7692b 251 frame[5] = (swVersion >> 16) & 0xff;
shaunkrnelson 2:9c971be7692b 252 frame[6] = (swVersion >> 8) & 0xff;
shaunkrnelson 2:9c971be7692b 253 frame[7] = swVersion & 0xff;
shaunkrnelson 0:cc9f4010bba6 254
shaunkrnelson 2:9c971be7692b 255 frame[8] = powerMask;
shaunkrnelson 0:cc9f4010bba6 256
shaunkrnelson 0:cc9f4010bba6 257 out = SELFID_PAYLOAD_LEN;
shaunkrnelson 0:cc9f4010bba6 258 }
shaunkrnelson 0:cc9f4010bba6 259
shaunkrnelson 0:cc9f4010bba6 260 return out;
shaunkrnelson 0:cc9f4010bba6 261 }
shaunkrnelson 0:cc9f4010bba6 262
shaunkrnelson 0:cc9f4010bba6 263 int32_t ConfigWordPacket::serializePayload(uint8_t *frame, int32_t len)
shaunkrnelson 0:cc9f4010bba6 264 {
shaunkrnelson 0:cc9f4010bba6 265 int32_t out = -1;
shaunkrnelson 0:cc9f4010bba6 266
shaunkrnelson 0:cc9f4010bba6 267 if(CONTROL_PAYLOAD_LENGTH <= len)
shaunkrnelson 0:cc9f4010bba6 268 {
shaunkrnelson 0:cc9f4010bba6 269 frame[0] = (config>>24) & 0xff;
shaunkrnelson 0:cc9f4010bba6 270 frame[1] = (config>>16) & 0xff;
shaunkrnelson 0:cc9f4010bba6 271 frame[2] = (config>>8) & 0xff;
shaunkrnelson 0:cc9f4010bba6 272 frame[3] = config & 0xff;
shaunkrnelson 0:cc9f4010bba6 273
shaunkrnelson 0:cc9f4010bba6 274 frame[4] = (mask>>24) & 0xff;
shaunkrnelson 0:cc9f4010bba6 275 frame[5] = (mask>>16) & 0xff;
shaunkrnelson 0:cc9f4010bba6 276 frame[6] = (mask>>8) & 0xff;
shaunkrnelson 0:cc9f4010bba6 277 frame[7] = mask & 0xff;
shaunkrnelson 0:cc9f4010bba6 278
shaunkrnelson 0:cc9f4010bba6 279 frame[8] = authKey;
shaunkrnelson 0:cc9f4010bba6 280 out = CONTROL_PAYLOAD_LENGTH;
shaunkrnelson 0:cc9f4010bba6 281 }
shaunkrnelson 0:cc9f4010bba6 282
shaunkrnelson 0:cc9f4010bba6 283 return out;
shaunkrnelson 0:cc9f4010bba6 284
shaunkrnelson 0:cc9f4010bba6 285 }
shaunkrnelson 0:cc9f4010bba6 286
shaunkrnelson 1:3e0cc8ad24f1 287 int32_t ConfigWordPacket::deserializePayload(uint8_t *frame, int32_t len)
shaunkrnelson 1:3e0cc8ad24f1 288 {
shaunkrnelson 1:3e0cc8ad24f1 289 if(CONTROL_PAYLOAD_LENGTH <= len)
shaunkrnelson 1:3e0cc8ad24f1 290 {
shaunkrnelson 1:3e0cc8ad24f1 291 int32_t offset = 0;
shaunkrnelson 1:3e0cc8ad24f1 292
shaunkrnelson 1:3e0cc8ad24f1 293 config = frame[offset++]<<24;
shaunkrnelson 1:3e0cc8ad24f1 294 config |= frame[offset++]<<16;
shaunkrnelson 1:3e0cc8ad24f1 295 config |= frame[offset++]<<8;
shaunkrnelson 1:3e0cc8ad24f1 296 config |= frame[offset++];
shaunkrnelson 1:3e0cc8ad24f1 297
shaunkrnelson 1:3e0cc8ad24f1 298 mask = frame[offset++]<<24;
shaunkrnelson 1:3e0cc8ad24f1 299 mask |= frame[offset++]<<16;
shaunkrnelson 1:3e0cc8ad24f1 300 mask |= frame[offset++]<<8;
shaunkrnelson 1:3e0cc8ad24f1 301 mask |= frame[offset++];
shaunkrnelson 1:3e0cc8ad24f1 302
shaunkrnelson 1:3e0cc8ad24f1 303 authKey = frame[offset++];
shaunkrnelson 1:3e0cc8ad24f1 304
shaunkrnelson 1:3e0cc8ad24f1 305 return offset;
shaunkrnelson 1:3e0cc8ad24f1 306 }
shaunkrnelson 1:3e0cc8ad24f1 307 return -1;
shaunkrnelson 1:3e0cc8ad24f1 308 }
shaunkrnelson 1:3e0cc8ad24f1 309
shaunkrnelson 1:3e0cc8ad24f1 310
shaunkrnelson 0:cc9f4010bba6 311 int32_t BootInfoPacket::serializePayload(uint8_t *frame, int32_t len)
shaunkrnelson 0:cc9f4010bba6 312 {
shaunkrnelson 0:cc9f4010bba6 313 int32_t out = -1;
shaunkrnelson 0:cc9f4010bba6 314
shaunkrnelson 0:cc9f4010bba6 315 if(BOOT_PAYLOAD_LENGTH <= len)
shaunkrnelson 0:cc9f4010bba6 316 {
shaunkrnelson 2:9c971be7692b 317 frame[0] = (bootCount>>8) & 0xff;
shaunkrnelson 0:cc9f4010bba6 318 frame[1] = bootCount & 0xff;
shaunkrnelson 0:cc9f4010bba6 319
shaunkrnelson 2:9c971be7692b 320 frame[2] = (resetCount>>8) & 0xff;
shaunkrnelson 0:cc9f4010bba6 321 frame[3] = resetCount & 0xff;
shaunkrnelson 0:cc9f4010bba6 322
shaunkrnelson 2:9c971be7692b 323 frame[4] = (lastBootReason>>24) & 0xff;
shaunkrnelson 2:9c971be7692b 324 frame[5] = (lastBootReason>>16) & 0xff;
shaunkrnelson 2:9c971be7692b 325 frame[6] = (lastBootReason>>8) & 0xff;
shaunkrnelson 2:9c971be7692b 326 frame[7] = lastBootReason & 0xff;
shaunkrnelson 2:9c971be7692b 327 frame[8] = authKey;
shaunkrnelson 0:cc9f4010bba6 328
shaunkrnelson 0:cc9f4010bba6 329 out = BOOT_PAYLOAD_LENGTH;
shaunkrnelson 0:cc9f4010bba6 330 }
shaunkrnelson 0:cc9f4010bba6 331
shaunkrnelson 0:cc9f4010bba6 332 return out;
shaunkrnelson 0:cc9f4010bba6 333 }
shaunkrnelson 0:cc9f4010bba6 334
shaunkrnelson 2:9c971be7692b 335
shaunkrnelson 2:9c971be7692b 336 int32_t BootInfoPacket::deserializePayload(uint8_t *frame, int32_t len)
shaunkrnelson 0:cc9f4010bba6 337 {
shaunkrnelson 2:9c971be7692b 338 if(BOOT_PAYLOAD_LENGTH <= len)
shaunkrnelson 2:9c971be7692b 339 {
shaunkrnelson 2:9c971be7692b 340 int32_t offset = 0;
shaunkrnelson 2:9c971be7692b 341
shaunkrnelson 2:9c971be7692b 342 bootCount = frame[offset++]<<8;
shaunkrnelson 2:9c971be7692b 343 bootCount |= frame[offset++];
shaunkrnelson 2:9c971be7692b 344
shaunkrnelson 2:9c971be7692b 345 resetCount = frame[offset++]<<8;
shaunkrnelson 2:9c971be7692b 346 resetCount |= frame[offset++];
shaunkrnelson 0:cc9f4010bba6 347
shaunkrnelson 2:9c971be7692b 348 lastBootReason = frame[offset++] << 24;
shaunkrnelson 2:9c971be7692b 349 lastBootReason |= frame[offset++] << 16;
shaunkrnelson 2:9c971be7692b 350 lastBootReason |= frame[offset++] << 8;
shaunkrnelson 2:9c971be7692b 351 lastBootReason |= frame[offset++];
shaunkrnelson 2:9c971be7692b 352
shaunkrnelson 2:9c971be7692b 353 authKey = frame[offset++];
shaunkrnelson 0:cc9f4010bba6 354
shaunkrnelson 2:9c971be7692b 355 return offset;
shaunkrnelson 2:9c971be7692b 356 }
shaunkrnelson 2:9c971be7692b 357 return -1;
shaunkrnelson 2:9c971be7692b 358 }
shaunkrnelson 2:9c971be7692b 359
shaunkrnelson 1:3e0cc8ad24f1 360 bool GpsPacket::setCoordinates(int32_t _latitude, int32_t _longitude, uint16_t _elevation)
shaunkrnelson 0:cc9f4010bba6 361 {
shaunkrnelson 0:cc9f4010bba6 362 latitude = _latitude;
shaunkrnelson 0:cc9f4010bba6 363 longitude = _longitude;
shaunkrnelson 0:cc9f4010bba6 364 elevation = _elevation;
shaunkrnelson 0:cc9f4010bba6 365
shaunkrnelson 0:cc9f4010bba6 366 return true;
shaunkrnelson 0:cc9f4010bba6 367 }
shaunkrnelson 0:cc9f4010bba6 368
shaunkrnelson 0:cc9f4010bba6 369 int32_t GpsPacket::serializePayload(uint8_t *frame, int32_t len)
shaunkrnelson 0:cc9f4010bba6 370 {
shaunkrnelson 0:cc9f4010bba6 371 int32_t out = -1;
shaunkrnelson 0:cc9f4010bba6 372
shaunkrnelson 0:cc9f4010bba6 373 if(GPS_PAYLOAD_LENGTH <= len)
shaunkrnelson 0:cc9f4010bba6 374 {
shaunkrnelson 0:cc9f4010bba6 375 frame[0] = (latitude>>16) & 0xff;
shaunkrnelson 0:cc9f4010bba6 376 frame[1] = (latitude>>8) & 0xff;
shaunkrnelson 0:cc9f4010bba6 377 frame[2] = latitude & 0xff;
shaunkrnelson 0:cc9f4010bba6 378
shaunkrnelson 0:cc9f4010bba6 379 frame[3] = (longitude>>16) & 0xff;
shaunkrnelson 0:cc9f4010bba6 380 frame[4] = (longitude>>8) & 0xff;
shaunkrnelson 0:cc9f4010bba6 381 frame[5] = longitude & 0xff;
shaunkrnelson 0:cc9f4010bba6 382
shaunkrnelson 0:cc9f4010bba6 383 frame[6] = (elevation>>8) & 0xff;
shaunkrnelson 0:cc9f4010bba6 384 frame[7] = elevation & 0xff;
shaunkrnelson 0:cc9f4010bba6 385
shaunkrnelson 0:cc9f4010bba6 386 frame[8] = txPower;
shaunkrnelson 0:cc9f4010bba6 387
shaunkrnelson 0:cc9f4010bba6 388 out = GPS_PAYLOAD_LENGTH;
shaunkrnelson 0:cc9f4010bba6 389 }
shaunkrnelson 0:cc9f4010bba6 390
shaunkrnelson 0:cc9f4010bba6 391 return out;
shaunkrnelson 0:cc9f4010bba6 392 }
shaunkrnelson 0:cc9f4010bba6 393
shaunkrnelson 0:cc9f4010bba6 394 int32_t RFDataPacket::serializePayload(uint8_t *frame, int32_t len)
shaunkrnelson 0:cc9f4010bba6 395 {
shaunkrnelson 0:cc9f4010bba6 396 int32_t out = -1;
shaunkrnelson 0:cc9f4010bba6 397
shaunkrnelson 0:cc9f4010bba6 398 if(RFDATA_PAYLOAD_LEN <= len)
shaunkrnelson 0:cc9f4010bba6 399 {
shaunkrnelson 0:cc9f4010bba6 400 frame[0] = channel;
shaunkrnelson 0:cc9f4010bba6 401 frame[1] = txpower;
shaunkrnelson 0:cc9f4010bba6 402 frame[2] = datarate;
shaunkrnelson 0:cc9f4010bba6 403 frame[3] = snr;
shaunkrnelson 2:9c971be7692b 404 frame[4] = (rssi >>8) & 0xff;
shaunkrnelson 2:9c971be7692b 405 frame[5] = rssi & 0xff;
shaunkrnelson 2:9c971be7692b 406 frame[6] = (timestamp >> 16) & 0xff;
shaunkrnelson 2:9c971be7692b 407 frame[7] = (timestamp >> 8) & 0xff;
shaunkrnelson 2:9c971be7692b 408 frame[8] = timestamp & 0xff;
shaunkrnelson 0:cc9f4010bba6 409 out = RFDATA_PAYLOAD_LEN;
shaunkrnelson 0:cc9f4010bba6 410 }
shaunkrnelson 0:cc9f4010bba6 411 return out;
shaunkrnelson 0:cc9f4010bba6 412 }
shaunkrnelson 0:cc9f4010bba6 413
shaunkrnelson 0:cc9f4010bba6 414
shaunkrnelson 0:cc9f4010bba6 415 OctetStringPacket::OctetStringPacket(uint8_t size) :
shaunkrnelson 0:cc9f4010bba6 416 SenetPacket(OCTET_STRING_PACKET, NULL, size + SenetPacket::PacketHeader::HEADER_SIZE)
shaunkrnelson 0:cc9f4010bba6 417 {
shaunkrnelson 0:cc9f4010bba6 418 max = size;
shaunkrnelson 0:cc9f4010bba6 419 oslen = 0;
shaunkrnelson 0:cc9f4010bba6 420 }
shaunkrnelson 0:cc9f4010bba6 421
shaunkrnelson 0:cc9f4010bba6 422 bool OctetStringPacket::setOctetString(uint8_t *os, uint8_t len)
shaunkrnelson 0:cc9f4010bba6 423 {
shaunkrnelson 0:cc9f4010bba6 424 if(len > max)
shaunkrnelson 0:cc9f4010bba6 425 return false;
shaunkrnelson 0:cc9f4010bba6 426
shaunkrnelson 0:cc9f4010bba6 427 oslen = len;
shaunkrnelson 0:cc9f4010bba6 428 memcpy(buffer+PacketHeader::HEADER_SIZE, os, oslen);
shaunkrnelson 0:cc9f4010bba6 429 return true;
shaunkrnelson 0:cc9f4010bba6 430 }
shaunkrnelson 0:cc9f4010bba6 431
shaunkrnelson 0:cc9f4010bba6 432 int32_t OctetStringPacket::serializePayload(uint8_t *frame, int32_t len)
shaunkrnelson 0:cc9f4010bba6 433 {
shaunkrnelson 0:cc9f4010bba6 434 int32_t out = -1;
shaunkrnelson 0:cc9f4010bba6 435
shaunkrnelson 0:cc9f4010bba6 436 if(oslen >= len)
shaunkrnelson 0:cc9f4010bba6 437 {
shaunkrnelson 0:cc9f4010bba6 438 memcpy(frame, buffer + PacketHeader::HEADER_SIZE, oslen);
shaunkrnelson 0:cc9f4010bba6 439 out = oslen;
shaunkrnelson 0:cc9f4010bba6 440 }
shaunkrnelson 0:cc9f4010bba6 441
shaunkrnelson 0:cc9f4010bba6 442 return out;
shaunkrnelson 0:cc9f4010bba6 443 }
shaunkrnelson 0:cc9f4010bba6 444