#ifndef __INTERRUPT_H__
#define __INTERRUPT_H__

#include <stdint.h>

enum INTERRUPTS
{
	WAN_MAC_Changed						= 31,
	WAN_MAC_TransmitStatus				= 30,
	WAN_MAC_ReceiveStatus				= 29,
	WAN_MAC_TransmitBufferUnavailable	= 28,
	WAN_MAC_ReceiveBufferUnavailable	= 27,
	WAN_MAC_TransmitProcessStopped		= 26,
	WAN_MAC_ReceiveProcessStopped		= 25,
	AMBA_BusErrorResponse				= 24,
	LAN_MAC_TransmitStatus				= 17,
	LAN_MAC_ReceiveStatus				= 16,
	LAN_MAC_TransmitBufferUnavailable	= 15,
	LAN_MAC_ReceiveBufferUnavailable	= 14,
	LAN_MAC_TransmitProcessStopped		= 13,
	LAN_MAC_ReceiveProcessStopped		= 12,
	UART_ModemStatus					= 11,
	UART_LineError						= 10,
	UART_Receive						= 9,
	UART_Transmit						= 8,
	Timer1								= 7,
	Timer0								= 6,
	ExternalInterrupt3					= 5,
	ExternalInterrupt2					= 4,
	ExternalInterrupt1					= 3,
	ExternalInterrupt0					= 2,
	CommunicationsChannelTransmit		= 1,
	CommunicationsChannelReceive		= 0
};

enum INTERRUPT_PRIORITY
{
  HighestPriority	= 15,
  Level_14_Priority = 14,
  Level_13_Priority = 13,
  Level_12_Priority = 12,
  Level_11_Priority = 11,
  Level_10_Priority = 10,
  Level_9_Priority  = 9,
  Level_8_Priority  = 8,
  Level_7_Priority  = 7,
  Level_6_Priority  = 6,
  Level_5_Priority  = 5,
  Level_4_Priority  = 4,
  Level_3_Priority  = 3,
  Level_2_Priority  = 2,
  Level_1_Priority  = 1,
  LowestPriority    = 0
};

class Interrupt {
  public:

    static void Initialize( void );
    
    static void Set_WAN_MAC_InterruptPriority(
    	INTERRUPT_PRIORITY LinkChangedPriority,
    	INTERRUPT_PRIORITY TransmitStatusPriority,
    	INTERRUPT_PRIORITY ReceiveStatusPriority,
    	INTERRUPT_PRIORITY TransmitBufferUnavailablePriority,
    	INTERRUPT_PRIORITY ReceiveBufferUnavailablePriority,
    	INTERRUPT_PRIORITY TransmitProcessStoppedPriority,
    	INTERRUPT_PRIORITY ReceiveProcessStoppedPriority );
    	
    static void Set_LAN_MAC_InterruptPriority(
    	INTERRUPT_PRIORITY TransmitStatusPriority,
    	INTERRUPT_PRIORITY ReceiveStatusPriority,
    	INTERRUPT_PRIORITY TransmitBufferUnavailablePriority,
    	INTERRUPT_PRIORITY ReceiveBufferUnavailablePriority,
    	INTERRUPT_PRIORITY TransmitProcessStoppedPriority,
    	INTERRUPT_PRIORITY ReceiveProcessStoppedPriority );	
    	
	static void SetTimersInterruptPriority(
    	INTERRUPT_PRIORITY Timer1Priority,
    	INTERRUPT_PRIORITY Timer0Priority );
    	
    static void Set_UART_InterruptPriority(
    	INTERRUPT_PRIORITY ModemStatusPriority,
    	INTERRUPT_PRIORITY LineErrorPriority,
    	INTERRUPT_PRIORITY ReceivePriority,
    	INTERRUPT_PRIORITY TransmitPriority );	
    	
    static void SetCommunicationsChannelInterruptPriority(
    	INTERRUPT_PRIORITY TransmitPriority,	
    	INTERRUPT_PRIORITY ReceivePriority );
    	
    static void SetBusErrorResponseInterruptPriority(
    	INTERRUPT_PRIORITY Priority );
    	
	__inline static void EnableIRQ(void) {
       asm (
             " mov r0, #0        \n\
               mrs r0, CPSR      \n\
               bic r0, r0, #0x80 \n\
               msr CPSR_c, r0"
               :
               : );
			}
 
 	__inline static void DisableIRQ(void) {
	    asm (
	         " mov r0, #0        \n\
	           mrs r0, CPSR      \n\
		   	   orr r0, r0, #0x80 \n\
		       msr CPSR_c, r0"
		   	   :
	           : );
			}

    static void Enable( INTERRUPTS irq );
    static void Disable( INTERRUPTS irq );  
    
    private:
    	static void interruptHandler(void) __attribute__ ((interrupt("IRQ")));

};

#endif // __INTERRUPTS_H__
