From 1daadb5068f5a25d253f13f641b9ba38a3966d0e Mon Sep 17 00:00:00 2001 From: Pat Hickey Date: Sun, 13 Nov 2011 14:01:13 +1100 Subject: [PATCH] purple: added ISR_Registry() library this allows libraries to register interrupt handlers, so multiple components can use the same hardware level interrupt --- .../Arduino_Mega_ISR_Registry.cpp | 48 +++++++++++++++++++ .../Arduino_Mega_ISR_Registry.h | 22 +++++++++ 2 files changed, 70 insertions(+) create mode 100644 libraries/Arduino_Mega_ISR_Registry/Arduino_Mega_ISR_Registry.cpp create mode 100644 libraries/Arduino_Mega_ISR_Registry/Arduino_Mega_ISR_Registry.h diff --git a/libraries/Arduino_Mega_ISR_Registry/Arduino_Mega_ISR_Registry.cpp b/libraries/Arduino_Mega_ISR_Registry/Arduino_Mega_ISR_Registry.cpp new file mode 100644 index 0000000000..ef3bd790fd --- /dev/null +++ b/libraries/Arduino_Mega_ISR_Registry/Arduino_Mega_ISR_Registry.cpp @@ -0,0 +1,48 @@ + +#include +#include "Arduino_Mega_ISR_Registry.h" +#include "avr/interrupt.h" + +proc_ptr Arduino_Mega_ISR_Registry::_registry[ISR_REGISTRY_NUM_SLOTS]; + +void Arduino_Mega_ISR_Registry::init() +{ + for (int i = 0; i < ISR_REGISTRY_NUM_SLOTS; i++) + _registry[i] = NULL; +} + +int Arduino_Mega_ISR_Registry::register_signal(int signal, proc_ptr proc) +{ + if (signal >= 0 && signal < ISR_REGISTRY_NUM_SLOTS) { + _registry[signal] = proc; + return 0; + } + return -1; +} + +int Arduino_Mega_ISR_Registry::unregister_signal(int signal) +{ + if (signal >= 0 && signal < ISR_REGISTRY_NUM_SLOTS) { + _registry[signal] = NULL; + return 0; + } + return -1; +} + +/* ========== ISR IMPLEMENTATIONS ========== */ + +extern "C" ISR(TIMER2_OVF_vect) { + if (Arduino_Mega_ISR_Registry::_registry[ISR_REGISTRY_TIMER2_OVF] != NULL) + Arduino_Mega_ISR_Registry::_registry[ISR_REGISTRY_TIMER2_OVF](); +} + + +extern "C" ISR(TIMER4_CAPT_vect) { + if (Arduino_Mega_ISR_Registry::_registry[ISR_REGISTRY_TIMER4_CAPT] != NULL) + Arduino_Mega_ISR_Registry::_registry[ISR_REGISTRY_TIMER4_CAPT](); +} + +extern "C" ISR(TIMER5_CAPT_vect) { + if (Arduino_Mega_ISR_Registry::_registry[ISR_REGISTRY_TIMER5_CAPT] != NULL) + Arduino_Mega_ISR_Registry::_registry[ISR_REGISTRY_TIMER5_CAPT](); +} diff --git a/libraries/Arduino_Mega_ISR_Registry/Arduino_Mega_ISR_Registry.h b/libraries/Arduino_Mega_ISR_Registry/Arduino_Mega_ISR_Registry.h new file mode 100644 index 0000000000..0bd51539f7 --- /dev/null +++ b/libraries/Arduino_Mega_ISR_Registry/Arduino_Mega_ISR_Registry.h @@ -0,0 +1,22 @@ + +#ifndef __ARDUINO_MEGA_ISR_REGISTRY_H__ +#define __ARDUINO_MEGA_ISR_REGISTRY_H__ + +#define ISR_REGISTRY_TIMER2_OVF 0 +#define ISR_REGISTRY_TIMER4_CAPT 1 +#define ISR_REGISTRY_TIMER5_CAPT 2 +#define ISR_REGISTRY_NUM_SLOTS 3 + +typedef void (*proc_ptr)(void); + +class Arduino_Mega_ISR_Registry +{ + public: + void init(); + int register_signal(int isr_number, proc_ptr proc); + int unregister_signal(int isr_number); + + static proc_ptr _registry[ISR_REGISTRY_NUM_SLOTS]; +}; + +#endif // __ARDUINO_MEGA_ISR_REGISTRY_H__