118 lines
3.1 KiB
C++
118 lines
3.1 KiB
C++
#include "SX1273.h"
|
|
#if !RADIOLIB_EXCLUDE_SX127X
|
|
|
|
SX1273::SX1273(Module* mod) : SX1272(mod) {
|
|
|
|
}
|
|
|
|
int16_t SX1273::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, int8_t power, uint16_t preambleLength, uint8_t gain) {
|
|
// execute common part
|
|
uint8_t version = RADIOLIB_SX1272_CHIP_VERSION;
|
|
int16_t state = SX127x::begin(&version, 1, syncWord, preambleLength);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
// configure publicly accessible settings
|
|
state = setBandwidth(bw);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
state = setFrequency(freq);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
state = setSpreadingFactor(sf);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
state = setCodingRate(cr);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
state = setOutputPower(power);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
state = setGain(gain);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
// set publicly accessible settings that are not a part of begin method
|
|
state = setCRC(true);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
return(state);
|
|
}
|
|
|
|
int16_t SX1273::setSpreadingFactor(uint8_t sf) {
|
|
uint8_t newSpreadingFactor;
|
|
|
|
// check allowed spreading factor values
|
|
switch(sf) {
|
|
case 6:
|
|
newSpreadingFactor = RADIOLIB_SX127X_SF_6;
|
|
break;
|
|
case 7:
|
|
newSpreadingFactor = RADIOLIB_SX127X_SF_7;
|
|
break;
|
|
case 8:
|
|
newSpreadingFactor = RADIOLIB_SX127X_SF_8;
|
|
break;
|
|
case 9:
|
|
newSpreadingFactor = RADIOLIB_SX127X_SF_9;
|
|
break;
|
|
default:
|
|
return(RADIOLIB_ERR_INVALID_SPREADING_FACTOR);
|
|
}
|
|
|
|
// set spreading factor and if successful, save the new setting
|
|
int16_t state = setSpreadingFactorRaw(newSpreadingFactor);
|
|
if(state == RADIOLIB_ERR_NONE) {
|
|
SX127x::spreadingFactor = sf;
|
|
}
|
|
|
|
return(state);
|
|
}
|
|
|
|
int16_t SX1273::setDataRate(DataRate_t dr) {
|
|
int16_t state = RADIOLIB_ERR_UNKNOWN;
|
|
|
|
// select interpretation based on active modem
|
|
uint8_t modem = this->getActiveModem();
|
|
if(modem == RADIOLIB_SX127X_FSK_OOK) {
|
|
// set the bit rate
|
|
state = this->setBitRate(dr.fsk.bitRate);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
// set the frequency deviation
|
|
state = this->setFrequencyDeviation(dr.fsk.freqDev);
|
|
|
|
} else if(modem == RADIOLIB_SX127X_LORA) {
|
|
// set the spreading factor
|
|
state = this->setSpreadingFactor(dr.lora.spreadingFactor);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
// set the bandwidth
|
|
state = this->setBandwidth(dr.lora.bandwidth);
|
|
}
|
|
|
|
return(state);
|
|
}
|
|
|
|
int16_t SX1273::checkDataRate(DataRate_t dr) {
|
|
int16_t state = RADIOLIB_ERR_UNKNOWN;
|
|
|
|
// select interpretation based on active modem
|
|
int16_t modem = getActiveModem();
|
|
if(modem == RADIOLIB_SX127X_FSK_OOK) {
|
|
RADIOLIB_CHECK_RANGE(dr.fsk.bitRate, 0.5, 300.0, RADIOLIB_ERR_INVALID_BIT_RATE);
|
|
if(!((dr.fsk.freqDev + dr.fsk.bitRate/2.0 <= 250.0) && (dr.fsk.freqDev <= 200.0))) {
|
|
return(RADIOLIB_ERR_INVALID_FREQUENCY_DEVIATION);
|
|
}
|
|
return(RADIOLIB_ERR_NONE);
|
|
|
|
} else if(modem == RADIOLIB_SX127X_LORA) {
|
|
RADIOLIB_CHECK_RANGE(dr.lora.spreadingFactor, 6, 9, RADIOLIB_ERR_INVALID_SPREADING_FACTOR);
|
|
RADIOLIB_CHECK_RANGE(dr.lora.bandwidth, 100.0, 510.0, RADIOLIB_ERR_INVALID_BANDWIDTH);
|
|
RADIOLIB_CHECK_RANGE(dr.lora.codingRate, 5, 8, RADIOLIB_ERR_INVALID_CODING_RATE);
|
|
return(RADIOLIB_ERR_NONE);
|
|
|
|
}
|
|
|
|
return(state);
|
|
}
|
|
|
|
#endif
|