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 // data rate structure interpretation in case LoRa is used
8 struct LoRaRate_t {
9  uint8_t spreadingFactor;
10  float bandwidth;
11  uint8_t codingRate;
12 };
13 
14 // data rate structure interpretation in case FSK is used
15 struct FSKRate_t {
16  float bitRate;
17  float freqDev;
18 };
19 
20 // common data rate
21 union DataRate_t {
22  LoRaRate_t lora;
23  FSKRate_t fsk;
24 };
25 
35  public:
36 
37  // constructor
38 
44  PhysicalLayer(float step, size_t maxLen);
45 
46  // basic methods
47 
48  #if defined(RADIOLIB_BUILD_ARDUINO)
55  int16_t transmit(__FlashStringHelper* fstr, uint8_t addr = 0);
56 
63  int16_t transmit(String& str, uint8_t addr = 0);
64  #endif
65 
72  int16_t transmit(const char* str, uint8_t addr = 0);
73 
81  virtual int16_t transmit(uint8_t* data, size_t len, uint8_t addr = 0);
82 
83  #if defined(RADIOLIB_BUILD_ARDUINO)
90  int16_t receive(String& str, size_t len = 0);
91  #endif
92 
97  virtual int16_t sleep();
98 
103  virtual int16_t standby();
104 
109  virtual int16_t standby(uint8_t mode);
110 
115  virtual int16_t startReceive();
116 
127  virtual int16_t startReceive(uint32_t timeout, uint16_t irqFlags, uint16_t irqMask, size_t len);
128 
135  virtual int16_t receive(uint8_t* data, size_t len);
136 
137  #if defined(RADIOLIB_BUILD_ARDUINO)
145  int16_t startTransmit(String& str, uint8_t addr = 0);
146  #endif
147 
155  int16_t startTransmit(const char* str, uint8_t addr = 0);
156 
164  virtual int16_t startTransmit(uint8_t* data, size_t len, uint8_t addr = 0);
165 
170  virtual int16_t finishTransmit();
171 
172  #if defined(RADIOLIB_BUILD_ARDUINO)
180  int16_t readData(String& str, size_t len = 0);
181  #endif
182 
190  virtual int16_t readData(uint8_t* data, size_t len);
191 
198  virtual int16_t transmitDirect(uint32_t frf = 0);
199 
205  virtual int16_t receiveDirect();
206 
207  // configuration methods
208 
214  virtual int16_t setFrequency(float freq);
215 
221  virtual int16_t setBitRate(float br);
222 
229  virtual int16_t setFrequencyDeviation(float freqDev);
230 
236  virtual int16_t setDataShaping(uint8_t sh);
237 
243  virtual int16_t setEncoding(uint8_t encoding);
244 
250  virtual int16_t invertIQ(bool enable);
251 
257  virtual int16_t setOutputPower(int8_t power);
258 
265  virtual int16_t setSyncWord(uint8_t* sync, size_t len);
266 
272  virtual int16_t setPreambleLength(size_t len);
273 
279  virtual int16_t setDataRate(DataRate_t dr);
280 
286  virtual int16_t checkDataRate(DataRate_t dr);
287 
292  float getFreqStep() const;
293 
299  virtual size_t getPacketLength(bool update = true);
300 
305  virtual float getRSSI();
306 
311  virtual float getSNR();
312 
318  virtual uint32_t getTimeOnAir(size_t len);
319 
325  virtual uint32_t calculateRxTimeout(uint32_t timeoutUs);
326 
333  virtual int16_t irqRxDoneRxTimeout(uint16_t &irqFlags, uint16_t &irqMask);
334 
339  virtual bool isRxTimeout();
340 
346  virtual int16_t startChannelScan();
347 
352  virtual int16_t getChannelScanResult();
353 
360  virtual int16_t scanChannel();
361 
367  int32_t random(int32_t max);
368 
375  int32_t random(int32_t min, int32_t max);
376 
381  virtual uint8_t randomByte();
382 
388  int16_t startDirect();
389 
390  #if !RADIOLIB_EXCLUDE_DIRECT_RECEIVE
397  int16_t setDirectSyncWord(uint32_t syncWord, uint8_t len);
398 
404  virtual void setDirectAction(void (*func)(void));
405 
410  virtual void readBit(uint32_t pin);
411 
416  int16_t available();
417 
421  void dropSync();
422 
429  uint8_t read(bool drop = true);
430  #endif
431 
438  virtual int16_t setDIOMapping(uint32_t pin, uint32_t value);
439 
444  virtual void setPacketReceivedAction(void (*func)(void));
445 
449  virtual void clearPacketReceivedAction();
450 
455  virtual void setPacketSentAction(void (*func)(void));
456 
460  virtual void clearPacketSentAction();
461 
466  virtual void setChannelScanAction(void (*func)(void));
467 
471  virtual void clearChannelScanAction();
472 
473  #if RADIOLIB_INTERRUPT_TIMING
474 
480  void setInterruptSetup(void (*func)(uint32_t));
481 
486  void setTimerFlag();
487 
488  #endif
489 
490 #if !RADIOLIB_GODMODE
491  protected:
492 #endif
493 #if !RADIOLIB_EXCLUDE_DIRECT_RECEIVE
494  void updateDirectBuffer(uint8_t bit);
495 #endif
496 
497 #if !RADIOLIB_GODMODE
498  private:
499 #endif
500  float freqStep;
501  size_t maxPacketLength;
502 
503  #if !RADIOLIB_EXCLUDE_DIRECT_RECEIVE
504  uint8_t bufferBitPos;
505  uint8_t bufferWritePos;
506  uint8_t bufferReadPos;
507  uint8_t buffer[RADIOLIB_STATIC_ARRAY_SIZE];
508  uint32_t syncBuffer;
509  uint32_t directSyncWord;
510  uint8_t directSyncWordLen;
511  uint32_t directSyncWordMask;
512  bool gotSync;
513  #endif
514 
515  virtual Module* getMod() = 0;
516 
517  // allow specific classes access the private getMod method
518  friend class AFSKClient;
519  friend class RTTYClient;
520  friend class MorseClient;
521  friend class HellClient;
522  friend class SSTVClient;
523  friend class AX25Client;
524  friend class FSK4Client;
525  friend class PagerClient;
526  friend class BellClient;
527  friend class FT8Client;
528  friend class LoRaWANNode;
529 };
530 
531 #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:238
Client for Bell modem communication. The public interface is the same as Arduino Serial.
Definition: BellModem.h:57
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:454
Implements all common low-level methods to control the wireless module. Every module class contains o...
Definition: Module.h:31
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:34
virtual int16_t invertIQ(bool enable)
Set IQ inversion. Must be implemented in module class if the module supports it.
Definition: PhysicalLayer.cpp:249
virtual void clearChannelScanAction()
Clears interrupt service routine to call when a channel scan is finished.
Definition: PhysicalLayer.cpp:481
virtual int16_t startReceive()
Sets module to received mode using its default configuration.
Definition: PhysicalLayer.cpp:131
virtual uint8_t randomByte()
Get one truly random byte from RSSI noise. Must be implemented in module class.
Definition: PhysicalLayer.cpp:356
virtual int16_t irqRxDoneRxTimeout(uint16_t &irqFlags, uint16_t &irqMask)
Create the flags that make up RxDone and RxTimeout used for receiving downlinks.
Definition: PhysicalLayer.cpp:307
virtual int16_t finishTransmit()
Clean up after transmission is done.
Definition: PhysicalLayer.cpp:160
virtual int16_t setFrequencyDeviation(float freqDev)
Sets FSK frequency deviation from carrier frequency. Only available in FSK mode. Must be implemented ...
Definition: PhysicalLayer.cpp:234
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:284
virtual void setPacketSentAction(void(*func)(void))
Sets interrupt service routine to call when a packet is sent.
Definition: PhysicalLayer.cpp:469
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:455
virtual int16_t readData(uint8_t *data, size_t len)
Reads data that was received after calling startReceive method.
Definition: PhysicalLayer.cpp:209
void dropSync()
Forcefully drop synchronization.
Definition: PhysicalLayer.cpp:379
int16_t transmit(const char *str, uint8_t addr=0)
C-string transmit method.
Definition: PhysicalLayer.cpp:52
uint8_t read(bool drop=true)
Get data from direct mode buffer.
Definition: PhysicalLayer.cpp:386
virtual uint32_t calculateRxTimeout(uint32_t timeoutUs)
Calculate the timeout value for this specific module / series (in number of symbols or units of time)
Definition: PhysicalLayer.cpp:302
virtual uint32_t getTimeOnAir(size_t len)
Get expected time-on-air for a given size of payload.
Definition: PhysicalLayer.cpp:297
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:275
virtual int16_t getChannelScanResult()
Read the channel scan result.
Definition: PhysicalLayer.cpp:321
virtual void clearPacketSentAction()
Clears interrupt service routine to call when a packet is sent.
Definition: PhysicalLayer.cpp:473
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:259
virtual int16_t setDataRate(DataRate_t dr)
Set data. Must be implemented in module class if the module supports it.
Definition: PhysicalLayer.cpp:270
virtual void clearPacketReceivedAction()
Clears interrupt service routine to call when a packet is received.
Definition: PhysicalLayer.cpp:465
virtual int16_t setPreambleLength(size_t len)
Set preamble length. Must be implemented in module class if the module supports it.
Definition: PhysicalLayer.cpp:265
int16_t startDirect()
Configure module parameters for direct modes. Must be called prior to "ham" modes like RTTY or AX....
Definition: PhysicalLayer.cpp:360
virtual int16_t setFrequency(float freq)
Sets carrier frequency. Must be implemented in module class.
Definition: PhysicalLayer.cpp:224
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:394
int16_t startTransmit(const char *str, uint8_t addr=0)
Interrupt-driven Arduino String transmit method. Unlike the standard transmit method,...
Definition: PhysicalLayer.cpp:149
float getFreqStep() const
Gets the module frequency step size that was set in constructor.
Definition: PhysicalLayer.cpp:280
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:215
virtual float getRSSI()
Gets RSSI (Recorded Signal Strength Indicator) of the last received packet.
Definition: PhysicalLayer.cpp:289
int16_t available()
Get the number of direct mode bytes currently available in buffer.
Definition: PhysicalLayer.cpp:375
virtual int16_t receive(uint8_t *data, size_t len)
Binary receive method. Must be implemented in module class.
Definition: PhysicalLayer.cpp:112
virtual int16_t scanChannel()
Check whether the current communication channel is free or occupied. Performs CAD for LoRa modules,...
Definition: PhysicalLayer.cpp:325
virtual void setDirectAction(void(*func)(void))
Set interrupt service routine function to call when data bit is received in direct mode....
Definition: PhysicalLayer.cpp:445
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:244
virtual bool isRxTimeout()
Check whether the IRQ bit for RxTimeout is set.
Definition: PhysicalLayer.cpp:313
virtual int16_t standby()
Sets module to standby.
Definition: PhysicalLayer.cpp:122
int32_t random(int32_t max)
Get truly random number in range 0 - max.
Definition: PhysicalLayer.cpp:329
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:449
virtual int16_t setOutputPower(int8_t power)
Set output power. Must be implemented in module class if the module supports it.
Definition: PhysicalLayer.cpp:254
virtual int16_t receiveDirect()
Enables direct reception mode on pins DIO1 (clock) and DIO2 (data). Must be implemented in module cla...
Definition: PhysicalLayer.cpp:220
PhysicalLayer(float step, size_t maxLen)
Default constructor.
Definition: PhysicalLayer.cpp:4
virtual void setChannelScanAction(void(*func)(void))
Sets interrupt service routine to call when a channel scan is finished.
Definition: PhysicalLayer.cpp:477
virtual int16_t startChannelScan()
Interrupt-driven channel activity detection method. interrupt will be activated when packet is detect...
Definition: PhysicalLayer.cpp:317
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:239
virtual void setPacketReceivedAction(void(*func)(void))
Sets interrupt service routine to call when a packet is received.
Definition: PhysicalLayer.cpp:461
virtual int16_t setBitRate(float br)
Sets FSK bit rate. Only available in FSK mode. Must be implemented in module class.
Definition: PhysicalLayer.cpp:229
virtual float getSNR()
Gets SNR (Signal to Noise Ratio) of the last received packet. Only available for LoRa modem.
Definition: PhysicalLayer.cpp:293
virtual int16_t sleep()
Sets module to sleep.
Definition: PhysicalLayer.cpp:118
Client for RTTY communication. The public interface is the same as Arduino Serial.
Definition: RTTY.h:17
Client for SSTV transmissions.
Definition: SSTV.h:117
Definition: PhysicalLayer.h:15
Definition: PhysicalLayer.h:8
Definition: PhysicalLayer.h:21