#include "interrupt.h"
#include "interrupt_registers.h"
#include "gpio.h"
#include "timer.h"

void Interrupt::interruptHandler ( void )
{
	uint32_t pending = regRead(INTERRUPT::INTST);
	if (pending & 0x80) {             
		Pins::WriteAllPins(Pins::ReadAllPins() ^ 0x00008000);
		regWrite(INTERRUPT::INTST, 0x80);
	}
}

void Interrupt::Initialize(void)
{
	regWrite(INTERRUPT::INTMC, 0);
	uint32_t* vector = reinterpret_cast<uint32_t*> (0x18);
	uint32_t vec = ((reinterpret_cast<uint32_t>(&interruptHandler) - (uint32_t)vector - 0x8) >> 2 );
	vec = static_cast<uint32_t>(0xEA000000 | vec);
	*vector = vec;
}
   
void Interrupt::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 )
{
}
    	
void Interrupt::Set_LAN_MAC_InterruptPriority(
	INTERRUPT_PRIORITY TransmitStatusPriority,
	INTERRUPT_PRIORITY ReceiveStatusPriority,
	INTERRUPT_PRIORITY TransmitBufferUnavailablePriority,
	INTERRUPT_PRIORITY ReceiveBufferUnavailablePriority,
	INTERRUPT_PRIORITY TransmitProcessStoppedPriority,
	INTERRUPT_PRIORITY ReceiveProcessStoppedPriority )
{
}
    
void Interrupt::SetTimersInterruptPriority(
	INTERRUPT_PRIORITY Timer1Priority,
	INTERRUPT_PRIORITY Timer0Priority )
{
	regWrite(INTERRUPT::INTPT, 
		static_cast<uint32_t>(Timer1Priority) << 4 | 
		static_cast<uint32_t> (Timer0Priority));
}
    	
void Interrupt::Set_UART_InterruptPriority(
	INTERRUPT_PRIORITY ModemStatusPriority,
	INTERRUPT_PRIORITY LineErrorPriority,
	INTERRUPT_PRIORITY ReceivePriority,
	INTERRUPT_PRIORITY TransmitPriority )
{
}	
    	
void Interrupt::SetCommunicationsChannelInterruptPriority(
	INTERRUPT_PRIORITY TransmitPriority,	
	INTERRUPT_PRIORITY ReceivePriority )
{
}
    	
void Interrupt::SetBusErrorResponseInterruptPriority(
	INTERRUPT_PRIORITY Priority )  	
{
}

void Interrupt::Enable( INTERRUPTS irq )
{
	regWrite(INTERRUPT::INTEN, 
		regRead(INTERRUPT::INTEN) | (1 << static_cast<uint32_t> (irq)));
}
   
void Interrupt::Disable( INTERRUPTS irq )
{
	regWrite(INTERRUPT::INTEN, 
		regRead(INTERRUPT::INTEN) & ~(1 << static_cast<uint32_t> (irq)));
}
