4 changed files with 79 additions and 0 deletions
@ -0,0 +1,52 @@
@@ -0,0 +1,52 @@
|
||||
|
||||
#include <stdlib.h> |
||||
#include <avr/interrupt.h> |
||||
|
||||
#include "ISRRegistry.h" |
||||
|
||||
using namespace AP_HAL_AVR; |
||||
|
||||
proc_ptr ISRRegistry::_registry[ISR_REGISTRY_NUM_SLOTS]; |
||||
|
||||
void ISRRegistry::init() { |
||||
for(int i = 0; i < ISR_REGISTRY_NUM_SLOTS; i++) { |
||||
_registry[i] = NULL; |
||||
} |
||||
} |
||||
|
||||
int ISRRegistry::register_signal(int signal, proc_ptr proc) |
||||
{ |
||||
if (signal >= 0 && signal < ISR_REGISTRY_NUM_SLOTS) { |
||||
_registry[signal] = proc; |
||||
return 0; |
||||
} |
||||
return -1; |
||||
} |
||||
|
||||
int ISRRegistry::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 ( ISRRegistry::_registry[ISR_REGISTRY_TIMER2_OVF] != NULL) |
||||
ISRRegistry::_registry[ISR_REGISTRY_TIMER2_OVF](); |
||||
} |
||||
|
||||
|
||||
extern "C" ISR(TIMER4_CAPT_vect) { |
||||
if ( ISRRegistry::_registry[ISR_REGISTRY_TIMER4_CAPT] != NULL) |
||||
ISRRegistry::_registry[ISR_REGISTRY_TIMER4_CAPT](); |
||||
} |
||||
|
||||
extern "C" ISR(TIMER5_CAPT_vect) { |
||||
if ( ISRRegistry::_registry[ISR_REGISTRY_TIMER5_CAPT] != NULL) |
||||
ISRRegistry::_registry[ISR_REGISTRY_TIMER5_CAPT](); |
||||
} |
||||
|
@ -0,0 +1,24 @@
@@ -0,0 +1,24 @@
|
||||
|
||||
|
||||
#ifndef __AP_HAL_AVR_ISR_REGISTRY_H__ |
||||
#define __AP_HAL_AVR_ISR_REGISTRY_H__ |
||||
|
||||
#include "AP_HAL_AVR_Namespace.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 AP_HAL_AVR::ISRRegistry { |
||||
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 // __AP_HAL_AVR_ISR_REGISTRY_H__
|
Loading…
Reference in new issue