diff --git a/MyConfig.h b/MyConfig.h
index 5d04238..9582a1d 100644
--- a/MyConfig.h
+++ b/MyConfig.h
@@ -430,16 +430,18 @@
#endif
/**
- * @def MY_RF24_IRQ_PIN
- * @brief Disable RF24 interrupt pin usage by default. Override in sketch if needed.
- */
-//#define MY_RF24_IRQ_PIN
+* @def MY_RX_MESSAGE_BUFFER_FEATURE
+* @brief This enabled the receiving buffer feature.
+*
+* This feature is currently not supported for RFM69 and RS485, for RF24 MY_RF24_IRQ_PIN has to be defined.
+*/
+//#define MY_RX_MESSAGE_BUFFER_FEATURE
/**
* @def MY_RX_MESSAGE_BUFFER_SIZE
- * @brief Declare the amount of incoming messages that can be buffered. Requires MY_RADIO_NRF24 and MY_RF24_IRQ_PIN. Override in sketch if needed.
+ * @brief Declare the amount of incoming messages that can be buffered.
*/
-#ifdef MY_RF24_IRQ_PIN
+#ifdef MY_RX_MESSAGE_BUFFER_FEATURE
#ifndef MY_RX_MESSAGE_BUFFER_SIZE
#define MY_RX_MESSAGE_BUFFER_SIZE (20)
#endif
@@ -711,6 +713,7 @@
#define MY_DEBUG_VERBOSE_RF24
#define MY_TRANSPORT_SANITY_CHECK
#define MY_RF24_IRQ_PIN
+#define MY_RX_MESSAGE_BUFFER_FEATURE
#define MY_RX_MESSAGE_BUFFER_SIZE
#define MY_NODE_LOCK_FEATURE
#endif
diff --git a/MySensors.h b/MySensors.h
index a52d1be..70bc936 100644
--- a/MySensors.h
+++ b/MySensors.h
@@ -255,23 +255,6 @@
#error Only one forward link driver can be activated
#endif
#if defined(MY_RADIO_NRF24)
- #ifdef MY_RF24_IRQ_PIN
- // SoftSPI does not support usingInterrupt()
- #ifdef MY_SOFTSPI
- #error RF24 IRQ usage cannot be used with Soft SPI
- #endif
- // ESP8266 does not support usingInterrupt()
- #ifdef ESP8266
- #error RF24 IRQ usage cannot be used with ESP8266
- #endif
- #ifndef SPI_HAS_TRANSACTION
- #error RF24 IRQ usage requires transactional SPI support
- #endif
- #else
- #ifdef MY_RX_MESSAGE_BUFFER_SIZE
- #error Receive message buffering requires RF24 IRQ usage
- #endif
- #endif
#if defined(MY_RF24_ENABLE_ENCRYPTION)
#include "drivers/AES/AES.cpp"
#endif
diff --git a/core/MySensorsCore.h b/core/MySensorsCore.h
index 5676840..d9dafa6 100644
--- a/core/MySensorsCore.h
+++ b/core/MySensorsCore.h
@@ -33,7 +33,7 @@
* - MCO:REG from @ref _registerNode()
* - MCO:SND from @ref send()
* - MCO:PIM from @ref _processInternalMessages()
- * - MCO:NLK from @ref nodeLock()
+ * - MCO:NLK from nodeLock()
*
* MySensorsCore debug log messages:
*
diff --git a/core/MyTransport.h b/core/MyTransport.h
index 0b5a5c7..2267bee 100644
--- a/core/MyTransport.h
+++ b/core/MyTransport.h
@@ -147,6 +147,18 @@
#else
#define TRANSMISSION_FAILURES 5 //!< search for a new parent node after this many transmission failures, lower threshold for non-repeating nodes
#endif
+
+#if defined(MY_RX_MESSAGE_BUFFER_FEATURE)
+ #if defined(MY_RADIO_RFM69)
+ #error Receive message buffering not supported for RFM69!
+ #endif
+ #if defined(MY_RS485)
+ #error Receive message buffering not supported for RS485!
+ #endif
+#elif !defined(MY_RX_MESSAGE_BUFFER_FEATURE) && defined(MY_RX_MESSAGE_BUFFER_SIZE)
+ #error Receive message buffering requires message buffering feature enabled!
+#endif
+
#define TIMEOUT_FAILURE_STATE 10000 //!< duration failure state
#define STATE_TIMEOUT 2000 //!< general state timeout
#define STATE_RETRIES 3 //!< retries before switching to FAILURE
diff --git a/core/MyTransportNRF24.cpp b/core/MyTransportNRF24.cpp
index 6d7f407..ffa0889 100644
--- a/core/MyTransportNRF24.cpp
+++ b/core/MyTransportNRF24.cpp
@@ -26,7 +26,7 @@
#include "drivers/AES/AES.h"
#endif
-#ifdef MY_RF24_IRQ_PIN
+#if defined(MY_RX_MESSAGE_BUFFER_FEATURE)
typedef struct _transportQueuedMessage
{
uint8_t m_len; // Length of the data
@@ -76,7 +76,7 @@ bool transportInit() {
memset(_psk, 0, 16);
#endif
- #ifdef MY_RF24_IRQ_PIN
+ #if defined(MY_RX_MESSAGE_BUFFER_FEATURE)
RF24_registerReceiveCallback( transportRxCallback );
#endif
return RF24_initialize();
@@ -109,7 +109,7 @@ bool transportSend(uint8_t recipient, const void* data, uint8_t len) {
}
bool transportAvailable() {
- #ifdef MY_RF24_IRQ_PIN
+ #if defined(MY_RX_MESSAGE_BUFFER_FEATURE)
(void)RF24_isDataAvailable; // Prevent 'defined but not used' warning
return !transportRxQueue.empty();
#else
@@ -123,10 +123,9 @@ bool transportSanityCheck() {
uint8_t transportReceive(void* data) {
uint8_t len = 0;
- #ifdef MY_RF24_IRQ_PIN
+ #if defined(MY_RX_MESSAGE_BUFFER_FEATURE)
transportQueuedMessage* msg = transportRxQueue.getBack();
- if (msg)
- {
+ if (msg) {
len = msg->m_len;
(void)memcpy(data, msg->m_data, len);
(void)transportRxQueue.popBack();
diff --git a/drivers/RF24/RF24.cpp b/drivers/RF24/RF24.cpp
index d263c1f..ea30f21 100644
--- a/drivers/RF24/RF24.cpp
+++ b/drivers/RF24/RF24.cpp
@@ -25,7 +25,7 @@
LOCAL uint8_t MY_RF24_BASE_ADDR[MY_RF24_ADDR_WIDTH] = { MY_RF24_BASE_RADIO_ID };
LOCAL uint8_t MY_RF24_NODE_ADDRESS = AUTO;
-#ifdef MY_RF24_IRQ_PIN
+#if defined(MY_RX_MESSAGE_BUFFER_FEATURE)
LOCAL RF24_receiveCallbackType RF24_receiveCallback = NULL;
#endif
@@ -261,7 +261,7 @@ LOCAL bool RF24_sanityCheck(void) {
return status;
}
-#ifdef MY_RF24_IRQ_PIN
+#if defined(MY_RX_MESSAGE_BUFFER_FEATURE)
LOCAL void RF24_irqHandler( void )
{
if (RF24_receiveCallback)
@@ -307,14 +307,14 @@ LOCAL bool RF24_initialize(void) {
// Initialize pins
pinMode(MY_RF24_CE_PIN,OUTPUT);
pinMode(MY_RF24_CS_PIN,OUTPUT);
- #ifdef MY_RF24_IRQ_PIN
+ #if defined(MY_RX_MESSAGE_BUFFER_FEATURE)
pinMode(MY_RF24_IRQ_PIN,INPUT);
#endif
// Initialize SPI
_SPI.begin();
RF24_ce(LOW);
RF24_csn(HIGH);
- #ifdef MY_RF24_IRQ_PIN
+ #if defined(MY_RX_MESSAGE_BUFFER_FEATURE)
// assure SPI can be used from interrupt context
// Note: ESP8266 & SoftSPI currently do not support interrupt usage for SPI,
// therefore it is unsafe to use MY_RF24_IRQ_PIN with ESP8266/SoftSPI!
diff --git a/drivers/RF24/RF24.h b/drivers/RF24/RF24.h
index 765a434..77a4cf2 100644
--- a/drivers/RF24/RF24.h
+++ b/drivers/RF24/RF24.h
@@ -36,9 +36,6 @@
#if defined (ARDUINO) && !defined (__arm__) && !defined (_SPI)
#if defined(MY_SOFTSPI)
SoftSPI _SPI;
- #elif defined(ARDUINO_ARCH_SAMD)
- #include
- #define _SPI SPI1
#else
#include
#define _SPI SPI
@@ -61,8 +58,31 @@
#endif
#endif
+// verify RF24 IRQ defs
+#if defined(MY_RX_MESSAGE_BUFFER_FEATURE)
+ #if !defined(MY_RF24_IRQ_PIN)
+ #error Message buffering feature requires MY_RF24_IRQ_PIN to be defined!
+ #endif
+ // SoftSPI does not support usingInterrupt()
+ #ifdef MY_SOFTSPI
+ #error RF24 IRQ usage cannot be used with Soft SPI
+ #endif
+ // ESP8266 does not support usingInterrupt()
+ #ifdef ARDUINO_ARCH_ESP8266
+ #error RF24 IRQ usage cannot be used with ESP8266
+ #endif
+ #ifndef SPI_HAS_TRANSACTION
+ #error RF24 IRQ usage requires transactional SPI support
+ #endif
+#else
+ #ifdef MY_RX_MESSAGE_BUFFER_SIZE
+ #error Receive message buffering requires RF24 IRQ usage
+ #endif
+#endif
+
+
// RF24 settings
-#ifdef MY_RF24_IRQ_PIN
+#if defined(MY_RX_MESSAGE_BUFFER_FEATURE)
#define MY_RF24_CONFIGURATION (uint8_t) ((RF24_CRC_16 << 2) | (1 << MASK_TX_DS) | (1 << MASK_MAX_RT))
#else
#define MY_RF24_CONFIGURATION (uint8_t) (RF24_CRC_16 << 2)
@@ -253,7 +273,7 @@ LOCAL void RF24_setPipeLSB(uint8_t pipe, uint8_t LSB);
LOCAL void RF24_setStatus(uint8_t status);
LOCAL void RF24_enableFeatures(void);
-#ifdef MY_RF24_IRQ_PIN
+#if defined(MY_RX_MESSAGE_BUFFER_FEATURE)
typedef void (*RF24_receiveCallbackType)(void);
/**
* Register a callback, which will be called (from interrupt context) for every message received.
diff --git a/keywords.txt b/keywords.txt
index c38e03f..77a2540 100644
--- a/keywords.txt
+++ b/keywords.txt
@@ -74,6 +74,7 @@ MY_RF24_SPI_MAX_SPEED LITERAL1
MY_RF24_CE_PIN LITERAL1
MY_RF24_CS_PIN LITERAL1
MY_RF24_IRQ_PIN LITERAL1
+MY_RX_MESSAGE_BUFFER_FEATURE LITERAL1
MY_RF24_PA_LEVEL LITERAL1
MY_RF24_CHANNEL LITERAL1
MY_RF24_DATARATE LITERAL1