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