// A COMPLETER

/*
Service permettant de chornométrer jusqu'à 59mn 59s 99 1/100
Utilise un timer au choix (TIMER1 à TIMER4).
Utilise la lib MyTimers.h /.c
*/



#include "Chrono.h"
#include "Timer.h"

// variable privée de type Time qui mémorise la durée mesurée
static Time Chrono_Time; // rem : static rend la visibilité de la variable Chrono_Time limitée à ce fichier 

// variable privée qui mémorise pour le module le timer utilisé par le module
static TIM_TypeDef * Chrono_Timer=TIM1; // init par défaut au cas où l'utilisateur ne lance pas Chrono_Conf avant toute autre fct.

// déclaration callback appelé toute les 10ms
void Chrono_Task_10ms(void);

/**
* @brief  Configure le chronomètre. 
* @note   A lancer avant toute autre fonction.
* @param  Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
* @retval None
*/
void Chrono_Conf(TIM_TypeDef * Timer)
{
// Reset Time
Chrono_Time.Hund = 0;
Chrono_Time.Sec = 0;
Chrono_Time.Min = 0;

// Fixation du Timer
Chrono_Timer = Timer;

// Réglage Timer pour un débordement à 10ms
Timer_conf(Chrono_Timer, 999, 719);

// Réglage des interruptions
Timer_IT_conf(Chrono_Timer, Chrono_Task_10ms, 3);
Timer_IT_enable(Chrono_Timer);
}


/**
* @brief  Démarre le chronomètre. 
* @note   si la durée dépasse 59mn 59sec 99 Hund, elle est remise à zéro et repart
* @param  Aucun
* @retval Aucun
*/
void Chrono_Start(void)
{
Timer_start(Chrono_Timer);
}


/**
* @brief  Arrête le chronomètre. 
* @note   
* @param  Aucun
* @retval Aucun
*/
void Chrono_Stop(void)
{
Timer_stop(Chrono_Timer);
}


/**
* @brief  Remet le chronomètre à 0 
* @note   
* @param  Aucun
* @retval Aucun
*/
void Chrono_Reset(void)
{
// Arrêt Chrono
Timer_stop(Chrono_Timer);

// Reset Time
Chrono_Time.Hund=0;
Chrono_Time.Sec=0;
Chrono_Time.Min=0;
}


/**
* @brief  Renvoie l'adresse de la variable Time privée gérée dans le module Chrono.c
* @note   
* @param  Aucun
* @retval adresse de la variable Time
*/
Time * Chrono_Read(void)
{
return &Chrono_Time;
}




/**
* @brief  incrémente la variable privée Chron_Time modulo 60mn 
* @note   
* @param  Aucun
* @retval Aucun
*/
void Chrono_Task_10ms(void)
{ 
Chrono_Time.Hund++;
if (Chrono_Time.Hund==100)
{
Chrono_Time.Sec++;
Chrono_Time.Hund=0;
}
if (Chrono_Time.Sec==60)
{
Chrono_Time.Min++;
Chrono_Time.Sec=0;
}
if (Chrono_Time.Min==60)
{
Chrono_Time.Hund=0;
}

}

