25#include <kernel/scheduler/scheduler.h>
35using namespace SX1278;
36using namespace SX1278::Fsk;
84 "[sx1278] Configured power invalid for given frontend!");
86 (config.
ocp >= 130 && config.
ocp <= 240)) &&
87 "[sx1278] Invalid ocp!");
89 "[sx1278] Invalid freq_dev!");
91 "[sx1278] Invalid freq_rf");
100 miosix::Thread::sleep(1);
121 int ocp = config.
ocp <= 120 ? std::max(std::min(config.
ocp, 120), 0)
122 : std::max(std::min(config.
ocp, 240), 130);
187 else if (power != 20)
279 last_rx_rssi = getRssi();
387void SX1278Fsk::enterFskMode()
396 miosix::Thread::sleep(1);
402 miosix::Thread::sleep(1);
405void SX1278Fsk::rateLimitTx()
407 const long long RATE_LIMIT = 2;
409 long long delta =
now() - last_tx;
410 if (delta <= RATE_LIMIT)
411 miosix::Thread::sleep(RATE_LIMIT - delta);
420void SX1278Fsk::resetIrqFlags(IrqFlags flags)
434float SX1278Fsk::getRssi()
439 return static_cast<float>(rssi_raw) * -0.5f;
442float SX1278Fsk::getFei()
446 uint16_t fei_raw = spi.readRegister16(
REG_FEI_MSB);
447 return static_cast<float>(fei_raw) *
FSTEP;
450void SX1278Fsk::setMode(Mode mode)
#define LOG_ERR(logger,...)
Provides high-level access to the SPI Bus for a single transaction.
uint8_t readRegister(uint8_t reg)
Reads an 8 bit register.
void writeRegisters(uint8_t reg, uint8_t *data, size_t size)
Writes multiple bytes starting from the specified register.
void writeRegister24(uint8_t reg, uint32_t data)
Writes a 24 bit register.
void readRegisters(uint8_t reg, uint8_t *data, size_t size)
Reads multiple bytes starting from the specified register.
void writeRegister(uint8_t reg, uint8_t data)
Writes an 8 bit register.
void writeRegister16(uint8_t reg, uint16_t data)
Writes a 16 bit register.
virtual bool isOnPaBoost()=0
Is this frontend connected to PA_BOOST or RFO_LF/_HF?
virtual int maxInPower()=0
What is the maximum power supported by this frontend?
RAII scoped bus lock guard.
RAII scoped mode lock, requires a previous lock.
ISX1278Frontend & getFrontend()
void setDefaultMode(Mode mode, DioMapping mapping, InterruptTrigger dio1_trigger, bool set_tx_frontend_on, bool set_rx_frontend_on)
Set default device mode.
IrqFlags checkForIrqAndReset(IrqFlags set_irq, IrqFlags reset_irq)
Returns a mask containing triggered interrupts.
IrqFlags waitForIrq(LockMode &guard, IrqFlags set_irq, IrqFlags reset_irq, bool unlock=false)
Wait for generic irq.
virtual Error init(const Config &config)
Setup the device.
virtual Error configure(const Config &config)
Configure this device on the fly.
static constexpr size_t MTU
Maximum transmittable unit of this driver.
float getLastRxFei() override
Get the frequency error index in Hz, during last packet receive.
float getLastRxRssi() override
Get the RSSI in dBm, during last packet receive.
float getCurRssi()
Get the current perceived RSSI in dBm.
bool send(uint8_t *pkt, size_t len) override
Send a packet. The function must block until the packet is sent (successfully or not)
ssize_t receive(uint8_t *pkt, size_t max_len) override
Wait until a new packet is received.
long long getOldTick()
Get the current time in milliseconds.
constexpr uint8_t make(RxBwAfc rx_bw_afc)
constexpr uint8_t make(int fifo_threshold, TxStartCondition tx_start_condition)
@ TX_START_CONDITION_FIFO_NOT_EMPTY
constexpr uint8_t make(uint8_t ocp_trim, bool ocp_on)
constexpr uint8_t make(Mode mode, bool low_frequency_mode_on, ModulationType modulation_type)
constexpr uint8_t make(uint8_t output_power, uint8_t max_power, bool pa_select)
constexpr uint8_t make(PaDac pa_dac)
constexpr uint8_t make(PaRamp pa_ramp, ModulationShaping modulation_shaping)
@ CRC_WHITENING_TYPE_CCITT_CRC
@ PACKET_FORMAT_VARIABLE_LENGTH
constexpr uint8_t make(CrcWhiteningType crc_whitening_type, AddressFiltering address_filtering, bool crc_auto_clear_off, bool crc_on, DcFree dc_free, PacketFormat packet_format)
constexpr uint8_t make(bool beacon_on, bool io_home_power_frame, bool io_home_on, DataMode data_mode)
@ PREAMBLE_DETECTOR_SIZE_2_BYTES
constexpr uint8_t make(int tol, Size size, bool on)
constexpr uint8_t make(RxBw rx_bw)
constexpr uint8_t make(bool rx_trigger_rssi_interrupt, bool rx_trigger_preable_detect, bool agc_auto_on, bool afc_auto_on, bool restart_rx_with_pll_lock, bool restart_rx_without_pll_lock, bool restart_rx_on_collision)
constexpr uint8_t make(int size, bool on, PreamblePolarity preamble_polarity, AutoRestartRxMode auto_restart_rx_mode)
@ AUTO_RESTART_RX_MODE_OFF
@ REG_PACKET_PAYLOAD_LENGTH
constexpr int FIFO_LEN
Length of the internal FIFO.
constexpr int MIN_FREQ_DEV
constexpr float FSTEP
Frequency step (Hz) used in some calculations.
constexpr int MAX_FREQ_DEV
RegDioMapping::Mapping DioMapping
constexpr int MIN_FREQ_RF
constexpr int MAX_FREQ_RF
constexpr int FXOSC
Main oscillator frequency (Hz)
This file includes all the types the logdecoder script will decode.
constexpr DioMapping DEFAULT_MAPPING
Represents an actual Dio mapping..
Requested SX1278 configuration.