1582#define RH_VERSION_MAJOR 1
1583#define RH_VERSION_MINOR 146
1586#define RH_PLATFORM_ARDUINO 1
1587#define RH_PLATFORM_MSP430 2
1588#define RH_PLATFORM_STM32 3
1589#define RH_PLATFORM_GENERIC_AVR8 4
1590#define RH_PLATFORM_UNO32 5
1591#define RH_PLATFORM_UNIX 6
1592#define RH_PLATFORM_STM32STD 7
1593#define RH_PLATFORM_STM32F4_HAL 8
1594#define RH_PLATFORM_RASPI 9
1595#define RH_PLATFORM_NRF51 10
1596#define RH_PLATFORM_ESP8266 11
1597#define RH_PLATFORM_STM32F2 12
1598#define RH_PLATFORM_CHIPKIT_CORE 13
1599#define RH_PLATFORM_ESP32 14
1600#define RH_PLATFORM_NRF52 15
1601#define RH_PLATFORM_MONGOOSE_OS 16
1602#define RH_PLATFORM_ATTINY 17
1604#define RH_PLATFORM_ATTINY_MEGA 18
1605#define RH_PLATFORM_STM32L0 19
1606#define RH_PLATFORM_RASPI_PICO 20
1611 #if (defined(MPIDE) && MPIDE>=150 && defined(ARDUINO))
1613 #define RH_PLATFORM RH_PLATFORM_CHIPKIT_CORE
1614 #elif defined(MPIDE)
1616 #define RH_PLATFORM RH_PLATFORM_UNO32
1617 #elif defined(NRF51) || defined(NRF52)
1618 #define RH_PLATFORM RH_PLATFORM_NRF51
1619 #elif defined(NRF52)
1620 #define RH_PLATFORM RH_PLATFORM_NRF52
1621 #elif defined(ESP8266)
1622 #define RH_PLATFORM RH_PLATFORM_ESP8266
1623 #elif defined(ESP32)
1624 #define RH_PLATFORM RH_PLATFORM_ESP32
1625 #elif defined(STM32L0) || defined(ARDUINO_ARCH_STM32L0)
1626 #define RH_PLATFORM RH_PLATFORM_STM32L0
1628 #define RH_PLATFORM RH_PLATFORM_MONGOOSE_OS
1629#elif defined(MEGATINYCORE) || defined(ARDUINO_attinyxy2) || defined(ARDUINO_attinyxy4) || defined(ARDUINO_attinyxy6) || defined(ARDUINO_attinyxy7)
1630 #define RH_PLATFORM RH_PLATFORM_ATTINY_MEGA
1631 #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)
1632 #define RH_PLATFORM RH_PLATFORM_ATTINY
1633 #elif defined(ARDUINO)
1634 #define RH_PLATFORM RH_PLATFORM_ARDUINO
1635 #elif defined(__MSP430G2452__) || defined(__MSP430G2553__)
1636 #define RH_PLATFORM RH_PLATFORM_MSP430
1637 #elif defined(MCU_STM32F103RE)
1638 #define RH_PLATFORM RH_PLATFORM_STM32
1639 #elif defined(STM32F2XX)
1640 #define RH_PLATFORM RH_PLATFORM_STM32F2
1641 #elif defined(USE_STDPERIPH_DRIVER)
1642 #define RH_PLATFORM RH_PLATFORM_STM32STD
1643 #elif defined(RASPBERRY_PI)
1644 #define RH_PLATFORM RH_PLATFORM_RASPI
1645 #elif defined(__unix__)
1646 #define RH_PLATFORM RH_PLATFORM_UNIX
1647 #elif defined(__APPLE__)
1648 #define RH_PLATFORM RH_PLATFORM_UNIX
1651 #error Platform not defined!
1657#if (RH_PLATFORM == RH_PLATFORM_ARDUINO)
1658 #if (ARDUINO >= 100)
1659 #include <Arduino.h>
1664 #define RH_HAVE_HARDWARE_SPI
1665 #define RH_HAVE_SERIAL
1667 #if defined(ARDUINO_ARCH_STM32F4)
1671 #define Serial Serial2
1673 #elif defined(ARDUINO_ARCH_RP2040)
1674 #if defined(PICO_RP2350)
1676 #define RH_ASK_PICO_ALARM_IRQ TIMER0_IRQ_1
1679 #define RH_ASK_PICO_ALARM_IRQ TIMER_IRQ_1
1681 #define RH_ASK_PICO_ALARM_NUM 1
1683 #elif defined(ARDUINO_LORA_E5_MINI)
1687#elif defined(CubeCell_Board) || defined(CubeCell_Board_V2) || defined(CubeCell_Capsule) || defined(CubeCell_Module) || defined(CubeCell_Module_V2) || defined(CubeCell_BoardPlus) || defined(CubeCell_GPS) || defined(CubeCell_ModulePlus) || defined(CubeCell_HalfAA) || defined(CubeCell_BoardP)
1688 #define RH_CUBE_CELL_BOARD
1689 #define RH_MISSING_SPIUSINGINTERRUPT
1690 #include <board-config.h>
1694#elif (RH_PLATFORM == RH_PLATFORM_ATTINY)
1695 #include <Arduino.h>
1697#elif (RH_PLATFORM == RH_PLATFORM_ATTINY_MEGA)
1699 #define RH_HAVE_HARDWARE_SPI
1700 #define RH_HAVE_SERIAL
1704 #if defined(MILLIS_USE_TIMERB0) && defined(TCB1)
1705 #define RH_ATTINY_MEGA_ASK_TIMER TCB1
1706 #define RH_ATTINY_MEGA_ASK_TIMER_VECTOR TCB1_INT_vect
1708 #define RH_ATTINY_MEGA_ASK_TIMER TCB0
1709 #define RH_ATTINY_MEGA_ASK_TIMER_VECTOR TCB0_INT_vect
1712#elif (RH_PLATFORM == RH_PLATFORM_ESP8266)
1713 #include <Arduino.h>
1715 #define RH_HAVE_HARDWARE_SPI
1716 #define RH_HAVE_SERIAL
1717 #define RH_MISSING_SPIUSINGINTERRUPT
1719#elif (RH_PLATFORM == RH_PLATFORM_ESP32)
1720 #include <Arduino.h>
1722 #define RH_HAVE_HARDWARE_SPI
1723 #define RH_HAVE_SERIAL
1724 #define RH_MISSING_SPIUSINGINTERRUPT
1739#elif (RH_PLATFORM == RH_PLATFORM_MONGOOSE_OS)
1741 #include <mgos_adc.h>
1742 #include <mgos_pwm.h>
1743 #include <MGOSCompat/HardwareSerial.h>
1744 #include <MGOSCompat/HardwareSPI.h>
1745 #include <MGOSCompat/MGOS.h>
1747 #define RH_HAVE_HARDWARE_SPI
1750 #if defined(RH_SERIAL_PORT)
1751 #if RH_SERIAL_PORT == 0
1752 #define Serial Serial0
1753 #elif RH_SERIAL_PORT == 1
1754 #define Serial Serial1
1755 #elif RH_SERIAL_PORT == 2
1756 #define Serial Serial2
1759 #warning "RH_SERIAL_PORT not defined. Therefore serial port 0 selected"
1760 #define Serial Serial0
1762 #define RH_HAVE_SERIAL
1764#elif (RH_PLATFORM == RH_PLATFORM_MSP430)
1765 #include "legacymsp430.h"
1766 #include "Energia.h"
1768 #define RH_HAVE_HARDWARE_SPI
1769 #define RH_HAVE_SERIAL
1771#elif (RH_PLATFORM == RH_PLATFORM_UNO32 || RH_PLATFORM == RH_PLATFORM_CHIPKIT_CORE)
1772 #include <WProgram.h>
1775 #define RH_HAVE_HARDWARE_SPI
1776 #define memcpy_P memcpy
1777 #define RH_HAVE_SERIAL
1779#elif (RH_PLATFORM == RH_PLATFORM_STM32)
1780 #include <STM32ArduinoCompat/wirish.h>
1783 #include <STM32ArduinoCompat/HardwareSPI.h>
1784 #define RH_HAVE_HARDWARE_SPI
1786 #define MAPLE_TIMER 1
1788 #define memcpy_P memcpy
1789 #define Serial SerialUSB
1790 #define RH_HAVE_SERIAL
1792#elif (RH_PLATFORM == RH_PLATFORM_STM32L0)
1793 #include <Arduino.h>
1796 #ifndef RH_EXCLUDE_STM32L0_INCLUDES
1798 #include <stm32l0_gpio.h>
1799 #include <stm32l0_exti.h>
1800 #include <stm32l0_rtc.h>
1802 #define RH_HAVE_HARDWARE_SPI
1803 #define RH_HAVE_SERIAL
1805#elif (RH_PLATFORM == RH_PLATFORM_STM32F2)
1806 #include <stm32f2xx.h>
1807 #include <application.h>
1809 #define RH_HAVE_SERIAL
1810 #define RH_HAVE_HARDWARE_SPI
1812#elif (RH_PLATFORM == RH_PLATFORM_STM32STD)
1813 #include <stm32f4xx.h>
1818 #include <HardwareSPI.h>
1819 #define RH_HAVE_HARDWARE_SPI
1820 #define Serial SerialUSB
1821 #define RH_HAVE_SERIAL
1823#elif (RH_PLATFORM == RH_PLATFORM_GENERIC_AVR8)
1825 #include <avr/interrupt.h>
1826 #include <util/delay.h>
1828 #include <stdbool.h>
1829 #define RH_HAVE_HARDWARE_SPI
1834#elif (RH_PLATFORM == RH_PLATFORM_STM32F4_HAL)
1835 #include <ArduinoWorkarounds.h>
1836 #include <stm32f4xx.h>
1840 #define RH_HAVE_HARDWARE_SPI
1842#elif (RH_PLATFORM == RH_PLATFORM_RASPI)
1843 #define RH_HAVE_HARDWARE_SPI
1844 #define RH_HAVE_SERIAL
1848 #if (__has_include (<pigpio.h>))
1849 #include <RHutil_pigpio/RasPi.h>
1851 #include <RHutil/RasPi.h>
1857#elif (RH_PLATFORM == RH_PLATFORM_NRF51)
1858 #define RH_HAVE_SERIAL
1860 #include <Arduino.h>
1862#elif (RH_PLATFORM == RH_PLATFORM_NRF52)
1864 #define RH_HAVE_HARDWARE_SPI
1865 #define RH_HAVE_SERIAL
1866 #define RH_HAVE_SPI_ATTACH_INTERRUPT
1868 #include <Arduino.h>
1870#elif (RH_PLATFORM == RH_PLATFORM_UNIX)
1872 #include <RHutil/simulator.h>
1873 #define RH_HAVE_SERIAL
1874#include <netinet/in.h>
1877 #error Platform unknown!
1882#if (RH_PLATFORM == RH_PLATFORM_ARDUINO)
1883 #if defined(RH_CUBE_CELL_BOARD)
1885 #elif defined(__arm__)
1886 #include <RHutil/atomic.h>
1888 #include <util/atomic.h>
1891 #if defined(ARDUINO_ARCH_MBED_RP2040) || defined(ARDUINO_UNOR4_MINIMA) || defined(ARDUINO_UNOR4_WIFI) || defined(RH_CUBE_CELL_BOARD)
1893 #define ATOMIC_BLOCK_START {
1894 #define ATOMIC_BLOCK_END }
1897 #define ATOMIC_BLOCK_START ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
1898 #define ATOMIC_BLOCK_END }
1900#elif (RH_PLATFORM == RH_PLATFORM_CHIPKIT_CORE)
1902 #define ATOMIC_BLOCK_START unsigned int __status = disableInterrupts(); {
1903 #define ATOMIC_BLOCK_END } restoreInterrupts(__status);
1904#elif (RH_PLATFORM == RH_PLATFORM_UNO32)
1906 #include <peripheral/int.h>
1907 #define ATOMIC_BLOCK_START unsigned int __status = INTDisableInterrupts(); {
1908 #define ATOMIC_BLOCK_END } INTRestoreInterrupts(__status);
1909#elif (RH_PLATFORM == RH_PLATFORM_STM32L0)
1910 #define ATOMIC_BLOCK_START uint32_t primask = __get_PRIMASK(); __disable_irq(); {
1911 #define ATOMIC_BLOCK_END } __set_PRIMASK(primask);
1912#elif (RH_PLATFORM == RH_PLATFORM_STM32F2)
1913 #define ATOMIC_BLOCK_START { int __prev = HAL_disable_irq();
1914 #define ATOMIC_BLOCK_END HAL_enable_irq(__prev); }
1915#elif (RH_PLATFORM == RH_PLATFORM_ESP8266)
1917 #define ATOMIC_BLOCK_START { uint32_t __savedPS = xt_rsil(15);
1918 #define ATOMIC_BLOCK_END xt_wsr_ps(__savedPS);}
1919#elif (RH_PLATFORM == RH_PLATFORM_ESP32)
1928 #include "freertos/atomic.h"
1929 #define ATOMIC_BLOCK_START ATOMIC_ENTER_CRITICAL()
1930 #define ATOMIC_BLOCK_END ATOMIC_EXIT_CRITICAL()
1933 #define ATOMIC_BLOCK_START
1934 #define ATOMIC_BLOCK_END
1941#if (RH_PLATFORM == RH_PLATFORM_ARDUINO) && defined(RH_CUBE_CELL_BOARD)
1943#elif (RH_PLATFORM == RH_PLATFORM_ARDUINO && ARDUINO >= 155) || (defined(TEENSYDUINO) && defined(__MK20DX128__))
1944 #define YIELD yield();
1945#elif (RH_PLATFORM == RH_PLATFORM_ESP8266)
1947 #define YIELD yield();
1948#elif (RH_PLATFORM == RH_PLATFORM_STM32L0)
1949 #define YIELD yield();
1950#elif (RH_PLATFORM == RH_PLATFORM_MONGOOSE_OS)
1955 void mgosYield(
void);
1957 #define YIELD mgosYield()
1958#elif (RH_PLATFORM == RH_PLATFORM_ESP32)
1960 #define YIELD yield();
1968#ifndef NOT_AN_INTERRUPT
1969 #define NOT_AN_INTERRUPT -1
1971#ifndef digitalPinToInterrupt
1972 #if (RH_PLATFORM == RH_PLATFORM_ARDUINO) && !defined(__arm__)
1974 #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
1977 #define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : ((p) >= 18 && (p) <= 21 ? 23 - (p) : NOT_AN_INTERRUPT)))
1979 #elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
1982 #define digitalPinToInterrupt(p) ((p) == 10 ? 0 : ((p) == 11 ? 1 : ((p) == 2 ? 2 : NOT_AN_INTERRUPT)))
1984 #elif defined(__AVR_ATmega32U4__)
1987 #define digitalPinToInterrupt(p) ((p) == 0 ? 2 : ((p) == 1 ? 3 : ((p) == 2 ? 1 : ((p) == 3 ? 0 : ((p) == 7 ? 4 : NOT_AN_INTERRUPT)))))
1993 #define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : NOT_AN_INTERRUPT))
1997 #elif (RH_PLATFORM == RH_PLATFORM_UNO32) || (RH_PLATFORM == RH_PLATFORM_CHIPKIT_CORE)
1999 #define digitalPinToInterrupt(p) ((p) == 38 ? 0 : ((p) == 2 ? 1 : ((p) == 7 ? 2 : ((p) == 8 ? 3 : ((p) == 735 ? 4 : NOT_AN_INTERRUPT)))))
2001 #elif (RH_PLATFORM == RH_PLATFORM_ESP32)
2002 #define digitalPinToInterrupt(p) (((p) < 40) ? (p) : -1)
2004 #elif (RH_PLATFORM == RH_PLATFORM_ESP8266)
2005 #define digitalPinToInterrupt(p) (((p) < EXTERNAL_NUM_INTERRUPTS)? (p) : NOT_AN_INTERRUPT)
2010 #define digitalPinToInterrupt(p) (p)
2015#if (RH_PLATFORM == RH_PLATFORM_ARDUINO) && defined (__arm__) && (defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_SAM_DUE)) || defined(ARDUINO_ARCH_STM32L0)
2016 #define RH_ATTACHINTERRUPT_TAKES_PIN_NUMBER
2022#if (RH_PLATFORM != RH_PLATFORM_ESP32)
2029#if (RH_PLATFORM == RH_PLATFORM_ESP8266)
2033 #define RH_INTERRUPT_ATTR IRAM_ATTR
2035#elif (RH_PLATFORM == RH_PLATFORM_ESP32)
2036 #define RH_INTERRUPT_ATTR IRAM_ATTR
2038 #define RH_INTERRUPT_ATTR
2048#if RH_PLATFORM != RH_PLATFORM_UNIX && !defined(htons)
2051 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
2053 #define htons(x) ( ((x)<<8) | (((x)>>8)&0xFF) )
2054 #define ntohs(x) htons(x)
2055 #define htonl(x) ( ((x)<<24 & 0xFF000000UL) | \
2056 ((x)<< 8 & 0x00FF0000UL) | \
2057 ((x)>> 8 & 0x0000FF00UL) | \
2058 ((x)>>24 & 0x000000FFUL) )
2059 #define ntohl(x) htonl(x)
2061 #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
2063 #define htons(x) (x)
2064 #define ntohs(x) (x)
2065 #define htonl(x) (x)
2066 #define ntohl(x) (x)
2069 #error "RadioHead.h: Dont know how to define htons and friends for this processor"
2075 #include <pthread.h>
2076 #define RH_DECLARE_MUTEX(X) pthread_mutex_t X;
2077 #define RH_MUTEX_INIT(X) pthread_mutex_init(&X, NULL)
2078 #define RH_MUTEX_LOCK(X) pthread_mutex_lock(&X)
2079 #define RH_MUTEX_UNLOCK(X) pthread_mutex_unlock(&X)
2081 #define RH_DECLARE_MUTEX(X)
2082 #define RH_MUTEX_INIT(X)
2083 #define RH_MUTEX_LOCK(X)
2084 #define RH_MUTEX_UNLOCK(X)
2088#define RH_BROADCAST_ADDRESS 0xff
2091#define RH_INVALID_PIN 0xff