#include "Driver_GPIO.h" 

void MyGPIO_Activate(int nb_GPIO) {
	//activer la clock du GPIO donné
	RCC->APB2ENR |= (0x01 << (nb_GPIO +1)) ;
	//RCC->APB2ENR |= (0x01 << 2 | 0x01 << 3 | 0x01 << 4) ;
}

/*
void MyGPIO_Desactivate(int nb_GPIO) {
	//désactiver le GPIO donné
	RCC->APB2ENR &= ~(0x01 << (nb_GPIO +1)) ;
}*/

//la structure est déjà remplie
void MyGPIO_Init(MyGPIO_Struct_TypeDef * GPIOStructPtr) {
	//màj crl si on veut un pull up ou pull down
	//on reset la conf
	
	if(GPIOStructPtr->GPIO_Pin > 7){
		GPIOStructPtr->GPIO->CRH &= ~(0xF << ((GPIOStructPtr->GPIO_Pin*4) - (8*4)));
		
		//on met la bonne conf
		if (GPIOStructPtr->GPIO_Conf == In_PullUp) {
			//on est en pull up -> on met à 1 par défaut
			GPIOStructPtr->GPIO->CRH |= (In_PullDown << ((GPIOStructPtr->GPIO_Pin*4) - (8*4)));
			MyGPIO_Set(GPIOStructPtr->GPIO, GPIOStructPtr->GPIO_Pin);
		}
		else {
			GPIOStructPtr->GPIO->CRH |= (GPIOStructPtr->GPIO_Conf << ((GPIOStructPtr->GPIO_Pin*4) - (8*4)));
		}		
	}
	else {
		GPIOStructPtr->GPIO->CRL &= ~(0xF << (GPIOStructPtr->GPIO_Pin*4));
		
		//on met la bonne conf
		if (GPIOStructPtr->GPIO_Conf == In_PullUp) {
			//on est en pull up -> on met à 1 par défaut
			GPIOStructPtr->GPIO->CRL |= (In_PullDown << (GPIOStructPtr->GPIO_Pin*4));
			MyGPIO_Set(GPIOStructPtr->GPIO, GPIOStructPtr->GPIO_Pin);
		}
		else {
			GPIOStructPtr->GPIO->CRL |= (GPIOStructPtr->GPIO_Conf << (GPIOStructPtr->GPIO_Pin * 4));
		}
	}
	
}

int MyGPIO_Read(GPIO_TypeDef * GPIO, char GPIO_Pin) {
	return (GPIO->IDR & (1 << GPIO_Pin)) ;
}

void MyGPIO_Set(GPIO_TypeDef * GPIO, char GPIO_Pin){
	//GPIO->ODR |= (1 << GPIO_Pin);
	GPIO->BSRR = (1 << GPIO_Pin) ;
}

void MyGPIO_Reset(GPIO_TypeDef * GPIO, char GPIO_Pin) {
	//GPIO->ODR &= ~(1 << GPIO_Pin);
	//d'après la data sheet, il faut écrire dans la partie des bits compris entre 16 et 31
	GPIO->BSRR = (1 << (GPIO_Pin + 16)) ;
}

void MyGPIO_Toggle(GPIO_TypeDef * GPIO, char GPIO_Pin){
	//voir si il y a une meilleur manière
	if (GPIO->ODR & (1 << GPIO_Pin)) {
		//dans ce cas c'est activé donc on le désactive
		MyGPIO_Reset(GPIO, GPIO_Pin);
	}
	else {
		//c'était désactivé donc on l'active
		MyGPIO_Set(GPIO, GPIO_Pin);
	}
}
