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