Aloha implementation of LoRa technology

Dependencies:   SX1276Lib mbed

Fork of SX1276PingPong by Semtech

Committer:
rba90
Date:
Wed Jun 08 22:15:29 2016 +0000
Revision:
16:c3c6b13c3c42
random stuff

Who changed what in which revision?

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