ENEL400 / L3PDU

Dependents:   LoRaBaseStation LoRaTerminal

Committer:
rba90
Date:
Mon Aug 08 11:10:00 2016 +0000
Revision:
5:dcf7271595af
Parent:
3:35e5a721f198
Child:
6:7c719bcd3047
suit new standard

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rba90 0:f32c0e562e9a 1 #include "BasicPacket.h"
rba90 0:f32c0e562e9a 2 #include "crc.h"
rba90 3:35e5a721f198 3 #include <string.h>
rba90 0:f32c0e562e9a 4
rba90 2:f4f46b04ab8a 5 #ifdef _DEBUG
rba90 2:f4f46b04ab8a 6 #include <cassert>
rba90 2:f4f46b04ab8a 7 #endif
rba90 2:f4f46b04ab8a 8
rba90 5:dcf7271595af 9 #define CRC_BASE_IDX 2
rba90 5:dcf7271595af 10
rba90 0:f32c0e562e9a 11 BasicPacket::BasicPacket()
rba90 0:f32c0e562e9a 12 {
rba90 0:f32c0e562e9a 13 // init variables
rba90 0:f32c0e562e9a 14 memset(_buffer, 0x0, sizeof(_buffer));
rba90 0:f32c0e562e9a 15 _isVerified = false;
rba90 0:f32c0e562e9a 16 }
rba90 0:f32c0e562e9a 17
rba90 0:f32c0e562e9a 18 BasicPacket::BasicPacket(uint8_t *data)
rba90 0:f32c0e562e9a 19 {
rba90 0:f32c0e562e9a 20 // the user takes the responsibility of making sure
rba90 0:f32c0e562e9a 21 // they have sufficient memory for data buffer
rba90 0:f32c0e562e9a 22
rba90 0:f32c0e562e9a 23 // copy data to internal buffer
rba90 0:f32c0e562e9a 24 memcpy(_buffer, data, sizeof(_buffer));
rba90 0:f32c0e562e9a 25
rba90 0:f32c0e562e9a 26 // set verify flag
rba90 0:f32c0e562e9a 27 _isVerified = false;
rba90 0:f32c0e562e9a 28 }
rba90 0:f32c0e562e9a 29
rba90 0:f32c0e562e9a 30 BasicPacket::~BasicPacket()
rba90 0:f32c0e562e9a 31 {
rba90 0:f32c0e562e9a 32
rba90 0:f32c0e562e9a 33 }
rba90 0:f32c0e562e9a 34
rba90 0:f32c0e562e9a 35 void BasicPacket::generateCrc()
rba90 0:f32c0e562e9a 36 {
rba90 0:f32c0e562e9a 37 _buffer[3] = crc8(_buffer, 3);
rba90 1:dda08634a9be 38
rba90 1:dda08634a9be 39 // set verify flag
rba90 1:dda08634a9be 40 _isVerified = true;
rba90 0:f32c0e562e9a 41 }
rba90 0:f32c0e562e9a 42
rba90 0:f32c0e562e9a 43 bool BasicPacket::verify()
rba90 0:f32c0e562e9a 44 {
rba90 2:f4f46b04ab8a 45 if (_isVerified)
rba90 2:f4f46b04ab8a 46 {
rba90 2:f4f46b04ab8a 47 return true;
rba90 2:f4f46b04ab8a 48 }
rba90 2:f4f46b04ab8a 49 else
rba90 2:f4f46b04ab8a 50 {
rba90 5:dcf7271595af 51 return _buffer[7] == crc8(_buffer, 7);
rba90 2:f4f46b04ab8a 52 }
rba90 0:f32c0e562e9a 53 }
rba90 0:f32c0e562e9a 54
rba90 0:f32c0e562e9a 55 void BasicPacket::serialize(uint8_t *buffer)
rba90 0:f32c0e562e9a 56 {
rba90 0:f32c0e562e9a 57 memcpy(buffer, _buffer, sizeof(_buffer));
rba90 0:f32c0e562e9a 58 }
rba90 0:f32c0e562e9a 59
rba90 0:f32c0e562e9a 60 void BasicPacket::setFid(uint8_t fid)
rba90 0:f32c0e562e9a 61 {
rba90 0:f32c0e562e9a 62 // clear upper 4 bits
rba90 0:f32c0e562e9a 63 _buffer[0] &= 0x0f;
rba90 0:f32c0e562e9a 64
rba90 0:f32c0e562e9a 65 // set bits
rba90 0:f32c0e562e9a 66 _buffer[0] |= fid << 4;
rba90 1:dda08634a9be 67
rba90 1:dda08634a9be 68 // set verify flag
rba90 1:dda08634a9be 69 _isVerified = false;
rba90 0:f32c0e562e9a 70 }
rba90 0:f32c0e562e9a 71
rba90 5:dcf7271595af 72 void BasicPacket::setSequenceID(uint8_t seqid)
rba90 0:f32c0e562e9a 73 {
rba90 0:f32c0e562e9a 74 // clear lower 4 bits
rba90 0:f32c0e562e9a 75 _buffer[0] &= 0xf0;
rba90 0:f32c0e562e9a 76
rba90 0:f32c0e562e9a 77 // set bits
rba90 5:dcf7271595af 78 _buffer[0] |= seqid & 0x0f;
rba90 1:dda08634a9be 79
rba90 1:dda08634a9be 80 // set verify flag
rba90 1:dda08634a9be 81 _isVerified = false;
rba90 0:f32c0e562e9a 82 }
rba90 0:f32c0e562e9a 83
rba90 5:dcf7271595af 84 void BasicPacket::setSourceID(uint8_t sid)
rba90 0:f32c0e562e9a 85 {
rba90 5:dcf7271595af 86 // clear upper 4 bits
rba90 5:dcf7271595af 87 _buffer[1] &= 0x0f;
rba90 5:dcf7271595af 88
rba90 5:dcf7271595af 89 // set bits
rba90 5:dcf7271595af 90 _buffer[1] |= sid << 4;
rba90 1:dda08634a9be 91
rba90 1:dda08634a9be 92 // set verify flag
rba90 1:dda08634a9be 93 _isVerified = false;
rba90 0:f32c0e562e9a 94 }
rba90 0:f32c0e562e9a 95
rba90 5:dcf7271595af 96 void BasicPacket::setDestinationID(uint8_t did)
rba90 0:f32c0e562e9a 97 {
rba90 5:dcf7271595af 98 // clear lower 4 bits
rba90 5:dcf7271595af 99 _buffer[1] = 0xf0;
rba90 5:dcf7271595af 100
rba90 5:dcf7271595af 101 // set bits
rba90 5:dcf7271595af 102 _buffer[1] |= did & 0x0f;
rba90 5:dcf7271595af 103
rba90 5:dcf7271595af 104 // set verify flag
rba90 5:dcf7271595af 105 _isVerified = false;
rba90 5:dcf7271595af 106 }
rba90 5:dcf7271595af 107
rba90 5:dcf7271595af 108 void BasicPacket::setField(uint8_t idx, uint8_t data)
rba90 5:dcf7271595af 109 {
rba90 5:dcf7271595af 110 // set payload based on index
rba90 5:dcf7271595af 111 _buffer[CRC_BASE_IDX + idx] = data;
rba90 1:dda08634a9be 112
rba90 1:dda08634a9be 113 // set verify flag
rba90 1:dda08634a9be 114 _isVerified = false;
rba90 0:f32c0e562e9a 115 }
rba90 0:f32c0e562e9a 116
rba90 0:f32c0e562e9a 117 uint8_t BasicPacket::getFid()
rba90 0:f32c0e562e9a 118 {
rba90 0:f32c0e562e9a 119 return (_buffer[0] & 0xf0) >> 4;
rba90 0:f32c0e562e9a 120 }
rba90 0:f32c0e562e9a 121
rba90 5:dcf7271595af 122 uint8_t BasicPacket::getSequenceID()
rba90 0:f32c0e562e9a 123 {
rba90 0:f32c0e562e9a 124 return _buffer[0] & 0x0f;
rba90 0:f32c0e562e9a 125 }
rba90 0:f32c0e562e9a 126
rba90 5:dcf7271595af 127 uint8_t BasicPacket::getSourceID()
rba90 0:f32c0e562e9a 128 {
rba90 5:dcf7271595af 129 return (_buffer[1] & 0xf0) >> 4;
rba90 0:f32c0e562e9a 130 }
rba90 0:f32c0e562e9a 131
rba90 5:dcf7271595af 132 uint8_t BasicPacket::getDestinationID()
rba90 0:f32c0e562e9a 133 {
rba90 5:dcf7271595af 134 return _buffer[1] & 0x0f;
rba90 5:dcf7271595af 135 }
rba90 5:dcf7271595af 136
rba90 5:dcf7271595af 137 uint8_t BasicPacket::getField(uint8_t idx)
rba90 5:dcf7271595af 138 {
rba90 5:dcf7271595af 139 return _buffer[CRC_BASE_IDX + idx];
rba90 0:f32c0e562e9a 140 }
rba90 0:f32c0e562e9a 141
rba90 0:f32c0e562e9a 142 uint8_t BasicPacket::getCrc()
rba90 0:f32c0e562e9a 143 {
rba90 2:f4f46b04ab8a 144 if (_isVerified)
rba90 2:f4f46b04ab8a 145 {
rba90 5:dcf7271595af 146 return _buffer[7];
rba90 2:f4f46b04ab8a 147 }
rba90 2:f4f46b04ab8a 148 else
rba90 2:f4f46b04ab8a 149 {
rba90 5:dcf7271595af 150 return crc8(_buffer, 7);
rba90 2:f4f46b04ab8a 151 }
rba90 0:f32c0e562e9a 152 }
rba90 2:f4f46b04ab8a 153
rba90 2:f4f46b04ab8a 154 #ifdef _DEBUG
rba90 2:f4f46b04ab8a 155 void BasicPacket::unit_test()
rba90 2:f4f46b04ab8a 156 {
rba90 2:f4f46b04ab8a 157 // value test
rba90 2:f4f46b04ab8a 158 BasicPacket testObject;
rba90 2:f4f46b04ab8a 159 testObject.setFid(0x1);
rba90 2:f4f46b04ab8a 160 testObject.setField1(0x2);
rba90 2:f4f46b04ab8a 161 testObject.setField2(0x34);
rba90 2:f4f46b04ab8a 162 testObject.setField3(0x67);
rba90 2:f4f46b04ab8a 163
rba90 2:f4f46b04ab8a 164 assert(0x1 == testObject.getFid());
rba90 2:f4f46b04ab8a 165 assert(0x2 == testObject.getField1());
rba90 2:f4f46b04ab8a 166 assert(0x34 == testObject.getField2());
rba90 2:f4f46b04ab8a 167 assert(0x67 == testObject.getField3());
rba90 2:f4f46b04ab8a 168
rba90 2:f4f46b04ab8a 169 assert(false == testObject.verify());
rba90 2:f4f46b04ab8a 170 testObject.generateCrc();
rba90 2:f4f46b04ab8a 171 assert(true == testObject.verify());
rba90 2:f4f46b04ab8a 172 assert(0xeb == testObject.getCrc());
rba90 2:f4f46b04ab8a 173
rba90 2:f4f46b04ab8a 174 // value test 2
rba90 2:f4f46b04ab8a 175 uint8_t testString[] = { 0x12, 0x34, 0x67, 0xeb };
rba90 2:f4f46b04ab8a 176 BasicPacket testObject2(testString);
rba90 2:f4f46b04ab8a 177
rba90 2:f4f46b04ab8a 178 assert(0x1 == testObject2.getFid());
rba90 2:f4f46b04ab8a 179 assert(0x2 == testObject2.getField1());
rba90 2:f4f46b04ab8a 180 assert(0x34 == testObject2.getField2());
rba90 2:f4f46b04ab8a 181 assert(0x67 == testObject2.getField3());
rba90 2:f4f46b04ab8a 182
rba90 2:f4f46b04ab8a 183 assert(true == testObject2.verify());
rba90 2:f4f46b04ab8a 184 testObject2.generateCrc();
rba90 2:f4f46b04ab8a 185 assert(true == testObject2.verify());
rba90 2:f4f46b04ab8a 186 assert(0xeb == testObject2.getCrc());
rba90 2:f4f46b04ab8a 187 }
rba90 2:f4f46b04ab8a 188 #endif