Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: LoRaBaseStation LoRaTerminal
BasicPacket/BasicPacket.cpp@5:dcf7271595af, 2016-08-08 (annotated)
- 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?
| User | Revision | Line number | New 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 |