// UTS 2000 - fichier 'horo.cpp' Lecture des variables pour la gestion de l'heure dans le fichier de configuration, et gestion de l'heure
// V3.7d - Le 19/10/2017
/*****************************************************************************/
/* Horodateur                                                                */
/*****************************************************************************/
#include  <windows.h>
#include  <string.h>
#include  <stdlib.h>
#include  <stdio.h>
#include "deplacement.h"
#include "Train_UTS.h"

#define _CRT_SECURE_NO_WARNINGS  // Limite les messages de warning dans Visual C++

// Déclaration des classes externes
extern cDeplacement deplacement;

// Déclaration des fonctions externes
extern int get_line(FILE*, char [][CHAR_CONFIG_NB], int*);
extern int pio_var_ch2int(char []);
extern int pio_var_int2ch(int ,char []);
extern void EasyTextOut(int, int, char*);
extern void EasyLine(int, int, int, int);
extern int pio_define_convert(char [],char []);
extern int pio_get_val(int);
extern int pio_set_val(int ,int);
extern void bmp_SetTextColor(int no_color);
extern void bmp_fond_default(void);
extern HWND      hwnd;         // C'est un nombre entier généré par Windows permettant d'identifier de manière unique une fenêtre.


// Déclaration des variables externes
extern HBRUSH  bmp_pinceau_blanc, bmp_pinceau_gris192, bmp_pinceau_gris220, bmp_pinceau_vert, bmp_pinceau_orange, bmp_pinceau_cyan, bmp_pinceau_rouge, bmp_pinceau_jaune;
extern HDC hMemDC;
extern HFONT     bmp_fonte;
extern HPEN      bmp_stylo_noir, bmp_stylo_gris128, bmp_stylo_gris192, bmp_stylo_blanc, bmp_stylo_vertfonce, bmp_stylo_marron;
extern HPEN      bmp_stylo_rougef, bmp_stylo_orange, bmp_stylo_rouge, bmp_stylo_vert, bmp_stylo_cyan;
extern int x_mouse, y_mouse, touche, touche_char, x_mouse_move, y_mouse_move, screen_mode_retour;
extern int timer_prg;
extern int debug_tic_nb;
extern int screen_mode;
extern int depl_tab[DEPL_TAB_NB][DEPL_TAB_IND_TAILLE];

int horo_tab[HORO_TAB_NB][HORO_TAB_IND_TAILLE];

int horo_j=0,horo_j_dep=0;    // Numéro du jour courant //0-6    //pour depart: 7=week 8=weekend
int horo_h=5,horo_h_dep=5;    // Heure courante         //0-23
int horo_m=0,horo_m_dep=0;    // Minute courante        //0-59
int horo_tic_on=0;            // Horloge en marche ou à l'arrêt
int horo_blocked=0;           // Horloge bloquée (en attente d'un évemnement, arrivée d'un train...).
int horo_tic_min=16;          // Nombre de 'tics' pour afire une minute de l'horloe UTS. Valeur écrasée par celle de 'config.txt'
int horo_tic_dec=16;
int horo_nettoyage=0;           // Nettoyage en route = 1

char horo_commentaire[HORO_NB_LIGNE_COM][HORO_TAILLE_LIGNE_COM]; // Commentaires dans la section "#hor"o pour savoir comment positionner les trains au départ de l'horloge.

/*****************************************************************************/
/* Horodateur                                                                */
/*****************************************************************************/
//int horo_j=0,horo_j_dep=0;    //global    //0-6    //por depart: 7=week 8=weekend
//int horo_h=5,horo_h_dep=5;    //global    //0-23
//int horo_m=0,horo_m_dep=0;    //global    //0-59
//int horo_tic_on=0;            //global
//int horo_blocked=0;           //global
//ex:
//#horo
//[
//    depart j0 5:00 tic_par_min:16
//    hd     7:00 hf 19:00 hi 00:30 hb +25 vf:!depl3 s:depl3
//    hd j:0:7:00 hf 19:00 hi 00:30 hb +25 vf:!depl3 s:depl3
//    hd j:n:7:00 hf 19:00 hi 00:30 hb +25 vf:!depl3 s:depl3        @ Nouveau en V3.6a pour parcour de nettoyage du réseau "j:n".
//]


void horo_init_file(char filename[])
{
   FILE* pf;
    char ch[CHAR_CONFIG_NB],ch_tab[BLOC_CONFIG_NB][CHAR_CONFIG_NB],ch_error[200],ch_syst[100];
    int  ch_nb, j, i;
    int  no_horo, no_var, var, com_en_cours;

	for (j=0; j<HORO_TAB_NB; j++) {
		for (i=0; i<HORO_TAB_IND_TAILLE; i++) horo_tab[j][i]=-1;
		horo_tab[j][HORO_TAB_IND_VAR_STATE]=HORO_CST_NOTHING;
		horo_tab[j][HORO_TAB_IND_INHIBE]=0; // Par défaut, les éléments ne sont pas inhibés.
	}
	for (j=0 ; j<HORO_NB_LIGNE_COM ; j++) sprintf_s(horo_commentaire[j],"");
    
    no_horo=-1;
    no_var=0;
	com_en_cours=0; // Numéro du commentaire en cours de traitement.
	horo_nettoyage=0;
    if((pf=fopen(filename,"rt"))==NULL) {
        MessageBox(NULL,"Impossible d'ouvrir le fichier de configuration de l'horodateur 'Config.txt'","Erreur",MB_OK|MB_ICONERROR); exit(1);
    }

	while(fscanf(pf,"%s%*[^\n]\n",ch)!=EOF) {	// " %s" => "%s%*[^\n]\n" = Nouvelle formule au 02/03/2012, lit uniquement le permier mot de chaque ligne.
		if(STR_SAME strcmp(ch,"#horo")) {
            fscanf(pf," %s",ch); // Passe le caractère '['.
            while(get_line(pf,ch_tab,&ch_nb)) {
	   			if(ch_nb>=BLOC_CONFIG_NB) {
					MessageBox(NULL,"Le fichier config.txt comporte une ligne trop complexe dans la section '#horo","Erreur",MB_OK|MB_ICONERROR);
					MessageBox(NULL,"Section '#horo' (ligne>75 blocs) commençant par (taper sur entrée) : ","Erreur",MB_OK|MB_ICONERROR);
					strcpy(ch_error,"Section #horo Erreur ligne :");

					for(i=0;i<ch_nb;i++) { strcat(ch_error,"  "); strcat(ch_error,ch_tab[i]); }
					MessageBox(NULL,ch_error,"UTS - Erreur",MB_OK|MB_ICONERROR); exit(1);
				}
				if(ch_tab[0][0]==']') break;			// Fin de la section '#horo'.
				for(i=0; i<ch_nb; i++) if(ch_tab[i][0]=='@') ch_nb=i;  // Supprime les commentaires.
                i=0;
                while (i<ch_nb) {
                    // depart j:0 7:55 
                    if (ch_nb-i>=7)
                    if ((!strcmp(ch_tab[i],"depart")) && ch_tab[i+1][0]=='j'
                    &&  ch_tab[i+2][0]==':' &&  ch_tab[i+5][0]==':') {
                        horo_j=horo_j_dep=atoi(ch_tab[i+3]);
                        horo_h=horo_h_dep=atoi(ch_tab[i+4]);
                        horo_m=horo_m_dep=atoi(ch_tab[i+6]);
						if (horo_j>=0 && horo_j<=6 && horo_h>=0 && horo_h<=59 && horo_m>=0 && horo_m<=59) {
	                        i=i+7;
		                    continue;
						}
                    }

                    // tic_par_min:50
                    if (ch_nb-i>=3)
                    if ((!strcmp(ch_tab[i],"tic_par_min")) && ch_tab[i+1][0]==':') {
                        horo_tic_min=atoi(ch_tab[i+2]);
						if (horo_tic_min>0 && horo_tic_min<=10000) {
							i=i+3;
							continue;
						}
                    }
                    // hd j:0:7:00 => Jour + Heure de départ.
                    if (ch_nb-i>=8)
                    if ((!strcmp(ch_tab[i],"hd")) && (!strcmp(ch_tab[i+1],"j")) && ch_tab[i+2][0]==':' && ch_tab[i+4][0]==':' && ch_tab[i+6][0]==':') {
                        no_horo++;no_var=0;
                        if     (ch_tab[i+3][0]=='s') horo_tab[no_horo][HORO_TAB_IND_HD_J]=HORO_CST_J_WEEK;
						else if (ch_tab[i + 3][0] == 'n') horo_tab[no_horo][HORO_TAB_IND_HD_J] = HORO_CST_J_NETTOYAGE;
						else if (ch_tab[i + 3][0] == 'w') horo_tab[no_horo][HORO_TAB_IND_HD_J] = HORO_CST_J_WEEKEND;
                        else                         horo_tab[no_horo][HORO_TAB_IND_HD_J]=atoi(ch_tab[i+3]);
                        horo_tab[no_horo][HORO_TAB_IND_HD_H]=atoi(ch_tab[i+5]);
                        horo_tab[no_horo][HORO_TAB_IND_HD_M]=atoi(ch_tab[i+7]);
						if (horo_tab[no_horo][HORO_TAB_IND_HD_H]>=0 && horo_tab[no_horo][HORO_TAB_IND_HD_H]<=59 && horo_tab[no_horo][HORO_TAB_IND_HD_M]>=0 && horo_tab[no_horo][HORO_TAB_IND_HD_M]<=59) {
	                        i=i+8;
		                    continue;
						}
                    }
                    // hd 7:00 => Heure de départ.
                    if (ch_nb-i>=4)
                    if ((!strcmp(ch_tab[i],"hd")) && ch_tab[i+2][0]==':') {
                        no_horo++;no_var=0;
                        horo_tab[no_horo][HORO_TAB_IND_HD_H]=atoi(ch_tab[i+1]);
                        horo_tab[no_horo][HORO_TAB_IND_HD_M]=atoi(ch_tab[i+3]);
						if (horo_tab[no_horo][HORO_TAB_IND_HD_H]>=0 && horo_tab[no_horo][HORO_TAB_IND_HD_H]<=59 && horo_tab[no_horo][HORO_TAB_IND_HD_M]>=0 && horo_tab[no_horo][HORO_TAB_IND_HD_M]<=59) {
		                    i=i+4;
	                        continue;
						}
                    }
                    // hf 19:00 => Fin d'une action périodique qui commence à 'hd'.
                    if (ch_nb-i>=4)
                    if ((!strcmp(ch_tab[i],"hf")) && ch_tab[i+2][0]==':') {
                        horo_tab[no_horo][HORO_TAB_IND_HF_H]=atoi(ch_tab[i+1]);
                        horo_tab[no_horo][HORO_TAB_IND_HF_M]=atoi(ch_tab[i+3]);
						if (horo_tab[no_horo][HORO_TAB_IND_HF_H]>=0 && horo_tab[no_horo][HORO_TAB_IND_HF_H]<=59 && horo_tab[no_horo][HORO_TAB_IND_HF_M]>=0 && horo_tab[no_horo][HORO_TAB_IND_HF_M]<=59) {
	                        i=i+4;
		                    continue;
						}
                    }
                    // hi 00:30 => Période d'une action périodique qui commence à 'hd' et fini à 'hf'.
                    if (ch_nb-i>=4)
                    if ((!strcmp(ch_tab[i],"hi")) && ch_tab[i+2][0]==':') {
                        horo_tab[no_horo][HORO_TAB_IND_HI_H]=atoi(ch_tab[i+1]);
                        horo_tab[no_horo][HORO_TAB_IND_HI_M]=atoi(ch_tab[i+3]);
						if (horo_tab[no_horo][HORO_TAB_IND_HI_H]>=0 && horo_tab[no_horo][HORO_TAB_IND_HI_H]<=59 && horo_tab[no_horo][HORO_TAB_IND_HI_M]>=0 && horo_tab[no_horo][HORO_TAB_IND_HI_M]<=59) {
	                        i=i+4;
		                    continue;
						}
                    }
                    // hb 07:25 => Temps maximum autorisé pour faire l'action ou le déplacement. Après bloque l'horloge.
                    if (ch_nb-i>=4)
                    if ((!strcmp(ch_tab[i],"hb")) && ch_tab[i+2][0]==':') {
                        horo_tab[no_horo][HORO_TAB_IND_TYPEB]=HORO_CST_BLOCK_H;
                        horo_tab[no_horo][HORO_TAB_IND_HB_H ]=atoi(ch_tab[i+1]);
                        horo_tab[no_horo][HORO_TAB_IND_HB_M ]=atoi(ch_tab[i+3]);
						if (horo_tab[no_horo][HORO_TAB_IND_HB_H]>=0 && horo_tab[no_horo][HORO_TAB_IND_HB_H]<=59 && horo_tab[no_horo][HORO_TAB_IND_HB_M]>=0 && horo_tab[no_horo][HORO_TAB_IND_HB_M]<=59) {
	                        i=i+4;
		                    continue;
						}
                    }
                    // hb +0:25 => 
                    if (ch_nb-i>=5)
                    if ((!strcmp(ch_tab[i],"hb")) && ch_tab[i+1][0]=='+' && ch_tab[i+3][0]==':') {
                        horo_tab[no_horo][HORO_TAB_IND_TYPEB]=HORO_CST_BLOCK_DELAY;
                        horo_tab[no_horo][HORO_TAB_IND_HB_H ]=atoi(ch_tab[i+2]);
                        horo_tab[no_horo][HORO_TAB_IND_HB_M ]=atoi(ch_tab[i+4]);
						if (horo_tab[no_horo][HORO_TAB_IND_HB_H]>=0 && horo_tab[no_horo][HORO_TAB_IND_HB_H]<=59 && horo_tab[no_horo][HORO_TAB_IND_HB_M]>=0 && horo_tab[no_horo][HORO_TAB_IND_HB_M]<=59) {
	                        i=i+5;
		                    continue;
						}	
                    }
                    // vf:depl3 => Variable conditionnant le blocage de l'horloge.
                    if (ch_nb-i>=3)
                    if ((!strcmp(ch_tab[i],"vf")) && ch_tab[i+1][0]==':' && ch_tab[i+2][0]!='!') {
                        horo_tab[no_horo][HORO_TAB_IND_VB_INV]=0;
                        //if (pio_define_convert(ch_tab[i+2],ch_syst)==0) strcpy(ch_syst,ch_tab[i+2]);
						if (pio_var_ch2int(ch_tab[i+2])!=-1) {
							horo_tab[no_horo][HORO_TAB_IND_VB_NUM]=pio_var_ch2int(ch_tab[i+2]);
							i=i+3;
							continue;
						}
                    }
                    // vf:!depl3 => Variable conditionnant le blocage de l'horloge.
                    if (ch_nb-i>=4)
                    if ((!strcmp(ch_tab[i],"vf"))  && ch_tab[i+1][0]==':' && ch_tab[i+2][0]=='!') {
                        horo_tab[no_horo][HORO_TAB_IND_VB_INV]=1;
                        if(pio_define_convert(ch_tab[i+3],ch_syst)==0) strcpy(ch_syst,ch_tab[i+3]);
                        if((var=pio_var_ch2int(ch_syst))!=-1) horo_tab[no_horo][HORO_TAB_IND_VB_NUM]=var;
                        i=i+4;
                        continue;
                    }
                    // s:depl3 => Positionne la variable 'var' à 1 (s=Set).
                    if (ch_nb-i>=3)
                    if ((!strcmp(ch_tab[i],"s")) && ch_tab[i+1][0]==':') {
                        horo_tab[no_horo][HORO_TAB_IND_V0_OP+2*no_var]=HORO_CST_OP_SET;
                        if(pio_define_convert(ch_tab[i+2],ch_syst)==0) strcpy(ch_syst,ch_tab[i+2]);
                        if((var=pio_var_ch2int(ch_syst))!=-1) horo_tab[no_horo][HORO_TAB_IND_V0_NUM+2*no_var]=var;
                        no_var++;
                        i=i+3;
                        continue;
                    }
                    // c:depl3 => Positionne la variable 'var' à 0 (c=Clear).
                    if (ch_nb-i>=3)
                    if ((!strcmp(ch_tab[i],"c")) && ch_tab[i+1][0]==':') {
                        horo_tab[no_horo][HORO_TAB_IND_V0_OP+2*no_var]=HORO_CST_OP_CLR;
                        if(pio_define_convert(ch_tab[i+2],ch_syst)==0) strcpy(ch_syst,ch_tab[i+2]);
                        if((var=pio_var_ch2int(ch_syst))!=-1) horo_tab[no_horo][HORO_TAB_IND_V0_NUM+2*no_var]=var;
                        no_var++;
                        i=i+3;
                        continue;
                    }
// Commentaires dans la section "#hor"o pour savoir comment positionner les trains au départ de l'horloge.
// commentaires : vapeur sur canton 1 et autorail sur canton 2 =
					if (ch_nb-i>=2) {
						if (!strncmp(ch_tab[i],"commentaire",11) && ch_tab[i+1][0]==':' && com_en_cours<HORO_NB_LIGNE_COM) {
							for (j=0; j<ch_nb-i-2; j++) {
									if (strlen(ch_tab[i+2+j])+strlen(horo_commentaire[com_en_cours])+1 < HORO_TAILLE_LIGNE_COM) { // +1 pour l'espace.
									strcat(horo_commentaire[com_en_cours],ch_tab[i+2+j]);
									strcat(horo_commentaire[com_en_cours]," ");
								}
							}
						com_en_cours++;  // horo_commentaire[HORO_NB_LIGNE_COM][HORO_TAILLE_LIGNE_COM] 
						i=ch_nb; // Dans ce cas on a bien fini la ligne.
						continue; // Aller à la ligne suivante.
						}
					}

					strcpy(ch_error,"Fichier 'config.txt',\n\nSection #horo,\n\nErreur de description sur la ligne :");
                    for(i=0;i<ch_nb;i++) { strcat(ch_error,"  "); strcat(ch_error,ch_tab[i]); }
                    MessageBox(NULL,ch_error,"UTS - Erreur",MB_OK|MB_ICONERROR); exit(1);
				}
			}	// While (get_line) fin de la ligne de texte.
			break; // Pour sortir de la lecture de la suite du fichier.
		}		// if(==#horo)   fin description '#horo'.
	}			// While (scanf)    fin du fichier 'config.txt'.
//	moins_char_normal=1;		// '-' est un caractère normal, comme '+'.
	fclose(pf);
}



void horo_save_conf(void)
{
    FILE* pf;
    int i,j;
    if((pf=fopen("debug_horo.txt","wt"))==NULL) {
        MessageBox(NULL,"Impossible de créer le fichier 'Debug_horo.txt'","Erreur",MB_OK|MB_ICONERROR); exit(1);
    }
    for(j=0;j<HORO_TAB_NB;j++) {
        fprintf(pf,"\n%3d:",j);
        for(i=0;i<HORO_TAB_IND_TAILLE;i++) fprintf(pf," %4d",horo_tab[j][i]);
    }
    fclose(pf);
}


// Met à jour l'horloge UTS à chaque interruption du 'Timer' du programme.
//
//
void horo_maj(void)
{
    int i,blocked,j,var,hb,mb,inv,ok_j,ok_hm;  /* int i,blocked,j,h,m,var,hb,mb,inv,ok_j,ok_hm; */
    int timec,timed,timef,timei;   /*    int timec,timed,timef,timei,timet;*/
    //chercher si blocage
    blocked=0;
    for (i=0; i<HORO_TAB_NB; i++) {
        if (horo_tab[i][HORO_TAB_IND_HD_H]==-1) break;
		if (horo_tab[i][HORO_TAB_IND_VAR_STATE]==HORO_CST_BLOCKED) { 
			blocked=1;
			break;
		}
    }
    horo_blocked=blocked;
    //gestion de l'horloge
    if (horo_tic_on && blocked==0) {
        if (horo_tic_dec<=0) {
 // 'horo_tic_min' = valeur lue dans 'config.txt' = nombre de tic pour faire avancer l'horloge UTS d'une minute.
            horo_tic_dec=horo_tic_min;
            horo_m++;
            if (horo_m>=60) {horo_m=0; horo_h++;}	// Incrémente les minutes, heures et n° du jour
			if (horo_h >= 24) {
				 horo_h = 0;
				 if (horo_nettoyage == 1) {
					horo_tic_on = 0; // Si on est en mode nettoyage on arrête l'horloge au bout de 24 heures et on réinitialise sa valeur.
					horo_j = horo_j_dep; horo_h = horo_h_dep; horo_m = horo_m_dep;  // Réinitialise l'horloge.
				}
				else horo_j++;
				if (horo_j >= 7) horo_j = 0;
			}
       }
       horo_tic_dec--;
   }

    if (horo_tic_dec!=(horo_tic_min-1)) return;  //c Cr reéolution evolution en minute
    
	// On continu ici une fois sur "horo_tic_min".

	for (i=0; i<HORO_TAB_NB; i++) {
		if (horo_tab[i][HORO_TAB_IND_HD_H]==-1) break; // Fin de la table.
        if (horo_tab[i][HORO_TAB_IND_INHIBE]==1) continue; // On passe à l'élément suivant.
        if (horo_tab[i][HORO_TAB_IND_VAR_STATE]==HORO_CST_NOTHING) {
            ok_j=0;
            j=horo_tab[i][HORO_TAB_IND_HD_J];
			if (horo_nettoyage == 0 && (
				j == -1 ||
				j == horo_j ||
				((j == HORO_CST_J_WEEK && horo_j >= 0) && (j == HORO_CST_J_WEEK && horo_j <= 4)) ||
				(j == HORO_CST_J_WEEKEND && horo_j == 5 || j == HORO_CST_J_WEEKEND && horo_j == 6))) ok_j = 1;
			if (horo_nettoyage == 1 && j == HORO_CST_J_NETTOYAGE) ok_j = 1;
			ok_hm = 0;
            timec=60*horo_h+horo_m;
            timed=60*horo_tab[i][HORO_TAB_IND_HD_H]+horo_tab[i][HORO_TAB_IND_HD_M];
            timef=60*horo_tab[i][HORO_TAB_IND_HF_H]+horo_tab[i][HORO_TAB_IND_HF_M];
            timei=60*horo_tab[i][HORO_TAB_IND_HI_H]+horo_tab[i][HORO_TAB_IND_HI_M];
            if(horo_tab[i][HORO_TAB_IND_HI_H]==-1 && horo_tab[i][HORO_TAB_IND_HF_H]==-1) {
                if(timec==timed) ok_hm=1;      //declenchement simple
            }
            else {
                if(timef<timed) timef+=24*60;  //declenchement recursif
                if(timec>=timed && timec<=timef) if(((timec-timed)%timei)==0) ok_hm=1;
            }
            if(ok_j && ok_hm) {
                //MessageBox(NULL,"OK H M","Debug",MB_OK|MB_ICONERROR);
                // gestion des etats et calcul de l'heure de blocage
                if(horo_tab[i][HORO_TAB_IND_TYPEB]==HORO_CST_BLOCK_H) {
                    horo_tab[i][HORO_TAB_IND_VAR_HB_H]=horo_tab[i][HORO_TAB_IND_HB_H];
                    horo_tab[i][HORO_TAB_IND_VAR_HB_M]=horo_tab[i][HORO_TAB_IND_HB_M];
                    horo_tab[i][HORO_TAB_IND_VAR_STATE]=HORO_CST_WAIT_BLOCKING;
                }
                else if(horo_tab[i][HORO_TAB_IND_TYPEB]==HORO_CST_BLOCK_DELAY) {
                    horo_tab[i][HORO_TAB_IND_VAR_HB_H]=horo_h+horo_tab[i][HORO_TAB_IND_HB_H];
                    horo_tab[i][HORO_TAB_IND_VAR_HB_M]=horo_m+horo_tab[i][HORO_TAB_IND_HB_M];
					if (horo_tab[i][HORO_TAB_IND_VAR_HB_M] >= 60) {
						horo_tab[i][HORO_TAB_IND_VAR_HB_M] = horo_tab[i][HORO_TAB_IND_VAR_HB_M] - 60;  // V3.7d
						horo_tab[i][HORO_TAB_IND_VAR_HB_H] = horo_tab[i][HORO_TAB_IND_VAR_HB_H] + 1;   // V3.7d
					}
                    horo_tab[i][HORO_TAB_IND_VAR_STATE]=HORO_CST_WAIT_BLOCKING;
                }
                else horo_tab[i][HORO_TAB_IND_VAR_STATE]=HORO_CST_NOTHING; // actions
                for(j=0;j<6;j++) {
                    var=horo_tab[i][HORO_TAB_IND_V0_NUM+2*j];
                    if(var==-1) break;
                    if(horo_tab[i][HORO_TAB_IND_V0_OP+2*j]==HORO_CST_OP_SET) pio_set_val(var,1);
                    if(horo_tab[i][HORO_TAB_IND_V0_OP+2*j]==HORO_CST_OP_CLR) pio_set_val(var,0);
                }
            }
        }
        if(horo_tab[i][HORO_TAB_IND_VAR_STATE]==HORO_CST_WAIT_BLOCKING) {
            //debut de blockage
            hb=horo_tab[i][HORO_TAB_IND_VAR_HB_H];
            mb=horo_tab[i][HORO_TAB_IND_VAR_HB_M];
            if(hb==horo_h && mb==horo_m) horo_tab[i][HORO_TAB_IND_VAR_STATE]=HORO_CST_BLOCKED;
            // fin avant blockage
            var=horo_tab[i][HORO_TAB_IND_VB_NUM];
            inv=horo_tab[i][HORO_TAB_IND_VB_INV];
            if( (pio_get_val(var) && inv==0) || (pio_get_val(var)==0 && inv) ) horo_tab[i][HORO_TAB_IND_VAR_STATE]=HORO_CST_BLOCKED;
		}
        if(horo_tab[i][HORO_TAB_IND_VAR_STATE]==HORO_CST_BLOCKED) {
            //fin de blockage
            var=horo_tab[i][HORO_TAB_IND_VB_NUM];
            inv=horo_tab[i][HORO_TAB_IND_VB_INV];
            if( (pio_get_val(var) && inv==0) || (pio_get_val(var)==0 && inv) ) horo_tab[i][HORO_TAB_IND_VAR_STATE]=HORO_CST_NOTHING;
        }
    }
}

// Affiche la page avec le tableau de réglage de l'horloge.
// Horloge réglage.
//
void horo_debug_r(int action)
{
    int x, y, j;
	int decalx, decaly, dimx, dimy, dimtx, dimty; // Décalage de la première case et dimmension d'une case 
    char ch[200];

	dimx   = 90; dimy  = 20;
	dimtx  = 180; dimty = 20;
	decalx = 2*dimx;
	decaly = 7*dimy;


	y=decaly+4*dimy;
	decaly = y+2*dimy;

	SelectObject(hMemDC,bmp_fonte); SetBkMode(hMemDC,TRANSPARENT);
	SelectObject(hMemDC,bmp_pinceau_blanc); SelectObject(hMemDC,bmp_stylo_blanc);

	if (action==DEBUG_TOTAL_PAINT) {
		Rectangle(hMemDC,0,0,800,700);
		SelectObject(hMemDC,bmp_pinceau_gris192); SelectObject(hMemDC,bmp_stylo_gris192); Rectangle(hMemDC,800-15,15,800-2,2); // Rectangle gris pour fermer la fenêtre.
		SelectObject(hMemDC,bmp_stylo_noir); EasyLine(800-14,3,800-3,14 ); EasyLine(800-14,13,800-3,2);   // Croix noire.
		SelectObject(hMemDC,bmp_stylo_noir);  EasyLine(800-2,1,800-2,16); EasyLine(800-16,15,800-1,15);   // Trait noir.
		SelectObject(hMemDC,bmp_stylo_gris128); EasyLine(800-3,2,800-3,15); EasyLine(800-15,14,800-2,14); // Trait gris foncé.
		SelectObject(hMemDC,bmp_pinceau_blanc); SelectObject(hMemDC,bmp_stylo_gris192);
		SetTextColor(hMemDC,RGB(0,0,0)); // Texte noir
		EasyTextOut(2,2+0*dimy,"AFFICHE LES PARAMÈTRES ET VALEURS DE L'HORLOGE UTS"); EasyTextOut(800-140,2,"(QUITTER = ESC)");
		EasyTextOut(2,2+1*dimy,"L'horloge déclenche des actions comme les déplacements.");
		EasyTextOut(2,2+2*dimy,"Le nombre de tics pour faire une minute réelle est défini dans 'config.txt' section '#horo'.");
		EasyTextOut(2,2+3*dimy,"Timer = 265 msec en V2.0 ou 95 msec en V3.");
		EasyTextOut(2,2+4*dimy,"L'horloge peut être bloquée en attente d'un événement (Arrivée d'un train...).");
		
    	y=decaly+0*dimy; // 1ere ligne du tableau
        SetTextColor(hMemDC,RGB(255,0,0)); // Texte rouge

// Premier tableau.
		EasyLine(0, decaly,         4*dimtx, decaly        ); // Lignes horizontales.
		EasyLine(0, decaly+1*dimty, 4*dimtx, decaly+1*dimty);
		EasyLine(0, decaly+2*dimty, 4*dimtx, decaly+2*dimty);
		EasyLine(0, decaly+3*dimty, 4*dimtx, decaly+3*dimty);
		EasyLine(0, decaly+4*dimty, 4*dimtx, decaly+4*dimty);
		EasyLine(0, decaly+5*dimty, 4*dimtx, decaly+5*dimty);
		EasyLine(0, decaly+6*dimty, 4*dimtx, decaly+6*dimty);
		EasyLine(1,       decaly,       1, decaly+6*dimty); // Lignes verticales.
		EasyLine(  dimtx, decaly,   dimtx, decaly+6*dimty);
		EasyLine(2*dimtx, decaly+dimty, 2*dimtx, decaly+6*dimty);
		EasyLine(3*dimtx, decaly, 3*dimtx, decaly+6*dimty);
		EasyLine(4*dimtx, decaly, 4*dimtx, decaly+6*dimty);

		EasyLine(dimtx,   decaly+2*dimty-10, dimtx-10,   decaly+2*dimty); // Lignes diagonales
		EasyLine(dimtx,   decaly+3*dimty-10, dimtx-10,   decaly+3*dimty);
		EasyLine(dimtx,   decaly+5*dimty-10, dimtx-10,   decaly+5*dimty);
		EasyLine(dimtx,   decaly+6*dimty-10, dimtx-10,   decaly+6*dimty);
		EasyLine(2*dimtx, decaly+2*dimty-10, 2*dimtx-10, decaly+2*dimty); // Lignes diagonales
		EasyLine(2*dimtx, decaly+3*dimty-10, 2*dimtx-10, decaly+3*dimty);
		EasyLine(2*dimtx, decaly+5*dimty-10, 2*dimtx-10, decaly+5*dimty);
		EasyLine(2*dimtx, decaly+6*dimty-10, 2*dimtx-10, decaly+6*dimty);
		EasyLine(3*dimtx, decaly+2*dimty-10, 3*dimtx-10, decaly+2*dimty); // Lignes diagonales
		EasyLine(3*dimtx, decaly+3*dimty-10, 3*dimtx-10, decaly+3*dimty);
		EasyLine(3*dimtx, decaly+5*dimty-10, 3*dimtx-10, decaly+5*dimty);
		EasyLine(3*dimtx, decaly+6*dimty-10, 3*dimtx-10, decaly+6*dimty);
		EasyLine(4*dimtx, decaly+2*dimty-10, 4*dimtx-10, decaly+2*dimty); // Lignes diagonales
		EasyLine(4*dimtx, decaly+3*dimty-10, 4*dimtx-10, decaly+3*dimty);
		EasyLine(4*dimtx, decaly+5*dimty-10, 4*dimtx-10, decaly+5*dimty);
		EasyLine(4*dimtx, decaly+6*dimty-10, 4*dimtx-10, decaly+6*dimty);

        SetTextColor(hMemDC,RGB(255,0,0)); // Texte rouge
		EasyTextOut(5,3+decaly,"Numéro jour(lundi=J0)"); EasyTextOut(105+dimtx,3+decaly, "Horloge UTS  (HH:MM)"); EasyTextOut(5+3*dimtx,3+decaly, "Nombre de tic/minute");
        SetTextColor(hMemDC,RGB(0,0,255)); // Texte bleu
		EasyTextOut(80,3+decaly+1*dimty,"J+2"); EasyTextOut(80+dimtx,3+decaly+1*dimty,"H+5"); EasyTextOut(80+2*dimtx,3+decaly+1*dimty,"M+5"); EasyTextOut(60+3*dimtx,3+decaly+1*dimty,"tic/mn +5");
		EasyTextOut(80,3+decaly+2*dimty,"J+1"); EasyTextOut(80+dimtx,3+decaly+2*dimty,"H+1"); EasyTextOut(80+2*dimtx,3+decaly+2*dimty,"M+1"); EasyTextOut(60+3*dimtx,3+decaly+2*dimty,"tic/mn +1");
		EasyTextOut(80,3+decaly+4*dimty,"J-1"); EasyTextOut(80+dimtx,3+decaly+4*dimty,"H-1"); EasyTextOut(80+2*dimtx,3+decaly+4*dimty,"M-1"); EasyTextOut(60+3*dimtx,3+decaly+4*dimty,"tic/mn -1");
		EasyTextOut(80,3+decaly+5*dimty,"J-2"); EasyTextOut(80+dimtx,3+decaly+5*dimty,"H-5"); EasyTextOut(80+2*dimtx,3+decaly+5*dimty,"M-5"); EasyTextOut(60+3*dimtx,3+decaly+5*dimty,"tic/mn -5");
		
		SetTextColor(hMemDC, RGB(0, 0, 0)); // Texte noir
		EasyTextOut(10,3+decaly+11*dimty,"Commentaires, section #horo, sur les conditions de départ des déplacements automatiques :");
		SetTextColor(hMemDC, RGB(0, 0, 255)); // Texte bleu
		for (j=0 ; j<HORO_NB_LIGNE_COM ; j++) { // Commentaires dans la section "#horo" pour savoir comment positionner les trains au départ de l'horloge.
			EasyTextOut(20,3+decaly+(12+j)*dimty,horo_commentaire[j]);
		}
	}

	decaly=7*dimy;
	y=decaly;  // Horloge placée au dessus du tableau
	SelectObject(hMemDC,bmp_fonte); SetBkMode(hMemDC,TRANSPARENT); SetTextColor(hMemDC,RGB(0,0,0)); // Texte noir

	SelectObject(hMemDC,bmp_stylo_gris192);
    Rectangle(hMemDC,decalx,y,decalx+4*dimx,y+dimy+1);
	sprintf_s(ch,"Durée du Timer 'tic'  : %d msec",timer_prg+15); EasyTextOut(decalx+5,4+y,ch);

	y=decaly+1*dimy; Rectangle(hMemDC,decalx,y,decalx+4*dimx,y+dimy+1); // Horloge placée au dessus du tableau
	sprintf_s(ch,"Nb de 'tics' pour 1mn : %d * Timer ci-dessus",horo_tic_min); EasyTextOut(decalx+5,4+y,ch);

	y=decaly+2*dimy; Rectangle(hMemDC,decalx,y,decalx+4*dimx,y+dimy+1);
	sprintf_s(ch,"1 heure  réelle       : %3d heures UTS",(60*1000/((timer_prg+15)*horo_tic_min))); EasyTextOut(decalx+5,4+y,ch);

	y=decaly+3*dimy; Rectangle(hMemDC,decalx,y,decalx+4*dimx,y+dimy+1);
	sprintf_s(ch,"1 heure  UTS          : %3d mn réelles",(((timer_prg+15)*horo_tic_min))/1000); EasyTextOut(decalx+5,4+y,ch);

	y=decaly+4*dimy; Rectangle(hMemDC,decalx,y,decalx+4*dimx,y+dimy+1);
	sprintf_s(ch,"1 jour   UTS          : %3d mn réelles",(((timer_prg+15)*24*horo_tic_min))/1000); EasyTextOut(decalx+5,4+y,ch);

	decaly = y+2*dimy;


	if (action==DEBUG_MOUSE) {
		if ((x_mouse > 800-15 && x_mouse < 800-2) && (y_mouse > 2 && y_mouse < 15)) {
			screen_mode= screen_mode_retour; 
			return;	// On ferme la fenêtre.
		}
		if (y_mouse<decaly+7*dimty) { // Premier tableau.
			x=1+(x_mouse/dimtx);
			y=(y_mouse-decaly)/dimty;
			if (x==1 && y==1)horo_j=horo_j+2; 
			else if (x==1 && y==2) horo_j=horo_j+1; 
			else if (x==1 && y==4) horo_j=horo_j-1; 
			else if (x==1 && y==5) horo_j=horo_j-2; 
			if (horo_j<0) horo_j=0;
			else if (horo_j>6) horo_j=6;

			if (x==2 && y==1) horo_h=horo_h+5;
			else if (x==2 && y==2) horo_h=horo_h+1;
			else if (x==2 && y==4) horo_h=horo_h-1;
			else if (x==2 && y==5) horo_h=horo_h-5;
			if (horo_h<0) horo_h=0;
			else if (horo_h>23) horo_h=23;

			if (x==3 && y==1) horo_m=horo_m+5;
			else if (x==3 && y==2) horo_m=horo_m+1;
			else if (x==3 && y==4) horo_m=horo_m-1;
			else if (x==3 && y==5) horo_m=horo_m-5;
			if (horo_m<0) horo_m=0;
			else if (horo_m>59) horo_m=59;

			if (x==4 && y==1) horo_tic_min=horo_tic_min+5;
			else if (x==4 && y==2) horo_tic_min=horo_tic_min+1;
			else if (x==4 && y==4) horo_tic_min=horo_tic_min-1;
			else if (x==4 && y==5) horo_tic_min=horo_tic_min-5;
			if (horo_tic_min<1) horo_tic_min=1;
		}
		else { // Deuxième tableau
			if ((y_mouse >= decaly + 9 * dimty) && (y_mouse <= decaly + 10 * dimty)) {
				if ((x_mouse >= 20) && (x_mouse <= 180)) {
					horo_j = horo_j_dep; horo_h = horo_h_dep; horo_m = horo_m_dep; horo_tic_dec=horo_tic_min;  // [INITIALISATION] Réinitialise l'horloge.
					for (j = 0; j < HORO_TAB_NB; j++){
						horo_tab[j][HORO_TAB_IND_VAR_STATE] = HORO_CST_NOTHING; // Débloque tous les événements.
						horo_tab[j][HORO_TAB_IND_INHIBE] = 0;                   // Désinhibe toutes Les lignes.
						horo_tab[j][HORO_TAB_IND_VAR_HB_H] = -1;   // Raz colonne 'Blocage'.
						horo_tab[j][HORO_TAB_IND_VAR_HB_M] = -1;
					}
					for (j = 0; j<DEPL_TAB_NB; j++) {
						if (depl_tab[j][DEPL_TAB_IND_CANT_START] != -1 && depl_tab[j][DEPL_TAB_IND_STEP] != DEPL_CST_STATE_IDLE) {
							depl_tab[j][DEPL_TAB_IND_STOP] = 1; // Raz tous les déplacements valides.
						}
					}
				}
				else if ((x_mouse >= 220) && (x_mouse <= 380)) horo_tic_on ^= 1;   // [ARRET]/[MARCHE] Change d'état l'horloge.
				else if ((x_mouse >= 420) && (x_mouse <= 580)) {                   // [NETTOYAGE ON]/[NETTOYAGE OFF] Change d'état du nettoyage.
					horo_nettoyage ^= 1; 
					horo_j = horo_j_dep; horo_h = horo_h_dep; horo_m = horo_m_dep; horo_tic_dec=horo_tic_min;  // Réinitialise l'horloge.
					for (j = 0; j < HORO_TAB_NB; j++) {
						horo_tab[j][HORO_TAB_IND_VAR_STATE] = HORO_CST_NOTHING; // Débloque tous les événements.
						horo_tab[j][HORO_TAB_IND_INHIBE] = 0;                   // Désinhibe toutes Les lignes.
						horo_tab[j][HORO_TAB_IND_VAR_HB_H] = -1;   // Raz colonne 'Blocage'.
						horo_tab[j][HORO_TAB_IND_VAR_HB_M] = -1;
						for (j = 0; j < DEPL_TAB_NB; j++) {
							if (depl_tab[j][DEPL_TAB_IND_CANT_START] != -1 && depl_tab[j][DEPL_TAB_IND_STEP] != DEPL_CST_STATE_IDLE) {
								depl_tab[j][DEPL_TAB_IND_STOP] = 1; // Raz tous les déplacements valides.
							}
						}
						if (horo_nettoyage == 1) { horo_tic_on = 1;horo_tic_dec=0;  } // Horloge en marche, on démarre le train le plus tot possible. Pour n'avoir plus qu'un "tic" avant l'heure dite.
						else horo_tic_on = 0; // Horloge à l'arrêt.
					}
				}
				else if ((x_mouse >= 620) && (x_mouse <= 780)) {
					screen_mode=MD_ECRAN_HORO_L1; // [BLOQUEE]/[NON BLOQUEE] On va vers debug2.
					PostMessage(hwnd,WM_PAINT,0,0); // Pour provoquer un réaffichage de la fenêtre appelée (Impose "action" = DEBUG_TOTAL_PAINT).
				}
			}
		}
    }

	SetTextColor(hMemDC,RGB(255,0,0)); // Texte rouge
	Rectangle(hMemDC, 1, decaly+3*dimty, 1+dimtx, 1+decaly+4*dimty); 
	sprintf_s(ch,"%d", horo_j); EasyTextOut((dimtx/2),3+decaly+3*dimty,ch);

	Rectangle(hMemDC, dimtx, decaly+3*dimty, 1+3*dimtx, 1+decaly+4*dimty); 
	sprintf_s(ch,"%02d:%02d", horo_h, horo_m); EasyTextOut(-20+2*dimtx,3+decaly+3*dimty,ch);

	Rectangle(hMemDC, 3*dimtx, decaly+3*dimty, 1+4*dimtx, 1+decaly+4*dimty); 
	sprintf_s(ch,"%d", horo_tic_min); EasyTextOut((7*dimtx/2)-5,3+decaly+3*dimty,ch);

	SelectObject(hMemDC, bmp_stylo_blanc);
	Rectangle(hMemDC, 20, decaly + 9 * dimty, 780 + 1, decaly + 10 * dimty + 1); // Rectangle blanc pour la recopie par "BitBlt(hdc_ori,  20,  440,  760,"
	SetTextColor(hMemDC, RGB(0, 0, 0)); // Texte noir.
	SelectObject(hMemDC, bmp_stylo_noir);
	// Bouton [Initialisation Horloge].
	EasyTextOut(100 - (12 * 8 / 2), 3 + decaly + 8 * dimty, "Init horloge");
	SelectObject(hMemDC, bmp_pinceau_vert); SelectObject(hMemDC, bmp_stylo_noir);
	Rectangle(hMemDC, 20, decaly + 9 * dimty, 180+1, decaly + 10 * dimty +1);
	SelectObject(hMemDC, bmp_stylo_vertfonce);
	EasyLine(20+ 1, decaly + 10 * dimty - 1, 180- 1, decaly + 10 * dimty - 1);  	// Relief rectangle = Trait horizontal.
	EasyLine(180-1, decaly + 9 * dimty + 1, 180-1,  decaly + 10 * dimty);	// Relief rectangle = Trait vertical.
	EasyTextOut(100-(14*8/2), 3 + decaly + 9 * dimty, "INITIALISATION");
	SelectObject(hMemDC, bmp_stylo_noir);
	EasyLine(180-10, decaly + 10 * dimty-1, 180, decaly + 10 * dimty-10-1); // Désignable = Trait en diagonale.

	EasyTextOut(300 - (12 * 8 / 2), 3 + decaly + 8 * dimty, "Etat horloge");
	if (horo_tic_on == 1) { // Bouton [Horloge on].
		SelectObject(hMemDC, bmp_pinceau_vert); SelectObject(hMemDC, bmp_stylo_noir);
		Rectangle(hMemDC, 220, decaly + 9 * dimty, 380 + 1, decaly + 10 * dimty + 1);
		SelectObject(hMemDC, bmp_stylo_vertfonce);
		EasyLine(220 + 1, decaly + 10 * dimty - 1, 380 - 1, decaly + 10 * dimty - 1);  	// Relief rectangle = Trait horizontal.
		EasyLine(380 - 1, decaly + 9 * dimty + 1, 380 - 1, decaly + 10 * dimty);	// Relief rectangle = Trait vertical.
		EasyTextOut(300 - (9 * 8 / 2), 3 + decaly + 9 * dimty, "EN MARCHE");
		SelectObject(hMemDC, bmp_stylo_noir);
		EasyLine(380 - 10, decaly + 10 * dimty - 1, 380, decaly + 10 * dimty - 10 - 1); // Désignable = Trait en diagonale.
	}
	else { // Bouton [Horloge off].
		SelectObject(hMemDC, bmp_pinceau_rouge); SelectObject(hMemDC, bmp_stylo_noir);
		Rectangle(hMemDC, 220, decaly + 9 * dimty, 380 + 1, decaly + 10 * dimty + 1);
		SelectObject(hMemDC, bmp_stylo_rougef);
		EasyLine(220 + 1, decaly + 10 * dimty - 1, 380 - 1, decaly + 10 * dimty - 1);  	// Relief rectangle = Trait horizontal.
		EasyLine(380 - 1, decaly + 9 * dimty + 1, 380 - 1, decaly + 10 * dimty);	// Relief rectangle = Trait vertical.
		EasyTextOut(300 - (9 * 8 / 2), 3 + decaly + 9 * dimty, "A L'ARRÊT");
		SelectObject(hMemDC, bmp_stylo_noir);
		EasyLine(380 - 10, decaly + 10 * dimty - 1, 380, decaly + 10 * dimty - 10 - 1); // Désignable = Trait en diagonale.
	}

	EasyTextOut(500 - (19 * 8 / 2), 3 + decaly + 8 * dimty, "Nettoyage du réseau");
	if (horo_nettoyage == 1) { // Bouton [Nettoyage on].
		SelectObject(hMemDC, bmp_pinceau_jaune); SelectObject(hMemDC, bmp_stylo_noir);
		Rectangle(hMemDC, 420, decaly + 9 * dimty, 580 + 1, decaly + 10 * dimty + 1);
		SelectObject(hMemDC, bmp_stylo_orange);
		EasyLine(420 + 1, decaly + 10 * dimty - 1, 580 - 1, decaly + 10 * dimty - 1);  	// Relief rectangle = Trait horizontal.
		EasyLine(580 - 1, decaly + 9 * dimty + 1, 580 - 1, decaly + 10 * dimty);	// Relief rectangle = Trait vertical.
		EasyTextOut(500 - (12 * 8 / 2), 3 + decaly + 9 * dimty, "NETTOYAGE ON");
		SelectObject(hMemDC, bmp_stylo_noir);
		EasyLine(580 - 10, decaly + 10 * dimty - 1, 580, decaly + 10 * dimty - 10 - 1); // Désignable = Trait en diagonale.
	}
	else { // Bouton [Nettoyage off].
		SelectObject(hMemDC, bmp_pinceau_vert); SelectObject(hMemDC, bmp_stylo_noir);
		Rectangle(hMemDC, 420, decaly + 9 * dimty, 580 + 1, decaly + 10 * dimty + 1);
		SelectObject(hMemDC, bmp_stylo_vertfonce);
		EasyLine(420 + 1, decaly + 10 * dimty - 1, 580 - 1, decaly + 10 * dimty - 1);  	// Relief rectangle = Trait horizontal.
		EasyLine(580 - 1, decaly + 9 * dimty + 1, 580 - 1, decaly + 10 * dimty);	// Relief rectangle = Trait vertical.
		EasyTextOut(500 - (13 * 8 / 2), 3 + decaly + 9 * dimty, "NETTOYAGE OFF");
		SelectObject(hMemDC, bmp_stylo_noir);
		EasyLine(580 - 10, decaly + 10 * dimty - 1, 580, decaly + 10 * dimty - 10 - 1); // Désignable = Trait en diagonale.
	}

	EasyTextOut(700 - (21 * 8 / 2), 3 + decaly + 8 * dimty, "Si clic Affiche Liste");
	if (horo_blocked == 1) { // Bouton [Horloge bloquée].
		SelectObject(hMemDC, bmp_pinceau_orange); SelectObject(hMemDC, bmp_stylo_noir);
		Rectangle(hMemDC, 620, decaly + 9 * dimty, 780 + 1, decaly + 10 * dimty + 1);
		SelectObject(hMemDC, bmp_stylo_marron);
		EasyLine(620 + 1, decaly + 10 * dimty - 1, 780 - 1, decaly + 10 * dimty - 1);  	// Relief rectangle = Trait horizontal.
		EasyLine(780 - 1, decaly + 9 * dimty + 1, 780 - 1, decaly + 10 * dimty);	// Relief rectangle = Trait vertical.
		EasyTextOut(700 - (7 * 8 / 2), 3 + decaly + 9 * dimty, "BLOQUÉE");
		SelectObject(hMemDC, bmp_stylo_noir);
		EasyLine(780 - 10, decaly + 10 * dimty - 1, 780, decaly + 10 * dimty - 10 - 1); // Désignable = Trait en diagonale.
	}
	else { // Bouton [Horloge pas bloquée].
		SelectObject(hMemDC, bmp_pinceau_vert); SelectObject(hMemDC, bmp_stylo_noir);
		Rectangle(hMemDC, 620, decaly + 9 * dimty, 780 + 1, decaly + 10 * dimty + 1);
		SelectObject(hMemDC, bmp_stylo_vertfonce);
		EasyLine(620 + 1, decaly + 10 * dimty - 1, 780 - 1, decaly + 10 * dimty - 1);  	// Relief rectangle = Trait horizontal.
		EasyLine(780 - 1, decaly + 9 * dimty + 1, 780 - 1, decaly + 10 * dimty);	// Relief rectangle = Trait vertical.
		EasyTextOut(700 - (11 * 8 / 2), 3 + decaly + 9 * dimty, "PAS BLOQUÉE");
		SelectObject(hMemDC, bmp_stylo_noir);
		EasyLine(780 - 10, decaly + 10 * dimty - 1, 780, decaly + 10 * dimty - 10 - 1); // Désignable = Trait en diagonale.
	}
}

//	
// Horloge Liste
void horo_debug_l(int action)
{
   	int i, j;
	char ch[200], ch2[25] ;	// ch[25] pour contenir 'garage_lock_status_0'+ '/0'
	static int horo_debug_l_deb=0;
	static int dimnx=44;    // Dimension horizontal d'une cellule 'Numéro'
	static int dimcx=68;    // Dimension horizontal d'une cellule 'Cantons'
	static int demidimcx=34;// Dimension horizontal d'une demi cellule 'Cantons'
	static int dimli=350;   // Dimension horizontal d'une cellule 'Libé' min=229
	static int dimy=16;     // Dimension vertical d'une cellule
	static int nblignes=32; // Nombre de ligne du tableau (sans le titre)	
	static int decaly=16;   // Decalage de la premiére ligne vers les bas.

	SelectObject(hMemDC,bmp_fonte); SetBkMode(hMemDC,TRANSPARENT);
	SelectObject(hMemDC,bmp_pinceau_blanc); SelectObject(hMemDC,bmp_stylo_blanc);

	if(action==DEBUG_TOTAL_PAINT) {     // ACTION = REDESSINE TOUTE LA FENETRE.
		Rectangle(hMemDC,0,0,1100,700);
		SelectObject(hMemDC,bmp_pinceau_gris192); SelectObject(hMemDC,bmp_stylo_gris192); Rectangle(hMemDC,1100-15,15,1100-2,2); // Rectangle gris pour fermer la fenêtre.
		SelectObject(hMemDC,bmp_stylo_noir); EasyLine(1100-14,3,1100-3,14 ); EasyLine(1100-14,13,1100-3,2); // Croix noire.
		SelectObject(hMemDC,bmp_stylo_noir);  EasyLine(1100-2,1,1100-2,16); EasyLine(1100-16,15,1100-1,15); // Trait noir.
		SelectObject(hMemDC,bmp_stylo_gris128); EasyLine(1100-3,2,1100-3,15); EasyLine(1100-15,14,1100-2,14); // Trait gris foncé.
		SelectObject(hMemDC,bmp_pinceau_blanc); SelectObject(hMemDC,bmp_stylo_gris192);
		Rectangle(hMemDC, 0, decaly, 1100, decaly+dimy+1);
		EasyLine(1*dimnx,         decaly, dimnx,           decaly+dimy);
		EasyLine(2*dimnx,         decaly, 2*dimnx,         decaly+dimy);
		EasyLine(3*dimnx,         decaly, 3*dimnx,         decaly+dimy);
		EasyLine(3*dimnx+1*dimcx, decaly, 3*dimnx+1*dimcx, decaly+dimy);
		EasyLine(3*dimnx+2*dimcx, decaly, 3*dimnx+2*dimcx, decaly+dimy);
		EasyLine(3*dimnx+3*dimcx, decaly, 3*dimnx+3*dimcx, decaly+dimy);
		EasyLine(3*dimnx+4*dimcx, decaly, 3*dimnx+4*dimcx, decaly+dimy);  
		EasyLine(3*dimnx+5*dimcx, decaly, 3*dimnx+5*dimcx, decaly+dimy);
		EasyLine(3*dimnx+6*dimcx, decaly, 3*dimnx+6*dimcx, decaly+dimy);
		EasyLine(3*dimnx+9*dimcx, decaly, 3*dimnx+9*dimcx, decaly+dimy);
		EasyLine(3*dimnx-10,decaly+dimy, 3*dimnx,decaly+dimy-10);              // Dessine un trait dans l'angle 'Inh' = valeurs modifiables.
		EasyLine(3*dimnx+dimcx-10,decaly+dimy, 3*dimnx+dimcx,decaly+dimy-10);  // Dessine un trait dans l'angle 'Départ' = valeurs désignables.
		bmp_SetTextColor(BMP_CST_COLOR_NOIR);			// Texte en noir.
		EasyTextOut(2,2,"AFFICHE LES VALEURS DU TABLEAU INTERNE '#horo'            (200 lignes maximum)"); EasyTextOut(1100-140,2,"(QUITTER = ESC)");
		EasyTextOut(2,decaly+(nblignes+1)*dimy,"Section '#horo'");
		SelectObject(hMemDC,bmp_stylo_noir); SelectObject(hMemDC,bmp_pinceau_gris220); // Rectangle gris foncé.
		Rectangle(hMemDC,0,decaly+(nblignes+2)*dimy-2, 97, decaly+(nblignes+3)*dimy);
		SelectObject(hMemDC,bmp_stylo_gris128);
		EasyLine(1,  decaly+(nblignes+3)*dimy-2,  96, decaly+(nblignes+3)*dimy-2);  	// Relief rectangle.
		EasyLine(95, decaly+(nblignes+2)*dimy-2+1, 95, decaly+(nblignes+3)*dimy-2);	// Relief rectangle.
		SelectObject(hMemDC,bmp_stylo_noir);
		EasyLine(97-10, decaly+(nblignes+3)*dimy-2, 97, decaly+(nblignes+3)*dimy-12);  // Dessine un trait dans l'angle = valeurs modifiables.
		SelectObject(hMemDC,bmp_pinceau_blanc); SelectObject(hMemDC,bmp_stylo_gris192);
		EasyTextOut(2,decaly+(nblignes+2)*dimy," CLIC-DROIT :AFFICHE LES PAGES 1 à 7, [00-31] à [182-199]");
		EasyTextOut(2,decaly+(nblignes+3)*dimy,"Liste des actions à départ temporisé.");
		EasyTextOut(2,decaly+(nblignes+4)*dimy,"Colonne 'Etat' = 'At-Bl'=En attente de blocage possible,  'Blqué'=Bloque l'horloge.");
		EasyTextOut(2,decaly+(nblignes+5)*dimy,"Colonne 'Inh' CLIC=Inhibe le blocage ou le départ de l'action + raz déplacement.");
		EasyTextOut(2,decaly+(nblignes+6)*dimy,"Colonne 'Départ', 'Fin', 'Période' = Jours:Heures:Minutes (s=Jour de semaine, w=WeekEnd).");
		EasyTextOut(2,decaly+(nblignes+7)*dimy,"Colonne 'Blocage' = Heure prévue de blocage = 'Temp_B' ou 'Départ'+'Temp_B'.");
		EasyTextOut(2,decaly+(nblignes+8)*dimy,"Colonne 'He/De_B' = Heure de blocage ou Délai par rapport au début de l'action.");
		SelectObject(hMemDC,bmp_pinceau_vert); // Rectangle vert.
		Rectangle(hMemDC,0, -2+decaly+(nblignes+9)*dimy,92,-2+decaly+(nblignes+10)*dimy);
		SelectObject(hMemDC,bmp_pinceau_orange); // Rectangle orange.
		Rectangle(hMemDC,369, -2+decaly+(nblignes+9)*dimy,468,-2+decaly+(nblignes+10)*dimy);
		SelectObject(hMemDC,bmp_pinceau_cyan); // Rectangle bleu.
		Rectangle(hMemDC,687, -2+decaly+(nblignes+9)*dimy,780,-2+decaly+(nblignes+10)*dimy);
		SelectObject(hMemDC,bmp_pinceau_blanc);

		EasyTextOut(2,decaly+(nblignes+9)*dimy,"LIGNE VERTE=Action pouvant bloquer l'horloge, LIGNE ORANGE=Action bloquant l'horloge, LIGNE BLEUE=Ligne ignorée.");
//
// |  n° | Inh | Etat|  Départ |  Fin  | Période | He/De_B | Temp_B | Blocage |  Variable_Blocage=Etat | Actions à lancer 
// |     |     |-.-.-| j:hh:mm | hh:mm |  hh:mm  |   Heure | hh:mm  |  hh:mm  |garage_lock_status_xxx=1|garage_lock_status_xxx.1 out_xxx.0 
// |     |     |Bloqé| j:hh:mm | hh:mm |  hh:mm  |  Delais | hh:mm  |  hh:mm  |                        | 
// |     |     |AtteB| j:hh:mm | hh:mm |  hh:mm  |  Delais | hh:mm  |  hh:mm  |                        | 
//
		bmp_SetTextColor(BMP_CST_COLOR_ROUGE);			     // Texte en rouge.
		EasyTextOut(2,                 2+decaly,"  n°");     // Indice 'i' du tableau : descr[i][].
		EasyTextOut(0+dimnx,           2+decaly," Etat");    //
		EasyTextOut(2+2*dimnx,         2+decaly," Inh");     //
		EasyTextOut(2+3*dimnx,         2+decaly," Départ");  // 
		EasyTextOut(5+3*dimnx+1*dimcx, 2+decaly,"  Fin");    // 
		EasyTextOut(0+3*dimnx+2*dimcx, 2+decaly," Période"); // 
		EasyTextOut(0+3*dimnx+3*dimcx, 2+decaly," Blocage"); // 
		EasyTextOut(0+3*dimnx+4*dimcx, 2+decaly," He/De_B"); // 
		EasyTextOut(2+3*dimnx+5*dimcx, 2+decaly," Temp_B");  // 
		EasyTextOut(2+3*dimnx+6*dimcx, 2+decaly," Variable_Blocage=Etat"); // 
		EasyTextOut(2+3*dimnx+9*dimcx, 2+decaly," Actions à lancer (2 affichées sur 6 maxi)"); // 
	}

	if (action==DEBUG_MOUSE) { // ACTION = CLIC GAUCHE DE LA SOURIS
		if ((x_mouse > 0 && x_mouse < 97) && (y_mouse > decaly+(nblignes+2)*dimy-22 && y_mouse < decaly+(nblignes+3)*dimy)) { //	Clique dans [CLIC DROIT]
			action=DEBUG_MOUSE_RIGHT; //	Simule le clique-droit traité plus loin.
		}
		else {
			if ((x_mouse > 1100-15 && x_mouse < 1100-2) && (y_mouse > 2 && y_mouse < 15)) {
				screen_mode= screen_mode_retour; 
				return;	// On ferme la fenêtre.
			}
		    i=(y_mouse-(decaly+dimy))/dimy;
			if (y_mouse>=(decaly+dimy) && y_mouse<=decaly+(nblignes+2)*dimy && i>=0 && i<nblignes && horo_debug_l_deb+i<HORO_TAB_NB) {
				if(x_mouse>2*dimnx && x_mouse<3*dimnx) {    // Colone "Inhibition".
					if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_HD_H]!=-1) {
						horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_INHIBE]^=1;	// Change la position de l'inhibition.
						if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_INHIBE]==1) {
							horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VAR_STATE]=HORO_CST_NOTHING;
							if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VB_NUM]!=-1) {
								if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VB_NUM]==horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_V0_NUM]) {
									if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VB_NUM]>=6500 && horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VB_NUM]<=6699) { // Cas d'un déplacement.
										depl_tab[horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VB_NUM]-6500][DEPL_TAB_IND_STOP]=1; // Arrête le déplacement en cours.
									}
								}
							}
						}
					}
				}

				if (x_mouse > 3 * dimnx && x_mouse < 3 * dimnx + dimcx) {   // Colonne "Depart".
					// Met l'horloge à l'heure de départ
					if (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_H] != -1) {
						horo_j = 0; // Par défaut.
						if (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_J] > 0 && horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_J] <=4 ) horo_j = horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_J];  // Lundi au vendredi = 0 - 4.
						if (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_J] == HORO_CST_J_WEEK)    horo_j = 0;  // Lundi  = 0.
						if (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_J] == HORO_CST_J_WEEKEND) horo_j = 5;  // Samedi = 5.
						if (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_J] == HORO_CST_J_NETTOYAGE) horo_nettoyage = 1; else horo_nettoyage = 0;
						horo_h = horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_H];
						horo_m = horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_M];
						horo_m--; if (horo_m == -1) { horo_m = 59;  horo_h--; } // On retarde l'heure d'une minute pour ne pas rater le prochain départ horodaté.
						horo_tic_on = 1;  // Met en marche l'horloge.
						horo_tic_dec = 1; // On démarre le train le plus tôt possible. Pour n'avoir plus qu'un "tic" avant l'heure dite.
					}
				}
			}

			else { // Deuxième tableau du bas avec les boutons.
				if (y_mouse>=decaly+(nblignes+2)*dimy && y_mouse<=decaly+(nblignes+3)*dimy+4) {
					if ((x_mouse >= 470) && (x_mouse <= 590)) {
						horo_j = horo_j_dep; horo_h = horo_h_dep; horo_m = horo_m_dep; horo_tic_dec=horo_tic_min;  // [INITIALISATION] Réinitialise l'horloge.
						for (j = 0; j < HORO_TAB_NB; j++){
							horo_tab[j][HORO_TAB_IND_VAR_STATE] = HORO_CST_NOTHING; // Débloque tous les événements.
							horo_tab[j][HORO_TAB_IND_INHIBE] = 0;                   // Désinhibe toutes Les lignes.
							horo_tab[j][HORO_TAB_IND_VAR_HB_H] = -1;   // Raz colonne 'Blocage'.
							horo_tab[j][HORO_TAB_IND_VAR_HB_M] = -1;
						}
						for (j = 0; j < DEPL_TAB_NB; j++) {
							if (depl_tab[j][DEPL_TAB_IND_CANT_START] != -1 && depl_tab[j][DEPL_TAB_IND_STEP] != DEPL_CST_STATE_IDLE) {
								depl_tab[j][DEPL_TAB_IND_STOP] = 1; // Raz tous les déplacements valides.
							}
						}
					}
					else if (x_mouse>=620 && x_mouse<=740) horo_tic_on^=1; // [ARRET]/[MARCHE] Change d'état l'horloge.
					else if (x_mouse >= 770 && x_mouse <= 890)  {
						horo_nettoyage ^= 1; // [NETTOYAGE ON]/[NETTOYAGE OFF] Change d'état du nettoyage.
						horo_j = horo_j_dep; horo_h = horo_h_dep; horo_m = horo_m_dep;  // Réinitialise l'horloge.
						for (j = 0; j < HORO_TAB_NB; j++){
							horo_tab[j][HORO_TAB_IND_VAR_STATE] = HORO_CST_NOTHING; // Débloque tous les événements.
							horo_tab[j][HORO_TAB_IND_INHIBE] = 0;                   // Désinhibe toutes Les lignes.
							horo_tab[j][HORO_TAB_IND_VAR_HB_H] = -1;   // Rz colonne 'Blocage'.
							horo_tab[j][HORO_TAB_IND_VAR_HB_M] = -1;
						}
						for (j = 0; j<DEPL_TAB_NB; j++) {
							if (depl_tab[j][DEPL_TAB_IND_CANT_START] != -1 && depl_tab[j][DEPL_TAB_IND_STEP] != DEPL_CST_STATE_IDLE) {
								depl_tab[j][DEPL_TAB_IND_STOP] = 1; // Raz tous les déplacements valides.
							}
						}
						if (horo_nettoyage == 1) {horo_tic_on = 1; horo_tic_dec = 0;} // Horloge en marche. On démarre le train le plus tôt possible. Pour n'avoir plus qu'un "tic" avant l'heure dite.
						else horo_tic_on = 0; // Horloge à l'arrêt.
					}
					else if (x_mouse >= 920 && x_mouse <= 1040) {
						screen_mode=MD_ECRAN_HORO_R; // [BLOQUEE]/[NON BLOQUEE] On va vers debug2.
						PostMessage(hwnd,WM_PAINT,0,0); // Pour provoquer un réaffichage de la fenêtre appelée (Impose "action" = DEBUG_TOTAL_PAINT).
						bmp_fond_default(); // La fenêtre '1' est plus petite.
						return;
					}
				}
			}
		}
    }

	if (action==DEBUG_MOUSE_RIGHT) {    // ACTION = CLIC DROIT DE LA SOURIS, on passe à la page suivante.
		switch(horo_debug_l_deb/nblignes) {
			case 0 : { screen_mode=MD_ECRAN_HORO_L2; break;}
			case 1 : { screen_mode=MD_ECRAN_HORO_L3; break;}
			case 2 : { screen_mode=MD_ECRAN_HORO_L4; break;}
			case 3 : { screen_mode=MD_ECRAN_HORO_L5; break;}
			case 4 : { screen_mode=MD_ECRAN_HORO_L6; break;}
			case 5 : { screen_mode=MD_ECRAN_HORO_L7; break;}
			case 6 : { screen_mode=MD_ECRAN_HORO_L1; break;}
			default: break;
		}
		// nblignes=32; // Nombre de ligne du tableau (sans le titre)	
		j = (screen_mode - MD_ECRAN_HORO_L1)*nblignes;
		if (horo_tab[(screen_mode-MD_ECRAN_HORO_L1)*nblignes][HORO_TAB_IND_HD_H] == -1 ) screen_mode = MD_ECRAN_HORO_L1; // On n'affiche pas les pages vides, ou reboucle sur le 1er écran.
	}

	horo_debug_l_deb=(screen_mode-MD_ECRAN_HORO_L1)*nblignes; // Valeur de la premiere ligne à afficher.

	if (action==DEBUG_KEY) { }          // ACTION = TOUCHE ENFONCEE

	SelectObject(hMemDC,bmp_pinceau_blanc); SelectObject(hMemDC,bmp_stylo_blanc);
 	Rectangle(hMemDC, 940, 610, 940+70, 610+15); // Rectangle blanc pour effacer la place pour afficher l'heure
	SetTextColor(hMemDC, RGB(0, 0, 0)); // Texte noir.
	EasyTextOut(810 - (11 * 8 / 2), decaly + (nblignes + 5)*dimy + 3, "Horloge UTS (J:HH:MM): ");
	sprintf_s(ch, "%01d:%02d:%02d", horo_j, horo_h, horo_m);
	bmp_SetTextColor(BMP_CST_COLOR_ROUGE);	// Texte en rouge.
	EasyTextOut(990 - (11 * 8 / 2), decaly + (nblignes + 5)*dimy + 3, ch);

	SelectObject(hMemDC, bmp_stylo_blanc);
	Rectangle(hMemDC, 470, decaly + (nblignes + 2)*dimy - 1, 1040 + 1, decaly + (nblignes + 3)*dimy + 5); // Rectangle blanc pour la recopie par "BitBlt(hdc_ori,,,,"
	
	SetTextColor(hMemDC, RGB(0, 0, 0)); // Texte noir.
	SelectObject(hMemDC,bmp_stylo_noir);
			
	// Bouton [Initialisation Horloge].
	SelectObject(hMemDC,bmp_pinceau_vert);SelectObject(hMemDC,bmp_stylo_noir);
	Rectangle(hMemDC, 470, decaly+(nblignes+2)*dimy, 590+1, decaly+(nblignes+3)*dimy+5); 
	SelectObject(hMemDC,bmp_stylo_vertfonce);
	EasyLine(470+1, decaly+(nblignes+3)*dimy+3, 590-1, decaly+(nblignes+3)*dimy+3); // Relief rectangle = Trait horizontal.
	EasyLine(590-1, decaly+(nblignes+2)*dimy+1, 590-1, decaly+(nblignes+3)*dimy+4);	// Relief rectangle = Trait vertical.
	EasyTextOut(530 - (14 * 8 / 2), decaly + (nblignes + 2)*dimy+3, "INITIALISATION");
	SelectObject(hMemDC,bmp_stylo_noir);
	EasyLine(590-10, decaly+(nblignes+3)*dimy+3, 590, decaly+(nblignes+3)*dimy-10+3); // Désignable = Trait en diagonale.
	
	SelectObject(hMemDC, bmp_stylo_noir);
		if (horo_tic_on==1) { // Bouton [Horloge on].
		SelectObject(hMemDC,bmp_pinceau_vert);SelectObject(hMemDC,bmp_stylo_noir);
		Rectangle(hMemDC, 620, decaly + (nblignes + 2)*dimy, 740 + 1, decaly + (nblignes + 3)*dimy + 5);
		SelectObject(hMemDC,bmp_stylo_vertfonce);
		EasyLine(620 + 1, decaly + (nblignes + 3)*dimy + 3, 740 - 1, decaly + (nblignes + 3)*dimy + 3); // Relief rectangle = Trait horizontal.
		EasyLine(740 - 1, decaly + (nblignes + 2)*dimy + 1, 740 - 1, decaly + (nblignes + 3)*dimy + 4);	// Relief rectangle = Trait vertical.
		EasyTextOut(680 - (9 * 8 / 2), decaly + (nblignes + 2)*dimy + 3, "EN MARCHE");
	}
	else { // Bouton [Horloge off].
		SelectObject(hMemDC,bmp_pinceau_rouge);SelectObject(hMemDC,bmp_stylo_noir);
		Rectangle(hMemDC, 620, decaly + (nblignes + 2)*dimy, 740 + 1, decaly + (nblignes + 3)*dimy + 5);
		SelectObject(hMemDC, bmp_stylo_rougef);
		EasyLine(620 + 1, decaly + (nblignes + 3)*dimy + 3, 740 - 1, decaly + (nblignes + 3)*dimy + 3); // Relief rectangle = Trait horizontal.
		EasyLine(740 - 1, decaly + (nblignes + 2)*dimy + 1, 740 - 1, decaly + (nblignes + 3)*dimy + 4);	// Relief rectangle = Trait vertical.
		EasyTextOut(680 - (9 * 8 / 2), decaly + (nblignes + 2)*dimy + 3, "A L'ARRÊT");
	}
	SelectObject(hMemDC, bmp_stylo_noir);
	EasyLine(740 - 10, decaly + (nblignes + 3)*dimy + 3, 740, decaly + (nblignes + 3)*dimy - 10 + 3); // Désignable = Trait en diagonale.

	if (horo_nettoyage == 1) { // Bouton [Nettoyage on].
		SelectObject(hMemDC, bmp_pinceau_jaune); SelectObject(hMemDC, bmp_stylo_noir);
		Rectangle(hMemDC, 770, decaly + (nblignes + 2)*dimy, 890 + 1, decaly + (nblignes + 3)*dimy + 5);
		SelectObject(hMemDC, bmp_stylo_orange);
		EasyLine(770 + 1, decaly + (nblignes + 3)*dimy + 3, 890 - 1, decaly + (nblignes + 3)*dimy + 3); // Relief rectangle = Trait horizontal.
		EasyLine(890 - 1, decaly + (nblignes + 2)*dimy + 1, 890 - 1, decaly + (nblignes + 3)*dimy + 4);	// Relief rectangle = Trait vertical.
		EasyTextOut(830 - (12 * 8 / 2), decaly + (nblignes + 2)*dimy + 3, "NETTOYAGE ON");
	}
	else { // Bouton [Nettoyage off].
		SelectObject(hMemDC, bmp_pinceau_vert); SelectObject(hMemDC, bmp_stylo_noir);
		Rectangle(hMemDC, 770, decaly + (nblignes + 2)*dimy, 890 + 1, decaly + (nblignes + 3)*dimy + 5);
		SelectObject(hMemDC, bmp_stylo_vertfonce);
		EasyLine(770 + 1, decaly + (nblignes + 3)*dimy + 3, 890 - 1, decaly + (nblignes + 3)*dimy + 3); // Relief rectangle = Trait horizontal.
		EasyLine(890 - 1, decaly + (nblignes + 2)*dimy + 1, 890 - 1, decaly + (nblignes + 3)*dimy + 4);	// Relief rectangle = Trait vertical.
		EasyTextOut(830 - (13 * 8 / 2), decaly + (nblignes + 2)*dimy + 3, "NETTOYAGE OFF");
	}
	SelectObject(hMemDC,bmp_stylo_noir);
	EasyLine(890 - 10, decaly + (nblignes + 3)*dimy + 3, 890, decaly + (nblignes + 3)*dimy - 10 + 3); // Lignes diagonales

	if (horo_blocked==1) { // Bouton [Horloge bloquée].
		SelectObject(hMemDC,bmp_pinceau_orange);SelectObject(hMemDC,bmp_stylo_noir);
		Rectangle(hMemDC, 920, decaly + (nblignes + 2)*dimy, 1040 + 1, decaly + (nblignes + 3)*dimy + 5);
		SelectObject(hMemDC, bmp_stylo_marron);
		EasyLine(920 + 1, decaly + (nblignes + 3)*dimy + 3, 1040 - 1, decaly + (nblignes + 3)*dimy + 3); // Relief rectangle = Trait horizontal.
		EasyLine(1040 - 1, decaly + (nblignes + 2)*dimy + 1, 1040 - 1, decaly + (nblignes + 3)*dimy + 4);	// Relief rectangle = Trait vertical.
		EasyTextOut(980 - (7 * 8 / 2), decaly + (nblignes + 2)*dimy + 3, "BLOQUÉE");
	}
	else { // Bouton [Horloge pas bloquée].
		SelectObject(hMemDC,bmp_pinceau_vert);SelectObject(hMemDC,bmp_stylo_noir);
		Rectangle(hMemDC, 920, decaly + (nblignes + 2)*dimy, 1040 + 1, decaly + (nblignes + 3)*dimy + 5);
		SelectObject(hMemDC, bmp_stylo_vertfonce);
		EasyLine(920  + 1, decaly + (nblignes + 3)*dimy + 3, 1040 - 1, decaly + (nblignes + 3)*dimy + 3); // Relief rectangle = Trait horizontal.
		EasyLine(1040 - 1, decaly + (nblignes + 2)*dimy + 1, 1040 - 1, decaly + (nblignes + 3)*dimy + 4);	// Relief rectangle = Trait vertical.
		EasyTextOut(980 - (11 * 8 / 2), decaly + (nblignes + 2)*dimy + 3, "PAS BLOQUÉE");
	}
	SelectObject(hMemDC,bmp_stylo_noir);
	EasyLine(1040 - 10, decaly + (nblignes + 3)*dimy + 3, 1040, decaly + (nblignes + 3)*dimy - 10 + 3); // Lignes diagonales

	SelectObject(hMemDC,bmp_stylo_gris192);
	bmp_SetTextColor(BMP_CST_COLOR_BLEUF);// Texte en bleu foncé.
	for (i=0; i<nblignes; i++) {
		if (horo_debug_l_deb+i<HORO_TAB_NB) {
			SelectObject(hMemDC,bmp_pinceau_blanc);
			if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_INHIBE]==1) SelectObject(hMemDC,bmp_pinceau_cyan);
			else if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VAR_STATE]==HORO_CST_WAIT_BLOCKING) SelectObject(hMemDC,bmp_pinceau_vert);
			else if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VAR_STATE]==HORO_CST_BLOCKED) SelectObject(hMemDC,bmp_pinceau_orange);
			Rectangle(hMemDC, 0, dimy*(i+2), 1100, dimy*(i+3)+1);
			SelectObject(hMemDC,bmp_pinceau_blanc);
			EasyLine(1*dimnx,         i*dimy+2*decaly, 1*dimnx,         (i+1)*dimy+2*decaly);
			EasyLine(2*dimnx,         i*dimy+2*decaly, 2*dimnx,         (i+1)*dimy+2*decaly);
			EasyLine(3*dimnx,         i*dimy+2*decaly, 3*dimnx,         (i+1)*dimy+2*decaly);
			EasyLine(3*dimnx+1*dimcx, i*dimy+2*decaly, 3*dimnx+1*dimcx, (i+1)*dimy+2*decaly);
			EasyLine(3*dimnx+2*dimcx, i*dimy+2*decaly, 3*dimnx+2*dimcx, (i+1)*dimy+2*decaly);
			EasyLine(3*dimnx+3*dimcx, i*dimy+2*decaly, 3*dimnx+3*dimcx, (i+1)*dimy+2*decaly);
			EasyLine(3*dimnx+4*dimcx, i*dimy+2*decaly, 3*dimnx+4*dimcx, (i+1)*dimy+2*decaly);
			EasyLine(3*dimnx+5*dimcx, i*dimy+2*decaly, 3*dimnx+5*dimcx, (i+1)*dimy+2*decaly);
			EasyLine(3*dimnx+6*dimcx, i*dimy+2*decaly, 3*dimnx+6*dimcx, (i+1)*dimy+2*decaly);
			EasyLine(3*dimnx+9*dimcx, i*dimy+2*decaly, 3*dimnx+9*dimcx, (i+1)*dimy+2*decaly);

			if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_HD_H]==-1) bmp_SetTextColor(BMP_CST_COLOR_GRIS192);// Texte en gris
			sprintf_s(ch,"%3d",horo_debug_l_deb+i); // Numéro d'élément.
			EasyTextOut(5,i*dimy+2*decaly+2,ch); 
			bmp_SetTextColor(BMP_CST_COLOR_BLEUF);// Texte en bleu foncé.
			if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_HD_H]!=-1) {

				sprintf_s(ch,"????");
				if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VAR_STATE]==HORO_CST_WAIT_BLOCKING) sprintf_s(ch,"At-Bl");
				else if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VAR_STATE]==HORO_CST_NOTHING)  sprintf_s(ch,"     ");
				else if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VAR_STATE]==HORO_CST_BLOCKED)  sprintf_s(ch,"Blqué");
				EasyTextOut(2+1*dimnx,i*dimy+2*decaly+2,ch); 			

				if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_HD_J]!=-1) { // Jour début.
					if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_HD_J]==HORO_CST_J_WEEK) sprintf_s(ch,"s:");
					else if (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_J] == HORO_CST_J_WEEKEND) sprintf_s(ch, "w:");
					else if (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_J] == HORO_CST_J_NETTOYAGE) sprintf_s(ch, "n:");
					else sprintf_s(ch, "%1d:", horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_J]);
				}
				else sprintf_s(ch,"  ");
				bmp_SetTextColor(BMP_CST_COLOR_BLEUF);// Texte colonne 'Départ' en bleu foncé.

				if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_INHIBE]==1) EasyTextOut(2+2*dimnx,i*dimy+2*decaly+2," Inh");  // Elément inhibé.
				
				if (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_H] != -1) {
					if ( ((horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_J] == -1 && horo_nettoyage == 0) ||             // Indéfini = Tous les jours.
						  (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_J] == horo_j  && horo_j >=0 && horo_j <=4 ) ||  // Le même jour du lundi au vendredi = 0 1 2 3 4.
						  (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_J] == HORO_CST_J_WEEK       && horo_j <=4 ) ||  // Semaine du lundi au vendredi = 0 1 2 3 4.
						  (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_J] == HORO_CST_J_WEEKEND    && (horo_j == 5 && horo_j == 6 )) || // Samedi et Dimanche = 5 6.
						  (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_J] == HORO_CST_J_NETTOYAGE  && horo_nettoyage == 1 )) && // Nettoyage.
						  (60*horo_h + horo_m >= 60*horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_H] + horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_M])) bmp_SetTextColor(BMP_CST_COLOR_ROUGEF); // Texte en rouge si heure dépassée.
					sprintf_s(ch2, "%02d:", horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_H]); // Texte colonne 'Départ' Heure début.
				}
				else sprintf_s(ch2,"--:");
				strcat (ch,ch2);
				if (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_M] != -1) {
					sprintf_s(ch2, "%02d", horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_M]); // Texte colonne 'Départ' Minute début, la couleur est déjà définie pour les heures.
				}
				else sprintf_s(ch2,"--");
				strcat (ch,ch2);
				EasyTextOut(6 + 3 * dimnx, i*dimy + 2 * decaly + 2, ch);

				bmp_SetTextColor(BMP_CST_COLOR_BLEUF);// Texte en bleu foncé.
				if (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HD_J] == HORO_CST_J_NETTOYAGE) {
					SelectObject(hMemDC, bmp_stylo_blanc);
					if (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_INHIBE] == 1) SelectObject(hMemDC, bmp_stylo_cyan);
					else if (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_VAR_STATE] == HORO_CST_WAIT_BLOCKING) SelectObject(hMemDC, bmp_stylo_vert);
					else if (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_VAR_STATE] == HORO_CST_BLOCKED) SelectObject(hMemDC, bmp_stylo_orange);
					EasyLine(3 * dimnx + 2 * dimcx, i*dimy + 2 * decaly + 1, 3 * dimnx + 2 * dimcx, (i+1)*dimy + 2 * decaly + 2);
					SelectObject(hMemDC, bmp_stylo_gris192);
					sprintf_s(ch, "train nettoyage");
					EasyTextOut(8 + 3 * dimnx + 1 * dimcx, i*dimy + 2 * decaly + 2, ch);
				}
				else {
					if (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HF_H] != -1) sprintf_s(ch, "%02d:", horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HF_H]); // Heure fin.
					else sprintf_s(ch, "--:");
					if (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HF_M] != -1) sprintf_s(ch2, "%02d", horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_HF_M]); // Minute fin.
					else sprintf_s(ch2, "--");
					strcat(ch, ch2);
					EasyTextOut(14 + 3 * dimnx + 1 * dimcx, i*dimy + 2 * decaly + 2, ch);
					
					if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_HI_H]!=-1) sprintf_s(ch,"%02d:",horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_HI_H]); // Heure interval.
					else sprintf_s(ch,"--:");
					if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_HI_M]!=-1) sprintf_s(ch2,"%02d",horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_HI_M]); // Minute interval.
					else sprintf_s(ch2,"--");
					strcat (ch,ch2);
					EasyTextOut(14+3*dimnx+2*dimcx,i*dimy+2*decaly+2,ch); 
				}

				if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VAR_HB_H]!=-1) sprintf_s(ch,"%02d:",horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VAR_HB_H]); // Heure avant blocage.
				else sprintf_s(ch,"--:");
				if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VAR_HB_M]!=-1) sprintf_s(ch2,"%02d",horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VAR_HB_M]); // Minute avant blocage.
				else sprintf_s(ch2,"--");
				strcat (ch,ch2);
				EasyTextOut(14+3*dimnx+3*dimcx,i*dimy+2*decaly+2,ch); 

				if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_HB_H]!=-1) sprintf_s(ch,"%02d:",horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_HB_H]); // Heure prévue de blocage.
				else sprintf_s(ch,"--:");
				if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_HB_M]!=-1) sprintf_s(ch2,"%02d",horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_HB_M]); // Minute prévue de blocage.
				else sprintf_s(ch2,"--");
				strcat (ch,ch2);
				EasyTextOut(14+3*dimnx+5*dimcx,i*dimy+2*decaly+2,ch); 

				if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_TYPEB]==HORO_CST_BLOCK_H)     EasyTextOut(13+3*dimnx+4*dimcx,i*dimy+2*decaly+2,"heure"); 
				if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_TYPEB]==HORO_CST_BLOCK_DELAY) EasyTextOut(13+3*dimnx+4*dimcx,i*dimy+2*decaly+2,"délai"); 

				if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VB_NUM]!=-1) { // Variable de blocage.
					pio_var_int2ch(horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VB_NUM],ch);
				    if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_VB_INV]==1) strcat (ch,"=1");
				    else strcat (ch,"=0");
					EasyTextOut(14+3*dimnx+6*dimcx,i*dimy+2*decaly+2,ch); 
				}
				sprintf_s(ch,"");
                for(j=0; j<2; j++) {  // Liste des actions à lancer (variables) 2 actions affichées au plus sur 6 possibles maximum.
                    if(horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_V0_NUM+2*j]==-1) break;
					pio_var_int2ch(horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_V0_NUM+2*j],ch2);
					strcat (ch,ch2);
					if (horo_tab[horo_debug_l_deb+i][HORO_TAB_IND_V0_OP+2*j]==HORO_CST_OP_SET) strcat (ch,".1 ");
					else strcat (ch,".0 ");
				}
				j = horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_V0_NUM]; // j = n° de variable = un déplacement et set à '1'.
				
				if (j >= 6500 && (j <= 6500 + DEPL_TAB_NB) && (horo_tab[horo_debug_l_deb + i][HORO_TAB_IND_V0_OP] == HORO_CST_OP_SET)) {
					j = j - 6500; // Si c'est un déplacement, on affiche le nom du déplacement, plutôt que le nom de la variable.
					sprintf_s(ch,  "d%3d = ", j);
					strcat (ch,deplacement.depl_name[j]);
					ch[7 + 35] = '\x00'; // Pour limiter le nombre de caractère affichés.
					EasyTextOut(13 + 3 * dimnx + 9 * dimcx, i*dimy + 2 * decaly + 2, ch);
				}
				else {
					EasyTextOut(67 + 2 + 3 * dimnx + 9 * dimcx, i*dimy + 2 * decaly + 2, ch); // + 67 pixels pour décaler le texte.
				}
			}
		} 
		else {
			Rectangle(hMemDC, 0, dimy*(i+2), 1100, dimy*(i+3)+1);
			EasyLine(1*dimnx,         i*dimy+2*decaly, 1*dimnx,         (i+1)*dimy+2*decaly);
			EasyLine(2*dimnx,         i*dimy+2*decaly, 2*dimnx,         (i+1)*dimy+2*decaly);
			EasyLine(3*dimnx,         i*dimy+2*decaly, 3*dimnx,         (i+1)*dimy+2*decaly);
			EasyLine(3*dimnx+1*dimcx, i*dimy+2*decaly, 3*dimnx+1*dimcx, (i+1)*dimy+2*decaly);
			EasyLine(3*dimnx+2*dimcx, i*dimy+2*decaly, 3*dimnx+2*dimcx, (i+1)*dimy+2*decaly);
			EasyLine(3*dimnx+3*dimcx, i*dimy+2*decaly, 3*dimnx+3*dimcx, (i+1)*dimy+2*decaly);
			EasyLine(3*dimnx+4*dimcx, i*dimy+2*decaly, 3*dimnx+4*dimcx, (i+1)*dimy+2*decaly);
			EasyLine(3*dimnx+5*dimcx, i*dimy+2*decaly, 3*dimnx+5*dimcx, (i+1)*dimy+2*decaly);
			EasyLine(3*dimnx+6*dimcx, i*dimy+2*decaly, 3*dimnx+6*dimcx, (i+1)*dimy+2*decaly);
			EasyLine(3*dimnx+9*dimcx, i*dimy+2*decaly, 3*dimnx+9*dimcx, (i+1)*dimy+2*decaly);
		}
	}
}
