diff --git a/src/modules/RF69.cpp b/src/modules/RF69.cpp index 49e61602..54d44313 100644 --- a/src/modules/RF69.cpp +++ b/src/modules/RF69.cpp @@ -4,7 +4,7 @@ RF69::RF69(Module* module) { _mod = module; } -uint8_t RF69::begin(float freq, float br, float rxBw, float freqDev) { +uint8_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { // set module properties _mod->init(USE_SPI, INT_0); @@ -67,6 +67,11 @@ uint8_t RF69::begin(float freq, float br, float rxBw, float freqDev) { return(state); } + state = setOutputPower(power); + if(state != ERR_NONE) { + return(state); + } + return(ERR_NONE); } @@ -319,6 +324,30 @@ uint8_t RF69::setFrequencyDeviation(float freqDev) { return(state); } +uint8_t RF69::setOutputPower(int8_t power) { + // check output power range + if((power < -18) || (power > 17)) { + return(ERR_INVALID_OUTPUT_POWER); + } + + // set mode to standby + setMode(RF69_STANDBY); + + // set output power + uint8_t state; + if(power > 13) { + // requested output power is higher than 13 dBm, enable PA2 + PA1 on PA_BOOST + state = _mod->SPIsetRegValue(RF69_REG_PA_LEVEL, RF69_PA0_OFF | RF69_PA1_ON | RF69_PA2_ON | power + 14, 7, 0); + } else { + // requested output power is lower than 13 dBm, enable PA0 on RFIO + state = _mod->SPIsetRegValue(RF69_REG_PA_LEVEL, RF69_PA0_ON | RF69_PA1_OFF | RF69_PA2_OFF | power + 18, 7, 0); + } + if(state == ERR_NONE) { + RF69::_power = _power; + } + return(state); +} + uint8_t RF69::config() { uint8_t state = ERR_NONE; @@ -398,12 +427,6 @@ uint8_t RF69::config() { return(state); } - //set output power - state = _mod->SPIsetRegValue(RF69_REG_PA_LEVEL, RF69_PA0_ON | RF69_PA1_OFF | RF69_PA2_OFF | RF69_OUTPUT_POWER, 7, 0); - if(state != ERR_NONE) { - return(state); - } - //set Rx timeouts state = _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_1, RF69_TIMEOUT_RX_START, 7, 0); state = _mod->SPIsetRegValue(RF69_REG_RX_TIMEOUT_2, RF69_TIMEOUT_RSSI_THRESH, 7, 0); diff --git a/src/modules/RF69.h b/src/modules/RF69.h index 4e687c83..1558678d 100644 --- a/src/modules/RF69.h +++ b/src/modules/RF69.h @@ -420,7 +420,7 @@ class RF69 { public: RF69(Module* module); - uint8_t begin(float freq = 434.0, float br = 48.0, float rxBw = 125.0, float freqDev = 50.0); + uint8_t begin(float freq = 434.0, float br = 48.0, float rxBw = 125.0, float freqDev = 50.0, int8_t power = 13); uint8_t transmit(Packet& pack); uint8_t receive(Packet& pack); @@ -431,6 +431,7 @@ class RF69 { uint8_t setBitRate(float br); uint8_t setRxBandwidth(float rxBw); uint8_t setFrequencyDeviation(float freqDev); + uint8_t setOutputPower(int8_t power); private: Module* _mod; @@ -439,6 +440,7 @@ class RF69 { float _br; float _rxBw; float _freqDev; + int8_t _power; uint8_t config(); uint8_t setMode(uint8_t mode);