From 301654ead407ecd3da513e9df72afb9e3422cb1c Mon Sep 17 00:00:00 2001 From: jgromes Date: Sat, 26 Oct 2024 14:00:48 +0100 Subject: [PATCH] [SX127x] Added get/set modem --- src/modules/SX127x/SX1272.cpp | 13 +++++++++++++ src/modules/SX127x/SX1272.h | 8 ++++++++ src/modules/SX127x/SX1273.cpp | 13 +++++++++++++ src/modules/SX127x/SX1273.h | 8 ++++++++ src/modules/SX127x/SX1276.cpp | 13 +++++++++++++ src/modules/SX127x/SX1276.h | 8 ++++++++ src/modules/SX127x/SX1277.cpp | 13 +++++++++++++ src/modules/SX127x/SX1277.h | 8 ++++++++ src/modules/SX127x/SX1278.cpp | 13 +++++++++++++ src/modules/SX127x/SX1278.h | 8 ++++++++ src/modules/SX127x/SX1279.cpp | 13 +++++++++++++ src/modules/SX127x/SX1279.h | 8 ++++++++ src/modules/SX127x/SX127x.cpp | 18 ++++++++++++++++++ src/modules/SX127x/SX127x.h | 7 +++++++ 14 files changed, 151 insertions(+) diff --git a/src/modules/SX127x/SX1272.cpp b/src/modules/SX127x/SX1272.cpp index 50b088b2..ed615705 100644 --- a/src/modules/SX127x/SX1272.cpp +++ b/src/modules/SX127x/SX1272.cpp @@ -585,4 +585,17 @@ void SX1272::errataFix(bool rx) { mod->SPIsetRegValue(0x31, 0b10000000, 7, 7); } +int16_t SX1272::setModem(ModemType_t modem) { + switch(modem) { + case(ModemType_t::LoRa): { + return(this->begin()); + } break; + case(ModemType_t::FSK): { + return(this->beginFSK()); + } break; + default: + return(RADIOLIB_ERR_WRONG_MODEM); + } +} + #endif diff --git a/src/modules/SX127x/SX1272.h b/src/modules/SX127x/SX1272.h index 292bfd79..26899692 100644 --- a/src/modules/SX127x/SX1272.h +++ b/src/modules/SX127x/SX1272.h @@ -301,6 +301,14 @@ class SX1272: public SX127x { \returns \ref status_codes */ int16_t explicitHeader(); + + /*! + \brief Set modem for the radio to use. Will perform full reset and reconfigure the radio + using its default parameters. + \param modem Modem type to set - FSK or LoRa. + \returns \ref status_codes + */ + int16_t setModem(ModemType_t modem) override; #if !RADIOLIB_GODMODE protected: diff --git a/src/modules/SX127x/SX1273.cpp b/src/modules/SX127x/SX1273.cpp index 9ef7c175..0efbbe93 100644 --- a/src/modules/SX127x/SX1273.cpp +++ b/src/modules/SX127x/SX1273.cpp @@ -115,4 +115,17 @@ int16_t SX1273::checkDataRate(DataRate_t dr) { return(state); } +int16_t SX1273::setModem(ModemType_t modem) { + switch(modem) { + case(ModemType_t::LoRa): { + return(this->begin()); + } break; + case(ModemType_t::FSK): { + return(this->beginFSK()); + } break; + default: + return(RADIOLIB_ERR_WRONG_MODEM); + } +} + #endif diff --git a/src/modules/SX127x/SX1273.h b/src/modules/SX127x/SX1273.h index 8e7ab1ca..4e9dd1ed 100644 --- a/src/modules/SX127x/SX1273.h +++ b/src/modules/SX127x/SX1273.h @@ -62,6 +62,14 @@ class SX1273: public SX1272 { \returns \ref status_codes */ int16_t checkDataRate(DataRate_t dr) override; + + /*! + \brief Set modem for the radio to use. Will perform full reset and reconfigure the radio + using its default parameters. + \param modem Modem type to set - FSK or LoRa. + \returns \ref status_codes + */ + int16_t setModem(ModemType_t modem) override; #if !RADIOLIB_GODMODE private: diff --git a/src/modules/SX127x/SX1276.cpp b/src/modules/SX127x/SX1276.cpp index d45826fc..8890c6cb 100644 --- a/src/modules/SX127x/SX1276.cpp +++ b/src/modules/SX127x/SX1276.cpp @@ -79,4 +79,17 @@ int16_t SX1276::setFrequency(float freq) { return(state); } +int16_t SX1276::setModem(ModemType_t modem) { + switch(modem) { + case(ModemType_t::LoRa): { + return(this->begin()); + } break; + case(ModemType_t::FSK): { + return(this->beginFSK()); + } break; + default: + return(RADIOLIB_ERR_WRONG_MODEM); + } +} + #endif diff --git a/src/modules/SX127x/SX1276.h b/src/modules/SX127x/SX1276.h index 89ab9f9f..64dbaa3e 100644 --- a/src/modules/SX127x/SX1276.h +++ b/src/modules/SX127x/SX1276.h @@ -62,6 +62,14 @@ class SX1276: public SX1278 { \returns \ref status_codes */ int16_t setFrequency(float freq) override; + + /*! + \brief Set modem for the radio to use. Will perform full reset and reconfigure the radio + using its default parameters. + \param modem Modem type to set - FSK or LoRa. + \returns \ref status_codes + */ + int16_t setModem(ModemType_t modem) override; #if !RADIOLIB_GODMODE private: diff --git a/src/modules/SX127x/SX1277.cpp b/src/modules/SX127x/SX1277.cpp index fea394cd..c85a5fe5 100644 --- a/src/modules/SX127x/SX1277.cpp +++ b/src/modules/SX127x/SX1277.cpp @@ -157,4 +157,17 @@ int16_t SX1277::checkDataRate(DataRate_t dr) { return(state); } +int16_t SX1277::setModem(ModemType_t modem) { + switch(modem) { + case(ModemType_t::LoRa): { + return(this->begin()); + } break; + case(ModemType_t::FSK): { + return(this->beginFSK()); + } break; + default: + return(RADIOLIB_ERR_WRONG_MODEM); + } +} + #endif diff --git a/src/modules/SX127x/SX1277.h b/src/modules/SX127x/SX1277.h index c7efd95b..fe068c0d 100644 --- a/src/modules/SX127x/SX1277.h +++ b/src/modules/SX127x/SX1277.h @@ -83,6 +83,14 @@ class SX1277: public SX1278 { \returns \ref status_codes */ int16_t checkDataRate(DataRate_t dr) override; + + /*! + \brief Set modem for the radio to use. Will perform full reset and reconfigure the radio + using its default parameters. + \param modem Modem type to set - FSK or LoRa. + \returns \ref status_codes + */ + int16_t setModem(ModemType_t modem) override; #if !RADIOLIB_GODMODE private: diff --git a/src/modules/SX127x/SX1278.cpp b/src/modules/SX127x/SX1278.cpp index 3265675f..e53bfe34 100644 --- a/src/modules/SX127x/SX1278.cpp +++ b/src/modules/SX127x/SX1278.cpp @@ -705,4 +705,17 @@ void SX1278::errataFix(bool rx) { mod->SPIsetRegValue(0x30, fixedRegs[2]); } +int16_t SX1278::setModem(ModemType_t modem) { + switch(modem) { + case(ModemType_t::LoRa): { + return(this->begin()); + } break; + case(ModemType_t::FSK): { + return(this->beginFSK()); + } break; + default: + return(RADIOLIB_ERR_WRONG_MODEM); + } +} + #endif diff --git a/src/modules/SX127x/SX1278.h b/src/modules/SX127x/SX1278.h index 3c2b0088..feb1d09c 100644 --- a/src/modules/SX127x/SX1278.h +++ b/src/modules/SX127x/SX1278.h @@ -313,6 +313,14 @@ class SX1278: public SX127x { \returns \ref status_codes */ int16_t explicitHeader(); + + /*! + \brief Set modem for the radio to use. Will perform full reset and reconfigure the radio + using its default parameters. + \param modem Modem type to set - FSK or LoRa. + \returns \ref status_codes + */ + int16_t setModem(ModemType_t modem) override; #if !RADIOLIB_GODMODE protected: diff --git a/src/modules/SX127x/SX1279.cpp b/src/modules/SX127x/SX1279.cpp index 9f9ac037..4babad05 100644 --- a/src/modules/SX127x/SX1279.cpp +++ b/src/modules/SX127x/SX1279.cpp @@ -79,4 +79,17 @@ int16_t SX1279::setFrequency(float freq) { return(state); } +int16_t SX1279::setModem(ModemType_t modem) { + switch(modem) { + case(ModemType_t::LoRa): { + return(this->begin()); + } break; + case(ModemType_t::FSK): { + return(this->beginFSK()); + } break; + default: + return(RADIOLIB_ERR_WRONG_MODEM); + } +} + #endif diff --git a/src/modules/SX127x/SX1279.h b/src/modules/SX127x/SX1279.h index 1dceb423..865b1b22 100644 --- a/src/modules/SX127x/SX1279.h +++ b/src/modules/SX127x/SX1279.h @@ -62,6 +62,14 @@ class SX1279: public SX1278 { \returns \ref status_codes */ int16_t setFrequency(float freq) override; + + /*! + \brief Set modem for the radio to use. Will perform full reset and reconfigure the radio + using its default parameters. + \param modem Modem type to set - FSK or LoRa. + \returns \ref status_codes + */ + int16_t setModem(ModemType_t modem) override; #if !RADIOLIB_GODMODE private: diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index 55138aa1..425b1cb1 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -1754,6 +1754,24 @@ int16_t SX127x::invertIQ(bool enable) { return(state); } +int16_t SX127x::getModem(ModemType_t* modem) { + if(!modem) { + return(RADIOLIB_ERR_MEMORY_ALLOCATION_FAILED); + } + + int16_t packetType = getActiveModem(); + switch(packetType) { + case(RADIOLIB_SX127X_LORA): + *modem = ModemType_t::LoRa; + return(RADIOLIB_ERR_NONE); + case(RADIOLIB_SX127X_FSK_OOK): + *modem = ModemType_t::FSK; + return(RADIOLIB_ERR_NONE); + } + + return(RADIOLIB_ERR_WRONG_MODEM); +} + #if !RADIOLIB_EXCLUDE_DIRECT_RECEIVE void SX127x::setDirectAction(void (*func)(void)) { setDio1Action(func, this->mod->hal->GpioInterruptRising); diff --git a/src/modules/SX127x/SX127x.h b/src/modules/SX127x/SX127x.h index ba492f1d..c54a549f 100644 --- a/src/modules/SX127x/SX127x.h +++ b/src/modules/SX127x/SX127x.h @@ -1149,6 +1149,13 @@ class SX127x: public PhysicalLayer { */ int16_t invertIQ(bool enable) override; + /*! + \brief Get modem currently in use by the radio. + \param modem Pointer to a variable to save the retrieved configuration into. + \returns \ref status_codes + */ + int16_t getModem(ModemType_t* modem) override; + #if !RADIOLIB_EXCLUDE_DIRECT_RECEIVE /*! \brief Set interrupt service routine function to call when data bit is received in direct mode.