/**
 * @addtogroup pilote_arm_timer
 * Pilote des timers du microcontr�leur OKI ML675001
 * @{
 */

/**
 * @file timer.h
 *
 * @brief Interface du pilote des timers du microcontr�leur OKI ML675001
 *
 * $Author$
 * $Date$
 *
 * @version 2.0
 * $Revision$
 */

#ifndef H_TIMER
#define H_TIMER

#include "timer_parametres_possibles.h"
#include "miro_types.h"

/**
 * @name Fonction d'initialisation
 * @{
 */

/**
 * @brief Initialisation de tous les timers
 *
 * Cette fonction initialise tous les timers avec les r�glages par d�faut d�finis dans le
 * fichier timer_configuration_par_defaut.h.
 * Toutes les timers sont arr�t�s et toutes les interruptions timers sont d�sactiv�es.
 */
void Timer_initialiser ();

/** @} */

/**
 * @name Fonctions de configuration
 * @{
 */

/**
 * @brief R�glage du mode de fonctionnement d'un timer
 *
 * @param timer Le num�ro du timer � configurer (entre 0 et 5)
 * @param mode Le mode de comptage (valeurs possibles : TIMER_INTERVAL, TIMER_ONE_SHOT)
 */
void Timer_set_mode (int timer, int mode);

/**
 * @brief R�glage du pr�diviseur d'un timer
 *
 * @param timer Le num�ro du timer � configurer (entre 0 et 5)
 * @param pre Le facteur de pr�division (valeurs possibles : TIMER_PREDIVISEUR_1 � TIMER_PREDIVISEUR_32)
 */
void Timer_set_prediviseur (int timer, int pre);

/**
 * @brief R�glage de la valeur initiale d'un timer
 *
 * Lorsque le timer atteind sa valeur finale, il se recharge automatiquement avec sa valeur initiale.
 *
 * @param timer Le num�ro du timer � configurer (entre 0 et 5)
 * @param valeur La valeur initiale � affecter au timer
 */
void Timer_set_valeur_initiale (int timer, UInt16 valeur);

/**
 * @brief R�glage de la valeur finale d'un timer
 *
 * Lorsque le timer atteind sa valeur finale, il se recharge automatiquement avec sa valeur initiale.
 *
 * @param timer Le num�ro du timer � configurer (entre 0 et 5)
 * @param valeur La valeur finale � affecter au timer
 */
void Timer_set_valeur_finale (int timer, UInt16 valeur);

/**
 * @brief R�glage automatique d'un timer pour une dur�e fix�e, en microsecondes
 *
 * Cette fonction calcule automatiquement le modulo et le facteur de pr�division du timer
 * pour atteindre la dur�e souhait�e.
 * Si cette dur�e exc�de les possibilit�s du timer, elle retourne un facteur de post-division
 * � appliquer.
 *
 * @param timer Le num�ro du timer � configurer (entre 0 et 5)
 * @param duree La dur�e entre deux rebouclages, en microsecondes
 * @return Un facteur de postdivision, si n�cessaire
 */
UInt32 Timer_set_periode (int timer, UInt32 duree);

/** @} */

/**
 * @name Fonctions de gestion des �v�nements
 * @{
 */

/**
 * @brief Activer les demandes d'interruption pour un timer
 *
 * @param timer Le num�ro du timer � configurer (entre 0 et 5)
 */
void Timer_activer_interruptions (int timer);

/**
 * @brief D�sactiver les demandes d'interruption pour un timer
 *
 * @param timer Le num�ro du timer � configurer (entre 0 et 5)
 */
void Timer_desactiver_interruptions (int timer);

/**
 * @brief Tester l'�tat d'un timer
 *
 * @param timer Le num�ro du timer � tester (entre 0 et 5)
 * @return 0 si le timer n'a pas encore atteint sa valeur finale, une valeur non nulle si le timer a d�marr� un nouveau cycle de comptage
 */
int Timer_evenement (int timer);

/**
 * @brief Acquitter un �v�nement timer
 *
 * Cette fonction remet � z�ro l'indicateur de d�bordement d'un timer.
 *
 * @param timer Le num�ro du timer (entre 0 et 5)
 */
void Timer_acquitter_evenement (int timer);

/** @} */

/**
 * @name Fonctions de contr�le du fonctionnement d'un timer
 * @{
 */

/**
 * @brief D�marrer un timer
 *
 * @param timer Le num�ro du timer � d�marrer (entre 0 et 5)
 */
void Timer_demarrer (int timer);

/**
 * @brief Arr�ter un timer
 *
 * @param timer Le num�ro du timer � arr�ter (entre 0 et 5)
 */
void Timer_arreter (int timer);

/**
 * @brief Lire la valeur courante du compteur
 *
 * @param timer Le num�ro du timer � tester (entre 0 et 5)
 * @return La valeur courante du compteur
 */
UInt16 Timer_get_valeur (int timer);

/**
 * @brief Temporisation bloquante
 *
 * Cette fonction utilise le timer 1 pour mettre le programme en attente pendant
 * une dur�e fix�e.
 *
 * @param timer Le num�ro du timer � utiliser (entre 0 et 5)
 * @param duree Dur�e d'attente, en microsecondes
 */
void Timer_attendre (int timer, UInt32 duree);

/** @} */

#endif

/** @} */