From d710a85985168b163267250d1cd5d814dc5968a9 Mon Sep 17 00:00:00 2001
From: jgromes <jgromes@users.noreply.github.com>
Date: Thu, 18 Jun 2020 16:38:30 +0200
Subject: [PATCH] [SX126x] Implemented RF switch control (#153)

---
 examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino | 10 ++++++++++
 src/modules/SX126x/SX126x.cpp                       | 10 ++++++++++
 src/modules/SX126x/SX126x.h                         | 10 ++++++++++
 3 files changed, 30 insertions(+)

diff --git a/examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino b/examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino
index 574fdff3..338bf3f5 100644
--- a/examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino
+++ b/examples/SX126x/SX126x_Transmit/SX126x_Transmit.ino
@@ -51,6 +51,16 @@ void setup() {
     Serial.println(state);
     while (true);
   }
+
+  // some modules have an external RF switch
+  // controlled via two pins (RX enable, TX enable)
+  // to enable automatic control of the switch,
+  // call the following method
+  // RX enable:   4
+  // TX enable:   5
+  /*
+    lora.setRfSwitchPins(4, 5);
+  */
 }
 
 void loop() {
diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp
index e419761e..efbecc10 100644
--- a/src/modules/SX126x/SX126x.cpp
+++ b/src/modules/SX126x/SX126x.cpp
@@ -435,6 +435,9 @@ int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) {
   state = fixSensitivity();
   RADIOLIB_ASSERT(state);
 
+  // set RF switch (if present)
+  _mod->setRfSwitchState(true);
+
   // start transmission
   state = setTx(SX126X_TX_TIMEOUT_NONE);
   RADIOLIB_ASSERT(state);
@@ -451,6 +454,9 @@ int16_t SX126x::startReceive(uint32_t timeout) {
   int16_t state = startReceiveCommon();
   RADIOLIB_ASSERT(state);
 
+  // set RF switch (if present)
+  _mod->setRfSwitchState(true);
+
   // set mode to receive
   state = setRx(timeout);
 
@@ -1117,6 +1123,10 @@ int16_t SX126x::setEncoding(uint8_t encoding) {
   return(setWhitening(encoding));
 }
 
+void SX126x::setRfSwitchPins(RADIOLIB_PIN_TYPE rxEn, RADIOLIB_PIN_TYPE txEn) {
+  _mod->setRfSwitchPins(rxEn, txEn);
+}
+
 int16_t SX126x::setTCXO(float voltage, uint32_t delay) {
   // set mode to standby
   standby();
diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h
index e6a7f078..ae2216d6 100644
--- a/src/modules/SX126x/SX126x.h
+++ b/src/modules/SX126x/SX126x.h
@@ -843,6 +843,16 @@ class SX126x: public PhysicalLayer {
    */
    int16_t setEncoding(uint8_t encoding);
 
+   /*!
+     \brief Some modules contain external RF switch controlled by two pins. This function gives RadioLib control over those two pins to automatically switch Rx and Tx state.
+     When using automatic RF switch control, DO NOT change the pin mode of rxEn or txEn from Arduino sketch!
+
+     \param rxEn RX enable pin.
+
+     \param txEn TX enable pin.
+   */
+   void setRfSwitchPins(RADIOLIB_PIN_TYPE rxEn, RADIOLIB_PIN_TYPE txEn);
+
 #ifndef RADIOLIB_GODMODE
   protected:
 #endif