#include "MyTimer.h"
#include "stm32f10x.h"
#include "Driver_GPIO.h"
#include "Plateau.h"
#include "Telecommande.h"
#define NULL 0

/* Declaration */
USART_TypeDef USART ;
USART_TypeDef * Usart = &USART;
MyGPIO_Struct_TypeDef GPIOA10; // pin rx = reception 
MyGPIO_Struct_TypeDef GPIOA9; // pin tx = envoie 
void (* ptr) (char) = NULL;

/* Configuration de l'UART */
void Init_USART (USART_TypeDef * USART){
	
	/* Configuration des GPIOs */
	GPIOA10.GPIO = GPIOA;
	GPIOA10.GPIO_Pin = 10;
	GPIOA10.GPIO_Conf = In_Floating;  
	MyGPIO_Init(&GPIOA10);
	
	GPIOA9.GPIO = GPIOA;
	GPIOA9.GPIO_Pin = 9;
	GPIOA9.GPIO_Conf = AltOut_Ppull;
	MyGPIO_Init(&GPIOA9);
	
	/* Configuration de l'USART */
	RCC->APB2ENR |= RCC_APB2ENR_USART1EN ; // activation de la clock
	USART1->CR1 |= USART_CR1_UE ; // rendre usart enable
	USART1->CR1 &= ~(USART_CR1_M); // mettre à 8 la longueur du mot
	
	// bd 9600 (cf. prof) puis calcul de la mantisse et de la fraction (cf. p 804)
	USART1->BRR |= 0x0C; // mantisse
	USART1->BRR |= (0x01D4 << 4) ; // fraction
	
	// Active la reception et l'emission
	USART1->CR1 |= USART_CR1_RE;
	USART1->CR1 |= USART_CR1_TE;
	
	/* On active les interruptions pour l'usart1 */
	USART1->CR1 |= USART_CR1_RXNEIE;
}

/* Envoie d'un character */
void Send_Char (char c) {
	while (((USART1->SR >> 6) & 0x1) == 0);// tant que la transmission n'est pas finie
	USART1->DR = c;
}

/* Envoie de messages */
void Send_Message (char message[]){
	int i = 0;
	while (message[i] != '\0') {
		Send_Char(message[i]);
		i+=1;
	}
}



void USART1_IRQHandler() {
	char input;
	input = USART1->DR ; // on récupère ce qu'il y a dans le registre
	(*ptr) (input); // on execute la fonction
}

/* Reception de message */
void Init_Message_Reception(void (* pFonction) (char)){ //(void (* pFonction) (char)){
	
	/* Configuration de l'interruption */
	//!\\ A revoir cette partie ! p 198
	NVIC->ISER[1] |= NVIC_ISER_SETENA_5 ;//NVIC_IABR_ACTIVE_5 ;    // on autorise l'interuption au niveau du coeur par le usart1
	NVIC->IP[37] = 7; // on parametre la prio de l'usart
	
	/* Activation de la réception */
	USART1->CR1 |= USART_CR1_RE ;
	ptr = pFonction; //fonction à appeler par le handler
	
	
}



