#include "InterruptController.h"



void initInterruptRouting(uint8_t pin1, uint8_t pin2){
	RCC->AHB1ENR |= RCC_AHB1ENR_GPIOFEN;
	RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
	
	SYSCFG ->EXTICR[0] &= (0xf << (4*pin1));
	SYSCFG ->EXTICR[0] |= (GPIOFMASK << (4*pin1));
	EXTI->RTSR |= (1<<pin1);	// Aufsteigende Flanke
	EXTI->FTSR |= (1<<pin1);	// Absteigenden Flanke
	EXTI->IMR |= (1<<pin1);		// Unmask Int<<Pin1
	
	SYSCFG ->EXTICR[0] &= (0xf << (4*pin2));
	SYSCFG ->EXTICR[0] |= (GPIOFMASK << (4*pin2));
	EXTI->RTSR |= (1<<pin2);	// Aufsteigende Flanke
	EXTI->FTSR |= (1<<pin2);	// Absteigenden Flanke
	EXTI->IMR |= (1<<pin2);		// Unmask Int<<Pin2
	}

void initInterruptController(){
	EXTI->IMR |= (1<<3);
	NVIC_SetPriorityGrouping(2);
	
	NVIC_SetPriority(EXTI2_IRQn,8);
	NVIC_EnableIRQ(EXTI2_IRQn);
	
	NVIC_SetPriority(EXTI3_IRQn,8);
	NVIC_EnableIRQ(EXTI3_IRQn);
}

void EXTI2_IRQHandler(){
	EXTI->PR = (1<<2);
	int8_t temp;
	temp = ~(GPIOF->IDR & CHANNELA);		//0x0000 || 0x0000 || 0x0100 || 0x0100	
	temp |= ~(GPIOF->IDR & CHANNELB);		//0x0000 || 0x1000 || 0x1100 || 0x0100
	if((temp & CHMSK) == CHMSK || (temp & CHMSK) == 0){
		temp = 1;		// vor
		direction = 1;
		/*t02 = 0;
		t01 += get_uptime();*/
	}
	else{
	  temp = -1;	// rück
		direction = -1;
	/*	t01 = 0;
		t02 += get_uptime();*/
	}
	count += temp;
	
}

void EXTI3_IRQHandler(){
	EXTI->PR = (1<<3);
	int8_t temp;
	temp = ~(GPIOF->IDR & CHANNELA);		//0x0000 || 0x0000 || 0x0100 || 0x0100	
	temp |= ~(GPIOF->IDR & CHANNELB);		//0x0000 || 0x1000 || 0x1100 || 0x0100
	if((temp & CHMSK) == CHMSK || (temp & CHMSK) == 0){
		/*t01 = 0;
		t02 += get_uptime();*/
		temp = -1;	// rück
		direction = -1;
	}	
	else{
		temp = 1;		// vor
		direction = 1;
		/*t02 = 0;
		t01 += get_uptime();*/
	}	
	count += temp;
}

int read_State(){
	int steps;
	NVIC_DisableIRQ(EXTI2_IRQn);
	NVIC_DisableIRQ(EXTI3_IRQn);
	steps = count;
	direct = direction;
	NVIC_EnableIRQ(EXTI2_IRQn);
	NVIC_EnableIRQ(EXTI3_IRQn);
	return steps;
}

