firmware/src/mesh/SX126xInterface.cpp

348 lines
13 KiB
C++
Raw Normal View History

#include "SX126xInterface.h"
2023-01-21 13:34:29 +00:00
#include "configuration.h"
#include "error.h"
2023-01-25 20:59:12 +00:00
#include "mesh/NodeDB.h"
#ifdef ARCH_PORTDUINO
#include "PortduinoGlue.h"
#endif
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
// Particular boards might define a different max power based on what their hardware can do, default to max power output if not
// specified (may be dangerous if using external PA and SX126x power config forgotten)
#ifndef SX126X_MAX_POWER
#define SX126X_MAX_POWER 22
#endif
2023-01-21 13:34:29 +00:00
template <typename T>
2023-05-08 11:18:28 +00:00
SX126xInterface<T>::SX126xInterface(LockingArduinoHal *hal, RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq, RADIOLIB_PIN_TYPE rst,
RADIOLIB_PIN_TYPE busy)
: RadioLibInterface(hal, cs, irq, rst, busy, &lora), lora(&module)
{
2024-03-22 01:45:48 +00:00
LOG_DEBUG("SX126xInterface(cs=%d, irq=%d, rst=%d, busy=%d)\n", cs, irq, rst, busy);
}
/// Initialise the Driver transport hardware and software.
/// Make sure the Driver is properly configured before calling init().
/// \return true if initialisation succeeded.
2023-01-25 20:59:12 +00:00
template <typename T> bool SX126xInterface<T>::init()
{
#ifdef SX126X_POWER_EN
pinMode(SX126X_POWER_EN, OUTPUT);
digitalWrite(SX126X_POWER_EN, HIGH);
#endif
#if ARCH_PORTDUINO
float tcxoVoltage = 0;
if (settingsMap[dio3_tcxo_voltage])
tcxoVoltage = 1.8;
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
// FIXME: correct logic to default to not using TCXO if no voltage is specified for SX126X_DIO3_TCXO_VOLTAGE
#elif !defined(SX126X_DIO3_TCXO_VOLTAGE)
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
float tcxoVoltage =
0; // "TCXO reference voltage to be set on DIO3. Defaults to 1.6 V, set to 0 to skip." per
// https://github.com/jgromes/RadioLib/blob/690a050ebb46e6097c5d00c371e961c1caa3b52e/src/modules/SX126x/SX126x.h#L471C26-L471C104
// (DIO3 is free to be used as an IRQ)
#else
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
float tcxoVoltage = SX126X_DIO3_TCXO_VOLTAGE;
// (DIO3 is not free to be used as an IRQ)
#endif
if (tcxoVoltage == 0)
LOG_DEBUG("SX126X_DIO3_TCXO_VOLTAGE not defined, not using DIO3 as TCXO reference voltage\n");
else
LOG_DEBUG("SX126X_DIO3_TCXO_VOLTAGE defined, using DIO3 as TCXO reference voltage at %f V\n", tcxoVoltage);
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
// FIXME: May want to set depending on a definition, currently all SX126x variant files use the DC-DC regulator option
bool useRegulatorLDO = false; // Seems to depend on the connection to pin 9/DCC_SW - if an inductor DCDC?
RadioLibInterface::init();
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
if (power > SX126X_MAX_POWER) // Clamp power to maximum defined level
power = SX126X_MAX_POWER;
limitPower();
int res = lora.begin(getFreq(), bw, sf, cr, syncWord, power, preambleLength, tcxoVoltage, useRegulatorLDO);
// \todo Display actual typename of the adapter, not just `SX126x`
LOG_INFO("SX126x init result %d\n", res);
if (res == RADIOLIB_ERR_CHIP_NOT_FOUND)
return false;
LOG_INFO("Frequency set to %f\n", getFreq());
LOG_INFO("Bandwidth set to %f\n", bw);
LOG_INFO("Power output set to %d\n", power);
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
// Overriding current limit
// (https://github.com/jgromes/RadioLib/blob/690a050ebb46e6097c5d00c371e961c1caa3b52e/src/modules/SX126x/SX126x.cpp#L85) using
// value in SX126xInterface.h (currently 140 mA) It may or may not be neccessary, depending on how RadioLib functions, from
// SX1261/2 datasheet: OCP after setting DeviceSel with SetPaConfig(): SX1261 - 60 mA, SX1262 - 140 mA For the SX1268 the IC
// defaults to 140mA no matter the set power level, but RadioLib set it lower, this would need further checking Default values
// are: SX1262, SX1268: 0x38 (140 mA), SX1261: 0x18 (60 mA)
// FIXME: Not ideal to increase SX1261 current limit above 60mA as it can only transmit max 15dBm, should probably only do it
// if using SX1262 or SX1268
res = lora.setCurrentLimit(currentLimit);
2022-12-30 02:41:37 +00:00
LOG_DEBUG("Current limit set to %f\n", currentLimit);
LOG_DEBUG("Current limit set result %d\n", res);
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
#ifdef SX126X_DIO2_AS_RF_SWITCH
LOG_DEBUG("Setting DIO2 as RF switch\n");
bool dio2AsRfSwitch = true;
#elif defined(ARCH_PORTDUINO)
bool dio2AsRfSwitch = false;
2023-11-19 20:00:03 +00:00
if (settingsMap[dio2_as_rf_switch]) {
LOG_DEBUG("Setting DIO2 as RF switch\n");
dio2AsRfSwitch = true;
}
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
#else
LOG_DEBUG("Setting DIO2 as not RF switch\n");
bool dio2AsRfSwitch = false;
2023-05-12 01:09:34 +00:00
#endif
2023-01-25 20:59:12 +00:00
if (res == RADIOLIB_ERR_NONE) {
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
res = lora.setDio2AsRfSwitch(dio2AsRfSwitch);
}
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
// If a pin isn't defined, we set it to RADIOLIB_NC, it is safe to always do external RF switching with RADIOLIB_NC as it has
// no effect
#if ARCH_PORTDUINO
if (res == RADIOLIB_ERR_NONE) {
LOG_DEBUG("Using MCU pin %i as RXEN and pin %i as TXEN to control RF switching\n", settingsMap[rxen], settingsMap[txen]);
lora.setRfSwitchPins(settingsMap[rxen], settingsMap[txen]);
}
#else
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
#ifndef SX126X_RXEN
#define SX126X_RXEN RADIOLIB_NC
LOG_DEBUG("SX126X_RXEN not defined, defaulting to RADIOLIB_NC\n");
#endif
#ifndef SX126X_TXEN
#define SX126X_TXEN RADIOLIB_NC
LOG_DEBUG("SX126X_TXEN not defined, defaulting to RADIOLIB_NC\n");
#endif
if (res == RADIOLIB_ERR_NONE) {
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
LOG_DEBUG("Using MCU pin %i as RXEN and pin %i as TXEN to control RF switching\n", SX126X_RXEN, SX126X_TXEN);
lora.setRfSwitchPins(SX126X_RXEN, SX126X_TXEN);
}
#endif
2023-01-25 20:59:12 +00:00
if (config.lora.sx126x_rx_boosted_gain) {
uint16_t result = lora.setRxBoostedGainMode(true);
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
LOG_INFO("Set RX gain to boosted mode; result: %d\n", result);
2023-01-25 20:59:12 +00:00
} else {
uint16_t result = lora.setRxBoostedGainMode(false);
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
LOG_INFO("Set RX gain to power saving mode (boosted mode off); result: %d\n", result);
}
#if 0
// Read/write a register we are not using (only used for FSK mode) to test SPI comms
uint8_t crcLSB = 0;
int err = lora.readRegister(SX126X_REG_CRC_POLYNOMIAL_LSB, &crcLSB, 1);
if(err != RADIOLIB_ERR_NONE)
RECORD_CRITICALERROR(CriticalErrorCode_SX1262Failure);
//if(crcLSB != 0x0f)
// RECORD_CRITICALERROR(CriticalErrorCode_SX1262Failure);
crcLSB = 0x5a;
err = lora.writeRegister(SX126X_REG_CRC_POLYNOMIAL_LSB, &crcLSB, 1);
if(err != RADIOLIB_ERR_NONE)
RECORD_CRITICALERROR(CriticalErrorCode_SX1262Failure);
err = lora.readRegister(SX126X_REG_CRC_POLYNOMIAL_LSB, &crcLSB, 1);
if(err != RADIOLIB_ERR_NONE)
RECORD_CRITICALERROR(CriticalErrorCode_SX1262Failure);
if(crcLSB != 0x5a)
RECORD_CRITICALERROR(CriticalErrorCode_SX1262Failure);
// If we got this far register accesses (and therefore SPI comms) are good
#endif
if (res == RADIOLIB_ERR_NONE)
res = lora.setCRC(RADIOLIB_SX126X_LORA_CRC_ON);
if (res == RADIOLIB_ERR_NONE)
startReceive(); // start receiving
return res == RADIOLIB_ERR_NONE;
}
2023-01-25 20:59:12 +00:00
template <typename T> bool SX126xInterface<T>::reconfigure()
{
RadioLibInterface::reconfigure();
// set mode to standby
setStandby();
// configure publicly accessible settings
int err = lora.setSpreadingFactor(sf);
if (err != RADIOLIB_ERR_NONE)
RECORD_CRITICALERROR(meshtastic_CriticalErrorCode_INVALID_RADIO_SETTING);
err = lora.setBandwidth(bw);
if (err != RADIOLIB_ERR_NONE)
RECORD_CRITICALERROR(meshtastic_CriticalErrorCode_INVALID_RADIO_SETTING);
err = lora.setCodingRate(cr);
if (err != RADIOLIB_ERR_NONE)
RECORD_CRITICALERROR(meshtastic_CriticalErrorCode_INVALID_RADIO_SETTING);
err = lora.setSyncWord(syncWord);
if (err != RADIOLIB_ERR_NONE)
LOG_ERROR("Radiolib error %d when attempting SX126X setSyncWord!\n", err);
assert(err == RADIOLIB_ERR_NONE);
err = lora.setCurrentLimit(currentLimit);
if (err != RADIOLIB_ERR_NONE)
LOG_ERROR("Radiolib error %d when attempting SX126X setCurrentLimit!\n", err);
assert(err == RADIOLIB_ERR_NONE);
err = lora.setPreambleLength(preambleLength);
if (err != RADIOLIB_ERR_NONE)
LOG_ERROR("Radiolib error %d when attempting SX126X setPreambleLength!\n", err);
assert(err == RADIOLIB_ERR_NONE);
err = lora.setFrequency(getFreq());
if (err != RADIOLIB_ERR_NONE)
RECORD_CRITICALERROR(meshtastic_CriticalErrorCode_INVALID_RADIO_SETTING);
if (power > SX126X_MAX_POWER) // This chip has lower power limits than some
power = SX126X_MAX_POWER;
err = lora.setOutputPower(power);
if (err != RADIOLIB_ERR_NONE)
LOG_ERROR("Radiolib error %d when attempting SX126X setOutputPower!\n", err);
assert(err == RADIOLIB_ERR_NONE);
startReceive(); // restart receiving
return RADIOLIB_ERR_NONE;
}
2023-01-25 20:59:12 +00:00
template <typename T> void INTERRUPT_ATTR SX126xInterface<T>::disableInterrupt()
{
lora.clearDio1Action();
}
2023-01-25 20:59:12 +00:00
template <typename T> void SX126xInterface<T>::setStandby()
{
checkNotification(); // handle any pending interrupts before we force standby
int err = lora.standby();
2022-11-15 20:55:27 +00:00
if (err != RADIOLIB_ERR_NONE)
2022-12-30 02:41:37 +00:00
LOG_DEBUG("SX126x standby failed with error %d\n", err);
assert(err == RADIOLIB_ERR_NONE);
isReceiving = false; // If we were receiving, not any more
activeReceiveStart = 0;
disableInterrupt();
completeSending(); // If we were sending, not anymore
Add PowerMon support (#4155) * Turn off vscode cmake prompt - we don't use cmake on meshtastic * Add rak4631_dap variant for debugging with NanoDAP debug probe device. * The rak device can also run freertos (which is underneath nrf52 arduino) * Add semihosting support for nrf52840 devices Initial platformio.ini file only supports rak4630 Default to non TCP for the semihosting log output for now... Fixes https://github.com/meshtastic/firmware/issues/4135 * powermon WIP (for https://github.com/meshtastic/firmware/issues/4136 ) * oops - mean't to mark the _dbg variant as an 'extra' board. * powermon wip * Make serial port on wio-sdk-wm1110 board work By disabling the (inaccessible) adafruit USB * Instrument (radiolib only for now) lora for powermon per https://github.com/meshtastic/firmware/issues/4136 * powermon gps support https://github.com/meshtastic/firmware/issues/4136 * Add CPU deep and light sleep powermon states https://github.com/meshtastic/firmware/issues/4136 * Change the board/swversion bootstring so it is a new "structured" log msg. * powermon wip * add example script for getting esp S3 debugging working Not yet used but I didn't want these nasty tricks to get lost yet. * Add PowerMon reporting for screen and bluetooth pwr. * make power.powermon_enables config setting work. * update to latest protobufs * fix bogus shellcheck warning * make powermon optional (but default enabled because tiny and no runtime impact) * tell vscode, if formatting, use whatever our trunk formatter wants without this flag if the user has set some other formatter (clang) in their user level settings, it will be looking in the wrong directory for the clang options (we want the options in .trunk/clang) Note: formatOnSave is true in master, which means a bunch of our older files are non compliant and if you edit them it will generate lots of formatting related diffs. I guess I'll start letting that happen with my future commits ;-). * add PowerStress module * nrf52 arduino is built upon freertos, so let platformio debug it * don't accidentally try to Segger ICE if we are using another ICE * clean up RedirectablePrint::log so it doesn't have three very different implementations inline. * remove NoopPrint - it is no longer needed * when talking to API clients via serial, don't turn off log msgs instead encapsuate them * fix the build - would loop forever if there were no files to send * don't use Segger code if not talking to a Segger debugger * when encapsulating logs, make sure the strings always has nul terminators * nrf52 soft device will watchdog if you use ICE while BT on... so have debugger disable bluetooth. * Important to not print debug messages while writing to the toPhone scratch buffer * don't include newlines if encapsulating log records as protobufs * update to latest protobufs (needed for powermon goo) * PowerStress WIP * fix linter warning
2024-07-03 23:02:20 +00:00
RadioLibInterface::setStandby();
}
/**
* Add SNR data to received messages
*/
2023-01-25 20:59:12 +00:00
template <typename T> void SX126xInterface<T>::addReceiveMetadata(meshtastic_MeshPacket *mp)
{
2022-12-30 02:41:37 +00:00
// LOG_DEBUG("PacketStatus %x\n", lora.getPacketStatus());
mp->rx_snr = lora.getSNR();
mp->rx_rssi = lround(lora.getRSSI());
}
/** We override to turn on transmitter power as needed.
*/
2023-01-25 20:59:12 +00:00
template <typename T> void SX126xInterface<T>::configHardwareForSend()
{
RadioLibInterface::configHardwareForSend();
}
// For power draw measurements, helpful to force radio to stay sleeping
// #define SLEEP_ONLY
2023-01-25 20:59:12 +00:00
template <typename T> void SX126xInterface<T>::startReceive()
{
#ifdef SLEEP_ONLY
sleep();
#else
setStandby();
// We use a 16 bit preamble so this should save some power by letting radio sit in standby mostly.
// Furthermore, we need the PREAMBLE_DETECTED and HEADER_VALID IRQ flag to detect whether we are actively receiving
int err = lora.startReceiveDutyCycleAuto(preambleLength, 8,
2023-11-30 09:59:01 +00:00
RADIOLIB_SX126X_IRQ_RX_DEFAULT | RADIOLIB_SX126X_IRQ_PREAMBLE_DETECTED |
RADIOLIB_SX126X_IRQ_HEADER_VALID);
if (err != RADIOLIB_ERR_NONE)
LOG_ERROR("Radiolib error %d when attempting SX126X startReceiveDutyCycleAuto!\n", err);
assert(err == RADIOLIB_ERR_NONE);
Add PowerMon support (#4155) * Turn off vscode cmake prompt - we don't use cmake on meshtastic * Add rak4631_dap variant for debugging with NanoDAP debug probe device. * The rak device can also run freertos (which is underneath nrf52 arduino) * Add semihosting support for nrf52840 devices Initial platformio.ini file only supports rak4630 Default to non TCP for the semihosting log output for now... Fixes https://github.com/meshtastic/firmware/issues/4135 * powermon WIP (for https://github.com/meshtastic/firmware/issues/4136 ) * oops - mean't to mark the _dbg variant as an 'extra' board. * powermon wip * Make serial port on wio-sdk-wm1110 board work By disabling the (inaccessible) adafruit USB * Instrument (radiolib only for now) lora for powermon per https://github.com/meshtastic/firmware/issues/4136 * powermon gps support https://github.com/meshtastic/firmware/issues/4136 * Add CPU deep and light sleep powermon states https://github.com/meshtastic/firmware/issues/4136 * Change the board/swversion bootstring so it is a new "structured" log msg. * powermon wip * add example script for getting esp S3 debugging working Not yet used but I didn't want these nasty tricks to get lost yet. * Add PowerMon reporting for screen and bluetooth pwr. * make power.powermon_enables config setting work. * update to latest protobufs * fix bogus shellcheck warning * make powermon optional (but default enabled because tiny and no runtime impact) * tell vscode, if formatting, use whatever our trunk formatter wants without this flag if the user has set some other formatter (clang) in their user level settings, it will be looking in the wrong directory for the clang options (we want the options in .trunk/clang) Note: formatOnSave is true in master, which means a bunch of our older files are non compliant and if you edit them it will generate lots of formatting related diffs. I guess I'll start letting that happen with my future commits ;-). * add PowerStress module * nrf52 arduino is built upon freertos, so let platformio debug it * don't accidentally try to Segger ICE if we are using another ICE * clean up RedirectablePrint::log so it doesn't have three very different implementations inline. * remove NoopPrint - it is no longer needed * when talking to API clients via serial, don't turn off log msgs instead encapsuate them * fix the build - would loop forever if there were no files to send * don't use Segger code if not talking to a Segger debugger * when encapsulating logs, make sure the strings always has nul terminators * nrf52 soft device will watchdog if you use ICE while BT on... so have debugger disable bluetooth. * Important to not print debug messages while writing to the toPhone scratch buffer * don't include newlines if encapsulating log records as protobufs * update to latest protobufs (needed for powermon goo) * PowerStress WIP * fix linter warning
2024-07-03 23:02:20 +00:00
RadioLibInterface::startReceive();
// Must be done AFTER, starting transmit, because startTransmit clears (possibly stale) interrupt pending register bits
enableInterrupt(isrRxLevel0);
#endif
}
/** Is the channel currently active? */
2023-01-25 20:59:12 +00:00
template <typename T> bool SX126xInterface<T>::isChannelActive()
{
// check if we can detect a LoRa preamble on the current channel
int16_t result;
setStandby();
result = lora.scanChannel();
if (result == RADIOLIB_LORA_DETECTED)
return true;
2024-04-14 19:36:11 +00:00
if (result != RADIOLIB_CHANNEL_FREE)
LOG_ERROR("Radiolib error %d when attempting SX126X scanChannel!\n", result);
assert(result != RADIOLIB_ERR_WRONG_MODEM);
return false;
}
/** Could we send right now (i.e. either not actively receiving or transmitting)? */
2023-01-25 20:59:12 +00:00
template <typename T> bool SX126xInterface<T>::isActivelyReceiving()
{
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
// The IRQ status will be cleared when we start our read operation. Check if we've started a header, but haven't yet
// received and handled the interrupt for reading the packet/handling errors.
uint16_t irq = lora.getIrqStatus();
2023-11-30 09:59:01 +00:00
bool detected = (irq & (RADIOLIB_SX126X_IRQ_HEADER_VALID | RADIOLIB_SX126X_IRQ_PREAMBLE_DETECTED));
// Handle false detections
if (detected) {
uint32_t now = millis();
if (!activeReceiveStart) {
activeReceiveStart = now;
} else if ((now - activeReceiveStart > 2 * preambleTimeMsec) && !(irq & RADIOLIB_SX126X_IRQ_HEADER_VALID)) {
// The HEADER_VALID flag should be set by now if it was really a packet, so ignore PREAMBLE_DETECTED flag
activeReceiveStart = 0;
LOG_DEBUG("Ignore false preamble detection.\n");
return false;
} else if (now - activeReceiveStart > maxPacketTimeMsec) {
// We should have gotten an RX_DONE IRQ by now if it was really a packet, so ignore HEADER_VALID flag
activeReceiveStart = 0;
LOG_DEBUG("Ignore false header detection.\n");
return false;
}
}
// if (detected) LOG_DEBUG("rx detected\n");
return detected;
}
2023-01-25 20:59:12 +00:00
template <typename T> bool SX126xInterface<T>::sleep()
{
// Not keeping config is busted - next time nrf52 board boots lora sending fails tcxo related? - see datasheet
// \todo Display actual typename of the adapter, not just `SX126x`
Simplify SX126x variant configuration (#2813) * Update SX126xInterface.cpp * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update SX126xInterface.cpp * Update SX126xInterface.cpp * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update pins_arduino.h * Update pins_arduino.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * trunk fmt * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h Specify behavior * Update variant.h Maintain behavior * trunk fmt * Update variant.h * Update variant.h * Update variant.h * Update variant.h * Update variant.h --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
2023-09-27 21:01:40 +00:00
LOG_DEBUG("SX126x entering sleep mode (FIXME, don't keep config)\n");
setStandby(); // Stop any pending operations
// turn off TCXO if it was powered
// FIXME - this isn't correct
// lora.setTCXO(0);
// put chipset into sleep mode (we've already disabled interrupts by now)
bool keepConfig = true;
lora.sleep(keepConfig); // Note: we do not keep the config, full reinit will be needed
#ifdef SX126X_POWER_EN
digitalWrite(SX126X_POWER_EN, LOW);
#endif
return true;
}