diff --git a/src/grove/grove.cxx b/src/grove/grove.cxx index a3943a74..e9a7cb68 100644 --- a/src/grove/grove.cxx +++ b/src/grove/grove.cxx @@ -277,3 +277,26 @@ int GroveButton::value() { return mraa_gpio_read(m_gpio); } + +#ifdef JAVACALLBACK +void GroveButton::installISR(mraa::Edge level, IsrCallback *cb) +{ + installISR(level, generic_callback_isr, cb); +} +#endif + +void GroveButton::installISR(mraa::Edge level, void (*isr)(void *), void *arg) +{ + if (m_isrInstalled) + uninstallISR(); + + // install our interrupt handler + mraa_gpio_isr(m_gpio, (mraa_gpio_edge_t) level, isr, arg); + m_isrInstalled = true; +} + +void GroveButton::uninstallISR() +{ + mraa_gpio_isr_exit(m_gpio); + m_isrInstalled = false; +} diff --git a/src/grove/grove.h b/src/grove/grove.h index e7f0fb97..bdeff8c8 100644 --- a/src/grove/grove.h +++ b/src/grove/grove.h @@ -26,8 +26,12 @@ #pragma once #include -#include -#include +#include +#include + +#ifdef JAVACALLBACK +#include "../IsrCallback.h" +#endif namespace upm { @@ -378,7 +382,31 @@ class GroveButton: public Grove { * @return Value from the GPIO pin */ int value(); + + /** + * Installs an interrupt service routine (ISR) to be called when + * the button is activated or deactivated. + * + * @param fptr Pointer to a function to be called on interrupt + * @param arg Pointer to an object to be supplied as an + * argument to the ISR. + */ +#if defined(SWIGJAVA) || defined(JAVACALLBACK) + void installISR(mraa::Edge level, IsrCallback *cb); +#else + void installISR(mraa::Edge level, void (*isr)(void *), void *arg); +#endif + /** + * Uninstalls the previously installed ISR + * + */ + void uninstallISR(); + private: +#if defined(SWIGJAVA) || defined(JAVACALLBACK) + void installISR(mraa::Edge level, void (*isr)(void *), void *arg); +#endif + bool m_isrInstalled; std::string m_name; mraa_gpio_context m_gpio; }; diff --git a/src/grove/javaupm_grove.i b/src/grove/javaupm_grove.i index f7a9b9bf..2a3075bf 100644 --- a/src/grove/javaupm_grove.i +++ b/src/grove/javaupm_grove.i @@ -1,6 +1,14 @@ -%module javaupm_grove +%module (directors="1", docstring="Basic Grove sensors") javaupm_grove + %include "../upm.i" +%feature("director") IsrCallback; + +%ignore generic_callback_isr; +%include "../IsrCallback.h" + +%apply int {mraa::Edge} + %{ #include "grove.h" %}