LCOV - code coverage report
Current view: top level - src/modules/SX127x - SX1272.cpp (source / functions) Hit Total Coverage
Test: lcov.info Lines: 62 367 16.9 %
Date: 2026-06-03 18:53:41 Functions: 14 33 42.4 %

          Line data    Source code
       1             : #include "SX1272.h"
       2             : #include <math.h>
       3             : #if !RADIOLIB_EXCLUDE_SX127X
       4             : 
       5           3 : SX1272::SX1272(Module* mod) : SX127x(mod) {
       6             : 
       7           3 : }
       8             : 
       9           0 : int16_t SX1272::begin(const ConfigLoRa_t& cfg) {
      10             :   // execute common part
      11           0 :   uint8_t version = RADIOLIB_SX1272_CHIP_VERSION;
      12           0 :   int16_t state = SX127x::begin(&version, 1, cfg.syncWord, cfg.preambleLength);
      13           0 :   RADIOLIB_ASSERT(state);
      14             : 
      15             :   // configure publicly accessible settings
      16           0 :   state = setBandwidth(cfg.bandwidth);
      17           0 :   RADIOLIB_ASSERT(state);
      18             : 
      19           0 :   state = setFrequency(cfg.frequency);
      20           0 :   RADIOLIB_ASSERT(state);
      21             : 
      22           0 :   state = setSpreadingFactor(cfg.spreadingFactor);
      23           0 :   RADIOLIB_ASSERT(state);
      24             : 
      25           0 :   state = setCodingRate(cfg.codingRate);
      26           0 :   RADIOLIB_ASSERT(state);
      27             : 
      28           0 :   state = setOutputPower(cfg.power);
      29           0 :   RADIOLIB_ASSERT(state);
      30             : 
      31           0 :   state = setGain(this->gain);
      32           0 :   RADIOLIB_ASSERT(state);
      33             : 
      34             :   // set publicly accessible settings that are not a part of begin method
      35           0 :   state = setCRC(true);
      36           0 :   return(state);
      37             : }
      38             : 
      39           0 : int16_t SX1272::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint16_t preambleLength, uint8_t gain) {
      40           0 :   ConfigLoRa_t cfg;
      41           0 :   cfg.frequency = freq;
      42           0 :   cfg.bandwidth = bw;
      43           0 :   cfg.spreadingFactor = sf;
      44           0 :   cfg.codingRate = cr;
      45           0 :   cfg.syncWord = syncWord;
      46           0 :   cfg.power = power;
      47           0 :   cfg.preambleLength = preambleLength;
      48           0 :   this->gain = gain;
      49           0 :   return(begin(cfg));
      50             : }
      51             : 
      52           0 : int16_t SX1272::beginFSK(const ConfigFSK_t& cfg) {
      53             :   // execute common part
      54           0 :   uint8_t version = RADIOLIB_SX1272_CHIP_VERSION;
      55           0 :   int16_t state = SX127x::beginFSK(&version, 1, cfg.frequencyDeviation, cfg.receiverBandwidth, cfg.preambleLength);
      56           0 :   RADIOLIB_ASSERT(state);
      57             : 
      58             :   // configure settings not accessible by API
      59           0 :   state = configFSK();
      60           0 :   RADIOLIB_ASSERT(state);
      61             : 
      62             :   // configure publicly accessible settings
      63           0 :   state = setFrequency(cfg.frequency);
      64           0 :   RADIOLIB_ASSERT(state);
      65             : 
      66           0 :   state = setBitRate(cfg.bitRate);
      67           0 :   RADIOLIB_ASSERT(state);
      68             : 
      69           0 :   state = setOutputPower(cfg.power);
      70           0 :   RADIOLIB_ASSERT(state);
      71             : 
      72           0 :   if(this->enableOOK) {
      73           0 :     state = setDataShapingOOK(RADIOLIB_SHAPING_NONE);
      74           0 :     RADIOLIB_ASSERT(state);
      75             :   } else {
      76           0 :     state = setDataShaping(RADIOLIB_SHAPING_NONE);
      77           0 :     RADIOLIB_ASSERT(state);
      78             :   }
      79             : 
      80             :   // set publicly accessible settings that are not a part of begin method
      81           0 :   state = setCRC(true);
      82           0 :   return(state);
      83             : }
      84             : 
      85           0 : int16_t SX1272::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint16_t preambleLength, bool enableOOK) {
      86           0 :   ConfigFSK_t cfg;
      87           0 :   cfg.frequency = freq;
      88           0 :   cfg.bitRate = br;
      89           0 :   cfg.frequencyDeviation = freqDev;
      90           0 :   cfg.receiverBandwidth = rxBw;
      91           0 :   cfg.power = power;
      92           0 :   cfg.preambleLength = preambleLength;
      93           0 :   this->enableOOK = enableOOK;
      94           0 :   return(beginFSK(cfg));
      95             : }
      96             : 
      97           0 : void SX1272::reset() {
      98           0 :   Module* mod = this->getMod();
      99           0 :   mod->hal->pinMode(mod->getRst(), mod->hal->GpioModeOutput);
     100           0 :   mod->hal->digitalWrite(mod->getRst(), mod->hal->GpioLevelHigh);
     101           0 :   mod->hal->delay(1);
     102           0 :   mod->hal->digitalWrite(mod->getRst(), mod->hal->GpioLevelLow);
     103           0 :   mod->hal->delay(5);
     104           0 : }
     105             : 
     106           3 : int16_t SX1272::setFrequency(float freq) {
     107           3 :   RADIOLIB_CHECK_RANGE(freq, 860.0f, 1020.0f, RADIOLIB_ERR_INVALID_FREQUENCY);
     108             : 
     109             :   // set frequency and if successful, save the new setting
     110           0 :   int16_t state = SX127x::setFrequencyRaw(freq);
     111           0 :   if(state == RADIOLIB_ERR_NONE) {
     112           0 :     SX127x::frequency = freq;
     113             :   }
     114           0 :   return(state);
     115             : }
     116             : 
     117           0 : int16_t SX1272::setBandwidth(float bw) {
     118             :   // check active modem
     119           0 :   if(getActiveModem() != RADIOLIB_SX127X_LORA) {
     120           0 :     return(RADIOLIB_ERR_WRONG_MODEM);
     121             :   }
     122             : 
     123             :   uint8_t newBandwidth;
     124             : 
     125             :   // check allowed bandwidth values
     126           0 :   if(fabsf(bw - 125.0f) <= 0.001f) {
     127           0 :     newBandwidth = RADIOLIB_SX1272_BW_125_00_KHZ;
     128           0 :   } else if(fabsf(bw - 250.0f) <= 0.001f) {
     129           0 :     newBandwidth = RADIOLIB_SX1272_BW_250_00_KHZ;
     130           0 :   } else if(fabsf(bw - 500.0f) <= 0.001f) {
     131           0 :     newBandwidth = RADIOLIB_SX1272_BW_500_00_KHZ;
     132             :   } else {
     133           0 :     return(RADIOLIB_ERR_INVALID_BANDWIDTH);
     134             :   }
     135             : 
     136             :   // set bandwidth and if successful, save the new setting
     137           0 :   int16_t state = SX1272::setBandwidthRaw(newBandwidth);
     138           0 :   if(state == RADIOLIB_ERR_NONE) {
     139           0 :     SX127x::bandwidth = bw;
     140             : 
     141             :     // calculate symbol length and set low data rate optimization, if auto-configuration is enabled
     142           0 :     if(this->ldroAuto) {
     143           0 :       float symbolLength = (float)(uint32_t(1) << SX127x::spreadingFactor) / (float)SX127x::bandwidth;
     144           0 :       Module* mod = this->getMod();
     145           0 :       if(symbolLength >= 16.0f) {
     146           0 :         this->ldroEnabled = true;
     147           0 :         state = mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_LOW_DATA_RATE_OPT_ON, 0, 0);
     148             :       } else {
     149           0 :         this->ldroEnabled = false;
     150           0 :         state = mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_LOW_DATA_RATE_OPT_OFF, 0, 0);
     151             :       }
     152             :     }
     153             :   }
     154           0 :   return(state);
     155             : }
     156             : 
     157           2 : int16_t SX1272::setSpreadingFactor(uint8_t sf) {
     158             :   // check active modem
     159           2 :   if(getActiveModem() != RADIOLIB_SX127X_LORA) {
     160           0 :     return(RADIOLIB_ERR_WRONG_MODEM);
     161             :   }
     162             : 
     163             :   uint8_t newSpreadingFactor;
     164             : 
     165             :   // check allowed spreading factor values
     166           2 :   switch(sf) {
     167           0 :     case 6:
     168           0 :       newSpreadingFactor = RADIOLIB_SX127X_SF_6;
     169           0 :       break;
     170           0 :     case 7:
     171           0 :       newSpreadingFactor = RADIOLIB_SX127X_SF_7;
     172           0 :       break;
     173           0 :     case 8:
     174           0 :       newSpreadingFactor = RADIOLIB_SX127X_SF_8;
     175           0 :       break;
     176           0 :     case 9:
     177           0 :       newSpreadingFactor = RADIOLIB_SX127X_SF_9;
     178           0 :       break;
     179           0 :     case 10:
     180           0 :       newSpreadingFactor = RADIOLIB_SX127X_SF_10;
     181           0 :       break;
     182           0 :     case 11:
     183           0 :       newSpreadingFactor = RADIOLIB_SX127X_SF_11;
     184           0 :       break;
     185           0 :     case 12:
     186           0 :       newSpreadingFactor = RADIOLIB_SX127X_SF_12;
     187           0 :       break;
     188           2 :     default:
     189           2 :       return(RADIOLIB_ERR_INVALID_SPREADING_FACTOR);
     190             :   }
     191             : 
     192             :   // set spreading factor and if successful, save the new setting
     193           0 :   int16_t state = SX1272::setSpreadingFactorRaw(newSpreadingFactor);
     194           0 :   if(state == RADIOLIB_ERR_NONE) {
     195           0 :     SX127x::spreadingFactor = sf;
     196             : 
     197             :     // calculate symbol length and set low data rate optimization, if auto-configuration is enabled
     198           0 :     if(this->ldroAuto) {
     199           0 :       float symbolLength = (float)(uint32_t(1) << SX127x::spreadingFactor) / (float)SX127x::bandwidth;
     200           0 :       Module* mod = this->getMod();
     201           0 :       if(symbolLength >= 16.0f) {
     202           0 :         state = mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_LOW_DATA_RATE_OPT_ON, 0, 0);
     203             :       } else {
     204           0 :         state = mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_LOW_DATA_RATE_OPT_OFF, 0, 0);
     205             :       }
     206             :     }
     207             :   }
     208           0 :   return(state);
     209             : }
     210             : 
     211           0 : int16_t SX1272::setCodingRate(uint8_t cr) {
     212             :   // check active modem
     213           0 :   if(getActiveModem() != RADIOLIB_SX127X_LORA) {
     214           0 :     return(RADIOLIB_ERR_WRONG_MODEM);
     215             :   }
     216             : 
     217             :   uint8_t newCodingRate;
     218             : 
     219             :   // check allowed coding rate values
     220           0 :   switch(cr) {
     221           0 :     case 4:
     222           0 :       newCodingRate = RADIOLIB_SX1272_CR_4_4;
     223           0 :       break;
     224           0 :     case 5:
     225           0 :       newCodingRate = RADIOLIB_SX1272_CR_4_5;
     226           0 :       break;
     227           0 :     case 6:
     228           0 :       newCodingRate = RADIOLIB_SX1272_CR_4_6;
     229           0 :       break;
     230           0 :     case 7:
     231           0 :       newCodingRate = RADIOLIB_SX1272_CR_4_7;
     232           0 :       break;
     233           0 :     case 8:
     234           0 :       newCodingRate = RADIOLIB_SX1272_CR_4_8;
     235           0 :       break;
     236           0 :     default:
     237           0 :       return(RADIOLIB_ERR_INVALID_CODING_RATE);
     238             :   }
     239             : 
     240             :   // set coding rate and if successful, save the new setting
     241           0 :   int16_t state = SX1272::setCodingRateRaw(newCodingRate);
     242           0 :   if(state == RADIOLIB_ERR_NONE) {
     243           0 :     SX127x::codingRate = cr;
     244             :   }
     245           0 :   return(state);
     246             : }
     247             : 
     248           3 : int16_t SX1272::setBitRate(float br) {
     249           3 :   return(SX127x::setBitRateCommon(br, RADIOLIB_SX1272_REG_BIT_RATE_FRAC));
     250             : }
     251             : 
     252           2 : int16_t SX1272::setDataRate(DataRate_t dr, ModemType_t modem) {
     253             :   // get the current modem
     254             :   ModemType_t currentModem;
     255           2 :   int16_t state = this->getModem(&currentModem);
     256           2 :   RADIOLIB_ASSERT(state);
     257             : 
     258             :   // switch over if the requested modem is different
     259           2 :   if(modem != RADIOLIB_MODEM_NONE && modem != currentModem) {
     260           0 :     state = this->standby();
     261           0 :     RADIOLIB_ASSERT(state);
     262           0 :     state = this->setModem(modem);
     263           0 :     RADIOLIB_ASSERT(state);
     264             :   }
     265             :   
     266           2 :   if(modem == RADIOLIB_MODEM_NONE) {
     267           2 :     modem = currentModem;
     268             :   }
     269             : 
     270             :   // select interpretation based on modem
     271           2 :   if(modem == RADIOLIB_MODEM_FSK) {
     272             :     // set the bit rate
     273           0 :     state = this->setBitRate(dr.fsk.bitRate);
     274           0 :     RADIOLIB_ASSERT(state);
     275             : 
     276             :     // set the frequency deviation
     277           0 :     state = this->setFrequencyDeviation(dr.fsk.freqDev);
     278             : 
     279           2 :   } else if(modem == RADIOLIB_MODEM_LORA) {
     280             :     // set the spreading factor
     281           2 :     state = this->setSpreadingFactor(dr.lora.spreadingFactor);
     282           2 :     RADIOLIB_ASSERT(state);
     283             : 
     284             :     // set the bandwidth
     285           0 :     state = this->setBandwidth(dr.lora.bandwidth);
     286           0 :     RADIOLIB_ASSERT(state);
     287             : 
     288             :     // set the coding rate
     289           0 :     state = this->setCodingRate(dr.lora.codingRate);
     290             :   }
     291             : 
     292           0 :   return(state);
     293             : }
     294             : 
     295           2 : int16_t SX1272::checkDataRate(DataRate_t dr, ModemType_t modem) {
     296           2 :   int16_t state = RADIOLIB_ERR_UNKNOWN;
     297             : 
     298             :   // retrieve modem if not supplied
     299           2 :   if(modem == RADIOLIB_MODEM_NONE) {
     300           2 :     state = this->getModem(&modem);
     301           2 :     RADIOLIB_ASSERT(state);
     302             :   }
     303             : 
     304             :   // select interpretation based on modem
     305           2 :   if(modem == RADIOLIB_MODEM_FSK) {
     306           0 :     RADIOLIB_CHECK_RANGE(dr.fsk.bitRate, 0.5f, 300.0f, RADIOLIB_ERR_INVALID_BIT_RATE);
     307           0 :     if(!((dr.fsk.freqDev + dr.fsk.bitRate/2.0f <= 250.0f) && (dr.fsk.freqDev <= 200.0f))) {
     308           0 :       return(RADIOLIB_ERR_INVALID_FREQUENCY_DEVIATION);
     309             :     }
     310           0 :     return(RADIOLIB_ERR_NONE);
     311             : 
     312           2 :   } else if(modem == RADIOLIB_MODEM_LORA) {
     313           2 :     RADIOLIB_CHECK_RANGE(dr.lora.spreadingFactor, 6, 12, RADIOLIB_ERR_INVALID_SPREADING_FACTOR);
     314           0 :     RADIOLIB_CHECK_RANGE(dr.lora.bandwidth, 100.0f, 510.0f, RADIOLIB_ERR_INVALID_BANDWIDTH);
     315           0 :     RADIOLIB_CHECK_RANGE(dr.lora.codingRate, 4, 8, RADIOLIB_ERR_INVALID_CODING_RATE);
     316           0 :     return(RADIOLIB_ERR_NONE);
     317             :   
     318             :   }
     319             : 
     320           0 :   return(state);
     321             : }
     322             : 
     323           3 : int16_t SX1272::setOutputPower(int8_t power) {
     324           3 :   return(this->setOutputPower(power, false));
     325             : }
     326             : 
     327           3 : int16_t SX1272::setOutputPower(int8_t power, bool forceRfo) {
     328             :   // check if power value is configurable
     329           3 :   bool useRfo = (power < 2) || forceRfo;
     330           3 :   int16_t state = checkOutputPower(power, NULL, useRfo);
     331           3 :   RADIOLIB_ASSERT(state);
     332             : 
     333             :   // set mode to standby
     334           3 :   state = SX127x::standby();
     335           3 :   Module* mod = this->getMod();
     336             : 
     337           3 :   if(useRfo) {
     338             :     // RFO output
     339           3 :     state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, RADIOLIB_SX127X_PA_SELECT_RFO, 7, 7);
     340           3 :     state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, (power + 1), 3, 0);
     341           3 :     state |= mod->SPIsetRegValue(RADIOLIB_SX1272_REG_PA_DAC, RADIOLIB_SX127X_PA_BOOST_OFF, 2, 0);
     342             : 
     343             :   } else {
     344           0 :     if(power <= 17) {
     345             :       // power is 2 - 17 dBm, enable PA1 + PA2 on PA_BOOST
     346           0 :       state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, RADIOLIB_SX127X_PA_SELECT_BOOST, 7, 7);
     347           0 :       state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, (power - 2), 3, 0);
     348           0 :       state |= mod->SPIsetRegValue(RADIOLIB_SX1272_REG_PA_DAC, RADIOLIB_SX127X_PA_BOOST_OFF, 2, 0);
     349             : 
     350             :     } else {
     351             :       // power is 18 - 20 dBm, enable PA1 + PA2 on PA_BOOST and enable high power control
     352           0 :       state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, RADIOLIB_SX127X_PA_SELECT_BOOST, 7, 7);
     353           0 :       state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PA_CONFIG, (power - 5), 3, 0);
     354           0 :       state |= mod->SPIsetRegValue(RADIOLIB_SX1272_REG_PA_DAC, RADIOLIB_SX127X_PA_BOOST_ON, 2, 0);
     355             : 
     356             :     }
     357             : 
     358             :   }
     359             : 
     360           3 :   return(state);
     361             : }
     362             : 
     363           3 : int16_t SX1272::checkOutputPower(int8_t power, int8_t* clipped) {
     364           3 :   return(checkOutputPower(power, clipped, false));
     365             : }
     366             : 
     367           6 : int16_t SX1272::checkOutputPower(int8_t power, int8_t* clipped, bool useRfo) {
     368             :   // check allowed power range
     369           6 :   if(useRfo) {
     370           3 :     if(clipped) {
     371           0 :       *clipped = RADIOLIB_MAX(-1, RADIOLIB_MIN(14, power));
     372             :     }
     373           3 :     RADIOLIB_CHECK_RANGE(power, -1, 14, RADIOLIB_ERR_INVALID_OUTPUT_POWER);
     374             :   } else {
     375           3 :     if(clipped) {
     376           0 :       *clipped = RADIOLIB_MAX(2, RADIOLIB_MIN(20, power));
     377             :     }
     378           3 :     RADIOLIB_CHECK_RANGE(power, 2, 20, RADIOLIB_ERR_INVALID_OUTPUT_POWER);
     379             :   }
     380           3 :   return(RADIOLIB_ERR_NONE);
     381             : }
     382             : 
     383           0 : int16_t SX1272::setGain(uint8_t gain) {
     384             :   // check allowed range
     385           0 :   if(gain > 6) {
     386           0 :     return(RADIOLIB_ERR_INVALID_GAIN);
     387             :   }
     388             : 
     389             :   // set mode to standby
     390           0 :   int16_t state = SX127x::standby();
     391           0 :   Module* mod = this->getMod();
     392             : 
     393             :   // get modem
     394           0 :   int16_t modem = getActiveModem();
     395           0 :   if(modem == RADIOLIB_SX127X_LORA) {
     396             :     // set gain
     397           0 :     if(gain == 0) {
     398             :       // gain set to 0, enable AGC loop
     399           0 :       state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, RADIOLIB_SX1272_AGC_AUTO_ON, 2, 2);
     400             :     } else {
     401           0 :       state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, RADIOLIB_SX1272_AGC_AUTO_OFF, 2, 2);
     402           0 :       state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_LNA, (gain << 5) | RADIOLIB_SX127X_LNA_BOOST_ON);
     403             :     }
     404             : 
     405           0 :   } else if(modem == RADIOLIB_SX127X_FSK_OOK) {
     406             :     // set gain
     407           0 :     if(gain == 0) {
     408             :       // gain set to 0, enable AGC loop
     409           0 :       state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_RX_CONFIG, RADIOLIB_SX127X_AGC_AUTO_ON, 3, 3);
     410             :     } else {
     411           0 :       state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_RX_CONFIG, RADIOLIB_SX127X_AGC_AUTO_ON, 3, 3);
     412           0 :       state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_LNA, (gain << 5) | RADIOLIB_SX127X_LNA_BOOST_ON);
     413             :     }
     414             : 
     415             :   }
     416             : 
     417           0 :   return(state);
     418             : }
     419             : 
     420           3 : int16_t SX1272::setDataShaping(uint8_t sh) {
     421             :   // check active modem
     422           3 :   if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) {
     423           3 :     return(RADIOLIB_ERR_WRONG_MODEM);
     424             :   }
     425             : 
     426             :   // check modulation
     427           0 :   if(SX127x::ookEnabled) {
     428           0 :     return(RADIOLIB_ERR_INVALID_MODULATION);
     429             :   }
     430             : 
     431             :   // set mode to standby
     432           0 :   int16_t state = SX127x::standby();
     433           0 :   RADIOLIB_ASSERT(state);
     434             : 
     435             :   // set data shaping
     436           0 :   Module* mod = this->getMod();
     437           0 :   switch(sh) {
     438           0 :     case RADIOLIB_SHAPING_NONE:
     439           0 :       return(mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, RADIOLIB_SX1272_NO_SHAPING, 4, 3));
     440           0 :     case RADIOLIB_SHAPING_0_3:
     441           0 :       return(mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, RADIOLIB_SX1272_FSK_GAUSSIAN_0_3, 4, 3));
     442           0 :     case RADIOLIB_SHAPING_0_5:
     443           0 :       return(mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, RADIOLIB_SX1272_FSK_GAUSSIAN_0_5, 4, 3));
     444           0 :     case RADIOLIB_SHAPING_1_0:
     445           0 :       return(mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, RADIOLIB_SX1272_FSK_GAUSSIAN_1_0, 4, 3));
     446           0 :     default:
     447           0 :       return(RADIOLIB_ERR_INVALID_DATA_SHAPING);
     448             :   }
     449             : }
     450             : 
     451           0 : int16_t SX1272::setDataShapingOOK(uint8_t sh) {
     452             :   // check active modem
     453           0 :   if(getActiveModem() != RADIOLIB_SX127X_FSK_OOK) {
     454           0 :     return(RADIOLIB_ERR_WRONG_MODEM);
     455             :   }
     456             : 
     457             :   // check modulation
     458           0 :   if(!SX127x::ookEnabled) {
     459           0 :     return(RADIOLIB_ERR_INVALID_MODULATION);
     460             :   }
     461             : 
     462             :   // set mode to standby
     463           0 :   int16_t state = SX127x::standby();
     464             : 
     465             :   // set data shaping
     466           0 :   Module* mod = this->getMod();
     467           0 :   switch(sh) {
     468           0 :     case 0:
     469           0 :       state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, RADIOLIB_SX1272_NO_SHAPING, 4, 3);
     470           0 :       break;
     471           0 :     case 1:
     472           0 :       state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, RADIOLIB_SX1272_OOK_FILTER_BR, 4, 3);
     473           0 :       break;
     474           0 :     case 2:
     475           0 :       state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_OP_MODE, RADIOLIB_SX1272_OOK_FILTER_2BR, 4, 3);
     476           0 :       break;
     477           0 :     default:
     478           0 :       state = RADIOLIB_ERR_INVALID_DATA_SHAPING;
     479           0 :       break;
     480             :   }
     481             : 
     482           0 :   return(state);
     483             : }
     484             : 
     485           3 : float SX1272::getRSSI() {
     486           3 :   return(SX1272::getRSSI(true, false));
     487             : }
     488             : 
     489           3 : float SX1272::getRSSI(bool packet, bool skipReceive) {
     490           3 :   return(SX127x::getRSSICommon(packet, skipReceive, -139));
     491             : }
     492             : 
     493           0 : int16_t SX1272::setCRC(bool enable, bool mode) {
     494           0 :   Module* mod = this->getMod();
     495           0 :   if(getActiveModem() == RADIOLIB_SX127X_LORA) {
     496             :     // set LoRa CRC
     497           0 :     SX127x::crcEnabled = enable;
     498           0 :     if(enable) {
     499           0 :       return(mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_RX_CRC_MODE_ON, 1, 1));
     500             :     } else {
     501           0 :       return(mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_RX_CRC_MODE_OFF, 1, 1));
     502             :     }
     503             :   } else {
     504             :     // set FSK CRC
     505           0 :     int16_t state = RADIOLIB_ERR_NONE;
     506           0 :     if(enable) {
     507           0 :       state = mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_CRC_ON, 4, 4);
     508             :     } else {
     509           0 :       state = mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_CRC_OFF, 4, 4);
     510             :     }
     511           0 :     RADIOLIB_ASSERT(state);
     512             : 
     513             :     // set FSK CRC mode
     514           0 :     if(mode) {
     515           0 :       return(mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_CRC_WHITENING_TYPE_IBM, 0, 0));
     516             :     } else {
     517           0 :       return(mod->SPIsetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, RADIOLIB_SX127X_CRC_WHITENING_TYPE_CCITT, 0, 0));
     518             :     }
     519             :   }
     520             : }
     521             : 
     522           0 : int16_t SX1272::forceLDRO(bool enable) {
     523           0 :   if(getActiveModem() != RADIOLIB_SX127X_LORA) {
     524           0 :     return(RADIOLIB_ERR_WRONG_MODEM);
     525             :   }
     526             : 
     527           0 :   this->ldroAuto = false;
     528           0 :   this->ldroEnabled = enable;
     529           0 :   Module* mod = this->getMod();
     530           0 :   if(enable) {
     531           0 :     return(mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_LOW_DATA_RATE_OPT_ON, 0, 0));
     532             :   } else {
     533           0 :     return(mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_LOW_DATA_RATE_OPT_OFF, 0, 0));
     534             :   }
     535             : }
     536             : 
     537           0 : int16_t SX1272::autoLDRO() {
     538           0 :   if(getActiveModem() != RADIOLIB_SX127X_LORA) {
     539           0 :     return(RADIOLIB_ERR_WRONG_MODEM);
     540             :   }
     541             : 
     542           0 :   this->ldroAuto = true;
     543           0 :   return(RADIOLIB_ERR_NONE);
     544             : }
     545             : 
     546           0 : int16_t SX1272::implicitHeader(size_t len) {
     547           0 :   this->implicitHdr = true;
     548           0 :   return(setHeaderType(RADIOLIB_SX1272_HEADER_IMPL_MODE, 2, len));
     549             : }
     550             : 
     551           0 : int16_t SX1272::explicitHeader() {
     552           0 :   this->implicitHdr = false;
     553           0 :   return(setHeaderType(RADIOLIB_SX1272_HEADER_EXPL_MODE, 2));
     554             : }
     555             : 
     556           0 : int16_t SX1272::setBandwidthRaw(uint8_t newBandwidth) {
     557             :   // set mode to standby
     558           0 :   int16_t state = SX127x::standby();
     559             : 
     560             :   // write register
     561           0 :   Module* mod = this->getMod();
     562           0 :   state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, newBandwidth, 7, 6);
     563           0 :   return(state);
     564             : }
     565             : 
     566           0 : int16_t SX1272::setSpreadingFactorRaw(uint8_t newSpreadingFactor) {
     567             :   // set mode to standby
     568           0 :   int16_t state = SX127x::standby();
     569             : 
     570             :   // write registers
     571           0 :   Module* mod = this->getMod();
     572           0 :   if(newSpreadingFactor == RADIOLIB_SX127X_SF_6) {
     573           0 :     this->implicitHdr = true;
     574           0 :     state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_HEADER_IMPL_MODE | (SX127x::crcEnabled ? RADIOLIB_SX1272_RX_CRC_MODE_ON : RADIOLIB_SX1272_RX_CRC_MODE_OFF), 2, 1);
     575           0 :     state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, RADIOLIB_SX127X_SF_6 | RADIOLIB_SX127X_TX_MODE_SINGLE, 7, 3);
     576           0 :     state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DETECT_OPTIMIZE, RADIOLIB_SX127X_DETECT_OPTIMIZE_SF_6, 2, 0);
     577           0 :     state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DETECTION_THRESHOLD, RADIOLIB_SX127X_DETECTION_THRESHOLD_SF_6);
     578             :   } else {
     579           0 :     this->implicitHdr = false;
     580           0 :     state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, RADIOLIB_SX1272_HEADER_EXPL_MODE | (SX127x::crcEnabled ? RADIOLIB_SX1272_RX_CRC_MODE_ON : RADIOLIB_SX1272_RX_CRC_MODE_OFF),  2, 1);
     581           0 :     state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, newSpreadingFactor | RADIOLIB_SX127X_TX_MODE_SINGLE, 7, 3);
     582           0 :     state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DETECT_OPTIMIZE, RADIOLIB_SX127X_DETECT_OPTIMIZE_SF_7_12, 2, 0);
     583           0 :     state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_DETECTION_THRESHOLD, RADIOLIB_SX127X_DETECTION_THRESHOLD_SF_7_12);
     584             :   }
     585           0 :   return(state);
     586             : }
     587             : 
     588           0 : int16_t SX1272::setCodingRateRaw(uint8_t newCodingRate) {
     589             :   // set mode to standby
     590           0 :   int16_t state = SX127x::standby();
     591             : 
     592             :   // write register
     593           0 :   Module* mod = this->getMod();
     594           0 :   state |= mod->SPIsetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, newCodingRate, 5, 3);
     595           0 :   return(state);
     596             : }
     597             : 
     598           0 : int16_t SX1272::configFSK() {
     599             :   // configure common registers
     600           0 :   int16_t state = SX127x::configFSK();
     601           0 :   RADIOLIB_ASSERT(state);
     602             : 
     603             :   // set fast PLL hop
     604           0 :   Module* mod = this->getMod();
     605           0 :   state = mod->SPIsetRegValue(RADIOLIB_SX1272_REG_PLL_HOP, RADIOLIB_SX127X_FAST_HOP_ON, 7, 7);
     606           0 :   return(state);
     607             : }
     608             : 
     609           0 : void SX1272::errataFix(bool rx) {
     610             :   (void)rx;
     611             : 
     612             :   // mitigation of receiver spurious response
     613             :   // see SX1272/73 Errata, section 2.2 for details
     614           0 :   Module* mod = this->getMod();
     615           0 :   mod->SPIsetRegValue(0x31, 0b10000000, 7, 7);
     616           0 : }
     617             : 
     618           2 : int16_t SX1272::setModem(ModemType_t modem) {
     619           2 :   switch(modem) {
     620           0 :     case(ModemType_t::RADIOLIB_MODEM_LORA): {
     621           0 :       return(this->begin());
     622             :     } break;
     623           0 :     case(ModemType_t::RADIOLIB_MODEM_FSK): {
     624           0 :       return(this->beginFSK());
     625             :     } break;
     626           2 :     default:
     627           2 :       return(RADIOLIB_ERR_WRONG_MODEM);
     628             :   }
     629             : }
     630             : 
     631             : #endif

Generated by: LCOV version 1.14