unit Surveillance; interface uses Classes, Windows, SysUtils, ConvUtils, Dialogs, Math, idGlobal, Contnrs, Resultat_Surveillance; type {------------------------------------------------------------------------------} { CLASSE TSURVEILLANCE } {------------------------------------------------------------------------------} {*------------------------------------------------------------------------------ Classe de surveillance générique -------------------------------------------------------------------------------} TSurveillance = class(TObject) private { Déclarations privées } Function TickToDate(const _Tick : cardinal) : String; protected { Déclarations protégées } FListe_Definition : TObjectList; FListe_Defauts : TObjectList; Procedure Set_Liste_Definition(_Liste_Definition : TObjectList); virtual; Procedure Set_Liste_Defauts(_Liste_Defauts : TObjectList); virtual; Procedure Gerer_Redondance (_Resultat_Surveillance : TResultat_Surveillance); virtual; public { Déclarations publiques } Constructor Create; overload; virtual; Constructor Create(_Liste_Definition : TObjectList); overload; virtual; Destructor Destroy; override; Property Liste_Definition : TObjectList read FListe_Definition write Set_Liste_Definition ; Property Liste_Defauts : TObjectList read FListe_Defauts write Set_Liste_Defauts ; // Fonctions d'accès à la liste des défauts Procedure Reset_Liste_Defauts ; end; implementation { TSurveillance } {*------------------------------------------------------------------------------ Constructeur par défaut. Créé un objet de surveillance -------------------------------------------------------------------------------} Constructor TSurveillance.Create; Begin FListe_Definition := TObjectList.Create ; FListe_Defauts := TObjectList.Create ; End; //___________________________________________________________________Create {*------------------------------------------------------------------------------ Constructeur paramètré. Créé un objet de surveillance @param _Liste_Definition La liste des définitions -------------------------------------------------------------------------------} Constructor TSurveillance.Create(_Liste_Definition: TObjectList); Begin FListe_Definition := TObjectList.Create; FListe_Definition.Assign(_Liste_Definition); FListe_Defauts := TObjectList.Create; End; //___________________________________________________________________Create {*------------------------------------------------------------------------------ Destructeur Détruit la liste de définitions et de défauts -------------------------------------------------------------------------------} Destructor TSurveillance.Destroy; Begin Inherited Destroy; FListe_Definition.Free; FListe_Defauts.Free ; End; //__________________________________________________________________Destroy {*------------------------------------------------------------------------------ Procédure traitant la redondance des défauts constatés @param _Resultat_Surveillance Le résultat courant à traiter parmi la liste -------------------------------------------------------------------------------} Procedure TSurveillance.Gerer_Redondance(_Resultat_Surveillance: TResultat_Surveillance); Var Index : Integer ; Index_Defaut : Integer ; Tps_Cumule : Cardinal ; Begin Index_Defaut := -1 ; // On regarde si le défaut existe déja parmi la liste des défauts // On utilise Downto pour traiter en priorité les derniers défauts arrivés For Index := Liste_Defauts.Count - 1 Downto 0 Do If TResultat_Surveillance(Liste_Defauts.Items[Index]).Cle = _Resultat_Surveillance.Cle Then Begin Index_Defaut := Index ; Break ; End; // Le défaut exise déjà car il a été trouvé dans la liste If Index_Defaut >= 0 Then Begin Case TResultat_Surveillance(Liste_Defauts.Items[Index_Defaut]).Deb_Fin Of D : Begin // Si le résultat de la surveillance courante est false if Not _Resultat_Surveillance.Verdict Then // On incrémente le nombre d'apparitions TResultat_Surveillance(Liste_Defauts.Items[Index_Defaut]).Inc_Nb_Apparitions ; // Si le résultat de la surveillance courante est true If _Resultat_Surveillance.Verdict Then Begin // Calcul du temps d'appartion Tps_Cumule := GetTickCount - TResultat_Surveillance(Liste_Defauts.Items[Index_Defaut]).Tps_Deb ; // On regarde si le temps d'apparition du défaut est > à 100ms pour filtrer le "bagotement" // d'un défaut If Tps_Cumule < 100 Then Begin // On incrémente le nombre d'apparitions TResultat_Surveillance(Liste_Defauts.Items[Index_Defaut]).Inc_Nb_Apparitions ; // On réinitialise le temps d'apparition pour éviter de détecter un grand nombre de défauts en 200ms TResultat_Surveillance(Liste_Defauts.Items[Index_Defaut]).Tps_Deb := GetTickCount ; End Else Begin // Fin du défaut _Resultat_Surveillance.Deb_Fin := F ; // Application du temps cumulé du défaut _Resultat_Surveillance.Tps_Fin_Cumule := TickToDate(Tps_Cumule) ; // Ajout de la fin du défaut dans la liste Liste_Defauts.Add(_Resultat_Surveillance) ; End ; End ; End; // End D F : Begin // Si le résultat de la surveillance courante est false if Not _Resultat_Surveillance.Verdict Then // Réapparition du défaut et ajout à la liste des défauts Liste_Defauts.Add(_Resultat_Surveillance) ; // Si le résultat de la surveillance courante est true, le défaut n'est pas réapparu, // pas de traitement particulier End ; // End F End ; // End Case End Else // Le défaut n'éxistait pas auparavant, on l'ajoute à la liste des défauts // si le verdict de la surveillance est faux If Not _Resultat_Surveillance.Verdict Then Liste_Defauts.Add(_Resultat_Surveillance) ; End; //_________________________________________________________Gerer_Redondance {*------------------------------------------------------------------------------ Procedure effacant tous les défauts constatés -------------------------------------------------------------------------------} Procedure TSurveillance.Reset_Liste_Defauts; Begin If (FListe_Defauts <> nil) Then FListe_Defauts.Clear ; End; //______________________________________________________Reset_Liste_Defauts {*------------------------------------------------------------------------------ Initialise la liste des défauts @param _Liste_Defauts La liste des défauts -------------------------------------------------------------------------------} Procedure TSurveillance.Set_Liste_Defauts(_Liste_Defauts: TObjectList); Begin If (_Liste_Defauts <> Nil) Then FListe_Defauts.Assign(_Liste_Defauts); End; //________________________________________________________Set_Liste_Defauts {*------------------------------------------------------------------------------ Initialise la liste des données à surveiller @param _Liste_Definition La liste de définition des données -------------------------------------------------------------------------------} Procedure TSurveillance.Set_Liste_Definition(_Liste_Definition: TObjectList); Begin If (_Liste_Definition <> Nil) Then FListe_Definition.Assign(_Liste_Definition); End; //_____________________________________________________Set_Liste_Definition {*------------------------------------------------------------------------------ Fonction qui convertit des millisecondes au format date @param _Tick Les millisecondes -------------------------------------------------------------------------------} Function TSurveillance.TickToDate(const _Tick: cardinal): String; Var H, N, S : Word; Begin S := (_Tick div 1000) mod 60; N := (_Tick div 60000) mod 60; H := (_Tick div 3600000); Result := format('%.2d:%.2d:%.2d',[H,N,S]); End; //_______________________________________________________________TickToDate