![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Aloha implementation of LoRa technology
Fork of SX1276PingPong by
AlohaPacket.cpp@16:c3c6b13c3c42, 2016-06-08 (annotated)
- Committer:
- rba90
- Date:
- Wed Jun 08 22:15:29 2016 +0000
- Revision:
- 16:c3c6b13c3c42
random stuff
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rba90 | 16:c3c6b13c3c42 | 1 | #include "AlohaPacket.h" |
rba90 | 16:c3c6b13c3c42 | 2 | |
rba90 | 16:c3c6b13c3c42 | 3 | uint8_t crc8(const uint8_t *data, int len) |
rba90 | 16:c3c6b13c3c42 | 4 | { |
rba90 | 16:c3c6b13c3c42 | 5 | unsigned int crc = 0; |
rba90 | 16:c3c6b13c3c42 | 6 | |
rba90 | 16:c3c6b13c3c42 | 7 | for (int j = len; j; j--, data++) |
rba90 | 16:c3c6b13c3c42 | 8 | { |
rba90 | 16:c3c6b13c3c42 | 9 | crc ^= (*data << 8); |
rba90 | 16:c3c6b13c3c42 | 10 | for (int i = 8; i; i--) |
rba90 | 16:c3c6b13c3c42 | 11 | { |
rba90 | 16:c3c6b13c3c42 | 12 | if (crc & 0x8000) |
rba90 | 16:c3c6b13c3c42 | 13 | { |
rba90 | 16:c3c6b13c3c42 | 14 | crc ^= (0x1070 << 3); |
rba90 | 16:c3c6b13c3c42 | 15 | } |
rba90 | 16:c3c6b13c3c42 | 16 | crc <<= 1; |
rba90 | 16:c3c6b13c3c42 | 17 | } |
rba90 | 16:c3c6b13c3c42 | 18 | } |
rba90 | 16:c3c6b13c3c42 | 19 | |
rba90 | 16:c3c6b13c3c42 | 20 | return (uint8_t)(crc >> 8); |
rba90 | 16:c3c6b13c3c42 | 21 | } |
rba90 | 16:c3c6b13c3c42 | 22 | |
rba90 | 16:c3c6b13c3c42 | 23 | bool dissectAlohaPacket(uint8_t *input, HeaderStruct *header, DataStruct *data) |
rba90 | 16:c3c6b13c3c42 | 24 | { |
rba90 | 16:c3c6b13c3c42 | 25 | // assume user has already prepare memory in *in |
rba90 | 16:c3c6b13c3c42 | 26 | |
rba90 | 16:c3c6b13c3c42 | 27 | // get header |
rba90 | 16:c3c6b13c3c42 | 28 | if (header) |
rba90 | 16:c3c6b13c3c42 | 29 | { |
rba90 | 16:c3c6b13c3c42 | 30 | header->fid = input[0] >> 4; // higher four bits |
rba90 | 16:c3c6b13c3c42 | 31 | header->no = input[0] & 0x0f; // lower four bits |
rba90 | 16:c3c6b13c3c42 | 32 | } |
rba90 | 16:c3c6b13c3c42 | 33 | |
rba90 | 16:c3c6b13c3c42 | 34 | // get data |
rba90 | 16:c3c6b13c3c42 | 35 | if (data) |
rba90 | 16:c3c6b13c3c42 | 36 | { |
rba90 | 16:c3c6b13c3c42 | 37 | data->pd0 = input[1]; |
rba90 | 16:c3c6b13c3c42 | 38 | data->pd1 = input[2]; |
rba90 | 16:c3c6b13c3c42 | 39 | } |
rba90 | 16:c3c6b13c3c42 | 40 | |
rba90 | 16:c3c6b13c3c42 | 41 | // check crc |
rba90 | 16:c3c6b13c3c42 | 42 | if (header && data) |
rba90 | 16:c3c6b13c3c42 | 43 | { |
rba90 | 16:c3c6b13c3c42 | 44 | return input[3] == crc8(input, 3); |
rba90 | 16:c3c6b13c3c42 | 45 | } |
rba90 | 16:c3c6b13c3c42 | 46 | else |
rba90 | 16:c3c6b13c3c42 | 47 | { |
rba90 | 16:c3c6b13c3c42 | 48 | return false; |
rba90 | 16:c3c6b13c3c42 | 49 | } |
rba90 | 16:c3c6b13c3c42 | 50 | } |
rba90 | 16:c3c6b13c3c42 | 51 | |
rba90 | 16:c3c6b13c3c42 | 52 | void createAlohaPacket(uint8_t *output, HeaderStruct *header, DataStruct *data) |
rba90 | 16:c3c6b13c3c42 | 53 | { |
rba90 | 16:c3c6b13c3c42 | 54 | // assume user has already allocated memory for output |
rba90 | 16:c3c6b13c3c42 | 55 | |
rba90 | 16:c3c6b13c3c42 | 56 | // create header |
rba90 | 16:c3c6b13c3c42 | 57 | if (header) |
rba90 | 16:c3c6b13c3c42 | 58 | { |
rba90 | 16:c3c6b13c3c42 | 59 | output[0] = header->no; |
rba90 | 16:c3c6b13c3c42 | 60 | output[0] |= header->fid << 4; |
rba90 | 16:c3c6b13c3c42 | 61 | } |
rba90 | 16:c3c6b13c3c42 | 62 | |
rba90 | 16:c3c6b13c3c42 | 63 | // fit data |
rba90 | 16:c3c6b13c3c42 | 64 | if (data) |
rba90 | 16:c3c6b13c3c42 | 65 | { |
rba90 | 16:c3c6b13c3c42 | 66 | output[1] = data->pd0; |
rba90 | 16:c3c6b13c3c42 | 67 | output[2] = data->pd1; |
rba90 | 16:c3c6b13c3c42 | 68 | } |
rba90 | 16:c3c6b13c3c42 | 69 | |
rba90 | 16:c3c6b13c3c42 | 70 | // calculate CRC |
rba90 | 16:c3c6b13c3c42 | 71 | if (header && data) |
rba90 | 16:c3c6b13c3c42 | 72 | { |
rba90 | 16:c3c6b13c3c42 | 73 | output[3] = crc8(output, 3); |
rba90 | 16:c3c6b13c3c42 | 74 | } |
rba90 | 16:c3c6b13c3c42 | 75 | } |