#ifndef TIMER_H
#define TIMER_H

#include "stm32f103xb.h" 
#include "stm32f1xx_ll_tim.h" // Pour les timers

enum CounterDirection {
	CLOCKWISE = LL_TIM_COUNTERDIRECTION_UP,
	COUNTER_CLOCKWISE = LL_TIM_COUNTERDIRECTION_DOWN,
};


/****************************************************************************
	*																	INTERRUPTIONS
	***************************************************************************/

void Timer_IT_enable(TIM_TypeDef * timer);

void Timer_IT_disable(TIM_TypeDef * timer);

void Timer_IT_conf(TIM_TypeDef * timer, void (*it_callback) (void), int prio);


/****************************************************************************
	*																	TIMER
	***************************************************************************/


/**
	* @brief  Active l'horloge et r�gle l'ARR et le PSC du timer vis�
	* @note   Fonction � lancer avant toute autre. Le timer n'est pas encore lanc� (voir MyTimerStart)
	* @param  TIM_TypeDef Timer : indique le timer � utiliser par le chronom�tre, TIM1, TIM2, TIM3 ou TIM4
	* 				int Arr   : valeur � placer dans ARR
	*					int Psc   : valeur � placer dans PSC
	* @retval None
	*/
void Timer_conf(TIM_TypeDef * timer, int arr, int psc);


/**
	* @brief  D�marre le timer consid�r�
	* @note   
	* @param  TIM_TypeDef Timer : indique le timer � utiliser par le chronom�tre, TIM1, TIM2, TIM3 ou TIM4
	* @retval None
	*/
void Timer_start(TIM_TypeDef * timer);


/**
	* @brief  Arr�t le timer consid�r�
	* @note   
	* @param  TIM_TypeDef Timer : indique le timer � utiliser par le chronom�tre, TIM1, TIM2, TIM3 ou TIM4
	* @retval None
	*/
void Timer_stop(TIM_TypeDef * timer);


/****************************************************************************
	*																PWM INPUT
	***************************************************************************/

void PWMi_conf(TIM_TypeDef * timer, int channel);

int PWMi_getDutyCycle(TIM_TypeDef * timer);

int PWMi_getPeriod(TIM_TypeDef * TIMx);

/****************************************************************************
	*																PWM OUTPUT
	***************************************************************************/

/**
	* @brief  Configure le timer en mode PWM output � la fr�quence donn�e
  * @note   
	* @param  TIM_TypeDef Timer : indique le timer � utiliser : TIM1, TIM2, TIM3 ou TIM4
	*					int channel 			: Le channel utilis� par la PWM
	*					float freq  			: Fr�quence en Hz (entre 2Hz et pas trop grand svp)
	*					float dutyCycle 	: Valeur entre 0 et 1
  * @retval None
  */
void Timer_pwmo_conf(TIM_TypeDef * timer, int channel, float freq, float dutyCycle);

/**
	* @brief  Modifie la fr�quence des PWMs associ�es au timer donn�
  * @note   
	* @param  TIM_TypeDef Timer : indique le timer � utiliser : TIM1, TIM2, TIM3 ou TIM4
	*					float freq  			: Fr�quence en Hz (entre 2Hz et pas trop grand svp)
  * @retval None
  */
void Timer_pwmo_setFreq(TIM_TypeDef * timer, float freq);

/**
	* @brief  Modifie le duty cycle de la PWM
  * @note   
	* @param  TIM_TypeDef Timer : indique le timer � utiliser : TIM1, TIM2, TIM3 ou TIM4
	*					int channel 			: Le channel utilis� par la PWM
	*					float dutyCycle 	: Valeur entre 0 et 1
  * @retval None
  */
void Timer_pwmo_setDutyCycle(TIM_TypeDef * timer, int channel, float dutyCycle);

/**
	* @brief  R�cup�re le duty cycle de la PWM
  * @note   
	* @param  TIM_TypeDef Timer : indique le timer � utiliser : TIM1, TIM2, TIM3 ou TIM4
	*					int channel 			: Le channel utilis� par la PWM
  * @retval float dutyCycle
  */
float Timer_pwmo_getDutyCycle(TIM_TypeDef * timer, int channel);

/****************************************************************************
	*																ENCODER
	***************************************************************************/

/**
	* @brief  Configure le timer en mode encoder
  * @note   
	* @param  TIM_TypeDef Timer : indique le timer � utiliser : TIM1, TIM2, TIM3 ou TIM4
  * @retval None
  */
void Timer_encoder_conf(TIM_TypeDef * timer);

/**
	* @brief  R�cup�re l'angle, en degr�s
  * @note   
	* @param  TIM_TypeDef Timer : indique le timer � utiliser : TIM1, TIM2, TIM3 ou TIM4
  * @retval None
  */
int Timer_encoder_getAngle(TIM_TypeDef * timer);

/**
	* @brief  R�cup�re la direction
  * @note   
	* @param  TIM_TypeDef Timer : indique le timer � utiliser : TIM1, TIM2, TIM3 ou TIM4
  * @retval None
  */
enum CounterDirection Timer_encoder_getDirection(TIM_TypeDef * timer);

#endif
