Senet Packet API
Embed:
(wiki syntax)
Show/hide line numbers
senet_packet.cpp
00001 /* 00002 * ===================================================================================== 00003 * 00004 * Filename: senet_packet.cpp 00005 * 00006 * Description: Senet Packet Types implementation file 00007 * 00008 * Version: 1.0 00009 * Created: 03/05/2016 04:23:40 PM 00010 * 00011 * Author: S. Nelson 00012 * Company: Senet, Inc 00013 * 00014 * ===================================================================================== 00015 */ 00016 #include "senet_packet.h" 00017 #include <stdio.h> 00018 00019 #ifdef ASSERT_IS_DEFINED 00020 #include <assert.h> 00021 #define ASSERT(_expr) assert(_expr) 00022 #else 00023 #define ASSERT(_expr) 00024 #endif 00025 00026 00027 int32_t SenetPacket:: 00028 PacketHeader::serialize(uint8_t *frame, int32_t len) 00029 { 00030 int32_t serializedLen = 0; 00031 00032 if(len >= PacketHeader::HEADER_SIZE) 00033 { 00034 frame[0] = version; 00035 frame[1] = type; 00036 serializedLen = PacketHeader::HEADER_SIZE; 00037 } 00038 00039 return serializedLen; 00040 } 00041 00042 bool SenetPacket:: 00043 PacketHeader::deserialize(uint8_t *frame, int32_t len) 00044 { 00045 if((frame != NULL) && (len >= PacketHeader::HEADER_SIZE)) 00046 { 00047 version = frame[0]; 00048 type = frame[1]; 00049 return true; 00050 } 00051 return false; 00052 } 00053 00054 00055 SenetPacket::SenetPacket(uint8_t senetPktType, uint8_t *_buffer, uint8_t _buflen) 00056 { 00057 header.type = senetPktType; 00058 header.version = VERSION; 00059 pktLen = 0; 00060 00061 if(_buffer != NULL) 00062 { 00063 buffer = _buffer; 00064 bufferLen = _buflen; 00065 ownBuffer = false; 00066 } 00067 else 00068 { 00069 if(_buflen != 0) 00070 bufferLen = _buflen; 00071 else 00072 bufferLen = MAX_FRAME_SIZE; 00073 00074 buffer = new uint8_t[bufferLen]; 00075 ASSERT(buffer != NULL); 00076 ownBuffer = true; 00077 } 00078 memset(buffer, 0, bufferLen); 00079 } 00080 00081 00082 SenetPacket::~SenetPacket() 00083 { 00084 if(ownBuffer == true) 00085 delete buffer; 00086 } 00087 00088 00089 int32_t SenetPacket::serialize() 00090 { 00091 pktLen = header.serialize(buffer, bufferLen); 00092 ASSERT(pktLen > 0); 00093 00094 if(pktLen > 0) 00095 { 00096 int32_t payloadLen = serializePayload(buffer + pktLen, bufferLen - pktLen); 00097 00098 ASSERT(payloadLen > 0); 00099 00100 if(payloadLen > 0) 00101 { 00102 pktLen += payloadLen; 00103 return pktLen; 00104 } 00105 } 00106 00107 return -1; 00108 } 00109 00110 00111 bool SensorPacket::addSensorValue(uint8_t position, uint8_t type, uint16_t value) 00112 { 00113 if (position < MAX_SENSOR_VALUES) 00114 { 00115 sensorValue[position].type = type; 00116 sensorValue[position].value = value; 00117 sensorValue[position].isSet = true; 00118 return true; 00119 } 00120 else 00121 return false; 00122 } 00123 00124 int32_t SensorPacket::serializePayload(uint8_t *buffer, int32_t len) 00125 { 00126 int32_t bytes = 0; 00127 int32_t dataLen = 0; 00128 00129 for(int32_t i = 0; i < MAX_SENSOR_VALUES; i++) 00130 { 00131 if(sensorValue[i].isSet == true) 00132 { 00133 dataLen = sensorValue[i].serialize(buffer+bytes, len - bytes); 00134 if(dataLen == -1) 00135 return -1; 00136 bytes += dataLen; 00137 } 00138 } 00139 return bytes; 00140 } 00141 00142 bool SelfIdPacket::setDeviceType(uint32_t model, uint8_t revision) 00143 { 00144 if((model & 0x00FFFFFF) != model) 00145 return false; 00146 00147 deviceType = (model<<8)|revision; 00148 return true; 00149 } 00150 00151 bool SelfIdPacket::setSwVersion(uint8_t major, uint8_t minor, uint8_t point, uint16_t build, uint8_t developerId) 00152 { 00153 uint8_t _major = major & 0xf; 00154 uint8_t _minor = minor & 0xf; 00155 uint8_t _point = point & 0x3f; 00156 uint16_t _build = build & 0x3ff; 00157 uint8_t _devid = developerId & 0xff; 00158 00159 if((_major != major) || (_minor != minor) || (_point != point) || (_build != build) || (_devid != developerId)) 00160 return false; 00161 00162 swVersion = (_major << 28) | (_minor << 24) | (_point << 18) | (_build << 8) | _devid; 00163 return true; 00164 } 00165 00166 void SelfIdPacket::setBatteryFailState(bool failed) 00167 { 00168 if(failed == true) 00169 powerMask |= 1 << 3; 00170 else 00171 powerMask &= ~(1 << 3); 00172 } 00173 00174 bool SelfIdPacket::setBatteryLevel(uint8_t level) 00175 { 00176 uint8_t _level = level & 0x7; 00177 00178 if(level != _level) 00179 return false; 00180 00181 powerMask &= 0xf8; 00182 powerMask |= _level; 00183 00184 return true; 00185 } 00186 00187 bool SelfIdPacket::setExtPowerSupplyState(uint8_t id, bool isPresent) 00188 { 00189 bool retVal = false; 00190 if(id == EXT_POWER_SUPPLY_1) 00191 { 00192 powerMask &= 0x7F; 00193 if(isPresent) 00194 powerMask |= 0x80; 00195 retVal = true; 00196 } 00197 else if(id == EXT_POWER_SUPPLY_2) 00198 { 00199 powerMask &= 0xBF; 00200 if(isPresent) 00201 powerMask |= 0x40; 00202 retVal = true; 00203 } 00204 return retVal; 00205 } 00206 00207 int32_t SelfIdPacket::serializePayload(uint8_t *frame, int32_t len) 00208 { 00209 int32_t out = -1; 00210 00211 if(SELFID_PAYLOAD_LEN <= len) 00212 { 00213 frame[0] = (deviceType>>16) & 0xff; 00214 frame[1] = (deviceType>>8) & 0xff; 00215 frame[2] = deviceType & 0xff; 00216 00217 frame[3] = (swVersion >> 24) & 0xff; 00218 frame[4] = (swVersion >> 16) & 0xff; 00219 frame[5] = (swVersion >> 8) & 0xff; 00220 frame[6] = swVersion & 0xff; 00221 00222 frame[7] = powerMask; 00223 00224 out = SELFID_PAYLOAD_LEN; 00225 } 00226 00227 return out; 00228 } 00229 00230 int32_t ConfigWordPacket::serializePayload(uint8_t *frame, int32_t len) 00231 { 00232 int32_t out = -1; 00233 00234 if(CONTROL_PAYLOAD_LENGTH <= len) 00235 { 00236 frame[0] = (config>>24) & 0xff; 00237 frame[1] = (config>>16) & 0xff; 00238 frame[2] = (config>>8) & 0xff; 00239 frame[3] = config & 0xff; 00240 00241 frame[4] = (mask>>24) & 0xff; 00242 frame[5] = (mask>>16) & 0xff; 00243 frame[6] = (mask>>8) & 0xff; 00244 frame[7] = mask & 0xff; 00245 00246 frame[8] = authKey; 00247 out = CONTROL_PAYLOAD_LENGTH; 00248 } 00249 00250 return out; 00251 00252 } 00253 00254 int32_t BootInfoPacket::serializePayload(uint8_t *frame, int32_t len) 00255 { 00256 int32_t out = -1; 00257 00258 if(BOOT_PAYLOAD_LENGTH <= len) 00259 { 00260 frame[0] = (bootCount<<8) & 0xff; 00261 frame[1] = bootCount & 0xff; 00262 00263 frame[2] = (resetCount<<8) & 0xff; 00264 frame[3] = resetCount & 0xff; 00265 00266 frame[4] = (lastBootReason<<24) & 0xff; 00267 frame[5] = (lastBootReason<<16) & 0xff; 00268 frame[6] = (lastBootReason<<8) & 0xff; 00269 00270 out = BOOT_PAYLOAD_LENGTH; 00271 } 00272 00273 return out; 00274 } 00275 00276 bool GpsPacket::setCoordinates(uint32_t _latitude, uint32_t _longitude, uint16_t _elevation) 00277 { 00278 00279 if(((_latitude & 0x00ffffff) != _latitude) || ((_longitude & 0x00ffffff) != _longitude)) 00280 return false; 00281 00282 latitude = _latitude; 00283 longitude = _longitude; 00284 elevation = _elevation; 00285 00286 return true; 00287 } 00288 00289 int32_t GpsPacket::serializePayload(uint8_t *frame, int32_t len) 00290 { 00291 int32_t out = -1; 00292 00293 if(GPS_PAYLOAD_LENGTH <= len) 00294 { 00295 frame[0] = (latitude>>16) & 0xff; 00296 frame[1] = (latitude>>8) & 0xff; 00297 frame[2] = latitude & 0xff; 00298 00299 frame[3] = (longitude>>16) & 0xff; 00300 frame[4] = (longitude>>8) & 0xff; 00301 frame[5] = longitude & 0xff; 00302 00303 frame[6] = (elevation>>8) & 0xff; 00304 frame[7] = elevation & 0xff; 00305 00306 frame[8] = txPower; 00307 00308 out = GPS_PAYLOAD_LENGTH; 00309 } 00310 00311 return out; 00312 } 00313 00314 int32_t RFDataPacket::serializePayload(uint8_t *frame, int32_t len) 00315 { 00316 int32_t out = -1; 00317 00318 if(RFDATA_PAYLOAD_LEN <= len) 00319 { 00320 frame[0] = channel; 00321 frame[1] = txpower; 00322 frame[2] = datarate; 00323 frame[3] = snr; 00324 frame[4] = rssi; 00325 frame[5] = (timestamp >> 16)& 0xff; 00326 frame[6] = (timestamp >> 8)& 0xff; 00327 frame[7] = timestamp & 0xff; 00328 out = RFDATA_PAYLOAD_LEN; 00329 } 00330 return out; 00331 } 00332 00333 00334 OctetStringPacket::OctetStringPacket(uint8_t size) : 00335 SenetPacket(OCTET_STRING_PACKET, NULL, size + SenetPacket::PacketHeader::HEADER_SIZE) 00336 { 00337 max = size; 00338 oslen = 0; 00339 } 00340 00341 bool OctetStringPacket::setOctetString(uint8_t *os, uint8_t len) 00342 { 00343 if(len > max) 00344 return false; 00345 00346 oslen = len; 00347 memcpy(buffer+PacketHeader::HEADER_SIZE, os, oslen); 00348 return true; 00349 } 00350 00351 int32_t OctetStringPacket::serializePayload(uint8_t *frame, int32_t len) 00352 { 00353 int32_t out = -1; 00354 00355 if(oslen >= len) 00356 { 00357 memcpy(frame, buffer + PacketHeader::HEADER_SIZE, oslen); 00358 out = oslen; 00359 } 00360 00361 return out; 00362 } 00363
Generated on Thu Jul 21 2022 01:47:54 by
1.7.2