108 lines
2.7 KiB
C++
108 lines
2.7 KiB
C++
/*
|
|
* IntereruptChain library v1.3.0 (20130601)
|
|
*
|
|
* Copyright 2011-2013 by Randy Simons http://randysimons.nl/
|
|
*
|
|
* License: GPLv3. See license.txt
|
|
*/
|
|
|
|
#include <InterruptChain.h>
|
|
|
|
void InterruptChainLink::init(InterruptCallback callbackIn, InterruptChainLink *nextIn) {
|
|
callback = callbackIn;
|
|
next = nextIn;
|
|
}
|
|
|
|
InterruptChainLink *InterruptChain::chain[MAX_INTERRUPTS] = {NULL};
|
|
byte InterruptChain::mode[MAX_INTERRUPTS] = {CHANGE};
|
|
|
|
void InterruptChain::setMode(byte interruptNr, byte modeIn) {
|
|
mode[interruptNr] = modeIn;
|
|
}
|
|
|
|
|
|
|
|
void InterruptChain::addInterruptCallback(byte interruptNr, InterruptCallback callback) {
|
|
InterruptChainLink *prevLink = chain[interruptNr]; // Note: the chain-array is NULL initialized, so the first time prevLink is indeed NULL
|
|
|
|
chain[interruptNr] = (InterruptChainLink *) malloc(sizeof(InterruptChainLink)); // malloc instead of new, due to the lack of new / delete support in AVR-libc
|
|
chain[interruptNr]->init(callback, prevLink);
|
|
|
|
enable(interruptNr);
|
|
}
|
|
|
|
void InterruptChain::enable(byte interruptNr) {
|
|
switch (interruptNr) {
|
|
case 0:
|
|
attachInterrupt(0, InterruptChain::processInterrupt0, mode[0]);
|
|
break;
|
|
case 1:
|
|
attachInterrupt(1, InterruptChain::processInterrupt1, mode[1]);
|
|
break;
|
|
case 2:
|
|
attachInterrupt(2, InterruptChain::processInterrupt2, mode[2]);
|
|
break;
|
|
case 3:
|
|
attachInterrupt(3, InterruptChain::processInterrupt3, mode[3]);
|
|
break;
|
|
case 4:
|
|
attachInterrupt(4, InterruptChain::processInterrupt4, mode[4]);
|
|
break;
|
|
case 5:
|
|
attachInterrupt(5, InterruptChain::processInterrupt5, mode[5]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void InterruptChain::disable(byte interruptNr) {
|
|
detachInterrupt(interruptNr);
|
|
}
|
|
|
|
void InterruptChain::processInterrupt0() {
|
|
InterruptChainLink *current = chain[0];
|
|
while(current) {
|
|
(current->callback)();
|
|
current = current->next;
|
|
}
|
|
}
|
|
|
|
void InterruptChain::processInterrupt1() {
|
|
InterruptChainLink *current = chain[1];
|
|
while(current) {
|
|
(current->callback)();
|
|
current = current->next;
|
|
}
|
|
}
|
|
|
|
void InterruptChain::processInterrupt2() {
|
|
InterruptChainLink *current = chain[2];
|
|
while(current) {
|
|
(current->callback)();
|
|
current = current->next;
|
|
}
|
|
}
|
|
|
|
void InterruptChain::processInterrupt3() {
|
|
InterruptChainLink *current = chain[3];
|
|
while(current) {
|
|
(current->callback)();
|
|
current = current->next;
|
|
}
|
|
}
|
|
|
|
void InterruptChain::processInterrupt4() {
|
|
InterruptChainLink *current = chain[4];
|
|
while(current) {
|
|
(current->callback)();
|
|
current = current->next;
|
|
}
|
|
}
|
|
|
|
void InterruptChain::processInterrupt5() {
|
|
InterruptChainLink *current = chain[5];
|
|
while(current) {
|
|
(current->callback)();
|
|
current = current->next;
|
|
}
|
|
}
|