From 8cecd36d9b63b30831549b0b2aefe3e94780ff06 Mon Sep 17 00:00:00 2001 From: "Daniel A. Maierhofer" Date: Sun, 18 Jan 2015 12:22:43 +0100 Subject: [PATCH] Follow Optimized Frequency Hopping Sequence by https://github.com/mike-zero/RFM69/commit/cf13c60ae5a1bf449af8bdcd8f49506028744c6a Don't remove "if (newMode == _mode)" to prevent unnecessary mode switching by setFrequency() --- RFM69.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/RFM69.cpp b/RFM69.cpp index eb6b361..b6d5db3 100644 --- a/RFM69.cpp +++ b/RFM69.cpp @@ -119,16 +119,24 @@ uint32_t RFM69::getFrequency() // set the frequency (in Hz) void RFM69::setFrequency(uint32_t freqHz) { - // TODO: datasheet p38 hopping sequence may need to be followed in some cases + uint8_t oldMode = _mode; + if (oldMode == RF69_MODE_TX) { + setMode(RF69_MODE_RX); + } freqHz /= RF69_FSTEP; // divide down by FSTEP to get FRF writeReg(REG_FRFMSB, freqHz >> 16); writeReg(REG_FRFMID, freqHz >> 8); writeReg(REG_FRFLSB, freqHz); + if (oldMode == RF69_MODE_RX) { + setMode(RF69_MODE_SYNTH); + } + setMode(oldMode); } void RFM69::setMode(uint8_t newMode) { - if (newMode == _mode) return; // TODO: can remove this? + if (newMode == _mode) + return; switch (newMode) { case RF69_MODE_TX: @@ -148,7 +156,8 @@ void RFM69::setMode(uint8_t newMode) case RF69_MODE_SLEEP: writeReg(REG_OPMODE, (readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_SLEEP); break; - default: return; + default: + return; } // we are using packet mode, so this check is not really needed