RadioLib
Universal wireless communication library for Arduino
PhysicalLayer.h
1 #if !defined(_RADIOLIB_PHYSICAL_LAYER_H)
2 #define _RADIOLIB_PHYSICAL_LAYER_H
3 
4 #include "../../TypeDef.h"
5 #include "../../Module.h"
6 
7 // common IRQ values - the IRQ flags in RadioLibIrqFlags_t arguments are offset by this value
8 enum RadioLibIrqType_t {
9  RADIOLIB_IRQ_TX_DONE = 0x00,
10  RADIOLIB_IRQ_RX_DONE = 0x01,
11  RADIOLIB_IRQ_PREAMBLE_DETECTED = 0x02,
12  RADIOLIB_IRQ_SYNC_WORD_VALID = 0x03,
13  RADIOLIB_IRQ_HEADER_VALID = 0x04,
14  RADIOLIB_IRQ_HEADER_ERR = 0x05,
15  RADIOLIB_IRQ_CRC_ERR = 0x06,
16  RADIOLIB_IRQ_CAD_DONE = 0x07,
17  RADIOLIB_IRQ_CAD_DETECTED = 0x08,
18  RADIOLIB_IRQ_TIMEOUT = 0x09,
19  RADIOLIB_IRQ_NOT_SUPPORTED = 0x1F, // this must be the last value, intentionally set to 31
20 };
21 
22 // some commonly used default values - defined here to ensure all modules have the same default behavior
23 #define RADIOLIB_IRQ_RX_DEFAULT_FLAGS ((1UL << RADIOLIB_IRQ_RX_DONE) | (1UL << RADIOLIB_IRQ_TIMEOUT) | (1UL << RADIOLIB_IRQ_CRC_ERR) | (1UL << RADIOLIB_IRQ_HEADER_VALID) | (1UL << RADIOLIB_IRQ_HEADER_ERR))
24 #define RADIOLIB_IRQ_RX_DEFAULT_MASK ((1UL << RADIOLIB_IRQ_RX_DONE))
25 #define RADIOLIB_IRQ_CAD_DEFAULT_FLAGS ((1UL << RADIOLIB_IRQ_CAD_DETECTED) | (1UL << RADIOLIB_IRQ_CAD_DONE))
26 #define RADIOLIB_IRQ_CAD_DEFAULT_MASK ((1UL << RADIOLIB_IRQ_CAD_DETECTED) | (1UL << RADIOLIB_IRQ_CAD_DONE))
27 
32 struct LoRaRate_t {
34  uint8_t spreadingFactor;
35 
37  float bandwidth;
38 
40  uint8_t codingRate;
41 };
42 
47 struct FSKRate_t {
49  float bitRate;
50 
52  float freqDev;
53 };
54 
59 struct LrFhssRate_t {
61  uint8_t bw;
62 
64  uint8_t cr;
65 
67  bool narrowGrid;
68 };
69 
74 union DataRate_t {
77 
80 
83 };
84 
91  uint8_t symNum;
92 
94  uint8_t detPeak;
95 
97  uint8_t detMin;
98 
100  uint8_t exitMode;
101 
104 
107 
110 };
111 
118  float limit;
119 };
120 
128 
131 };
132 
137 enum ModemType_t {
138  RADIOLIB_MODEM_FSK = 0,
139  RADIOLIB_MODEM_LORA,
140  RADIOLIB_MODEM_LRFHSS,
141 };
142 
152  public:
153 
154  // constructor
155 
161  PhysicalLayer(float step, size_t maxLen);
162 
163  // basic methods
164 
165  #if defined(RADIOLIB_BUILD_ARDUINO)
172  int16_t transmit(__FlashStringHelper* fstr, uint8_t addr = 0);
173 
180  int16_t transmit(String& str, uint8_t addr = 0);
181  #endif
182 
189  int16_t transmit(const char* str, uint8_t addr = 0);
190 
198  virtual int16_t transmit(const uint8_t* data, size_t len, uint8_t addr = 0);
199 
200  #if defined(RADIOLIB_BUILD_ARDUINO)
207  int16_t receive(String& str, size_t len = 0);
208  #endif
209 
214  virtual int16_t sleep();
215 
220  virtual int16_t standby();
221 
226  virtual int16_t standby(uint8_t mode);
227 
232  virtual int16_t startReceive();
233 
244  virtual int16_t startReceive(uint32_t timeout, RadioLibIrqFlags_t irqFlags, RadioLibIrqFlags_t irqMask, size_t len);
245 
252  virtual int16_t receive(uint8_t* data, size_t len);
253 
254  #if defined(RADIOLIB_BUILD_ARDUINO)
262  int16_t startTransmit(String& str, uint8_t addr = 0);
263  #endif
264 
272  int16_t startTransmit(const char* str, uint8_t addr = 0);
273 
281  virtual int16_t startTransmit(const uint8_t* data, size_t len, uint8_t addr = 0);
282 
287  virtual int16_t finishTransmit();
288 
289  #if defined(RADIOLIB_BUILD_ARDUINO)
297  int16_t readData(String& str, size_t len = 0);
298  #endif
299 
307  virtual int16_t readData(uint8_t* data, size_t len);
308 
315  virtual int16_t transmitDirect(uint32_t frf = 0);
316 
322  virtual int16_t receiveDirect();
323 
324  // configuration methods
325 
331  virtual int16_t setFrequency(float freq);
332 
338  virtual int16_t setBitRate(float br);
339 
346  virtual int16_t setFrequencyDeviation(float freqDev);
347 
353  virtual int16_t setDataShaping(uint8_t sh);
354 
360  virtual int16_t setEncoding(uint8_t encoding);
361 
367  virtual int16_t invertIQ(bool enable);
368 
374  virtual int16_t setOutputPower(int8_t power);
375 
382  virtual int16_t checkOutputPower(int8_t power, int8_t* clipped);
383 
390  virtual int16_t setSyncWord(uint8_t* sync, size_t len);
391 
397  virtual int16_t setPreambleLength(size_t len);
398 
404  virtual int16_t setDataRate(DataRate_t dr);
405 
411  virtual int16_t checkDataRate(DataRate_t dr);
412 
417  float getFreqStep() const;
418 
424  virtual size_t getPacketLength(bool update = true);
425 
430  virtual float getRSSI();
431 
436  virtual float getSNR();
437 
443  virtual RadioLibTime_t getTimeOnAir(size_t len);
444 
452 
458  uint32_t getIrqMapped(RadioLibIrqFlags_t irq);
459 
465  int16_t checkIrq(RadioLibIrqType_t irq);
466 
474  int16_t setIrq(RadioLibIrqFlags_t irq);
475 
483  int16_t clearIrq(RadioLibIrqFlags_t irq);
484 
490  virtual uint32_t getIrqFlags();
491 
498  virtual int16_t setIrqFlags(uint32_t irq);
499 
506  virtual int16_t clearIrqFlags(uint32_t irq);
507 
513  virtual int16_t startChannelScan();
514 
521  virtual int16_t startChannelScan(const ChannelScanConfig_t &config);
522 
527  virtual int16_t getChannelScanResult();
528 
535  virtual int16_t scanChannel();
536 
544  virtual int16_t scanChannel(const ChannelScanConfig_t &config);
545 
551  int32_t random(int32_t max);
552 
559  int32_t random(int32_t min, int32_t max);
560 
565  virtual uint8_t randomByte();
566 
572  int16_t startDirect();
573 
574  #if !RADIOLIB_EXCLUDE_DIRECT_RECEIVE
581  int16_t setDirectSyncWord(uint32_t syncWord, uint8_t len);
582 
588  virtual void setDirectAction(void (*func)(void));
589 
594  virtual void readBit(uint32_t pin);
595 
600  int16_t available();
601 
605  void dropSync();
606 
613  uint8_t read(bool drop = true);
614  #endif
615 
622  virtual int16_t setDIOMapping(uint32_t pin, uint32_t value);
623 
628  virtual void setPacketReceivedAction(void (*func)(void));
629 
633  virtual void clearPacketReceivedAction();
634 
639  virtual void setPacketSentAction(void (*func)(void));
640 
644  virtual void clearPacketSentAction();
645 
650  virtual void setChannelScanAction(void (*func)(void));
651 
655  virtual void clearChannelScanAction();
656 
663  virtual int16_t setModem(ModemType_t modem);
664 
670  virtual int16_t getModem(ModemType_t* modem);
671 
672  #if RADIOLIB_INTERRUPT_TIMING
673 
679  void setInterruptSetup(void (*func)(uint32_t));
680 
685  void setTimerFlag();
686 
687  #endif
688 
689 #if !RADIOLIB_GODMODE
690  protected:
691 #endif
692  uint32_t irqMap[10] = { 0 };
693 
694 #if !RADIOLIB_EXCLUDE_DIRECT_RECEIVE
695  void updateDirectBuffer(uint8_t bit);
696 #endif
697 
698 #if !RADIOLIB_GODMODE
699  private:
700 #endif
701  float freqStep;
702  size_t maxPacketLength;
703 
704  #if !RADIOLIB_EXCLUDE_DIRECT_RECEIVE
705  uint8_t bufferBitPos = 0;
706  uint8_t bufferWritePos = 0;
707  uint8_t bufferReadPos = 0;
708  uint8_t buffer[RADIOLIB_STATIC_ARRAY_SIZE] = { 0 };
709  uint32_t syncBuffer = 0;
710  uint32_t directSyncWord = 0;
711  uint8_t directSyncWordLen = 0;
712  uint32_t directSyncWordMask = 0;
713  bool gotSync = false;
714  #endif
715 
716  virtual Module* getMod() = 0;
717 
718  // allow specific classes access the private getMod method
719  friend class AFSKClient;
720  friend class RTTYClient;
721  friend class MorseClient;
722  friend class HellClient;
723  friend class SSTVClient;
724  friend class AX25Client;
725  friend class FSK4Client;
726  friend class PagerClient;
727  friend class BellClient;
728  friend class FT8Client;
729  friend class LoRaWANNode;
730  friend class M17Client;
731 };
732 
733 #endif
Client for audio-based transmissions. Requires Arduino tone() function, and a module capable of direc...
Definition: AFSK.h:16
Client for AX25 communication.
Definition: AX25.h:233
Client for Bell modem communication. The public interface is the same as Arduino Serial.
Definition: BellModem.h:54
Client for FSK-4 communication. The public interface is the same as Arduino Serial.
Definition: FSK4.h:15
Client for Hellschreiber transmissions.
Definition: Hellschreiber.h:90
LoRaWAN-compatible node (class A device).
Definition: LoRaWAN.h:522
Implements all common low-level methods to control the wireless module. Every module class contains o...
Definition: Module.h:73
Client for Morse Code communication. The public interface is the same as Arduino Serial.
Definition: Morse.h:93
Client for Pager communication.
Definition: Pager.h:62
Provides common interface for protocols that run on LoRa/FSK modules, such as RTTY or LoRaWAN....
Definition: PhysicalLayer.h:151
virtual int16_t invertIQ(bool enable)
Set IQ inversion. Must be implemented in module class if the module supports it.
Definition: PhysicalLayer.cpp:246
virtual void clearChannelScanAction()
Clears interrupt service routine to call when a channel scan is finished.
Definition: PhysicalLayer.cpp:526
virtual int16_t checkOutputPower(int8_t power, int8_t *clipped)
Check if output power is configurable. Must be implemented in module class if the module supports it.
Definition: PhysicalLayer.cpp:256
virtual int16_t startReceive()
Sets module to received mode using its default configuration.
Definition: PhysicalLayer.cpp:130
virtual uint8_t randomByte()
Get one truly random byte from RSSI noise. Must be implemented in module class.
Definition: PhysicalLayer.cpp:401
virtual int16_t finishTransmit()
Clean up after transmission is done.
Definition: PhysicalLayer.cpp:159
int16_t checkIrq(RadioLibIrqType_t irq)
Check whether a specific IRQ bit is set (e.g. RxTimeout, CadDone).
Definition: PhysicalLayer.cpp:322
virtual int16_t setFrequencyDeviation(float freqDev)
Sets FSK frequency deviation from carrier frequency. Only available in FSK mode. Must be implemented ...
Definition: PhysicalLayer.cpp:231
virtual size_t getPacketLength(bool update=true)
Query modem for the packet length of received payload. Must be implemented in module class.
Definition: PhysicalLayer.cpp:287
virtual void setPacketSentAction(void(*func)(void))
Sets interrupt service routine to call when a packet is sent.
Definition: PhysicalLayer.cpp:514
virtual int16_t setDIOMapping(uint32_t pin, uint32_t value)
Configure DIO pin mapping to get a given signal on a DIO pin (if available).
Definition: PhysicalLayer.cpp:500
virtual int16_t readData(uint8_t *data, size_t len)
Reads data that was received after calling startReceive method.
Definition: PhysicalLayer.cpp:206
void dropSync()
Forcefully drop synchronization.
Definition: PhysicalLayer.cpp:424
int16_t transmit(const char *str, uint8_t addr=0)
C-string transmit method.
Definition: PhysicalLayer.cpp:53
uint8_t read(bool drop=true)
Get data from direct mode buffer.
Definition: PhysicalLayer.cpp:431
virtual RadioLibTime_t getTimeOnAir(size_t len)
Get expected time-on-air for a given size of payload.
Definition: PhysicalLayer.cpp:300
virtual int16_t checkDataRate(DataRate_t dr)
Check the data rate can be configured by this module. Must be implemented in module class if the modu...
Definition: PhysicalLayer.cpp:278
virtual int16_t getChannelScanResult()
Read the channel scan result.
Definition: PhysicalLayer.cpp:361
virtual void clearPacketSentAction()
Clears interrupt service routine to call when a packet is sent.
Definition: PhysicalLayer.cpp:518
virtual int16_t setSyncWord(uint8_t *sync, size_t len)
Set sync word. Must be implemented in module class if the module supports it.
Definition: PhysicalLayer.cpp:262
virtual int16_t setDataRate(DataRate_t dr)
Set data. Must be implemented in module class if the module supports it.
Definition: PhysicalLayer.cpp:273
virtual int16_t setModem(ModemType_t modem)
Set modem for the radio to use. Will perform full reset and reconfigure the radio using its default p...
Definition: PhysicalLayer.cpp:530
virtual void clearPacketReceivedAction()
Clears interrupt service routine to call when a packet is received.
Definition: PhysicalLayer.cpp:510
virtual RadioLibTime_t calculateRxTimeout(RadioLibTime_t timeoutUs)
Calculate the timeout value for this specific module / series (in number of symbols or units of time)...
Definition: PhysicalLayer.cpp:305
int16_t setIrq(RadioLibIrqFlags_t irq)
Set interrupt on specific IRQ bit(s) (e.g. RxTimeout, CadDone). Keep in mind that not all radio modul...
Definition: PhysicalLayer.cpp:330
virtual int16_t setPreambleLength(size_t len)
Set preamble length. Must be implemented in module class if the module supports it.
Definition: PhysicalLayer.cpp:268
int16_t startDirect()
Configure module parameters for direct modes. Must be called prior to "ham" modes like RTTY or AX....
Definition: PhysicalLayer.cpp:405
virtual int16_t setFrequency(float freq)
Sets carrier frequency. Must be implemented in module class.
Definition: PhysicalLayer.cpp:221
int16_t setDirectSyncWord(uint32_t syncWord, uint8_t len)
Set sync word to be used to determine start of packet in direct reception mode.
Definition: PhysicalLayer.cpp:439
int16_t startTransmit(const char *str, uint8_t addr=0)
Interrupt-driven Arduino String transmit method. Unlike the standard transmit method,...
Definition: PhysicalLayer.cpp:148
float getFreqStep() const
Gets the module frequency step size that was set in constructor.
Definition: PhysicalLayer.cpp:283
virtual int16_t transmitDirect(uint32_t frf=0)
Enables direct transmission mode on pins DIO1 (clock) and DIO2 (data). Must be implemented in module ...
Definition: PhysicalLayer.cpp:212
virtual float getRSSI()
Gets RSSI (Recorded Signal Strength Indicator) of the last received packet.
Definition: PhysicalLayer.cpp:292
int16_t available()
Get the number of direct mode bytes currently available in buffer.
Definition: PhysicalLayer.cpp:420
virtual int16_t receive(uint8_t *data, size_t len)
Binary receive method. Must be implemented in module class.
Definition: PhysicalLayer.cpp:111
virtual int16_t scanChannel()
Check whether the current communication channel is free or occupied. Performs CAD for LoRa modules,...
Definition: PhysicalLayer.cpp:365
virtual void setDirectAction(void(*func)(void))
Set interrupt service routine function to call when data bit is received in direct mode....
Definition: PhysicalLayer.cpp:490
virtual int16_t clearIrqFlags(uint32_t irq)
Clear interrupt on a specific IRQ bit (e.g. RxTimeout, CadDone). Must be implemented in module class.
Definition: PhysicalLayer.cpp:347
virtual int16_t setEncoding(uint8_t encoding)
Sets FSK data encoding. Only available in FSK mode. Must be implemented in module class.
Definition: PhysicalLayer.cpp:241
virtual int16_t standby()
Sets module to standby.
Definition: PhysicalLayer.cpp:121
int32_t random(int32_t max)
Get truly random number in range 0 - max.
Definition: PhysicalLayer.cpp:374
virtual void readBit(uint32_t pin)
Function to read and process data bit in direct reception mode. Must be implemented in module class.
Definition: PhysicalLayer.cpp:494
virtual int16_t setOutputPower(int8_t power)
Set output power. Must be implemented in module class if the module supports it.
Definition: PhysicalLayer.cpp:251
virtual int16_t receiveDirect()
Enables direct reception mode on pins DIO1 (clock) and DIO2 (data). Must be implemented in module cla...
Definition: PhysicalLayer.cpp:217
PhysicalLayer(float step, size_t maxLen)
Default constructor.
Definition: PhysicalLayer.cpp:5
virtual void setChannelScanAction(void(*func)(void))
Sets interrupt service routine to call when a channel scan is finished.
Definition: PhysicalLayer.cpp:522
virtual int16_t startChannelScan()
Interrupt-driven channel activity detection method. Interrupt will be activated when packet is detect...
Definition: PhysicalLayer.cpp:352
uint32_t getIrqMapped(RadioLibIrqFlags_t irq)
Convert from radio-agnostic IRQ flags to radio-specific flags.
Definition: PhysicalLayer.cpp:310
virtual int16_t setDataShaping(uint8_t sh)
Sets GFSK data shaping. Only available in FSK mode. Must be implemented in module class.
Definition: PhysicalLayer.cpp:236
virtual void setPacketReceivedAction(void(*func)(void))
Sets interrupt service routine to call when a packet is received.
Definition: PhysicalLayer.cpp:506
virtual int16_t setBitRate(float br)
Sets FSK bit rate. Only available in FSK mode. Must be implemented in module class.
Definition: PhysicalLayer.cpp:226
virtual float getSNR()
Gets SNR (Signal to Noise Ratio) of the last received packet. Only available for LoRa modem.
Definition: PhysicalLayer.cpp:296
virtual int16_t getModem(ModemType_t *modem)
Get modem currently in use by the radio.
Definition: PhysicalLayer.cpp:535
virtual int16_t sleep()
Sets module to sleep.
Definition: PhysicalLayer.cpp:117
virtual uint32_t getIrqFlags()
Read currently active IRQ flags. Must be implemented in module class.
Definition: PhysicalLayer.cpp:338
virtual int16_t setIrqFlags(uint32_t irq)
Set interrupt on DIO1 to be sent on a specific IRQ bit (e.g. RxTimeout, CadDone). Must be implemented...
Definition: PhysicalLayer.cpp:342
int16_t clearIrq(RadioLibIrqFlags_t irq)
Clear interrupt on a specific IRQ bit (e.g. RxTimeout, CadDone). Keep in mind that not all radio modu...
Definition: PhysicalLayer.cpp:334
Client for RTTY communication. The public interface is the same as Arduino Serial.
Definition: RTTY.h:17
Client for SSTV transmissions.
Definition: SSTV.h:121
unsigned long RadioLibTime_t
Type used for durations in RadioLib.
Definition: TypeDef.h:642
uint32_t RadioLibIrqFlags_t
Type used for radio-agnostic IRQ flags. IRQ to enable corresponds to the bit index (RadioLibIrq_t)....
Definition: TypeDef.h:648
Channel scan configuration interpretation in case LoRa CAD is used.
Definition: PhysicalLayer.h:89
RadioLibTime_t timeout
Timeout in microseconds.
Definition: PhysicalLayer.h:103
uint8_t detPeak
Number of peak detection symbols.
Definition: PhysicalLayer.h:94
uint8_t symNum
Number of symbols to consider signal present.
Definition: PhysicalLayer.h:91
uint8_t exitMode
Exit mode after signal detection is complete - module-specific value.
Definition: PhysicalLayer.h:100
RadioLibIrqFlags_t irqFlags
Optional IRQ flags to set, bits offset by the value of RADIOLIB_IRQ_.
Definition: PhysicalLayer.h:106
RadioLibIrqFlags_t irqMask
Optional IRQ mask to set, bits offset by the value of RADIOLIB_IRQ_.
Definition: PhysicalLayer.h:109
uint8_t detMin
Number of minimum detection symbols.
Definition: PhysicalLayer.h:97
Data rate structure interpretation in case FSK is used.
Definition: PhysicalLayer.h:47
float bitRate
FSK bit rate in kbps.
Definition: PhysicalLayer.h:49
float freqDev
FSK frequency deviation in kHz.
Definition: PhysicalLayer.h:52
Data rate structure interpretation in case LoRa is used.
Definition: PhysicalLayer.h:32
uint8_t spreadingFactor
LoRa spreading factor.
Definition: PhysicalLayer.h:34
float bandwidth
LoRa bandwidth in kHz.
Definition: PhysicalLayer.h:37
uint8_t codingRate
LoRa coding rate.
Definition: PhysicalLayer.h:40
Data rate structure interpretation in case LR-FHSS is used.
Definition: PhysicalLayer.h:59
bool narrowGrid
Grid spacing.
Definition: PhysicalLayer.h:67
uint8_t cr
Coding rate.
Definition: PhysicalLayer.h:64
uint8_t bw
Bandwidth.
Definition: PhysicalLayer.h:61
Channel scan configuration interpretation in case RSSI threshold is used.
Definition: PhysicalLayer.h:116
float limit
RSSI limit in dBm.
Definition: PhysicalLayer.h:118
Common channel scan configuration structure.
Definition: PhysicalLayer.h:125
RSSIScanConfig_t rssi
Interpretation for modems that use RSSI threshold.
Definition: PhysicalLayer.h:130
CADScanConfig_t cad
Interpretation for modems that use CAD (usually LoRa modems)
Definition: PhysicalLayer.h:127
Common data rate structure.
Definition: PhysicalLayer.h:74
LrFhssRate_t lrFhss
Interpretation for LR-FHSS modems.
Definition: PhysicalLayer.h:82
LoRaRate_t lora
Interpretation for LoRa modems.
Definition: PhysicalLayer.h:76
FSKRate_t fsk
Interpretation for FSK modems.
Definition: PhysicalLayer.h:79