Browse Source
this allows libraries to register interrupt handlers, so multiple components can use the same hardware level interruptmission-4.1.18
Pat Hickey
13 years ago
2 changed files with 70 additions and 0 deletions
@ -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 @@ |
|||||||
|
|
||||||
|
#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