From 99d2e6c4520ac9768bf4ed9473862ab5399d3a04 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sat, 20 Apr 2024 18:05:31 +0200 Subject: [PATCH] [LR11x0] Added direct mode support --- .../APRS_Position_LoRa/APRS_Position_LoRa.ino | 1 + examples/AX25/AX25_Frames/AX25_Frames.ino | 1 + examples/AX25/AX25_Transmit/AX25_Transmit.ino | 1 + .../Morse_Transmit_SSB/Morse_Transmit_SSB.ino | 1 + src/modules/LR11x0/LR11x0.cpp | 25 ++++++++++++++++++- src/modules/LR11x0/LR11x0.h | 16 +++++++++++- 6 files changed, 43 insertions(+), 2 deletions(-) diff --git a/examples/APRS/APRS_Position_LoRa/APRS_Position_LoRa.ino b/examples/APRS/APRS_Position_LoRa/APRS_Position_LoRa.ino index 6b3053a1..31a2f826 100644 --- a/examples/APRS/APRS_Position_LoRa/APRS_Position_LoRa.ino +++ b/examples/APRS/APRS_Position_LoRa/APRS_Position_LoRa.ino @@ -8,6 +8,7 @@ - SX127x/RFM9x - SX126x/LLCC68 - SX128x + - LR11x0 For default module settings, see the wiki page https://github.com/jgromes/RadioLib/wiki/Default-configuration diff --git a/examples/AX25/AX25_Frames/AX25_Frames.ino b/examples/AX25/AX25_Frames/AX25_Frames.ino index 809d7176..8a55be74 100644 --- a/examples/AX25/AX25_Frames/AX25_Frames.ino +++ b/examples/AX25/AX25_Frames/AX25_Frames.ino @@ -12,6 +12,7 @@ - SX126x - nRF24 - Si443x/RFM2x + - LR11x0 Using raw AX.25 frames requires some knowledge of the protocol, refer to diff --git a/examples/AX25/AX25_Transmit/AX25_Transmit.ino b/examples/AX25/AX25_Transmit/AX25_Transmit.ino index 98236d10..bbefc67c 100644 --- a/examples/AX25/AX25_Transmit/AX25_Transmit.ino +++ b/examples/AX25/AX25_Transmit/AX25_Transmit.ino @@ -12,6 +12,7 @@ - SX126x - nRF24 - Si443x/RFM2x + - LR11x0 For default module settings, see the wiki page https://github.com/jgromes/RadioLib/wiki/Default-configuration diff --git a/examples/Morse/Morse_Transmit_SSB/Morse_Transmit_SSB.ino b/examples/Morse/Morse_Transmit_SSB/Morse_Transmit_SSB.ino index 61abde3a..4b35e774 100644 --- a/examples/Morse/Morse_Transmit_SSB/Morse_Transmit_SSB.ino +++ b/examples/Morse/Morse_Transmit_SSB/Morse_Transmit_SSB.ino @@ -14,6 +14,7 @@ - nRF24 - Si443x/RFM2x - SX128x + - LR11x0 For default module settings, see the wiki page https://github.com/jgromes/RadioLib/wiki/Default-configuration diff --git a/src/modules/LR11x0/LR11x0.cpp b/src/modules/LR11x0/LR11x0.cpp index 5c05e4c0..6272f2d6 100644 --- a/src/modules/LR11x0/LR11x0.cpp +++ b/src/modules/LR11x0/LR11x0.cpp @@ -292,6 +292,29 @@ int16_t LR11x0::receive(uint8_t* data, size_t len) { return(readData(data, len)); } +int16_t LR11x0::transmitDirect(uint32_t frf) { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_TX); + + // user requested to start transmitting immediately (required for RTTY) + int16_t state = RADIOLIB_ERR_NONE; + if(frf != 0) { + state = setRfFrequency(frf); + } + RADIOLIB_ASSERT(state); + + // start transmitting + return(setTxCw()); +} + +int16_t LR11x0::receiveDirect() { + // set RF switch (if present) + this->mod->setRfSwitchState(Module::MODE_RX); + + // LR11x0 is unable to output received data directly + return(RADIOLIB_ERR_UNKNOWN); +} + int16_t LR11x0::standby() { return(LR11x0::standby(RADIOLIB_LR11X0_STANDBY_RC)); } @@ -643,7 +666,7 @@ int16_t LR11x0::setFrequencyDeviation(float freqDev) { } RADIOLIB_CHECK_RANGE(newFreqDev, 0.6, 200.0, RADIOLIB_ERR_INVALID_FREQUENCY_DEVIATION); - this->frequencyDev = freqDev * 1000.0; + this->frequencyDev = newFreqDev * 1000.0; return(setModulationParamsGFSK(this->bitRate, this->pulseShape, this->rxBandwidth, this->frequencyDev)); } diff --git a/src/modules/LR11x0/LR11x0.h b/src/modules/LR11x0/LR11x0.h index 5bc3dc3d..d9340782 100644 --- a/src/modules/LR11x0/LR11x0.h +++ b/src/modules/LR11x0/LR11x0.h @@ -10,7 +10,7 @@ #include "../../protocols/PhysicalLayer/PhysicalLayer.h" // LR11X0 physical layer properties -#define RADIOLIB_LR11X0_FREQUENCY_STEP_SIZE 0.9536743164 +#define RADIOLIB_LR11X0_FREQUENCY_STEP_SIZE 1.0 #define RADIOLIB_LR11X0_MAX_PACKET_LENGTH 255 #define RADIOLIB_LR11X0_CRYSTAL_FREQ 32.0 #define RADIOLIB_LR11X0_DIV_EXPONENT 25 @@ -606,6 +606,20 @@ class LR11x0: public PhysicalLayer { */ int16_t receive(uint8_t* data, size_t len) override; + /*! + \brief Starts direct mode transmission. + \param frf Raw RF frequency value. Defaults to 0, required for quick frequency shifts in RTTY. + \returns \ref status_codes + */ + int16_t transmitDirect(uint32_t frf = 0) override; + + /*! + \brief Starts direct mode reception. Only implemented for PhysicalLayer compatibility, as %SX126x series does not support direct mode reception. + Will always return RADIOLIB_ERR_UNKNOWN. + \returns \ref status_codes + */ + int16_t receiveDirect() override; + /*! \brief Sets the module to standby mode (overload for PhysicalLayer compatibility, uses 13 MHz RC oscillator). \returns \ref status_codes