Aloha implementation of LoRa technology

Dependencies:   SX1276Lib mbed

Fork of SX1276PingPong by Semtech

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?

UserRevisionLine numberNew 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