Browse Source
this allows libraries to register interrupt handlers, so multiple components can use the same hardware level interruptmission-4.1.18
2 changed files with 70 additions and 0 deletions
@ -0,0 +1,48 @@
@@ -0,0 +1,48 @@
|
||||
|
||||
#include <stdlib.h> |
||||
#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](); |
||||
} |
@ -0,0 +1,22 @@
@@ -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__
|
Loading…
Reference in new issue