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::setFlrcModulationParams(uint8_t brBw, uint8_t cr, uint8_t pulseShape) { 11 0 : uint8_t buff[] = { brBw, (uint8_t)((cr << 4) | (pulseShape & 0x0F)) }; 12 0 : return(this->SPIcommand(RADIOLIB_LR2021_CMD_SET_FLRC_MODULATION_PARAMS, true, buff, sizeof(buff))); 13 : } 14 : 15 0 : int16_t LR2021::setFlrcPacketParams(uint8_t agcPreambleLen, uint8_t syncWordLen, uint8_t syncWordTx, uint8_t syncMatch, bool fixedLength, uint8_t crc, uint16_t payloadLen) { 16 : uint8_t buff[] = { 17 0 : (uint8_t)(((agcPreambleLen & 0x0F) << 2) | (syncWordLen / 2)), 18 0 : (uint8_t)(((syncWordTx & 0x03) << 6) | ((syncMatch & 0x07) << 3) | ((uint8_t)fixedLength << 2) | (crc & 0x03)), 19 0 : (uint8_t)((payloadLen >> 8) & 0xFF), (uint8_t)(payloadLen & 0xFF), 20 0 : }; 21 0 : return(this->SPIcommand(RADIOLIB_LR2021_CMD_SET_FLRC_PACKET_PARAMS, true, buff, sizeof(buff))); 22 : } 23 : 24 0 : int16_t LR2021::getFlrcRxStats(uint16_t* packetRx, uint16_t* packetCrcError, uint16_t* lenError) { 25 0 : uint8_t buff[14] = { 0 }; 26 0 : int16_t state = this->SPIcommand(RADIOLIB_LR2021_CMD_GET_FLRC_RX_STATS, false, buff, sizeof(buff)); 27 0 : if(packetRx) { *packetRx = ((uint16_t)(buff[0]) << 8) | (uint16_t)buff[1]; } 28 0 : if(packetCrcError) { *packetCrcError = ((uint16_t)(buff[2]) << 8) | (uint16_t)buff[3]; } 29 0 : if(lenError) { *lenError = ((uint16_t)(buff[4]) << 8) | (uint16_t)buff[5]; } 30 0 : return(state); 31 : } 32 : 33 0 : int16_t LR2021::getFlrcPacketStatus(uint16_t* packetLen, float* rssiAvg, float* rssiSync, uint8_t* syncWordNum) { 34 0 : uint8_t buff[5] = { 0 }; 35 0 : int16_t state = this->SPIcommand(RADIOLIB_LR2021_CMD_GET_FLRC_PACKET_STATUS, false, buff, sizeof(buff)); 36 : uint16_t raw; 37 0 : if(packetLen) { *packetLen = ((uint16_t)(buff[0]) << 8) | (uint16_t)buff[1]; } 38 0 : if(rssiAvg) { 39 0 : raw = (uint16_t)buff[2] << 1; 40 0 : raw |= (buff[4] & 0x04) >> 2; 41 0 : *rssiAvg = (float)raw / -2.0f; 42 : } 43 0 : if(rssiSync) { 44 0 : raw = (uint16_t)buff[3] << 1; 45 0 : raw |= (buff[4] & 0x01); 46 0 : *rssiSync = (float)raw / -2.0f; 47 : } 48 0 : if(syncWordNum) { *syncWordNum = (buff[4] & 0xF0) >> 4; } 49 0 : return(state); 50 : } 51 : 52 0 : int16_t LR2021::setFlrcSyncWord(uint8_t syncWordNum, uint32_t syncWord) { 53 : uint8_t buff[] = { 54 : syncWordNum, 55 0 : (uint8_t)((syncWord >> 24) & 0xFF), (uint8_t)((syncWord >> 16) & 0xFF), 56 0 : (uint8_t)((syncWord >> 8) & 0xFF), (uint8_t)(syncWord & 0xFF), 57 0 : }; 58 0 : return(this->SPIcommand(RADIOLIB_LR2021_CMD_SET_FLRC_SYNCWORD, true, buff, sizeof(buff))); 59 : } 60 : 61 : #endif