/*! \file ech.h
\brief Gestion de la date et d'un échéancier
*/
#ifndef _ECH_H
#define _ECH_H

/*! \ingroup Gech
\brief Prototype d'un traitant d'échéance
	
L'action appelée en fin d'échéance reçoit l'échéance en paramètre.
*/
typedef void (*PhilEventHandler) (struct PhilEvent *);


/*! \ingroup Gech
\brief Descripteur de cellule de ech
	On réutilise la cellule de liste triée par priorité. La priorité est la date.
	On rajoute le traitement de fin d'échéance.

*/
typedef struct PhilEvent{  
	PhilCELL;/*!<   chainage de liste et date */
	PhilEventHandler action;	/*!<  action à échéance */
 }PhilEvent ; 




/*! \ingroup Gech
\brief descripteur  d'échéancier

C'est une liste 
*/

typedef PhilList PhilEventList;   


/*! \ingroup Gech
\brief macro pour définir une structure comme une échéance

Pour définir qu'une structure quelconque peut être une échéance, il suffit d'insérer PhilEVENT en premiere définition des composants de la structure 
\code
struct MyEvent{ 
	PhilEVENT;
	int x;
	int y;
	...
};
\endcode
*/


#define PhilEVENT   PhilEvent _event


                                
/*! \ingroup Gech
\brief Insertion  d'un évenement
\param q  échéancier où insérer
\param b  échéance à insérer


L'insertion place la nouvelle échéance à la suite des échéances de même date (ou de date inférieue) et devant celles de dates supérieures. On doit éventuellement (si insertion en tête ) relancer le décomptage avec une nouvelle valeur.
*/

extern void PhilEventListInsert(PhilEventList *q,PhilEvent *b);

/*! \ingroup Gech
\brief Obtenir les  échéances échues
\param q  échéancier à consulter
\param  past liste des échéances échues  (vide à l'appel)


	On obtient la liste des échéances <= à la date courante. Cette liste peut être vide.  Cette fonction sert à vider l'échéancier après une interruption de fin d'échéance. On relance éventuellement le décompteur.

*/

extern void PhilEventListPurge(PhilEventList *q, PhilEventList* past  );

/*! \ingroup Gech
\brief Retrait d'une échéance quelconque
\param q  liste où  retirer
\param b  cellule à retirer


	Une échéance est annulée (par ex. un signal est arrivé avant la fin du délai d'une attente sur une condition). On doit la retirer de la liste. Si cette échéance était la plus proche, on peut  recalculer éventuellement la prochaine échéance et relancer le décompte.
*/

extern void PhilEventListRetract(PhilEventList *q,PhilEvent *b) ;


/*!\ingroup Gech
\brief  Date courante
\return la date en microseconde
	

*/

      
extern long int PhilEventListNow();





        
/*! \ingroup Gech
\brief Initialisation de la liste
\param q liste à initialiser
\param date date initiale en microsecondes

initialise l'échéance et lance le calcul de la date 

*/
extern void PhilEventListInit(PhilEventList *q, long int date) ;



#endif
