Line data Source code
1 : #include "LR2021.h"
2 :
3 : #include "../LR11x0/LR_common.h"
4 :
5 : #include <string.h>
6 : #include <math.h>
7 :
8 : #if !RADIOLIB_EXCLUDE_LR2021
9 :
10 0 : int16_t LR2021::setOokModulationParams(uint32_t bitRate, uint8_t pulseShape, uint8_t rxBw, uint8_t depth) {
11 : uint8_t buff[] = {
12 0 : (uint8_t)((bitRate >> 24) & 0xFF), (uint8_t)((bitRate >> 16) & 0xFF),
13 0 : (uint8_t)((bitRate >> 8) & 0xFF), (uint8_t)(bitRate & 0xFF),
14 : pulseShape, rxBw, depth,
15 0 : };
16 0 : return(this->SPIcommand(RADIOLIB_LR2021_CMD_SET_OOK_MODULATION_PARAMS, true, buff, sizeof(buff)));
17 : }
18 :
19 0 : int16_t LR2021::setOokPacketParams(uint16_t preambleLen, uint8_t addrComp, uint8_t packetFormat, uint16_t payloadLen, uint8_t crc, uint8_t manchester) {
20 : uint8_t buff[] = {
21 0 : (uint8_t)((preambleLen >> 8) & 0xFF), (uint8_t)(preambleLen & 0xFF),
22 0 : (uint8_t)((addrComp << 2) | ((uint8_t)packetFormat & 0x03)),
23 0 : (uint8_t)((payloadLen >> 8) & 0xFF), (uint8_t)(payloadLen & 0xFF),
24 0 : (uint8_t)(((crc << 4) & 0xF0) | (manchester & 0x0F)),
25 0 : };
26 0 : return(this->SPIcommand(RADIOLIB_LR2021_CMD_SET_OOK_PACKET_PARAMS, true, buff, sizeof(buff)));
27 : }
28 :
29 0 : int16_t LR2021::setOokCrcParams(uint32_t poly, uint32_t init) {
30 : uint8_t buff[] = {
31 0 : (uint8_t)((poly >> 24) & 0xFF), (uint8_t)((poly >> 16) & 0xFF),
32 0 : (uint8_t)((poly >> 8) & 0xFF), (uint8_t)(poly & 0xFF),
33 0 : (uint8_t)((init >> 24) & 0xFF), (uint8_t)((init >> 16) & 0xFF),
34 0 : (uint8_t)((init >> 8) & 0xFF), (uint8_t)(init & 0xFF),
35 0 : };
36 0 : return(this->SPIcommand(RADIOLIB_LR2021_CMD_SET_OOK_CRC_PARAMS, true, buff, sizeof(buff)));
37 : }
38 :
39 0 : int16_t LR2021::setOokSyncword(const uint8_t* syncWord, size_t syncWordLen, bool msbFirst) {
40 : // OOK maximum sync word length is just 32-bits, unlike GFSK
41 0 : if(syncWordLen > RADIOLIB_LR2021_OOK_SYNC_WORD_LEN) {
42 0 : return(RADIOLIB_ERR_INVALID_SYNC_WORD);
43 : }
44 :
45 0 : uint8_t buff[5] = { 0 };
46 0 : for(int8_t i = 3; i >= (int8_t) (RADIOLIB_LR2021_OOK_SYNC_WORD_LEN - syncWordLen); i--) {
47 0 : buff[i] = syncWord[i - (int8_t) (RADIOLIB_LR2021_OOK_SYNC_WORD_LEN - syncWordLen)];
48 : }
49 0 : buff[4] = (uint8_t)msbFirst << 7 | ((syncWordLen*8) & 0x7F);
50 0 : return(this->SPIcommand(RADIOLIB_LR2021_CMD_SET_OOK_SYNCWORD, true, buff, sizeof(buff)));
51 : }
52 :
53 0 : int16_t LR2021::setOokAddress(uint8_t addrNode, uint8_t addrBroadcast) {
54 0 : uint8_t buff[] = { addrNode, addrBroadcast };
55 0 : return(this->SPIcommand(RADIOLIB_LR2021_CMD_SET_OOK_ADDRESS, true, buff, sizeof(buff)));
56 : }
57 :
58 0 : int16_t LR2021::getOokRxStats(uint16_t* packetRx, uint16_t* crcError, uint16_t* lenError) {
59 0 : uint8_t buff[6] = { 0 };
60 0 : int16_t state = this->SPIcommand(RADIOLIB_LR2021_CMD_GET_OOK_RX_STATS, false, buff, sizeof(buff));
61 0 : if(packetRx) { *packetRx = ((uint16_t)(buff[0]) << 8) | (uint16_t)buff[1]; }
62 0 : if(crcError) { *crcError = ((uint16_t)(buff[2]) << 8) | (uint16_t)buff[3]; }
63 0 : if(lenError) { *lenError = ((uint16_t)(buff[4]) << 8) | (uint16_t)buff[5]; }
64 0 : return(state);
65 : }
66 :
67 0 : int16_t LR2021::getOokPacketStatus(uint16_t* packetLen, float* rssiAvg, float* rssiHigh, bool* addrMatchNode, bool* addrMatchBroadcast, float* lqi) {
68 0 : uint8_t buff[6] = { 0 };
69 0 : int16_t state = this->SPIcommand(RADIOLIB_LR2021_CMD_GET_OOK_PACKET_STATUS, false, buff, sizeof(buff));
70 : uint16_t raw;
71 0 : if(packetLen) { *packetLen = ((uint16_t)(buff[0]) << 8) | (uint16_t)buff[1]; }
72 0 : if(rssiAvg) {
73 0 : raw = (uint16_t)buff[2] << 1;
74 0 : raw |= (buff[4] & 0x04) >> 2;
75 0 : *rssiAvg = (float)raw / -2.0f;
76 : }
77 0 : if(rssiHigh) {
78 0 : raw = (uint16_t)buff[3] << 1;
79 0 : raw |= (buff[4] & 0x01);
80 0 : *rssiHigh = (float)raw / -2.0f;
81 : }
82 0 : if(addrMatchNode) { *addrMatchNode = (buff[4] & 0x10); }
83 0 : if(addrMatchBroadcast) { *addrMatchBroadcast = (buff[4] & 0x20); }
84 0 : if(lqi) { *lqi = buff[5] * 4.0f; }
85 0 : return(state);
86 : }
87 :
88 0 : int16_t LR2021::setOokDetector(uint16_t preamblePattern, uint8_t patternLen, uint8_t patternNumRepeaters, bool syncWordRaw, bool sofDelimiterRising, uint8_t sofDelimiterLen) {
89 : uint8_t buff[] = {
90 0 : (uint8_t)((preamblePattern >> 8) & 0xFF), (uint8_t)(preamblePattern & 0xFF),
91 0 : (uint8_t)(patternLen & 0x0F), (uint8_t)(patternNumRepeaters & 0x1F),
92 0 : (uint8_t)(((uint8_t)syncWordRaw << 5) | ((uint8_t)sofDelimiterRising << 4) | (sofDelimiterLen & 0x0F)),
93 0 : };
94 0 : return(this->SPIcommand(RADIOLIB_LR2021_CMD_SET_OOK_DETECTOR, true, buff, sizeof(buff)));
95 : }
96 :
97 0 : int16_t LR2021::setOokWhiteningParams(uint8_t bitIdx, uint16_t poly, uint16_t init) {
98 : uint8_t buff[] = {
99 0 : (uint8_t)((bitIdx << 4) | ((poly >> 8) & 0x0FF)), (uint8_t)(poly & 0xFF),
100 0 : (uint8_t)((init >> 8) & 0xFF), (uint8_t)(init & 0xFF),
101 0 : };
102 0 : return(this->SPIcommand(RADIOLIB_LR2021_CMD_SET_OOK_WHITENING_PARAMS, true, buff, sizeof(buff)));
103 : }
104 :
105 : #endif
|