173 lines
4.7 KiB
C++
173 lines
4.7 KiB
C++
#include "SX1277.h"
|
|
#if !RADIOLIB_EXCLUDE_SX127X
|
|
|
|
SX1277::SX1277(Module* mod) : SX1278(mod) {
|
|
|
|
}
|
|
|
|
int16_t SX1277::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 versions[] = { RADIOLIB_SX1278_CHIP_VERSION, RADIOLIB_SX1278_CHIP_VERSION_ALT, RADIOLIB_SX1278_CHIP_VERSION_RFM9X };
|
|
int16_t state = SX127x::begin(versions, 3, 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 SX1277::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, uint16_t preambleLength, bool enableOOK) {
|
|
// execute common part
|
|
uint8_t versions[] = { RADIOLIB_SX1278_CHIP_VERSION, RADIOLIB_SX1278_CHIP_VERSION_ALT, RADIOLIB_SX1278_CHIP_VERSION_RFM9X };
|
|
int16_t state = SX127x::beginFSK(versions, 3, freqDev, rxBw, preambleLength, enableOOK);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
// configure settings not accessible by API
|
|
state = configFSK();
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
// configure publicly accessible settings
|
|
state = setFrequency(freq);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
state = setBitRate(br);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
state = setOutputPower(power);
|
|
RADIOLIB_ASSERT(state);
|
|
|
|
if(enableOOK) {
|
|
state = setDataShapingOOK(RADIOLIB_SHAPING_NONE);
|
|
RADIOLIB_ASSERT(state);
|
|
} else {
|
|
state = setDataShaping(RADIOLIB_SHAPING_NONE);
|
|
RADIOLIB_ASSERT(state);
|
|
}
|
|
|
|
return(state);
|
|
}
|
|
|
|
int16_t SX1277::setFrequency(float freq) {
|
|
RADIOLIB_CHECK_RANGE(freq, 137.0, 1020.0, RADIOLIB_ERR_INVALID_FREQUENCY);
|
|
|
|
// set frequency and if successful, save the new setting
|
|
int16_t state = SX127x::setFrequencyRaw(freq);
|
|
if(state == RADIOLIB_ERR_NONE) {
|
|
SX127x::frequency = freq;
|
|
}
|
|
return(state);
|
|
}
|
|
|
|
int16_t SX1277::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 = SX1278::setSpreadingFactorRaw(newSpreadingFactor);
|
|
if(state == RADIOLIB_ERR_NONE) {
|
|
SX127x::spreadingFactor = sf;
|
|
}
|
|
|
|
return(state);
|
|
}
|
|
|
|
int16_t SX1277::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 SX1277::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, 0.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);
|
|
}
|
|
|
|
int16_t SX1277::setModem(ModemType_t modem) {
|
|
switch(modem) {
|
|
case(ModemType_t::RADIOLIB_MODEM_LORA): {
|
|
return(this->begin());
|
|
} break;
|
|
case(ModemType_t::RADIOLIB_MODEM_FSK): {
|
|
return(this->beginFSK());
|
|
} break;
|
|
default:
|
|
return(RADIOLIB_ERR_WRONG_MODEM);
|
|
}
|
|
}
|
|
|
|
#endif
|