diff options
Diffstat (limited to 'src/wiring/ext_interrupts.c')
| -rw-r--r-- | src/wiring/ext_interrupts.c | 49 | 
1 files changed, 44 insertions, 5 deletions
| diff --git a/src/wiring/ext_interrupts.c b/src/wiring/ext_interrupts.c index 0a35472..20ec11f 100644 --- a/src/wiring/ext_interrupts.c +++ b/src/wiring/ext_interrupts.c @@ -1,3 +1,28 @@ +/* ***************************************************************************** + *  This program is free software: you can redistribute it and/or modify + *  it under the terms of the GNU General Public License as published by + *  the Free Software Foundation, either version 3 of the License, or + *  (at your option) any later version. + * + *  This program is distributed in the hope that it will be useful, + *  but WITHOUT ANY WARRANTY; without even the implied warranty of + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + *  GNU General Public License for more details. + * + *  You should have received a copy of the GNU General Public License + *  along with this program.  If not, see <http://www.gnu.org/licenses/>. + * + *  Created: 12/18/09 02:39:48 + *  Copyright (c) 2009 Perry L. Hung. All rights reserved. + * + * ****************************************************************************/ + +/** + *  @file ext_interrupts.c + * + *  @brief Wiring-like interface for external interrupts + */ +  #include "wiring.h"  #include "exti.h"  #include "ext_interrupts.h" @@ -25,7 +50,6 @@ static ExtiInfo PIN_TO_EXTI_CHANNEL[NR_MAPLE_PINS] = {  }; -  /**   *  @brief Attach an interrupt handler to be triggered on a given   *  transition on the pin. Runs in interrupt context @@ -36,23 +60,38 @@ static ExtiInfo PIN_TO_EXTI_CHANNEL[NR_MAPLE_PINS] = {   *   *  @sideeffect Registers a handler   */ -int attachInterrupt(uint8_t pin, void (*handler)(void), uint8_t mode) { +int attachInterrupt(uint8_t pin, voidFuncPtr handler, ExtInterruptTriggerMode mode) { +    uint8_t outMode;      /* Parameter checking  */      if (pin >= NR_MAPLE_PINS) {          return EXT_INTERRUPT_INVALID_PIN;      }      if (!handler) { +        ASSERT(0);          return EXT_INTERRUPT_INVALID_FUNCTION;      } -    if (!(mode < NR_EXTI_MODES)) { -        return EXT_INTERRUPT_INVALID_MODE; +    switch (mode) { +    case RISING: +        outMode = EXTI_RISING; +        break; +    case FALLING: +        outMode = EXTI_FALLING; +        break; +    case CHANGE: +        outMode = EXTI_RISING_FALLING; +        break; +    default: +        ASSERT(0); +        return EXT_INTERRUPT_INVALID_MODE;;      } -    exti_attach_interrupt(PIN_TO_EXTI_CHANNEL[pin].channel,  +    exti_attach_interrupt(PIN_TO_EXTI_CHANNEL[pin].channel,                            PIN_TO_EXTI_CHANNEL[pin].port,                            handler, mode); + +    return 0;  }  int detachInterrupt(uint8_t pin) { | 
