#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); } #endif