firmware/src/rf95/SX1262Interface.cpp

124 lines
3.4 KiB
C++
Raw Normal View History

#include "SX1262Interface.h"
#include <configuration.h>
SX1262Interface::SX1262Interface(RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq, RADIOLIB_PIN_TYPE rst, RADIOLIB_PIN_TYPE busy,
SPIClass &spi)
: RadioLibInterface(cs, irq, rst, busy, spi, &lora), lora(&module)
{
}
/// Initialise the Driver transport hardware and software.
/// Make sure the Driver is properly configured before calling init().
/// \return true if initialisation succeeded.
bool SX1262Interface::init()
{
float tcxoVoltage = 0; // None - we use an XTAL
bool useRegulatorLDO = false; // Seems to depend on the connection to pin 9/DCC_SW - if an inductor DCDC?
applyModemConfig();
if (power > 22) // This chip has lower power limits than some
power = 22;
int res = lora.begin(freq, bw, sf, cr, syncWord, power, currentLimit, preambleLength, tcxoVoltage, useRegulatorLDO);
DEBUG_MSG("LORA init result %d\n", res);
2020-04-30 17:00:40 +00:00
if (res == ERR_NONE)
res = lora.setCRC(SX126X_LORA_CRC_ON);
2020-04-30 19:37:58 +00:00
if (res == ERR_NONE)
startReceive(); // start receiving
2020-04-30 20:50:40 +00:00
return res == ERR_NONE;
}
bool SX1262Interface::reconfigure()
{
applyModemConfig();
// set mode to standby
2020-04-30 20:50:40 +00:00
setStandby();
// configure publicly accessible settings
2020-04-30 20:50:40 +00:00
int err = lora.setSpreadingFactor(sf);
assert(err == ERR_NONE);
err = lora.setBandwidth(bw);
assert(err == ERR_NONE);
err = lora.setCodingRate(cr);
assert(err == ERR_NONE);
err = lora.setSyncWord(syncWord);
assert(err == ERR_NONE);
err = lora.setCurrentLimit(currentLimit);
assert(err == ERR_NONE);
err = lora.setPreambleLength(preambleLength);
assert(err == ERR_NONE);
err = lora.setFrequency(freq);
assert(err == ERR_NONE);
if (power > 22) // This chip has lower power limits than some
power = 22;
err = lora.setOutputPower(power);
assert(err == ERR_NONE);
2020-04-30 19:37:58 +00:00
startReceive(); // restart receiving
return ERR_NONE;
}
2020-04-30 20:50:40 +00:00
void SX1262Interface::setStandby()
{
int err = lora.standby();
assert(err == ERR_NONE);
isReceiving = false; // If we were receiving, not any more
disableInterrupt();
2020-05-01 05:53:21 +00:00
completeSending(); // If we were sending, not anymore
2020-04-30 20:50:40 +00:00
}
2020-05-01 02:58:10 +00:00
/**
* Add SNR data to received messages
*/
2020-05-01 05:53:21 +00:00
void SX1262Interface::addReceiveMetadata(MeshPacket *mp)
{
2020-05-01 02:58:10 +00:00
mp->rx_snr = lora.getSNR();
}
2020-04-30 19:37:58 +00:00
void SX1262Interface::startReceive()
{
2020-04-30 20:50:40 +00:00
setStandby();
2020-04-30 19:37:58 +00:00
int err = lora.startReceive();
assert(err == ERR_NONE);
2020-04-30 20:50:40 +00:00
isReceiving = true;
2020-04-30 19:37:58 +00:00
// Must be done AFTER, starting transmit, because startTransmit clears (possibly stale) interrupt pending register bits
enableInterrupt(isrRxLevel0);
}
/** Could we send right now (i.e. either not actively receving or transmitting)? */
bool SX1262Interface::canSendImmediately()
{
// We wait _if_ we are partially though receiving a packet (rather than just merely waiting for one).
// To do otherwise would be doubly bad because not only would we drop the packet that was on the way in,
// we almost certainly guarantee no one outside will like the packet we are sending.
bool busyTx = sendingPacket != NULL;
bool busyRx = isReceiving && lora.getPacketLength() > 0;
2020-04-30 20:50:40 +00:00
if (busyTx || busyRx)
DEBUG_MSG("Can not set now, busyTx=%d, busyRx=%d\n", busyTx, busyRx);
return !busyTx && !busyRx;
}
bool SX1262Interface::sleep()
{
2020-05-01 00:43:29 +00:00
// put chipset into sleep mode
disableInterrupt();
lora.sleep();
2020-05-01 00:43:29 +00:00
return true;
}