From bdacb6c640b85dd78c9c3ae265ed1481cb519552 Mon Sep 17 00:00:00 2001 From: Andrei Vasiliu Date: Thu, 17 Sep 2015 15:12:00 +0300 Subject: [PATCH] nrf24l01: Added callback functionality for Java Signed-off-by: Andrei Vasiliu Signed-off-by: Mihai Tudor Panu --- src/nrf24l01/Callback.h | 22 ++++++++++++++++++++ src/nrf24l01/javaupm_nrf24l01.i | 3 +++ src/nrf24l01/nrf24l01.cxx | 20 +++++++++++++++++- src/nrf24l01/nrf24l01.h | 36 +++++++++++++++++++++++++++++---- 4 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 src/nrf24l01/Callback.h diff --git a/src/nrf24l01/Callback.h b/src/nrf24l01/Callback.h new file mode 100644 index 00000000..3e0cd960 --- /dev/null +++ b/src/nrf24l01/Callback.h @@ -0,0 +1,22 @@ +#pragma once + +#if defined(SWIGJAVA) || defined(JAVACALLBACK) +class Callback +{ + public: + virtual ~Callback() + { + } + virtual void run() + { /* empty, overloaded in Java*/ + } +}; + + +static void generic_callback (Callback* callback) +{ + if (callback == NULL) + return; + callback->run(); +} +#endif diff --git a/src/nrf24l01/javaupm_nrf24l01.i b/src/nrf24l01/javaupm_nrf24l01.i index 1d7a3b28..e5d85bcc 100644 --- a/src/nrf24l01/javaupm_nrf24l01.i +++ b/src/nrf24l01/javaupm_nrf24l01.i @@ -1,9 +1,12 @@ %module javaupm_nrf24l01 %include "../upm.i" +%feature("director") Callback; + %include "arrays_java.i"; %apply signed char[] {uint8_t *}; +%include "Callback.h" %{ #include "nrf24l01.h" %} diff --git a/src/nrf24l01/nrf24l01.cxx b/src/nrf24l01/nrf24l01.cxx index e447ae43..8b9c98ed 100644 --- a/src/nrf24l01/nrf24l01.cxx +++ b/src/nrf24l01/nrf24l01.cxx @@ -148,6 +148,20 @@ NRF24L01::setPayload (uint8_t payload) { m_payload = payload; } +#ifdef JAVACALLBACK +void +NRF24L01::setDataReceivedHandler (Callback *call_obj) +{ + callback_obj = call_obj; + dataReceivedHandler = &generic_callback; +} +#else +void setDataReceivedHandler (funcPtrVoidVoid handler) +{ + dataReceivedHandler = handler; +} +#endif + bool NRF24L01::dataReady () { /* See note in getData() function - just checking RX_DR isn't good enough */ @@ -315,7 +329,11 @@ void NRF24L01::pollListener() { if (dataReady()) { getData (m_rxBuffer); - dataRecievedHandler (); /* let know that data arrived */ +#ifdef JAVACALLBACK + dataReceivedHandler (callback_obj); /* let know that data arrived */ +#else + dataReceivedHandler (); /* let know that data arrived */ +#endif } } diff --git a/src/nrf24l01/nrf24l01.h b/src/nrf24l01/nrf24l01.h index 8ca9aad8..0a468b85 100644 --- a/src/nrf24l01/nrf24l01.h +++ b/src/nrf24l01/nrf24l01.h @@ -33,6 +33,10 @@ #include #include +#if defined(SWIGJAVA) || defined(JAVACALLBACK) +#include "Callback.h" +#endif + /* Memory Map */ #define CONFIG 0x00 #define EN_AA 0x01 @@ -138,7 +142,11 @@ namespace upm { +#if defined(SWIGJAVA) || defined(JAVACALLBACK) +typedef void (* funcPtrVoidVoid) (Callback *); +#else typedef void (* funcPtrVoidVoid) (); +#endif typedef enum { NRF_250KBPS = 0, @@ -249,6 +257,21 @@ class NRF24L01 { */ void setPayload (uint8_t load); +#if defined(SWIGJAVA) || defined(JAVACALLBACK) + /** + * Sets the handler to be called when data has been + * received + * @param call_obj Object used for callback - Java + */ + void setDataReceivedHandler (Callback *call_obj); +#else + /** + * Sets the handler to be called when data has been + * received + * @param handler Handler used for callback + */ + void setDataReceivedHandler (funcPtrVoidVoid handler); +#endif /** * Checks if the data has arrived */ @@ -350,8 +373,13 @@ class NRF24L01 { uint8_t m_txBuffer[MAX_BUFFER]; /**< Transmit buffer */ uint8_t m_bleBuffer [32]; /**< BLE buffer */ - funcPtrVoidVoid dataRecievedHandler; /**< Data arrived handler */ private: +#if defined(SWIGJAVA) || defined(JAVACALLBACK) + /**< Callback object to use for setting the handler from Java */ + Callback *callback_obj; +#endif + funcPtrVoidVoid dataReceivedHandler; /**< Data arrived handler */ + /** * Writes bytes to an SPI device */ @@ -385,7 +413,7 @@ class NRF24L01 { uint8_t swapbits (uint8_t a); - mraa::Spi m_spi; + mraa::Spi m_spi; uint8_t m_ce; uint8_t m_csn; uint8_t m_channel; @@ -394,8 +422,8 @@ class NRF24L01 { uint8_t m_payload; uint8_t m_localAddress[5]; - mraa::Gpio m_csnPinCtx; - mraa::Gpio m_cePinCtx; + mraa::Gpio m_csnPinCtx; + mraa::Gpio m_cePinCtx; std::string m_name; };