From 361eba8ebc5cd4aac056451ce98726b1c3399a51 Mon Sep 17 00:00:00 2001
From: James Smith <james@loopj.com>
Date: Sat, 26 Mar 2022 12:53:17 -0700
Subject: [PATCH 1/3] Set RX bandwidth correctly for OOK mode

---
 src/modules/RF69/RF69.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp
index 8b3f441b..11491f67 100644
--- a/src/modules/RF69/RF69.cpp
+++ b/src/modules/RF69/RF69.cpp
@@ -464,7 +464,7 @@ int16_t RF69::setRxBandwidth(float rxBw) {
   // calculate exponent and mantissa values for receiver bandwidth
   for(int8_t e = 7; e >= 0; e--) {
     for(int8_t m = 2; m >= 0; m--) {
-      float point = (RADIOLIB_RF69_CRYSTAL_FREQ * 1000000.0)/(((4 * m) + 16) * ((uint32_t)1 << (e + 2)));
+      float point = (RADIOLIB_RF69_CRYSTAL_FREQ * 1000000.0)/(((4 * m) + 16) * ((uint32_t)1 << (e + (_ook ? 3 : 2))));
       if(fabs(rxBw - (point / 1000.0)) <= 0.1) {
         // set Rx bandwidth
         state = _mod->SPIsetRegValue(RADIOLIB_RF69_REG_RX_BW, (m << 3) | e, 4, 0);

From 2b99b6ec86ab787a8e7a0b7eec9d4dca4b0a0eb8 Mon Sep 17 00:00:00 2001
From: James Smith <james@loopj.com>
Date: Sat, 26 Mar 2022 14:45:54 -0700
Subject: [PATCH 2/3] Add enableOOK param to RF69::begin, false by default,
 mirrors SX127x

---
 src/modules/RF69/RF69.cpp | 6 +++++-
 src/modules/RF69/RF69.h   | 2 +-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp
index 11491f67..fdb83ef8 100644
--- a/src/modules/RF69/RF69.cpp
+++ b/src/modules/RF69/RF69.cpp
@@ -9,7 +9,7 @@ Module* RF69::getMod() {
   return(_mod);
 }
 
-int16_t RF69::begin(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t preambleLen) {
+int16_t RF69::begin(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t preambleLen, bool enableOOK) {
   // set module properties
   _mod->init();
   _mod->pinMode(_mod->getIrq(), INPUT);
@@ -54,6 +54,10 @@ int16_t RF69::begin(float freq, float br, float freqDev, float rxBw, int8_t powe
   int16_t state = config();
   RADIOLIB_ASSERT(state);
 
+  // enable/disable OOK
+  state = setOOK(enableOOK);
+  RADIOLIB_ASSERT(state);
+
   // configure publicly accessible settings
   state = setFrequency(freq);
   RADIOLIB_ASSERT(state);
diff --git a/src/modules/RF69/RF69.h b/src/modules/RF69/RF69.h
index 8e4afded..3b313830 100644
--- a/src/modules/RF69/RF69.h
+++ b/src/modules/RF69/RF69.h
@@ -473,7 +473,7 @@ class RF69: public PhysicalLayer {
 
       \returns \ref status_codes
     */
-    int16_t begin(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 125.0, int8_t power = 10, uint8_t preambleLen = 16);
+    int16_t begin(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 125.0, int8_t power = 10, uint8_t preambleLen = 16, bool enableOOK = false);
 
     /*!
       \brief Reset method. Will reset the chip to the default state using RST pin.

From 63ba279fd2b6973e52aad9ac87e602673b7ffa5d Mon Sep 17 00:00:00 2001
From: James Smith <james@loopj.com>
Date: Mon, 28 Mar 2022 17:28:01 -0700
Subject: [PATCH 3/3] Call setRxBandwidth again if setOOK is called

---
 src/modules/RF69/RF69.cpp | 10 +++++-----
 src/modules/RF69/RF69.h   |  3 ++-
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp
index 1ae6e1dc..5a388152 100644
--- a/src/modules/RF69/RF69.cpp
+++ b/src/modules/RF69/RF69.cpp
@@ -9,7 +9,7 @@ Module* RF69::getMod() {
   return(_mod);
 }
 
-int16_t RF69::begin(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t preambleLen, bool enableOOK) {
+int16_t RF69::begin(float freq, float br, float freqDev, float rxBw, int8_t power, uint8_t preambleLen) {
   // set module properties
   _mod->init();
   _mod->pinMode(_mod->getIrq(), INPUT);
@@ -54,10 +54,6 @@ int16_t RF69::begin(float freq, float br, float freqDev, float rxBw, int8_t powe
   int16_t state = config();
   RADIOLIB_ASSERT(state);
 
-  // enable/disable OOK
-  state = setOOK(enableOOK);
-  RADIOLIB_ASSERT(state);
-
   // configure publicly accessible settings
   state = setFrequency(freq);
   RADIOLIB_ASSERT(state);
@@ -394,10 +390,14 @@ int16_t RF69::setOOK(bool enableOOK) {
   } else {
     state = _mod->SPIsetRegValue(RADIOLIB_RF69_REG_DATA_MODUL, RADIOLIB_RF69_FSK, 4, 3, 5);
   }
+
   if(state == RADIOLIB_ERR_NONE) {
     _ook = enableOOK;
   }
 
+  // call setRxBandwidth again, since register values differ based on OOK mode being enabled
+  state |= setRxBandwidth(_rxBw);
+
   return(state);
 }
 
diff --git a/src/modules/RF69/RF69.h b/src/modules/RF69/RF69.h
index 34152b0c..7e13deb6 100644
--- a/src/modules/RF69/RF69.h
+++ b/src/modules/RF69/RF69.h
@@ -473,7 +473,7 @@ class RF69: public PhysicalLayer {
 
       \returns \ref status_codes
     */
-    int16_t begin(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 125.0, int8_t power = 10, uint8_t preambleLen = 16, bool enableOOK = false);
+    int16_t begin(float freq = 434.0, float br = 4.8, float freqDev = 5.0, float rxBw = 125.0, int8_t power = 10, uint8_t preambleLen = 16);
 
     /*!
       \brief Reset method. Will reset the chip to the default state using RST pin.
@@ -744,6 +744,7 @@ class RF69: public PhysicalLayer {
 
     /*!
       \brief Enables/disables OOK modulation instead of FSK.
+       Note: This function calls setRxBandwidth again, since register values differ based on OOK mode being enabled/disabled
 
       \param enableOOK Enable (true) or disable (false) OOK.