1215 #define RH_VERSION_MAJOR 1
1216 #define RH_VERSION_MINOR 100
1219 #define RH_PLATFORM_ARDUINO 1
1220 #define RH_PLATFORM_MSP430 2
1221 #define RH_PLATFORM_STM32 3
1222 #define RH_PLATFORM_GENERIC_AVR8 4
1223 #define RH_PLATFORM_UNO32 5
1224 #define RH_PLATFORM_UNIX 6
1225 #define RH_PLATFORM_STM32STD 7
1226 #define RH_PLATFORM_STM32F4_HAL 8
1227 #define RH_PLATFORM_RASPI 9
1228 #define RH_PLATFORM_NRF51 10
1229 #define RH_PLATFORM_ESP8266 11
1230 #define RH_PLATFORM_STM32F2 12
1231 #define RH_PLATFORM_CHIPKIT_CORE 13
1232 #define RH_PLATFORM_ESP32 14
1233 #define RH_PLATFORM_NRF52 15
1234 #define RH_PLATFORM_MONGOOSE_OS 16
1235 #define RH_PLATFORM_ATTINY 17
1237 #define RH_PLATFORM_ATTINY_MEGA 18
1242 #if (defined(MPIDE) && MPIDE>=150 && defined(ARDUINO))
1244 #define RH_PLATFORM RH_PLATFORM_CHIPKIT_CORE
1245 #elif defined(MPIDE)
1247 #define RH_PLATFORM RH_PLATFORM_UNO32
1248 #elif defined(NRF51) || defined(NRF52)
1249 #define RH_PLATFORM RH_PLATFORM_NRF51
1250 #elif defined(NRF52)
1251 #define RH_PLATFORM RH_PLATFORM_NRF52
1252 #elif defined(ESP8266)
1253 #define RH_PLATFORM RH_PLATFORM_ESP8266
1254 #elif defined(ESP32)
1255 #define RH_PLATFORM RH_PLATFORM_ESP32
1257 #define RH_PLATFORM RH_PLATFORM_MONGOOSE_OS
1258 #elif defined(ARDUINO_attinyxy2) || defined(ARDUINO_attinyxy4) || defined(ARDUINO_attinyxy6) || defined(ARDUINO_attinyxy7)
1259 #define RH_PLATFORM RH_PLATFORM_ATTINY_MEGA
1260 #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)
1261 #define RH_PLATFORM RH_PLATFORM_ATTINY
1262 #elif defined(ARDUINO)
1263 #define RH_PLATFORM RH_PLATFORM_ARDUINO
1264 #elif defined(__MSP430G2452__) || defined(__MSP430G2553__)
1265 #define RH_PLATFORM RH_PLATFORM_MSP430
1266 #elif defined(MCU_STM32F103RE)
1267 #define RH_PLATFORM RH_PLATFORM_STM32
1268 #elif defined(STM32F2XX)
1269 #define RH_PLATFORM RH_PLATFORM_STM32F2
1270 #elif defined(USE_STDPERIPH_DRIVER)
1271 #define RH_PLATFORM RH_PLATFORM_STM32STD
1272 #elif defined(RASPBERRY_PI)
1273 #define RH_PLATFORM RH_PLATFORM_RASPI
1274 #elif defined(__unix__) // Linux
1275 #define RH_PLATFORM RH_PLATFORM_UNIX
1276 #elif defined(__APPLE__) // OSX
1277 #define RH_PLATFORM RH_PLATFORM_UNIX
1279 #error Platform not defined!
1285 #if (RH_PLATFORM == RH_PLATFORM_ARDUINO)
1286 #if (ARDUINO >= 100)
1287 #include <Arduino.h>
1292 #define RH_HAVE_HARDWARE_SPI
1293 #define RH_HAVE_SERIAL
1294 #if defined(ARDUINO_ARCH_STM32F4)
1297 #define Serial Serial2
1299 #elif (RH_PLATFORM == RH_PLATFORM_ATTINY)
1300 #warning Arduino TinyCore does not support hardware SPI. Use software SPI instead.
1301 #elif (RH_PLATFORM == RH_PLATFORM_ATTINY_MEGA)
1303 #define RH_HAVE_HARDWARE_SPI
1304 #define RH_HAVE_SERIAL
1305 #elif (RH_PLATFORM == RH_PLATFORM_ESP8266) // ESP8266 processor on Arduino IDE
1306 #include <Arduino.h>
1308 #define RH_HAVE_HARDWARE_SPI
1309 #define RH_HAVE_SERIAL
1310 #define RH_MISSING_SPIUSINGINTERRUPT
1312 #elif (RH_PLATFORM == RH_PLATFORM_ESP32) // ESP32 processor on Arduino IDE
1313 #include <Arduino.h>
1315 #define RH_HAVE_HARDWARE_SPI
1316 #define RH_HAVE_SERIAL
1317 #define RH_MISSING_SPIUSINGINTERRUPT
1319 #elif (RH_PLATFORM == RH_PLATFORM_MONGOOSE_OS) // Mongoose OS platform
1321 #include <mgos_adc.h>
1322 #include <mgos_pwm.h>
1323 #include <MGOSCompat/HardwareSerial.h>
1324 #include <MGOSCompat/HardwareSPI.h>
1325 #include <MGOSCompat/MGOS.h>
1327 #define RH_HAVE_HARDWARE_SPI
1330 #if defined(RH_SERIAL_PORT)
1331 #if RH_SERIAL_PORT == 0
1332 #define Serial Serial0
1333 #elif RH_SERIAL_PORT == 1
1334 #define Serial Serial1
1335 #elif RH_SERIAL_PORT == 2
1336 #define Serial Serial2
1339 #warning "RH_SERIAL_PORT not defined. Therefore serial port 0 selected"
1340 #define Serial Serial0
1342 #define RH_HAVE_SERIAL
1344 #elif (RH_PLATFORM == RH_PLATFORM_MSP430) // LaunchPad specific
1345 #include "legacymsp430.h"
1346 #include "Energia.h"
1348 #define RH_HAVE_HARDWARE_SPI
1349 #define RH_HAVE_SERIALg
1351 #elif (RH_PLATFORM == RH_PLATFORM_UNO32 || RH_PLATFORM == RH_PLATFORM_CHIPKIT_CORE)
1352 #include <WProgram.h>
1355 #define RH_HAVE_HARDWARE_SPI
1356 #define memcpy_P memcpy
1357 #define RH_HAVE_SERIAL
1359 #elif (RH_PLATFORM == RH_PLATFORM_STM32) // Maple, Flymaple etc
1360 #include <STM32ArduinoCompat/wirish.h>
1363 #include <STM32ArduinoCompat/HardwareSPI.h>
1364 #define RH_HAVE_HARDWARE_SPI
1366 #define MAPLE_TIMER 1
1368 #define memcpy_P memcpy
1369 #define Serial SerialUSB
1370 #define RH_HAVE_SERIAL
1372 #elif (RH_PLATFORM == RH_PLATFORM_STM32F2) // Particle Photon with firmware-develop
1373 #include <stm32f2xx.h>
1374 #include <application.h>
1376 #define RH_HAVE_SERIAL
1377 #define RH_HAVE_HARDWARE_SPI
1379 #elif (RH_PLATFORM == RH_PLATFORM_STM32STD) // STM32 with STM32F4xx_StdPeriph_Driver
1380 #include <stm32f4xx.h>
1385 #include <HardwareSPI.h>
1386 #define RH_HAVE_HARDWARE_SPI
1387 #define Serial SerialUSB
1388 #define RH_HAVE_SERIAL
1390 #elif (RH_PLATFORM == RH_PLATFORM_GENERIC_AVR8)
1392 #include <avr/interrupt.h>
1393 #include <util/delay.h>
1395 #include <stdbool.h>
1396 #define RH_HAVE_HARDWARE_SPI
1401 #elif (RH_PLATFORM == RH_PLATFORM_STM32F4_HAL)
1402 #include <ArduinoWorkarounds.h>
1403 #include <stm32f4xx.h>
1407 #define RH_HAVE_HARDWARE_SPI // using HAL (Hardware Abstraction Libraries from ST along with CMSIS, not arduino libs or pins concept.
1409 #elif (RH_PLATFORM == RH_PLATFORM_RASPI)
1410 #define RH_HAVE_HARDWARE_SPI
1411 #define RH_HAVE_SERIAL
1413 #if (__has_include (<pigpio.h>))
1414 #include <RHutil_pigpio/RasPi.h>
1416 #include <RHutil/RasPi.h>
1422 #elif (RH_PLATFORM == RH_PLATFORM_NRF51)
1423 #define RH_HAVE_SERIAL
1425 #include <Arduino.h>
1427 #elif (RH_PLATFORM == RH_PLATFORM_NRF52)
1429 #define RH_HAVE_HARDWARE_SPI
1430 #define RH_HAVE_SERIAL
1432 #include <Arduino.h>
1434 #elif (RH_PLATFORM == RH_PLATFORM_UNIX)
1436 #include <RHutil/simulator.h>
1437 #define RH_HAVE_SERIAL
1438 #include <netinet/in.h>
1441 #error Platform unknown!
1446 #if (RH_PLATFORM == RH_PLATFORM_ARDUINO)
1447 #if defined(__arm__)
1448 #include <RHutil/atomic.h>
1450 #include <util/atomic.h>
1452 #define ATOMIC_BLOCK_START ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
1453 #define ATOMIC_BLOCK_END }
1454 #elif (RH_PLATFORM == RH_PLATFORM_CHIPKIT_CORE)
1456 #define ATOMIC_BLOCK_START unsigned int __status = disableInterrupts(); {
1457 #define ATOMIC_BLOCK_END } restoreInterrupts(__status);
1458 #elif (RH_PLATFORM == RH_PLATFORM_UNO32)
1460 #include <peripheral/int.h>
1461 #define ATOMIC_BLOCK_START unsigned int __status = INTDisableInterrupts(); {
1462 #define ATOMIC_BLOCK_END } INTRestoreInterrupts(__status);
1463 #elif (RH_PLATFORM == RH_PLATFORM_STM32F2) // Particle Photon with firmware-develop
1464 #define ATOMIC_BLOCK_START { int __prev = HAL_disable_irq();
1465 #define ATOMIC_BLOCK_END HAL_enable_irq(__prev); }
1466 #elif (RH_PLATFORM == RH_PLATFORM_ESP8266)
1468 #define ATOMIC_BLOCK_START { uint32_t __savedPS = xt_rsil(15);
1469 #define ATOMIC_BLOCK_END xt_wsr_ps(__savedPS);}
1472 #define ATOMIC_BLOCK_START
1473 #define ATOMIC_BLOCK_END
1480 #if (RH_PLATFORM == RH_PLATFORM_ARDUINO && ARDUINO >= 155) || (defined(TEENSYDUINO) && defined(__MK20DX128__))
1481 #define YIELD yield();
1482 #elif (RH_PLATFORM == RH_PLATFORM_ESP8266)
1484 #define YIELD yield();
1485 #elif (RH_PLATFORM == RH_PLATFORM_MONGOOSE_OS)
1490 void mgosYield(
void);
1492 #define YIELD mgosYield()
1500 #ifndef NOT_AN_INTERRUPT
1501 #define NOT_AN_INTERRUPT -1
1503 #ifndef digitalPinToInterrupt
1504 #if (RH_PLATFORM == RH_PLATFORM_ARDUINO) && !defined(__arm__)
1506 #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
1509 #define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : ((p) >= 18 && (p) <= 21 ? 23 - (p) : NOT_AN_INTERRUPT)))
1511 #elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
1514 #define digitalPinToInterrupt(p) ((p) == 10 ? 0 : ((p) == 11 ? 1 : ((p) == 2 ? 2 : NOT_AN_INTERRUPT)))
1516 #elif defined(__AVR_ATmega32U4__)
1519 #define digitalPinToInterrupt(p) ((p) == 0 ? 2 : ((p) == 1 ? 3 : ((p) == 2 ? 1 : ((p) == 3 ? 0 : ((p) == 7 ? 4 : NOT_AN_INTERRUPT)))))
1525 #define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : NOT_AN_INTERRUPT))
1529 #elif (RH_PLATFORM == RH_PLATFORM_UNO32) || (RH_PLATFORM == RH_PLATFORM_CHIPKIT_CORE)
1531 #define digitalPinToInterrupt(p) ((p) == 38 ? 0 : ((p) == 2 ? 1 : ((p) == 7 ? 2 : ((p) == 8 ? 3 : ((p) == 735 ? 4 : NOT_AN_INTERRUPT)))))
1535 #define digitalPinToInterrupt(p) (p)
1540 #if (RH_PLATFORM == RH_PLATFORM_ARDUINO) && defined (__arm__) && (defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_SAM_DUE))
1541 #define RH_ATTACHINTERRUPT_TAKES_PIN_NUMBER
1550 #if (RH_PLATFORM == RH_PLATFORM_ESP8266)
1553 #define RH_INTERRUPT_ATTR ICACHE_RAM_ATTR
1555 #elif (RH_PLATFORM == RH_PLATFORM_ESP32)
1556 #define RH_INTERRUPT_ATTR IRAM_ATTR
1558 #define RH_INTERRUPT_ATTR
1568 #if RH_PLATFORM != RH_PLATFORM_UNIX && !defined(htons)
1571 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
1573 #define htons(x) ( ((x)<<8) | (((x)>>8)&0xFF) )
1574 #define ntohs(x) htons(x)
1575 #define htonl(x) ( ((x)<<24 & 0xFF000000UL) | \
1576 ((x)<< 8 & 0x00FF0000UL) | \
1577 ((x)>> 8 & 0x0000FF00UL) | \
1578 ((x)>>24 & 0x000000FFUL) )
1579 #define ntohl(x) htonl(x)
1581 #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
1583 #define htons(x) (x)
1584 #define ntohs(x) (x)
1585 #define htonl(x) (x)
1586 #define ntohl(x) (x)
1589 #error "Dont know how to define htons and friends for this processor"
1594 #define RH_BROADCAST_ADDRESS 0xff