diff --git a/build/shared/lib/keywords.txt b/build/shared/lib/keywords.txt index fa4df1c20f5..50331d07cf9 100644 --- a/build/shared/lib/keywords.txt +++ b/build/shared/lib/keywords.txt @@ -149,6 +149,8 @@ analogRead KEYWORD2 AnalogRead analogWrite KEYWORD2 AnalogWrite attachInterrupt KEYWORD2 AttachInterrupt detachInterrupt KEYWORD2 DetachInterrupt +attachInterruptToPin KEYWORD2 AttachInterruptToPin +detachInterruptFromPin KEYWORD2 DetachInterruptFromPin delay KEYWORD2 Delay delayMicroseconds KEYWORD2 DelayMicroseconds digitalWrite KEYWORD2 DigitalWrite diff --git a/build/shared/revisions.txt b/build/shared/revisions.txt index 238eed0025d..b317261e2be 100644 --- a/build/shared/revisions.txt +++ b/build/shared/revisions.txt @@ -1,3 +1,6 @@ + +* Added attachInterruptToPin command (Rob Tillaart) + ARDUINO 1.5.7 BETA [core] diff --git a/hardware/arduino/avr/cores/arduino/Arduino.h b/hardware/arduino/avr/cores/arduino/Arduino.h index 630f0d6d78e..dcae175308b 100644 --- a/hardware/arduino/avr/cores/arduino/Arduino.h +++ b/hardware/arduino/avr/cores/arduino/Arduino.h @@ -244,4 +244,22 @@ long map(long, long, long, long, long); #include "pins_arduino.h" +static inline boolean attachInterruptToPin(uint8_t pin, void (*userFunc)(void), int mode) +{ + int irq = digitalPinToInterrupt(pin); + if (irq == NOT_AN_INTERRUPT) + return false; + attachInterrupt(irq, userFunc, mode); + return true; +} + +static inline boolean detachInterruptFromPin(uint8_t pin) +{ + int irq = digitalPinToInterrupt(pin); + if (irq == NOT_AN_INTERRUPT) + return false; + detachInterrupt(irq); + return true; +} + #endif diff --git a/hardware/arduino/sam/cores/arduino/WInterrupts.c b/hardware/arduino/sam/cores/arduino/WInterrupts.c index 87b83e4572b..ba46e5cf1c3 100644 --- a/hardware/arduino/sam/cores/arduino/WInterrupts.c +++ b/hardware/arduino/sam/cores/arduino/WInterrupts.c @@ -129,6 +129,24 @@ void detachInterrupt(uint32_t pin) pio->PIO_IDR = mask; } +boolean attachInterruptToPin(uint8_t pin, void (*userFunc)(void), int mode) +{ + int irq = digitalPinToInterrupt(pin); + if (irq == NOT_AN_INTERRUPT) + return false; + attachInterrupt(irq, userFunc, mode); + return true; +} + +boolean detachInterruptFromPin(uint8_t pin) +{ + int irq = digitalPinToInterrupt(pin); + if (irq == NOT_AN_INTERRUPT) + return false; + detachInterrupt(irq); + return true; +} + #ifdef __cplusplus extern "C" { #endif diff --git a/hardware/arduino/sam/cores/arduino/WInterrupts.h b/hardware/arduino/sam/cores/arduino/WInterrupts.h index bb698cdf384..da73dcb2024 100644 --- a/hardware/arduino/sam/cores/arduino/WInterrupts.h +++ b/hardware/arduino/sam/cores/arduino/WInterrupts.h @@ -29,6 +29,10 @@ void attachInterrupt(uint32_t pin, void (*callback)(void), uint32_t mode); void detachInterrupt(uint32_t pin); +boolean attachInterruptToPin(uint8_t pin, void (*userFunc)(void), int mode); + +boolean detachInterruptFromPin(uint8_t pin); + #ifdef __cplusplus } #endif