RadioLib Universal wireless communication library for Arduino

BuildOpt.h
1 #if !defined(_RADIOLIB_BUILD_OPTIONS_H)
2 #define _RADIOLIB_BUILD_OPTIONS_H
3
4 #if ARDUINO >= 100
5 // Arduino build
6 #include "Arduino.h"
7 #define RADIOLIB_BUILD_ARDUINO
8 #else
9 // generic build
10 #include <stdio.h>
11 #define RADIOLIB_BUILD_GENERIC
12 #endif
13
14 #if defined(RADIOLIB_BUILD_ARDUINO)
15 /*
16 * Platform-specific configuration.
17 *
18 * RADIOLIB_PLATFORM - platform name, used in debugging to quickly check the correct platform is detected.
19 * RADIOLIB_NC - alias for unused pin, usually the largest possible value of uint8_t.
20 * RADIOLIB_DEFAULT_SPI - default SPIClass instance to use.
21 * RADIOLIB_NONVOLATILE - macro to place variable into program storage (usually Flash).
22 * RADIOLIB_NONVOLATILE_READ_BYTE - function/macro to read variables saved in program storage (usually Flash).
23 * RADIOLIB_TYPE_ALIAS - construct to create an alias for a type, usually vai the `using` keyword.
24 * RADIOLIB_TONE_UNSUPPORTED - some platforms do not have tone()/noTone(), which is required for AFSK.
25 * RADIOLIB_BUILTIN_MODULE - some platforms have a builtin radio module on fixed pins, this macro is used to specify that pinout.
26 *
27 * In addition, some platforms may require RadioLib to disable specific drivers (such as ESP8266).
28 *
29 * Users may also specify their own configuration by uncommenting the RADIOLIB_CUSTOM_ARDUINO,
30 * and then specifying all platform parameters in the section below. This will override automatic
31 * platform detection.
32 */
33
34 // uncomment to enable custom platform definition
35 //#define RADIOLIB_CUSTOM_ARDUINO
36
37 #if defined(RADIOLIB_CUSTOM_ARDUINO)
38 // name for your platform
39 #define RADIOLIB_PLATFORM "Custom"
40
41 // the following must be defined if the Arduino core does not support tone or yield function
42 //#define RADIOLIB_TONE_UNSUPPORTED
43 //#define RADIOLIB_YIELD_UNSUPPORTED
44
45 // in addition, the following macros may be defined if the Arduino core differs from the defaults
46 #define RADIOLIB_NC (0xFFFFFFFF)
47 #define RADIOLIB_DEFAULT_SPI SPI
48 #define RADIOLIB_DEFAULT_SPI_SETTINGS SPISettings(2000000, MSBFIRST, SPI_MODE0)
49 #define RADIOLIB_NONVOLATILE PROGMEM
50 #define RADIOLIB_NONVOLATILE_READ_BYTE(addr) pgm_read_byte(addr)
51 #define RADIOLIB_NONVOLATILE_READ_DWORD(addr) pgm_read_dword(addr)
52 #define RADIOLIB_TYPE_ALIAS(type, alias) using alias = type;
53
54 // you might also have to define these if the Arduino core has some uncommon pin mode/status types
55 #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST
56 #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST
57 #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST
58
59 // some of RadioLib drivers may be excluded, to prevent collisions with platforms (or to speed up build process)
60 // the following is a complete list of all possible exclusion macros, uncomment any of them to disable that driver
61 // NOTE: Some of the exclusion macros are dependent on each other. For example, it is not possible to exclude RF69
62 // while keeping SX1231 (because RF69 is the base class for SX1231). The dependency is always uni-directional,
63 // so excluding SX1231 and keeping RF69 is valid.
64 //#define RADIOLIB_EXCLUDE_CC1101
65 //#define RADIOLIB_EXCLUDE_NRF24
66 //#define RADIOLIB_EXCLUDE_RF69
67 //#define RADIOLIB_EXCLUDE_SX1231 // dependent on RADIOLIB_EXCLUDE_RF69
68 //#define RADIOLIB_EXCLUDE_SI443X
69 //#define RADIOLIB_EXCLUDE_RFM2X // dependent on RADIOLIB_EXCLUDE_SI443X
70 //#define RADIOLIB_EXCLUDE_SX127X
71 //#define RADIOLIB_EXCLUDE_RFM9X // dependent on RADIOLIB_EXCLUDE_SX127X
72 //#define RADIOLIB_EXCLUDE_SX126X
73 //#define RADIOLIB_EXCLUDE_STM32WLX // dependent on RADIOLIB_EXCLUDE_SX126X
74 //#define RADIOLIB_EXCLUDE_SX128X
75 //#define RADIOLIB_EXCLUDE_AFSK
76 //#define RADIOLIB_EXCLUDE_AX25
77 //#define RADIOLIB_EXCLUDE_HELLSCHREIBER
78 //#define RADIOLIB_EXCLUDE_MORSE
79 //#define RADIOLIB_EXCLUDE_RTTY
80 //#define RADIOLIB_EXCLUDE_SSTV
81 //#define RADIOLIB_EXCLUDE_DIRECT_RECEIVE
82
83 #elif defined(__AVR__) && !(defined(ARDUINO_AVR_UNO_WIFI_REV2) || defined(ARDUINO_AVR_NANO_EVERY) || defined(ARDUINO_ARCH_MEGAAVR))
84 // Arduino AVR boards (except for megaAVR) - Uno, Mega etc.
85 #define RADIOLIB_PLATFORM "Arduino AVR"
86
87 #elif defined(ESP8266)
88 // ESP8266 boards
89 #define RADIOLIB_PLATFORM "ESP8266"
90
91 #elif defined(ESP32)
92 // ESP32 boards
93 #define RADIOLIB_PLATFORM "ESP32"
94
95 // ESP32 doesn't support tone(), but it can be emulated via LED control peripheral
96 #define RADIOLIB_TONE_UNSUPPORTED
97 #define RADIOLIB_TONE_ESP32_CHANNEL (1)
98
99 #elif defined(ARDUINO_ARCH_STM32)
100 // official STM32 Arduino core (https://github.com/stm32duino/Arduino_Core_STM32)
101 #define RADIOLIB_PLATFORM "Arduino STM32 (official)"
102
103 #elif defined(SAMD_SERIES)
104 // Adafruit SAMD boards (M0 and M4)
105 #define RADIOLIB_PLATFORM "Adafruit SAMD"
106
107 #elif defined(ARDUINO_ARCH_SAMD)
108 // Arduino SAMD (Zero, MKR, etc.)
109 #define RADIOLIB_PLATFORM "Arduino SAMD"
110 #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (PinMode)
111 #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST (PinStatus)
112 #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (PinStatus)
113
114 #elif defined(__SAM3X8E__)
115 // Arduino Due
116 #define RADIOLIB_PLATFORM "Arduino Due"
117 #define RADIOLIB_TONE_UNSUPPORTED
118
119 #elif (defined(NRF52832_XXAA) || defined(NRF52840_XXAA)) && !defined(ARDUINO_ARDUINO_NANO33BLE)
120 // Adafruit nRF52 boards
121 #define RADIOLIB_PLATFORM "Adafruit nRF52"
122
123 #elif defined(ARDUINO_ARC32_TOOLS)
124 // Intel Curie
125 #define RADIOLIB_PLATFORM "Intel Curie"
126
127 #elif defined(ARDUINO_AVR_UNO_WIFI_REV2) || defined(ARDUINO_AVR_NANO_EVERY) || defined(PORTDUINO)
128 // Arduino megaAVR boards - Uno Wifi Rev.2, Nano Every
129 #define RADIOLIB_PLATFORM "Arduino megaAVR"
130
131 #elif defined(ARDUINO_ARCH_APOLLO3)
132 // Sparkfun Apollo3 boards
133 #define RADIOLIB_PLATFORM "Sparkfun Apollo3"
134 #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (Arduino_PinMode)
135 #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST (PinStatus)
136 #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (PinStatus)
137
138 #elif defined(ARDUINO_ARDUINO_NANO33BLE)
139 // Arduino Nano 33 BLE
140 #define RADIOLIB_PLATFORM "Arduino Nano 33 BLE"
141 #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (PinMode)
142 #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST (PinStatus)
143 #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (PinStatus)
144
145 // Arduino mbed OS boards have a really bad tone implementation which will crash after a couple seconds
146 #define RADIOLIB_TONE_UNSUPPORTED
147 #define RADIOLIB_MBED_TONE_OVERRIDE
148
149 #elif defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_PORTENTA_H7_M4)
150 // Arduino Portenta H7
151 #define RADIOLIB_PLATFORM "Portenta H7"
152 #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (PinMode)
153 #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST (PinStatus)
154 #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (PinStatus)
155
156 // Arduino mbed OS boards have a really bad tone implementation which will crash after a couple seconds
157 #define RADIOLIB_TONE_UNSUPPORTED
158 #define RADIOLIB_MBED_TONE_OVERRIDE
159
160 #elif defined(__STM32F4__) || defined(__STM32F1__)
161 // Arduino STM32 core by Roger Clark (https://github.com/rogerclarkmelbourne/Arduino_STM32)
162 #define RADIOLIB_PLATFORM "STM32duino (unofficial)"
163 #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (WiringPinMode)
164 #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (ExtIntTriggerMode)
165
166 #elif defined(ARDUINO_ARCH_MEGAAVR)
167 // MegaCoreX by MCUdude (https://github.com/MCUdude/MegaCoreX)
168 #define RADIOLIB_PLATFORM "MegaCoreX"
169
170 #elif defined(ARDUINO_ARCH_MBED_RP2040)
171 // Raspberry Pi Pico (official mbed core)
172 #define RADIOLIB_PLATFORM "Raspberry Pi Pico"
173 #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (PinMode)
174 #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST (PinStatus)
175 #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (PinStatus)
176
177 // Arduino mbed OS boards have a really bad tone implementation which will crash after a couple seconds
178 #define RADIOLIB_TONE_UNSUPPORTED
179 #define RADIOLIB_MBED_TONE_OVERRIDE
180
181 #elif defined(ARDUINO_ARCH_RP2040)
182 // Raspberry Pi Pico (unofficial core)
183 #define RADIOLIB_PLATFORM "Raspberry Pi Pico (unofficial)"
184 #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (PinMode)
185 #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST (PinStatus)
186 #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (PinStatus)
187
188 #elif defined(__ASR6501__) || defined(ARDUINO_ARCH_ASR650X) || defined(DARDUINO_ARCH_ASR6601)
189 // CubeCell
190 #define RADIOLIB_PLATFORM "CubeCell"
191 #define RADIOLIB_DEFAULT_SPI_SETTINGS SPISettings(1000000, MSBFIRST, SPI_MODE0) // see issue #709
192 #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST (PINMODE)
193 #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST (IrqModes)
194
195 // provide an easy access to the on-board module
196 #include "board-config.h"
197 #define RADIOLIB_BUILTIN_MODULE RADIO_NSS, RADIO_DIO_1, RADIO_RESET, RADIO_BUSY
198
199 // CubeCell doesn't seem to define nullptr, let's do something like that now
200 #define nullptr NULL
201
202 // ... and also defines pinMode() as a macro, which is by far the stupidest thing I have seen on Arduino
203 #undef pinMode
204
205 // ... and uses an outdated GCC which does not support type aliases
206 #define RADIOLIB_TYPE_ALIAS(type, alias) typedef class type alias;
207
208 // ... and it also has no tone(). This platform was designed by an idiot.
209 #define RADIOLIB_TONE_UNSUPPORTED
210
211 // ... AND as the (hopefully) final nail in the coffin, IT F*CKING DEFINES YIELD() AS A MACRO THAT DOES NOTHING!!!
212 #define RADIOLIB_YIELD_UNSUPPORTED
213 #if defined(yield)
214 #undef yield
215 #endif
216
217 #elif defined(RASPI)
218 // RaspiDuino framework (https://github.com/me-no-dev/RasPiArduino)
219 #define RADIOLIB_PLATFORM "RasPiArduino"
220
221 // let's start off easy - no tone on this platform, that can happen
222 #define RADIOLIB_TONE_UNSUPPORTED
223
224 // hmm, no yield either - weird on something like Raspberry PI, but sure, we can handle it
225 #define RADIOLIB_YIELD_UNSUPPORTED
226
227 // aight, getting to the juicy stuff - PGM_P seems missing, that's the first time
228 #define PGM_P const char *
229
230 // ... and for the grand finale, we have millis() and micros() DEFINED AS MACROS!
231 #if defined(millis)
232 #undef millis
233 inline unsigned long millis() { return((unsigned long)(STCV / 1000)); };
234 #endif
235
236 #if defined(micros)
237 #undef micros
238 inline unsigned long micros() { return((unsigned long)(STCV)); };
239 #endif
240
241 #elif defined(TEENSYDUINO)
242 // Teensy
243 #define RADIOLIB_PLATFORM "Teensy"
244
245 #else
246 // other Arduino platforms not covered by the above list - this may or may not work
247 #define RADIOLIB_PLATFORM "Unknown Arduino"
248 #define RADIOLIB_UNKNOWN_PLATFORM
249
250 #endif
251
252 // set the default values for all macros
253 // these will be applied if they were not defined above
254 #if !defined(RADIOLIB_NC)
255 #define RADIOLIB_NC (0xFFFFFFFF)
256 #endif
257
258 #if !defined(RADIOLIB_DEFAULT_SPI)
259 #define RADIOLIB_DEFAULT_SPI SPI
260 #endif
261
262 #if !defined(RADIOLIB_DEFAULT_SPI_SETTINGS)
263 #define RADIOLIB_DEFAULT_SPI_SETTINGS SPISettings(2000000, MSBFIRST, SPI_MODE0)
264 #endif
265
266 #if !defined(RADIOLIB_NONVOLATILE)
267 #define RADIOLIB_NONVOLATILE PROGMEM
268 #endif
269
270 #if !defined(RADIOLIB_NONVOLATILE_READ_BYTE)
271 #define RADIOLIB_NONVOLATILE_READ_BYTE(addr) pgm_read_byte(addr)
272 #endif
273
274 #if !defined(RADIOLIB_NONVOLATILE_READ_DWORD)
275 #define RADIOLIB_NONVOLATILE_READ_DWORD(addr) pgm_read_dword(addr)
276 #endif
277
278 #if !defined(RADIOLIB_TYPE_ALIAS)
279 #define RADIOLIB_TYPE_ALIAS(type, alias) using alias = type;
280 #endif
281
282 #if !defined(RADIOLIB_ARDUINOHAL_PIN_MODE_CAST)
283 #define RADIOLIB_ARDUINOHAL_PIN_MODE_CAST
284 #endif
285
286 #if !defined(RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST)
287 #define RADIOLIB_ARDUINOHAL_PIN_STATUS_CAST
288 #endif
289
290 #if !defined(RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST)
291 #define RADIOLIB_ARDUINOHAL_INTERRUPT_MODE_CAST
292 #endif
293
294 #else
295 // generic non-Arduino platform
296 #define RADIOLIB_PLATFORM "Generic"
297
298 #define RADIOLIB_NC (0xFF)
299 #define RADIOLIB_NONVOLATILE
300 #define RADIOLIB_NONVOLATILE_READ_BYTE(addr) (*((uint8_t *)(void *)(addr)))
301 #define RADIOLIB_NONVOLATILE_READ_DWORD(addr) (*((uint32_t *)(void *)(addr)))
302 #define RADIOLIB_TYPE_ALIAS(type, alias) using alias = type;
303
304 #if !defined(RADIOLIB_DEBUG_PORT)
305 #define RADIOLIB_DEBUG_PORT stdout
306 #endif
307
308 #define DEC 10
309 #define HEX 16
310 #define OCT 8
311 #define BIN 2
312
313 #include <algorithm>
314 #include <stdint.h>
315
316 using std::max;
317 using std::min;
318 #endif
319
320 /*
321 * Uncomment to enable debug output.
322 * Warning: Debug output will slow down the whole system significantly.
323 * Also, it will result in larger compiled binary.
324 * Levels: debug - only main info
325 * verbose - full transcript of all SPI communication
326 */
327 #if !defined(RADIOLIB_DEBUG)
328 //#define RADIOLIB_DEBUG
329 #endif
330 #if !defined(RADIOLIB_VERBOSE)
331 //#define RADIOLIB_VERBOSE
332 #endif
333
334 // set which output port should be used for debug output
335 // may be Serial port (on Arduino) or file like stdout or stderr (on generic platforms)
336 #if defined(RADIOLIB_BUILD_ARDUINO) && !defined(RADIOLIB_DEBUG_PORT)
337 #define RADIOLIB_DEBUG_PORT Serial
338 #endif
339
340 /*
341 * Uncomment to enable "paranoid" SPI mode
342 * Every write to an SPI register using SPI set function will be verified by a subsequent read operation.
343 * This improves reliablility, but slightly slows down communication.
344 * Note: Enabled by default.
345 */
346 #if !defined(RADIOLIB_SPI_PARANOID)
347 #define RADIOLIB_SPI_PARANOID
348 #endif
349
350 /*
351 * Uncomment to enable parameter range checking
352 * RadioLib will check provided parameters (such as frequency) against limits determined by the device manufacturer.
353 * It is highly advised to keep this macro defined, removing it will allow invalid values to be set,
354 * possibly leading to bricked module and/or program crashing.
355 * Note: Enabled by default.
356 */
357 #if !defined(RADIOLIB_CHECK_PARAMS)
358 #define RADIOLIB_CHECK_PARAMS
359 #endif
360
361 /*
362 * Uncomment to enable SX127x errata fix
363 * Warning: SX127x errata fix has been reported to cause issues with LoRa bandwidths lower than 62.5 kHz.
364 * It should only be enabled if you really are observing some errata-related issue.
365 * Note: Disabled by default.
366 */
367 #if !defined(RADIOLIB_FIX_ERRATA_SX127X)
368 //#define RADIOLIB_FIX_ERRATA_SX127X
369 #endif
370
371 /*
372 * Uncomment to enable god mode - all methods and member variables in all classes will be made public, thus making them accessible from Arduino code.
373 * Warning: Come on, it's called GOD mode - obviously only use this if you know what you're doing.
374 * Failure to heed the above warning may result in bricked module.
375 */
376 #if !defined(RADIOLIB_GODMODE)
377 //#define RADIOLIB_GODMODE
378 #endif
379
380 /*
381 * Uncomment to enable low-level hardware access
382 * This will make some hardware methods like SPI get/set accessible from the user sketch - think of it as "god mode lite"
383 * Warning: RadioLib won't stop you from writing invalid stuff into your device, so it's quite easy to brick your module with this.
384 */
385 #if !defined(RADIOLIB_LOW_LEVEL)
386 //#define RADIOLIB_LOW_LEVEL
387 #endif
388
389 /*
390 * Uncomment to enable pre-defined modules when using RadioShield.
391 */
392 #if !defined(RADIOLIB_RADIOSHIELD)
393 //#define RADIOLIB_RADIOSHIELD
394 #endif
395
396 /*
397 * Uncomment to enable interrupt-based timing control
398 * For details, see https://github.com/jgromes/RadioLib/wiki/Interrupt-Based-Timing
399 */
400 #if !defined(RADIOLIB_INTERRUPT_TIMING)
401 //#define RADIOLIB_INTERRUPT_TIMING
402 #endif
403
404 /*
405 * Uncomment to enable static-only memory management: no dynamic allocation will be performed.
406 * Warning: Large static arrays will be created in some methods. It is not advised to send large packets in this mode.
407 */
408 #if !defined(RADIOLIB_STATIC_ONLY)
409 //#define RADIOLIB_STATIC_ONLY
410 #endif
411
412 // set the size of static arrays to use
413 #if !defined(RADIOLIB_STATIC_ARRAY_SIZE)
414 #define RADIOLIB_STATIC_ARRAY_SIZE (256)
415 #endif
416
417 // This only compiles on STM32 boards with SUBGHZ module, but also
418 // include when generating docs
419 #if (!defined(ARDUINO_ARCH_STM32) || !defined(SUBGHZSPI_BASE)) && !defined(DOXYGEN)
420 #define RADIOLIB_EXCLUDE_STM32WLX
421 #endif
422
423 #if defined(RADIOLIB_DEBUG)
424 #if defined(RADIOLIB_BUILD_ARDUINO)
425 #define RADIOLIB_DEBUG_PRINT(...) Module::serialPrintf(__VA_ARGS__)
426 #define RADIOLIB_DEBUG_PRINTLN(M, ...) Module::serialPrintf(M "\n", ##__VA_ARGS__)
427 #else
428 #if !defined(RADIOLIB_DEBUG_PRINT)
429 #define RADIOLIB_DEBUG_PRINT(...) fprintf(RADIOLIB_DEBUG_PORT, __VA_ARGS__)
430 #endif
431 #if !defined(RADIOLIB_DEBUG_PRINTLN)
432 #define RADIOLIB_DEBUG_PRINTLN(M, ...) fprintf(RADIOLIB_DEBUG_PORT, M "\n", ##__VA_ARGS__)
433 #endif
434 #endif
435 #else
436 #define RADIOLIB_DEBUG_PRINT(...) {}
437 #define RADIOLIB_DEBUG_PRINTLN(...) {}
438 #endif
439
440 #if defined(RADIOLIB_VERBOSE)
441 #define RADIOLIB_VERBOSE_PRINT(...) RADIOLIB_DEBUG_PRINT(__VA_ARGS__)
442 #define RADIOLIB_VERBOSE_PRINTLN(...) RADIOLIB_DEBUG_PRINTLN(__VA_ARGS__)
443 #else
444 #define RADIOLIB_VERBOSE_PRINT(...) {}
445 #define RADIOLIB_VERBOSE_PRINTLN(...) {}
446 #endif
447
451 #define RADIOLIB_ASSERT(STATEVAR) { if((STATEVAR) != RADIOLIB_ERR_NONE) { return(STATEVAR); } }
452
453
457 #if defined(RADIOLIB_CHECK_PARAMS)
458 #define RADIOLIB_CHECK_RANGE(VAR, MIN, MAX, ERR) { if(!(((VAR) >= (MIN)) && ((VAR) <= (MAX)))) { return(ERR); } }
459 #else
460 #define RADIOLIB_CHECK_RANGE(VAR, MIN, MAX, ERR) {}
461 #endif
462
463 #if defined(RADIOLIB_FIX_ERRATA_SX127X)
464 #define RADIOLIB_ERRATA_SX127X(...) { errataFix(__VA_ARGS__); }
465 #else
466 #define RADIOLIB_ERRATA_SX127X(...) {}
467 #endif
468
469 // version definitions
470 #define RADIOLIB_VERSION_MAJOR (0x05)
471 #define RADIOLIB_VERSION_MINOR (0x07)
472 #define RADIOLIB_VERSION_PATCH (0x00)
473 #define RADIOLIB_VERSION_EXTRA (0x00)
474
475 #define RADIOLIB_VERSION ((RADIOLIB_VERSION_MAJOR << 24) | (RADIOLIB_VERSION_MINOR << 16) | (RADIOLIB_VERSION_PATCH << 8) | (RADIOLIB_VERSION_EXTRA))
476
477 #endif