RNode_Firmware/sx128x.h

147 lines
3.6 KiB
C
Raw Normal View History

2025-01-04 21:05:11 +01:00
// Copyright Sandeep Mistry, Mark Qvist and Jacob Eva.
2020-05-21 12:41:39 +02:00
// Licensed under the MIT license.
#ifndef SX128X_H
#define SX128X_H
2018-04-05 18:10:42 +02:00
#include <Arduino.h>
#include <SPI.h>
2024-01-19 10:08:55 +00:00
#include "Modem.h"
2018-04-05 18:10:42 +02:00
2025-01-04 21:05:11 +01:00
#define LORA_DEFAULT_SS_PIN 10
#define LORA_DEFAULT_RESET_PIN 9
#define LORA_DEFAULT_DIO0_PIN 2
2024-01-19 10:08:55 +00:00
#define LORA_DEFAULT_RXEN_PIN -1
#define LORA_DEFAULT_TXEN_PIN -1
2024-01-19 10:08:55 +00:00
#define LORA_DEFAULT_BUSY_PIN -1
2025-01-04 21:05:11 +01:00
#define LORA_MODEM_TIMEOUT_MS 15E3
#define PA_OUTPUT_RFO_PIN 0
#define PA_OUTPUT_PA_BOOST_PIN 1
#define RSSI_OFFSET 157
class sx128x : public Stream {
2018-04-05 18:10:42 +02:00
public:
sx128x();
2018-04-05 18:10:42 +02:00
int begin(unsigned long frequency);
2018-04-05 18:10:42 +02:00
void end();
void reset();
2018-04-05 18:10:42 +02:00
int beginPacket(int implicitHeader = false);
int endPacket();
int parsePacket(int size = 0);
int packetRssi();
int packetRssi(uint8_t pkt_snr_raw);
int currentRssi();
2018-06-27 14:08:16 +02:00
uint8_t packetRssiRaw();
uint8_t currentRssiRaw();
2020-05-21 12:41:39 +02:00
uint8_t packetSnrRaw();
2018-04-05 18:10:42 +02:00
float packetSnr();
long packetFrequencyError();
// from Print
virtual size_t write(uint8_t byte);
virtual size_t write(const uint8_t *buffer, size_t size);
// from Stream
virtual int available();
virtual int read();
virtual int peek();
virtual void flush();
void onReceive(void(*callback)(int));
void receive(int size = 0);
2025-01-03 19:20:10 +01:00
void standby();
2018-04-05 18:10:42 +02:00
void sleep();
2023-01-07 16:35:07 +01:00
bool preInit();
uint8_t getTxPower();
2018-04-05 18:10:42 +02:00
void setTxPower(int level, int outputPin = PA_OUTPUT_PA_BOOST_PIN);
2018-06-20 16:32:30 +02:00
uint32_t getFrequency();
2025-01-03 19:20:10 +01:00
void setFrequency(uint32_t frequency);
2018-04-05 18:10:42 +02:00
void setSpreadingFactor(int sf);
2025-01-03 19:20:10 +01:00
uint8_t getSpreadingFactor();
uint32_t getSignalBandwidth();
void setSignalBandwidth(uint32_t sbw);
2018-04-05 18:10:42 +02:00
void setCodingRate4(int denominator);
2025-01-03 19:20:10 +01:00
uint8_t getCodingRate4();
void setPreambleLength(long preamble_symbols);
2018-04-05 18:10:42 +02:00
void setSyncWord(int sw);
bool dcd();
2025-01-03 19:20:10 +01:00
void clearIRQStatus();
2018-04-05 18:10:42 +02:00
void enableCrc();
void disableCrc();
2023-06-07 20:49:26 +02:00
void enableTCXO();
void disableTCXO();
2018-04-05 18:10:42 +02:00
void txAntEnable();
void rxAntEnable();
void loraMode();
void waitOnBusy();
void executeOpcode(uint8_t opcode, uint8_t *buffer, uint8_t size);
void executeOpcodeRead(uint8_t opcode, uint8_t *buffer, uint8_t size);
void writeBuffer(const uint8_t* buffer, size_t size);
void readBuffer(uint8_t* buffer, size_t size);
void setPacketParams(uint32_t target_preamble_symbols, uint8_t headermode, uint8_t payload_length, uint8_t crc);
void setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr);
2024-01-19 10:08:55 +00:00
2018-04-05 18:10:42 +02:00
void crc() { enableCrc(); }
void noCrc() { disableCrc(); }
void setPins(int ss = LORA_DEFAULT_SS_PIN, int reset = LORA_DEFAULT_RESET_PIN, int dio0 = LORA_DEFAULT_DIO0_PIN, int busy = LORA_DEFAULT_BUSY_PIN, int rxen = LORA_DEFAULT_RXEN_PIN, int txen = LORA_DEFAULT_TXEN_PIN);
2018-04-05 18:10:42 +02:00
void setSPIFrequency(uint32_t frequency);
void dumpRegisters(Stream& out);
private:
void explicitHeaderMode();
void implicitHeaderMode();
2025-01-03 21:23:23 +01:00
bool getPacketValidity();
2018-04-05 18:10:42 +02:00
void handleDio0Rise();
uint8_t readRegister(uint16_t address);
void writeRegister(uint16_t address, uint8_t value);
uint8_t singleTransfer(uint8_t opcode, uint16_t address, uint8_t value);
2018-04-05 18:10:42 +02:00
static void onDio0Rise();
void handleLowDataRate();
void optimizeModemSensitivity();
2018-04-05 18:10:42 +02:00
private:
SPISettings _spiSettings;
int _ss;
int _reset;
int _dio0;
2024-01-19 10:08:55 +00:00
int _rxen;
int _txen;
2024-01-19 10:08:55 +00:00
int _busy;
int _modem;
unsigned long _frequency;
2024-01-19 10:08:55 +00:00
int _txp;
uint8_t _sf;
uint8_t _bw;
uint8_t _cr;
2018-04-05 18:10:42 +02:00
int _packetIndex;
uint32_t _preambleLength;
2018-04-05 18:10:42 +02:00
int _implicitHeaderMode;
2024-01-19 10:08:55 +00:00
int _payloadLength;
int _crcMode;
int _fifo_tx_addr_ptr;
int _fifo_rx_addr_ptr;
uint8_t _packet[256];
bool _preinit_done;
2025-01-03 19:20:10 +01:00
bool _tcxo;
bool _radio_online;
int _rxPacketLength;
2025-01-03 19:20:10 +01:00
uint32_t _bitrate;
2025-01-08 22:16:07 +01:00
void (*_receive_callback)(int);
2018-04-05 18:10:42 +02:00
};
extern sx128x sx128x_modem;
2018-04-05 18:10:42 +02:00
2024-01-19 10:08:55 +00:00
#endif