From f068a150291f6716b0280dab5b0f1ff5a6458491 Mon Sep 17 00:00:00 2001
From: jgromes <jgromes@users.noreply.github.com>
Date: Thu, 28 May 2020 21:07:23 +0200
Subject: [PATCH] [SX127x] Added getIRQFlags and getModemStatus methods (#145)

---
 keywords.txt                  |  2 ++
 src/modules/SX127x/SX127x.cpp | 25 +++++++++++++++++++++++++
 src/modules/SX127x/SX127x.h   | 16 ++++++++++++++++
 3 files changed, 43 insertions(+)

diff --git a/keywords.txt b/keywords.txt
index 53b945b0..84b70c88 100644
--- a/keywords.txt
+++ b/keywords.txt
@@ -124,6 +124,8 @@ disableSyncWordFiltering  KEYWORD2
 setPromiscuous  KEYWORD2
 setRSSIConfig	KEYWORD2
 setEncoding	KEYWORD2
+getIRQFlags	KEYWORD2
+getModemStatus	KEYWORD2
 
 # RF69-specific
 setAESKey	KEYWORD2
diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp
index 8ba220d1..2a3a5121 100644
--- a/src/modules/SX127x/SX127x.cpp
+++ b/src/modules/SX127x/SX127x.cpp
@@ -909,6 +909,31 @@ int16_t SX127x::setEncoding(uint8_t encoding) {
   }
 }
 
+uint16_t SX127x::getIRQFlags() {
+  // check active modem
+  if(getActiveModem() == SX127X_LORA) {
+    // LoRa, just 8-bit value
+    return((uint16_t)_mod->SPIreadRegister(SX127X_REG_IRQ_FLAGS));
+
+  } else {
+    // FSK, the IRQ flags are 16 bits in total
+    uint16_t flags = ((uint16_t)_mod->SPIreadRegister(SX127X_REG_IRQ_FLAGS_2)) << 8;
+    flags |= (uint16_t)_mod->SPIreadRegister(SX127X_REG_IRQ_FLAGS_1);
+    return(flags);
+  }
+
+}
+
+uint8_t SX127x::getModemStatus() {
+  // check active modem
+  if(getActiveModem() != SX127X_LORA) {
+    return(0x00);
+  }
+
+  // read the register
+  return(_mod->SPIreadRegister(SX127X_REG_MODEM_STAT));
+}
+
 int16_t SX127x::config() {
   // turn off frequency hopping
   int16_t state = _mod->SPIsetRegValue(SX127X_REG_HOP_PERIOD, SX127X_HOP_PERIOD_OFF);
diff --git a/src/modules/SX127x/SX127x.h b/src/modules/SX127x/SX127x.h
index 1edf5917..7404427c 100644
--- a/src/modules/SX127x/SX127x.h
+++ b/src/modules/SX127x/SX127x.h
@@ -897,6 +897,22 @@ class SX127x: public PhysicalLayer {
     */
     int16_t setEncoding(uint8_t encoding);
 
+    /*!
+      \brief Reads currently active IRQ flags, can be used to check which event caused an interrupt.
+      In LoRa mode, this is the content of SX127X_REG_IRQ_FLAGS register.
+      In FSK mode, this is the contents of SX127X_REG_IRQ_FLAGS_2 (MSB) and SX127X_REG_IRQ_FLAGS_1 (LSB) registers.
+
+      \returns IRQ flags.
+    */
+    uint16_t getIRQFlags();
+
+    /*!
+      \brief Reads modem status. Only available in LoRa mode.
+
+      \returns Modem status.
+    */
+    uint8_t getModemStatus();
+
     #ifdef RADIOLIB_DEBUG
       void regDump();
     #endif