1483#define RH_VERSION_MAJOR 1
1484#define RH_VERSION_MINOR 130
1487#define RH_PLATFORM_ARDUINO 1
1488#define RH_PLATFORM_MSP430 2
1489#define RH_PLATFORM_STM32 3
1490#define RH_PLATFORM_GENERIC_AVR8 4
1491#define RH_PLATFORM_UNO32 5
1492#define RH_PLATFORM_UNIX 6
1493#define RH_PLATFORM_STM32STD 7
1494#define RH_PLATFORM_STM32F4_HAL 8
1495#define RH_PLATFORM_RASPI 9
1496#define RH_PLATFORM_NRF51 10
1497#define RH_PLATFORM_ESP8266 11
1498#define RH_PLATFORM_STM32F2 12
1499#define RH_PLATFORM_CHIPKIT_CORE 13
1500#define RH_PLATFORM_ESP32 14
1501#define RH_PLATFORM_NRF52 15
1502#define RH_PLATFORM_MONGOOSE_OS 16
1503#define RH_PLATFORM_ATTINY 17
1505#define RH_PLATFORM_ATTINY_MEGA 18
1506#define RH_PLATFORM_STM32L0 19
1507#define RH_PLATFORM_RASPI_PICO 20
1512 #if (defined(MPIDE) && MPIDE>=150 && defined(ARDUINO))
1514 #define RH_PLATFORM RH_PLATFORM_CHIPKIT_CORE
1515 #elif defined(MPIDE)
1517 #define RH_PLATFORM RH_PLATFORM_UNO32
1518 #elif defined(NRF51) || defined(NRF52)
1519 #define RH_PLATFORM RH_PLATFORM_NRF51
1520 #elif defined(NRF52)
1521 #define RH_PLATFORM RH_PLATFORM_NRF52
1522 #elif defined(ESP8266)
1523 #define RH_PLATFORM RH_PLATFORM_ESP8266
1524 #elif defined(ESP32)
1525 #define RH_PLATFORM RH_PLATFORM_ESP32
1526 #elif defined(STM32L0) || defined(ARDUINO_ARCH_STM32L0)
1527 #define RH_PLATFORM RH_PLATFORM_STM32L0
1529 #define RH_PLATFORM RH_PLATFORM_MONGOOSE_OS
1530#elif defined(MEGATINYCORE) || defined(ARDUINO_attinyxy2) || defined(ARDUINO_attinyxy4) || defined(ARDUINO_attinyxy6) || defined(ARDUINO_attinyxy7)
1531 #define RH_PLATFORM RH_PLATFORM_ATTINY_MEGA
1532 #elif defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny85__) || defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtinyX4__) || defined(__AVR_ATtinyX5__) || defined(__AVR_ATtiny2313__) || defined(__AVR_ATtiny4313__) || defined(__AVR_ATtinyX313__) || defined(ARDUINO_attiny)
1533 #define RH_PLATFORM RH_PLATFORM_ATTINY
1534 #elif defined(ARDUINO)
1535 #define RH_PLATFORM RH_PLATFORM_ARDUINO
1536 #elif defined(__MSP430G2452__) || defined(__MSP430G2553__)
1537 #define RH_PLATFORM RH_PLATFORM_MSP430
1538 #elif defined(MCU_STM32F103RE)
1539 #define RH_PLATFORM RH_PLATFORM_STM32
1540 #elif defined(STM32F2XX)
1541 #define RH_PLATFORM RH_PLATFORM_STM32F2
1542 #elif defined(USE_STDPERIPH_DRIVER)
1543 #define RH_PLATFORM RH_PLATFORM_STM32STD
1544 #elif defined(RASPBERRY_PI)
1545 #define RH_PLATFORM RH_PLATFORM_RASPI
1546 #elif defined(__unix__)
1547 #define RH_PLATFORM RH_PLATFORM_UNIX
1548 #elif defined(__APPLE__)
1549 #define RH_PLATFORM RH_PLATFORM_UNIX
1552 #error Platform not defined!
1558#if (RH_PLATFORM == RH_PLATFORM_ARDUINO)
1560 #if (ARDUINO >= 100)
1561 #include <Arduino.h>
1566 #define RH_HAVE_HARDWARE_SPI
1567 #define RH_HAVE_SERIAL
1568 #if defined(ARDUINO_ARCH_STM32F4)
1572 #define Serial Serial2
1573 #elif defined(ARDUINO_ARCH_RP2040)
1575 #define RH_ASK_PICO_ALARM_IRQ TIMER_IRQ_1
1576 #define RH_ASK_PICO_ALARM_NUM 1
1577 #elif defined(ARDUINO_LORA_E5_MINI)
1581#elif (RH_PLATFORM == RH_PLATFORM_ATTINY)
1582 #include <Arduino.h>
1584#elif (RH_PLATFORM == RH_PLATFORM_ATTINY_MEGA)
1586 #define RH_HAVE_HARDWARE_SPI
1587 #define RH_HAVE_SERIAL
1591 #if defined(MILLIS_USE_TIMERB0) && defined(TCB1)
1592 #define RH_ATTINY_MEGA_ASK_TIMER TCB1
1593 #define RH_ATTINY_MEGA_ASK_TIMER_VECTOR TCB1_INT_vect
1595 #define RH_ATTINY_MEGA_ASK_TIMER TCB0
1596 #define RH_ATTINY_MEGA_ASK_TIMER_VECTOR TCB0_INT_vect
1599#elif (RH_PLATFORM == RH_PLATFORM_ESP8266)
1600 #include <Arduino.h>
1602 #define RH_HAVE_HARDWARE_SPI
1603 #define RH_HAVE_SERIAL
1604 #define RH_MISSING_SPIUSINGINTERRUPT
1606#elif (RH_PLATFORM == RH_PLATFORM_ESP32)
1607 #include <Arduino.h>
1609 #define RH_HAVE_HARDWARE_SPI
1610 #define RH_HAVE_SERIAL
1611 #define RH_MISSING_SPIUSINGINTERRUPT
1626#elif (RH_PLATFORM == RH_PLATFORM_MONGOOSE_OS)
1628 #include <mgos_adc.h>
1629 #include <mgos_pwm.h>
1630 #include <MGOSCompat/HardwareSerial.h>
1631 #include <MGOSCompat/HardwareSPI.h>
1632 #include <MGOSCompat/MGOS.h>
1634 #define RH_HAVE_HARDWARE_SPI
1637 #if defined(RH_SERIAL_PORT)
1638 #if RH_SERIAL_PORT == 0
1639 #define Serial Serial0
1640 #elif RH_SERIAL_PORT == 1
1641 #define Serial Serial1
1642 #elif RH_SERIAL_PORT == 2
1643 #define Serial Serial2
1646 #warning "RH_SERIAL_PORT not defined. Therefore serial port 0 selected"
1647 #define Serial Serial0
1649 #define RH_HAVE_SERIAL
1651#elif (RH_PLATFORM == RH_PLATFORM_MSP430)
1652 #include "legacymsp430.h"
1653 #include "Energia.h"
1655 #define RH_HAVE_HARDWARE_SPI
1656 #define RH_HAVE_SERIAL
1658#elif (RH_PLATFORM == RH_PLATFORM_UNO32 || RH_PLATFORM == RH_PLATFORM_CHIPKIT_CORE)
1659 #include <WProgram.h>
1662 #define RH_HAVE_HARDWARE_SPI
1663 #define memcpy_P memcpy
1664 #define RH_HAVE_SERIAL
1666#elif (RH_PLATFORM == RH_PLATFORM_STM32)
1667 #include <STM32ArduinoCompat/wirish.h>
1670 #include <STM32ArduinoCompat/HardwareSPI.h>
1671 #define RH_HAVE_HARDWARE_SPI
1673 #define MAPLE_TIMER 1
1675 #define memcpy_P memcpy
1676 #define Serial SerialUSB
1677 #define RH_HAVE_SERIAL
1679#elif (RH_PLATFORM == RH_PLATFORM_STM32L0)
1680 #include <Arduino.h>
1683 #ifndef RH_EXCLUDE_STM32L0_INCLUDES
1685 #include <stm32l0_gpio.h>
1686 #include <stm32l0_exti.h>
1687 #include <stm32l0_rtc.h>
1689 #define RH_HAVE_HARDWARE_SPI
1690 #define RH_HAVE_SERIAL
1692#elif (RH_PLATFORM == RH_PLATFORM_STM32F2)
1693 #include <stm32f2xx.h>
1694 #include <application.h>
1696 #define RH_HAVE_SERIAL
1697 #define RH_HAVE_HARDWARE_SPI
1699#elif (RH_PLATFORM == RH_PLATFORM_STM32STD)
1700 #include <stm32f4xx.h>
1705 #include <HardwareSPI.h>
1706 #define RH_HAVE_HARDWARE_SPI
1707 #define Serial SerialUSB
1708 #define RH_HAVE_SERIAL
1710#elif (RH_PLATFORM == RH_PLATFORM_GENERIC_AVR8)
1712 #include <avr/interrupt.h>
1713 #include <util/delay.h>
1715 #include <stdbool.h>
1716 #define RH_HAVE_HARDWARE_SPI
1721#elif (RH_PLATFORM == RH_PLATFORM_STM32F4_HAL)
1722 #include <ArduinoWorkarounds.h>
1723 #include <stm32f4xx.h>
1727 #define RH_HAVE_HARDWARE_SPI
1729#elif (RH_PLATFORM == RH_PLATFORM_RASPI)
1730 #define RH_HAVE_HARDWARE_SPI
1731 #define RH_HAVE_SERIAL
1735 #if (__has_include (<pigpio.h>))
1736 #include <RHutil_pigpio/RasPi.h>
1738 #include <RHutil/RasPi.h>
1744#elif (RH_PLATFORM == RH_PLATFORM_NRF51)
1745 #define RH_HAVE_SERIAL
1747 #include <Arduino.h>
1749#elif (RH_PLATFORM == RH_PLATFORM_NRF52)
1751 #define RH_HAVE_HARDWARE_SPI
1752 #define RH_HAVE_SERIAL
1754 #include <Arduino.h>
1756#elif (RH_PLATFORM == RH_PLATFORM_UNIX)
1758 #include <RHutil/simulator.h>
1759 #define RH_HAVE_SERIAL
1760#include <netinet/in.h>
1763 #error Platform unknown!
1768#if (RH_PLATFORM == RH_PLATFORM_ARDUINO)
1769 #if defined(__arm__)
1770 #include <RHutil/atomic.h>
1772 #include <util/atomic.h>
1774 #if defined(ARDUINO_ARCH_MBED_RP2040) || defined(ARDUINO_UNOR4_MINIMA) || defined(ARDUINO_UNOR4_WIFI)
1776 #define ATOMIC_BLOCK_START {
1777 #define ATOMIC_BLOCK_END }
1780 #define ATOMIC_BLOCK_START ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
1781 #define ATOMIC_BLOCK_END }
1783#elif (RH_PLATFORM == RH_PLATFORM_CHIPKIT_CORE)
1785 #define ATOMIC_BLOCK_START unsigned int __status = disableInterrupts(); {
1786 #define ATOMIC_BLOCK_END } restoreInterrupts(__status);
1787#elif (RH_PLATFORM == RH_PLATFORM_UNO32)
1789 #include <peripheral/int.h>
1790 #define ATOMIC_BLOCK_START unsigned int __status = INTDisableInterrupts(); {
1791 #define ATOMIC_BLOCK_END } INTRestoreInterrupts(__status);
1792#elif (RH_PLATFORM == RH_PLATFORM_STM32L0)
1793 #define ATOMIC_BLOCK_START uint32_t primask = __get_PRIMASK(); __disable_irq(); {
1794 #define ATOMIC_BLOCK_END } __set_PRIMASK(primask);
1795#elif (RH_PLATFORM == RH_PLATFORM_STM32F2)
1796 #define ATOMIC_BLOCK_START { int __prev = HAL_disable_irq();
1797 #define ATOMIC_BLOCK_END HAL_enable_irq(__prev); }
1798#elif (RH_PLATFORM == RH_PLATFORM_ESP8266)
1800 #define ATOMIC_BLOCK_START { uint32_t __savedPS = xt_rsil(15);
1801 #define ATOMIC_BLOCK_END xt_wsr_ps(__savedPS);}
1802#elif (RH_PLATFORM == RH_PLATFORM_ESP32)
1811 #include "freertos/atomic.h"
1812 #define ATOMIC_BLOCK_START ATOMIC_ENTER_CRITICAL()
1813 #define ATOMIC_BLOCK_END ATOMIC_EXIT_CRITICAL()
1816 #define ATOMIC_BLOCK_START
1817 #define ATOMIC_BLOCK_END
1824#if (RH_PLATFORM == RH_PLATFORM_ARDUINO && ARDUINO >= 155) || (defined(TEENSYDUINO) && defined(__MK20DX128__))
1825 #define YIELD yield();
1826#elif (RH_PLATFORM == RH_PLATFORM_ESP8266)
1828 #define YIELD yield();
1829#elif (RH_PLATFORM == RH_PLATFORM_STM32L0)
1830 #define YIELD yield();
1831#elif (RH_PLATFORM == RH_PLATFORM_MONGOOSE_OS)
1836 void mgosYield(
void);
1838 #define YIELD mgosYield()
1839#elif (RH_PLATFORM == RH_PLATFORM_ESP32)
1841 #define YIELD yield();
1849#ifndef NOT_AN_INTERRUPT
1850 #define NOT_AN_INTERRUPT -1
1852#ifndef digitalPinToInterrupt
1853 #if (RH_PLATFORM == RH_PLATFORM_ARDUINO) && !defined(__arm__)
1855 #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
1858 #define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : ((p) >= 18 && (p) <= 21 ? 23 - (p) : NOT_AN_INTERRUPT)))
1860 #elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
1863 #define digitalPinToInterrupt(p) ((p) == 10 ? 0 : ((p) == 11 ? 1 : ((p) == 2 ? 2 : NOT_AN_INTERRUPT)))
1865 #elif defined(__AVR_ATmega32U4__)
1868 #define digitalPinToInterrupt(p) ((p) == 0 ? 2 : ((p) == 1 ? 3 : ((p) == 2 ? 1 : ((p) == 3 ? 0 : ((p) == 7 ? 4 : NOT_AN_INTERRUPT)))))
1874 #define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : NOT_AN_INTERRUPT))
1878 #elif (RH_PLATFORM == RH_PLATFORM_UNO32) || (RH_PLATFORM == RH_PLATFORM_CHIPKIT_CORE)
1880 #define digitalPinToInterrupt(p) ((p) == 38 ? 0 : ((p) == 2 ? 1 : ((p) == 7 ? 2 : ((p) == 8 ? 3 : ((p) == 735 ? 4 : NOT_AN_INTERRUPT)))))
1882 #elif (RH_PLATFORM == RH_PLATFORM_ESP32)
1883 #define digitalPinToInterrupt(p) (((p) < 40) ? (p) : -1)
1885 #elif (RH_PLATFORM == RH_PLATFORM_ESP8266)
1886 #define digitalPinToInterrupt(p) (((p) < EXTERNAL_NUM_INTERRUPTS)? (p) : NOT_AN_INTERRUPT)
1891 #define digitalPinToInterrupt(p) (p)
1896#if (RH_PLATFORM == RH_PLATFORM_ARDUINO) && defined (__arm__) && (defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_SAM_DUE)) || defined(ARDUINO_ARCH_STM32L0)
1897 #define RH_ATTACHINTERRUPT_TAKES_PIN_NUMBER
1903#if (RH_PLATFORM != RH_PLATFORM_ESP32)
1910#if (RH_PLATFORM == RH_PLATFORM_ESP8266)
1914 #define RH_INTERRUPT_ATTR IRAM_ATTR
1916#elif (RH_PLATFORM == RH_PLATFORM_ESP32)
1917 #define RH_INTERRUPT_ATTR IRAM_ATTR
1919 #define RH_INTERRUPT_ATTR
1929#if RH_PLATFORM != RH_PLATFORM_UNIX && !defined(htons)
1932 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
1934 #define htons(x) ( ((x)<<8) | (((x)>>8)&0xFF) )
1935 #define ntohs(x) htons(x)
1936 #define htonl(x) ( ((x)<<24 & 0xFF000000UL) | \
1937 ((x)<< 8 & 0x00FF0000UL) | \
1938 ((x)>> 8 & 0x0000FF00UL) | \
1939 ((x)>>24 & 0x000000FFUL) )
1940 #define ntohl(x) htonl(x)
1942 #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
1944 #define htons(x) (x)
1945 #define ntohs(x) (x)
1946 #define htonl(x) (x)
1947 #define ntohl(x) (x)
1950 #error "RadioHead.h: Dont know how to define htons and friends for this processor"
1956 #include <pthread.h>
1957 #define RH_DECLARE_MUTEX(X) pthread_mutex_t X;
1958 #define RH_MUTEX_INIT(X) pthread_mutex_init(&X, NULL)
1959 #define RH_MUTEX_LOCK(X) pthread_mutex_lock(&X)
1960 #define RH_MUTEX_UNLOCK(X) pthread_mutex_unlock(&X)
1962 #define RH_DECLARE_MUTEX(X)
1963 #define RH_MUTEX_INIT(X)
1964 #define RH_MUTEX_LOCK(X)
1965 #define RH_MUTEX_UNLOCK(X)
1969#define RH_BROADCAST_ADDRESS 0xff
1972#define RH_INVALID_PIN 0xff