/*! \file extint.h \brief External-Interrupt function library. */
//*****************************************************************************
//
// File Name	: 'extint.h'
// Title		: External-Interrupt function library
// Author		: Pascal Stang - Copyright (C) 2002-2004
// Created		: 5/10/2002
// Revised		: 11/16/2004
// Version		: 1.0
// Target MCU	: Atmel AVR Series
// Editor Tabs	: 4
//
// Notes:	This library provides convenient standardized configuration and
//			access to external interrupts.  The library is designed to make
//			it possible to write code that uses external interrupts without
//			digging into the processor datasheets to find register names and
//			bit-defines.  The library also strives to allow code which uses
//			external interrupts to more easily cross-compile between different
//			microcontrollers.
//
//			NOTE: Using this library has certain advantages, but also adds
//			overhead and latency to interrupt servicing.  If the smallest
//			code size or fastest possible latency is needed, do NOT use this
//			library; link your interrupts directly.
//
//*****************************************************************************

#ifndef EXTINT_H
#define EXTINT_H

#include "global.h"

// constants/macros/typdefs

// interrupt macros for attaching user functions to external interrupts
// use these with extintAttach( intNum, function )
#define EXTINT0					0x00	///< External Interrupt 0
#define EXTINT1					0x01	///< External Interrupt 1
#define EXTINT2					0x02	///< External Interrupt 2
#define EXTINT3					0x03	///< External Interrupt 3
#define EXTINT4					0x04	///< External Interrupt 4
#define EXTINT5					0x05	///< External Interrupt 5
#define EXTINT6					0x06	///< External Interrupt 6
#define EXTINT7					0x07	///< External Interrupt 7

#define EXTINT_LEVEL_LOW		0x00	///< Trigger on low level
#define EXTINT_EDGE_ANY			0x01	///< Trigger on any edge
#define EXTINT_EDGE_FALLING		0x02	///< Trigger on falling edge
#define EXTINT_EDGE_RISING		0x03	///< Trigger on rising edge

// type of interrupt handler to use
// *do not change unless you know what you're doing
// Value may be SIGNAL or INTERRUPT
#ifndef EXTINT_INTERRUPT_HANDLER
#define EXTINT_INTERRUPT_HANDLER	SIGNAL
#endif

// processor-adaptive defines
// mainstream AVR processors generally have 1,2,3, or 8 external interrupts
// (if someone has a better idea of how to manage this, let me know)
#ifdef SIG_INTERRUPT7
	#define EXTINT_NUM_INTERRUPTS	8
#else
#ifdef SIG_INTERRUPT2
	#define EXTINT_NUM_INTERRUPTS	3
#else
#ifdef SIG_INTERRUPT1
	#define EXTINT_NUM_INTERRUPTS	2
#else
	#define EXTINT_NUM_INTERRUPTS	1
#endif
#endif
#endif

// functions

//! initializes extint library
void extintInit(void);

//! Configure external interrupt trigger
void extintConfigure(u08 interruptNum, u08 configuration);

// extintAttach and extintDetach commands
//		These functions allow the attachment (or detachment) of any user
//		function to an external interrupt.  "Attaching" one of your own
//		functions to an interrupt means that it will be called whenever
//		that interrupt is triggered.  Example usage:
//
//		extintAttach(EXTINT0, myInterruptHandler);
//		extintDetach(EXTINT0);
//
//		extintAttach causes the myInterruptHandler() to be attached, and therefore
//		execute, whenever the corresponding interrupt occurs.  extintDetach removes
//		the association and executes no user function when the interrupt occurs.
//		myInterruptFunction must be defined with no return value and no arguments:
//
//		void myInterruptHandler(void) { ... }

//! Attach a user function to an external interrupt
void extintAttach(u08 interruptNum, void (*userHandler)(void) );
//! Detach a user function from an external interrupt
void extintDetach(u08 interruptNum);

#endif
