// UTS 2000 - Divers Sous-Programmes
// V3.5c - Le 01/04/2013
#include <windows.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "Train_UTS.h"

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


/*
Variables spéciales utilisable dans les tables de vérité ou équations.

Variables pour commander des automates à fréquence fixe.
	special_var_0  =       80 msec
	special_var_1  =      160 msec
	special_var_2  =      320 msec
	special_var_3  =      640 msec  ( 0,6 seconde)
	special_var_4  =    1.280 msec  ( 1,3 seconde)
	special_var_5  =    2.560 msec  ( 2,6 secondes)
	special_var_6  =    5.120 msec  ( 5,1 secondes)
	special_var_7  =   10.240 msec  (10   secondes)
	special_var_8  =   20.480 msec  (20   secondes)
	special_var_9  =   40.960 msec  (40   secondes)
	special_var_10 =   81.920 msec  (1 minute  et 20 secondes)
	special_var_11 =  163.840 msec  (2 minutes et 40 secondes)
	special_var_12 =  327.680 msec  (5 minutes et 27 secondes)
	special_var_13 =  655.360 msec  (11 minutes)
	special_var_14 = 1310.720 msec  (22 minutes)
	special_var_15 = 2621.440 msec  (44 minutes)

Variables pour commander des feux de carrefour routier.
	special_var_20 = feux 1&2 vitesse de séquencement (  1- 99)   1=rapide feux normaux.
	                                                  (101-199) 101=rapide feux oranges clignotants.
	special_var_23 = feux 1 - lampe rouge
	special_var_22 = feux 1 - lampe orange
	special_var_21 = feux 1 - lampe vert
	special_var_26 = feux 2 - lampe rouge
	special_var_25 = feux 2 - lampe orange
	special_var_24 = feux 2 - lampe verte

Variables pour commander divers automates. Allumage de type chenillard.
	special_var_30 = vitesse de séquencement 2 (1- 99)   1=rapide.
	special_var_31 = lampe 1
	special_var_32 = lampe 2

	special_var_33 = vitesse de séquencement 3 (1- 99)   1=rapide.
	special_var_34 = lampe 1
	special_var_35 = lampe 2
	special_var_36 = lampe 3

	special_var_37 = vitesse de séquencement 4 (1- 99)   1=rapide.
	special_var_38 = lampe 1
	special_var_39 = lampe 2
	special_var_40 = lampe 3
	special_var_41 = lampe 4

	special_var_42 = vitesse de séquencement 5 (1- 99)   1=rapide.
	special_var_43 = lampe 1
	special_var_44 = lampe 2
	special_var_45 = lampe 3
	special_var_46 = lampe 4
	special_var_47 = lampe 5

	special_var_48 = vitesse de séquencement 6 (1- 99)   1=rapide.
	special_var_49 = lampe 1
	special_var_50 = lampe 2
	special_var_51 = lampe 3
	special_var_52 = lampe 4
	special_var_53 = lampe 5
	special_var_54 = lampe 6

	special_var_55 = vitesse de séquencement 10 (1- 99)   1=rapide.
	special_var_56 = lampe 1
	special_var_57 = lampe 2
	special_var_58 = lampe 3
	special_var_59 = lampe 4
	special_var_60 = lampe 5
	special_var_61 = lampe 6
	special_var_62 = lampe 7
	special_var_63 = lampe 8
	special_var_64 = lampe 9
	special_var_65 = lampe 10

	special_var_66 = vitesse de séquencement lent (1- 99)   1=rapide, 2=+lent...
	special_var_67 = variable de 0 à  255.
	special_var_68 = variable de 0 à 1023.
	special_var_69 = vitesse de séquencement lent (1- 99)   1=rapide, 2=+lent...
	special_var_70 = variable de 0 à  255.
	special_var_71 = variable de 0 à 1023.

	special_var_72 = vitesse de séquencement rapide (1- 99) 1=lent, 2=+rapide...
	special_var_73 = variable de 0 à  255.
	special_var_74 = variable de 0 à 1023.
	special_var_75 = vitesse de séquencement rapide (1- 99) 1=lent, 2=+rapide...
	special_var_76 = variable de 0 à  255.
	special_var_77 = variable de 0 à 1023.

	special_var_78 = vitesse de séquencement lent (1- 99)   1=rapide, 2=+lent...
	special_var_79 = variable de 0 à  255 à 0.
	special_var_80 = variable de 0 à 1023 à 0.
	special_var_81 = vitesse de séquencement lent (1- 99)   1=rapide, 2=+lent...
	special_var_82 = variable de 0 à  255 à 0.
	special_var_83 = variable de 0 à 1023 à 0.

	special_var_84 = vitesse de séquencement rapide (1- 99) 1=lent, 2=+rapide...
	special_var_85 = variable de 0 à  255 à 0.
	special_var_86 = variable de 0 à 1023 à 0.
	special_var_87 = vitesse de séquencement rapide (1- 99) 1=lent, 2=+rapide...
	special_var_88 = variable de 0 à  255 à 0.
	special_var_89 = variable de 0 à 1023 à 0.

	special_var[90] = horloge en marche=1
	special_var[91] = horloge bloquée=1
	special_var[92] = jour courant=0 à 6 
	special_var[93] = heure courante=00 à 23
	special_var[94] = minute courante=00 à 59
	special_var[95] = 60*heure courante + minute courante.
}
*/
// Déclaration de diverses fonctions générales

// Déclaration des variables externes
extern int moins_char_normal;   // 1= '-' est un caractère normal,  0= '-' est un séparateur (comme +)

extern int special_var[NB_SPECIAL_VAR];
extern int special_seq_feu;
extern int special_seq_2, special_seq_3, special_seq_4, special_seq_5, special_seq_6, special_seq_10;
extern int special_sens_11a, special_sens_12a, special_sens_21a, special_sens_22a;
extern int special_sens_11b, special_sens_12b, special_sens_21b, special_sens_22b;
extern int debug_tic_nb;

extern int horo_j;    //global    //0-6    //horaire de départ: 7=week 8=weekend
extern int horo_h;    //global    //0-23
extern int horo_m;    //global    //0-59
extern int horo_tic_on;            //global
extern int horo_blocked;           //global


extern HDC   hMemDC;			//
//extern HFONT la_fonte;		// Font de caractères pour UTS
//extern HFONT cells_font;	// Font de caractères pour ..


//--------------------------------------------------------------------------------------------------
// Sous-programme de lecture d'une ligne de texte dans un fichier
// La fonction renvoie '0' si Ok ou fin de fichier.
// La fonction renvoie '1' en cas d'erreur.
//    get_line(fichier, chaine de réception, nombre de caractères lus en retour)
//                                           (paramètre renseigné par ce sous programme).
// 
//  Si ligne = 'can_0  pos0  pos1'
//  retour = char ch_tab[0][CHAR_CONFIG_NB] = 'can_0' = 1er mot
//           char ch_tab[1][CHAR_CONFIG_NB] = 'pos0'  = 2em mot
//           char ch_tab[2][CHAR_CONFIG_NB] = 'pos1'  = 3em mot    ...   char ch_tab[69][CHAR_CONFIG_NB].
//
//  char ch_tab[BLOC_CONFIG_NB][CHAR_CONFIG_NB] = CHAR_CONFIG_NB chaines maximum de 250 caractères!!!
//
// si 'moins_char_normal' = 0, le caractère '-' est un caractère séparateur comme ' ' -10:+10 =>  [-][10]  et  [+][10]
// si 'moins_char_normal' = 1, le caractère '-' est un caractère ordinaire.           -10:+10 =>    [-10]  et  [+][10]
//
int get_line(FILE* pf, char ch_tab[][CHAR_CONFIG_NB], int* ch_nb)
{
    int i;
    int ch_ind;
    int ch_ok;
    char c;

    *ch_nb=0;
    ch_ind=0;
    ch_ok=0;

    for(i=0;i<BLOC_CONFIG_NB;i++) ch_tab[i][0]='\0';   // Vide toutes les chaines.

    do { // Lit une ligne compléte dans le fichier 'config.txt' ou jusqu'au caractère ';'.
        if(fscanf(pf,"%c",&c)==EOF) return 0; // Fin du fichier, return(0).

        if( (c>='à' && c<='ù') ||(c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='_' || (c=='-' && moins_char_normal) || c=='[' || c==']') { // Modif V3.5c
            ch_tab[*ch_nb][ch_ind]=c;
            ch_ind++;
            if (ch_ind>=CHAR_CONFIG_NB) return 1;  // On arrête le traitement en erreur si la ligne comporte plus de 250 caractères.
            ch_ok=1;}

        else {
            if(ch_ok) { // On a bien un mot valide en mémoire dans 'ch_tab[][]'.
                ch_tab[*ch_nb][ch_ind]='\0';
                *ch_nb=(*ch_nb)+1; // On clos la chaine et l'on passe au mot suivant.
                if (*ch_nb>=BLOC_CONFIG_NB) return 1;  // On arrête le traitement en erreur si le nombre de mots par ligne >= CHAR_CONFIG_NB
                ch_ind=0;
                ch_ok=0; }

            if(c!=' ' && c!='\t' && c!='\n') { // Si le caractère n'est pas 'Espace', 'Retour_chariot' ou 'Fin_de_ligne'
                ch_tab[*ch_nb][0]=c;           // C'est un mot à lui tout seul. Exemple ':' ou '|'	
                ch_tab[*ch_nb][1]='\0';
                *ch_nb=(*ch_nb)+1;
                if (*ch_nb>=BLOC_CONFIG_NB) return 1;  // On arrête le traitement en erreur si le nombre de mots par ligne >= BLOC_CONFIG_NB
				ch_ind=0;
                ch_ok=0;}
        }
    }
    while(c!='\n' && c!=';');

    if( (*ch_nb)==1 && ch_tab[0][0]==']') return 0;
    return 1;
}

//--------------------------------------------------------------------------------------------------
// Sous-programme pour écrire des traces dans le fichier 'Train_UTS_log.txt'
//    log (chaine à écrire à la suite du fichier)
//
// exemples :
//   char szdebug[200];
//   sprintf_s(gszErr,"g=%d c=%d canton.num_train=%d selected_train=%d",g,c,canton.num_train[c/100][c%100],selected_train); log(gszErr);
//   sprintf_s(szerror," ");
//   MessageBox(NULL,szdebug,"Erreur",MB_OK|MB_ICONERROR);
//   sprintf_s(szdebug,"s_led_d=%d s_led_cli=%d s_led_phase=%d sel=%d",serial_led_debug[0],serial_led_cli_debug[0],serial_led_phase_debug[0],serial_led_debug_select[0]);
//   TextOut(hMemDC,10,550,szdebug,strlen(szdebug));
//
char gszErr[1024];
void log(char* sz)
{
    FILE* pf;
    static int start=1;
    if(start) pf=fopen("Train_UTS_log.txt","wt");		// Efface le fichier avant d'écrire la première ligne
    else      pf=fopen("Train_UTS_log.txt","at");		// Ajoute une ligne à la suite
    if(pf) { fprintf(pf,sz); fclose(pf); }
    start=0;
}

//--------------------------------------------------------------------------------------------------
// Sous-programme pour convertir une valeur du potentiométre de vitesse de la carte UTS (0-225) en -64 à +64 ou -99 si frein actionné.
//  Indicateur autorisation du frein = 1 => Bouton frein autorisé sur la manette.
/*  convertit la valeur can 0-255 en consigne de vitesse -64...0...+64 et frein -99
    utilise un profile standard
    +vmax                     /-----
                             /
                            /
    +vmin                  /
    0             /-------/
    -vmin        /
                /
               /
    -vmax ----/
          0  16  112   143  239  255
		  
  Valeur du can = 0 à 255 :   
		250-255 = Frein
		144-249 = Marche avant 0-64
		113-143 = Arrêt (zone d'incertitude de la manette)
		  5-112 = Marche arriére 0-64 (Vmin-Vmax)
		  0-  5 = Frein

V3.3 = Conversion fixe 0-255 en entrée, -64+64 en sortie  avec une zone à 0 de 112 à 143.
//   En V3.3, le profil des trains est appliqué dans le programme 'void cTrain::canton_maj_profil(void)' pour que le profile
//   soit pris en compte même dans le cadre du déplacement.
*/

int can_to_cons(int can, int enbreak)
{
    char sign='+';
    int can_plus;   // 0...127
    int ret;

	ret=0;
    if(can>=128) { sign='+'; can_plus=can-128; }
    else         { sign='-'; can_plus=127-can; }

	if(can_plus>122) if(enbreak) return -99; // ret = - 99 si frein.
    if(can_plus>112) ret=64;
    if(can_plus<16)  ret=0;
    if(can_plus>=16 && can_plus<=112) ret=(2*(can_plus-16))/3; 
    if(sign=='-') ret=-ret;
    return ret; // ret = -64 à +64.
}


//--------------------------------------------------------------------------------------------------
// Sous-programme qui renvoi une valeur de vitesse en fonction du cran du potentiomètre 
//   virtuel et de Vmin et Vmax. La valeur (de -64 à +64) est renvoyée par cette fonction.
//   virtualstep_to_cons (Cran du potentiomètre virtuel)
//   En V3.3, le profil des trains est appliqué dans le programme 'void cTrain::canton_maj_profil(void)' pour que le profils
//   soit pris en compte même dans le cadre de déplacement.
//
int virtualstep_to_cons(int pot_virtual_step) {
    switch(pot_virtual_step) {
        case  0: return 0;
        case  1: return +10; //vmin;
        case  2: return +32; //vmin+(1*(vmax-vmin))/2;     A convertir en -64 -32 0 +32 +64 quel que soit le profil.
        case  3: return +64; //vmax;
        case -1: return -10; //-vmin;
        case -2: return -32; //-(vmin+(1*(vmax-vmin))/2);
        case -3: return -64; //-vmax;
        default: return 0;
    }
}

//--------------------------------------------------------------------------------------------------
// Sous-programme pour renseigner les valeurs spéciales internes à UTS mais utilisables par l'utilisateur.
// Renseigne les variables 'special_var_0' à 'special_var_99'.
//
void special_var_tick(void)
{
    int i;
	special_var[ 0] = (debug_tic_nb&    1)    ; //       80 msec
	special_var[ 1] = (debug_tic_nb&    2)>> 1;	//      160 msec
	special_var[ 2] = (debug_tic_nb&    4)>> 2;	//      320 msec
	special_var[ 3] = (debug_tic_nb&    8)>> 3;	//      640 msec  ( 0,6 seconde)
	special_var[ 4] = (debug_tic_nb&   16)>> 4;	//    1.280 msec  ( 1,3 seconde)
	special_var[ 5] = (debug_tic_nb&   32)>> 5;	//    2.560 msec  ( 0,6 seconde)
	special_var[ 6] = (debug_tic_nb&   64)>> 6;	//    5.120 msec  ( 5,1 secondes)
	special_var[ 7] = (debug_tic_nb&  128)>> 7;	//   10.240 msec  (10   secondes)
	special_var[ 8] = (debug_tic_nb&  256)>> 8;	//   20.480 msec  (20   secondes)
	special_var[ 9] = (debug_tic_nb&  512)>> 9;	//   40.960 msec  (40   secondes)
	special_var[10] = (debug_tic_nb& 1024)>>10;	//   81.920 msec  ( 1 minute  et 20 secondes)
	special_var[11] = (debug_tic_nb& 2048)>>11;	//  163.840 msec  ( 2 minutes et 40 secondes)
	special_var[12] = (debug_tic_nb& 4096)>>12;	//  327.680 msec  ( 5 minutes et 27 secondes)
	special_var[13] = (debug_tic_nb& 8192)>>13;	//  655.360 msec  (11 minutes)
	special_var[14] = (debug_tic_nb&16384)>>14;	// 1310.720 msec  (22 minutes)
	special_var[15] = (debug_tic_nb&32768)>>15;	// 2621.440 msec  (44 minutes)

	
	// Séquence pour feux routiers tricolores sur 20 pas.
	//
	//00000000001111111111 : N° de séquence Vitesse = special_var[20] = special_var_20 = 15 par défaut. si > 101 = feux clignotant orange (vitesse= valeur-100).
	//01234567890123456789 
	//RRRRRRRRRRRVVVVVVVOO : Feux n°1  vert=special_var[21], orange=special_var[22], rouge=special_var[23].
	//RVVVVVVVOORRRRRRRRRR : Feux n°2  vert=special_var[24], orange=special_var[25], rouge=special_var[26].
	// Vitesse de séquencement = special_var[20]
	//
	if (debug_tic_nb<=2 && special_var[20] <100 ) {					// Vitesse <100
		special_var[24]=0; special_var[25]=0; special_var[26]=1;	// Initialisation des feux si 'debug_tic_nd' vient de commencer à tourner.
		special_var[21]=0; special_var[22]=0; special_var[23]=1;
	}
	if (debug_tic_nb>=3 && special_var[20] <100 ) {					// Vitesse <100
		// Initialisation des feux tricolores si l'on vient de quitter le mode orange cligotant.
		if (special_var[21]==0 && special_var[23]==0 && special_var[24]==0 && special_var[26]==0) {	
			special_seq_feu=0; special_var[21]=0; special_var[22]=0; special_var[23]=1; special_var[24]=1; special_var[25]=0; special_var[26]=0;
		}
	}
	if (debug_tic_nb<=2 && special_var[20] >=100 ) {				// Vitesse > 100
		special_var[24]=0; special_var[25]=0; special_var[26]=0;	// Initialisation des feux si 'debug_tic_nd' vient de commencer à tourner.
		special_var[21]=0; special_var[22]=0; special_var[23]=0;
	}
	
	if (special_var[20]<100) {				// Vitesse < 100
		i=15;								// Vitesse des feux par défaut.
		if (special_var[20]>=1) i=special_var[20];
		if (debug_tic_nb%i==0) {
			special_seq_feu++;
			if (special_seq_feu>=20) special_seq_feu=0;
			if (special_seq_feu== 1) { special_var[24]=1;                  ; special_var[26]=0; }
			if (special_seq_feu== 8) { special_var[24]=0; special_var[25]=1; }
			if (special_seq_feu==10) {                    special_var[25]=0; special_var[26]=1; }
			if (special_seq_feu==11) { special_var[21]=1;                  ; special_var[23]=0; }
			if (special_seq_feu==18) { special_var[21]=0; special_var[22]=1; }
			if (special_seq_feu== 0) {                  ; special_var[22]=0; special_var[23]=1; }
		}
	}
	if (special_var[20]>=100) {				// Vitesse > 100
		i=5;								// Vitesse des feux par défaut en orange clignotant.
		if (special_var[20]>=101 && special_var[20]<=199 ) i=special_var[20]-100;
		if (debug_tic_nb%i==0) {
			special_seq_feu++;
			if (special_seq_feu>=2) special_seq_feu=0;
			special_var[21]=0; special_var[23]=0; special_var[24]=0; special_var[26]=0;
			if (special_seq_feu== 0) { special_var[22]=0; special_var[25]=0; }
			if (special_seq_feu== 1) { special_var[22]=1; special_var[25]=1; }
		}
	}

	// Séquence pour chenillards à 3, 4, 5, 6 ou 10 lampes.
	//
	//
	i=15;
	if (special_var[30]>=1 && special_var[30]<100 ) i=special_var[30];
	if (debug_tic_nb%i==0) {
		special_seq_2++;
		if (special_seq_2==2) special_seq_2=0;
		if (special_seq_2==0) { special_var[32]=0; special_var[31]=1; }
		if (special_seq_2==1) { special_var[31]=0; special_var[32]=1; }
	}
	i=15;
	if (special_var[33]>=1 && special_var[33]<100 ) i=special_var[33];
	if (debug_tic_nb%i==0) {
		special_seq_3++;
		if (special_seq_3==3) special_seq_3=0;
		if (special_seq_3==0) { special_var[34]=0; special_var[35]=1; }
		if (special_seq_3==1) { special_var[35]=0; special_var[36]=1; }
		if (special_seq_3==2) { special_var[36]=0; special_var[34]=1; }
	}
	i=15;
	if (special_var[37]>=1 && special_var[37]<100 ) i=special_var[37];
	if (debug_tic_nb%i==0) {
		special_seq_4++;
		if (special_seq_4==4) special_seq_4=0;
		if (special_seq_4==0) { special_var[38]=0; special_var[39]=1; }
		if (special_seq_4==1) { special_var[39]=0; special_var[40]=1; }
		if (special_seq_4==2) { special_var[40]=0; special_var[41]=1; }
		if (special_seq_4==3) { special_var[41]=0; special_var[38]=1; }
	}
	i=15;
	if (special_var[42]>=1 && special_var[42]<100 ) i=special_var[42];
	if (debug_tic_nb%i==0) {
		special_seq_5++;
		if (special_seq_5==5) special_seq_5=0;
		if (special_seq_5==0) { special_var[43]=0; special_var[44]=1; }
		if (special_seq_5==1) { special_var[44]=0; special_var[45]=1; }
		if (special_seq_5==2) { special_var[45]=0; special_var[46]=1; }
		if (special_seq_5==3) { special_var[46]=0; special_var[47]=1; }
		if (special_seq_5==4) { special_var[47]=0; special_var[43]=1; }
	}
	i=15;
	if (special_var[48]>=1 && special_var[48]<100 ) i=special_var[48];
	if (debug_tic_nb%i==0) {
		special_seq_6++;
		if (special_seq_6==6) special_seq_6=0;
		if (special_seq_6==0) { special_var[49]=0; special_var[50]=1; }
		if (special_seq_6==1) { special_var[50]=0; special_var[51]=1; }
		if (special_seq_6==2) { special_var[51]=0; special_var[52]=1; }
		if (special_seq_6==3) { special_var[52]=0; special_var[53]=1; }
		if (special_seq_6==4) { special_var[53]=0; special_var[54]=1; }
		if (special_seq_6==5) { special_var[54]=0; special_var[49]=1; }
	}
	i=15;
	if (special_var[55]>=1 && special_var[55]<100 ) i=special_var[55];
	if (debug_tic_nb%i==0) {
		special_seq_10++;
		if (special_seq_10==10) special_seq_10=0;
		if (special_seq_10==0) { special_var[56]=0; special_var[57]=1; }
		if (special_seq_10==1) { special_var[57]=0; special_var[58]=1; }
		if (special_seq_10==2) { special_var[58]=0; special_var[59]=1; }
		if (special_seq_10==3) { special_var[59]=0; special_var[60]=1; }
		if (special_seq_10==4) { special_var[60]=0; special_var[61]=1; }
		if (special_seq_10==5) { special_var[61]=0; special_var[62]=1; }
		if (special_seq_10==6) { special_var[62]=0; special_var[63]=1; }
		if (special_seq_10==7) { special_var[63]=0; special_var[64]=1; }
		if (special_seq_10==8) { special_var[64]=0; special_var[65]=1; }
		if (special_seq_10==9) { special_var[65]=0; special_var[56]=1; }
	}

	// Pour une variable allant de 0 à 255 et (mode lent)   1=rapide, 2=+lent...
	// pour une variable allant de 0 à 1023   (/|/|/|/|/).
	i=1;
	if (special_var[66]>=1 && special_var[66]<100 ) i=special_var[66];
	if (debug_tic_nb%i==0) {
		if (special_var[67]++>=256)  special_var[67]=0;
		if (special_var[68]++>=1024) special_var[68]=0;
	}
	i=1;
	if (special_var[69]>=1 && special_var[69]<100 ) i=special_var[69];
	if (debug_tic_nb%i==0) {
		if (special_var[70]++>=256)  special_var[70]=0;
		if (special_var[71]++>=1024) special_var[71]=0;
	}
	// Pour une variable allant de 0 à 255 et (mode rapide) 1=lent, 2=+rapide...
	// pour une variable allant de 0 à 1023   (/|/|/|/|/|/).
	i=4;
	if (special_var[72]>=1 && special_var[72]<100 ) i=special_var[72];
	special_var[73]=special_var[73]+i; special_var[74]=special_var[74]+i;
	if (special_var[73]>=256)  special_var[73]=0;
	if (special_var[74]>=1024) special_var[74]=0;
	i=4;
	if (special_var[75]>=1 && special_var[75]<100 ) i=special_var[75];
	special_var[76]=special_var[76]+i; special_var[77]=special_var[77]+i;
	if (special_var[76]>=256)  special_var[76]=0;
	if (special_var[77]>=1024) special_var[77]=0;
	
	// Pour une variable allant de 0 à 255 à 0 et (mode lent)   1=rapide, 2=+lent...
	// pour une variable allant de 0 à 1023 à 0.  (/\/\/\/\/).
	i=1;
	if (special_var[78]>=1 && special_var[78]<100 ) i=special_var[78];
	if (debug_tic_nb%i==0) {
		special_var[79]=special_var[79]+special_sens_11a;
		special_var[80]=special_var[80]+special_sens_12a;
		if (special_var[79]>=256)  special_sens_11a=-1;
		if (special_var[79]<=0)    special_sens_11a= 1;
		if (special_var[80]>=1024) special_sens_12a=-1;
		if (special_var[80]<=0)    special_sens_12a= 1;
	}
	i=1;
	if (special_var[81]>=1 && special_var[81]<100 ) i=special_var[81];
	if (debug_tic_nb%i==0) {
		special_var[82]=special_var[82]+special_sens_11b;
		special_var[83]=special_var[83]+special_sens_12b;
		if (special_var[82]>=256)  special_sens_11b=-1;
		if (special_var[82]<=0)    special_sens_11b= 1;
		if (special_var[83]>=1024) special_sens_12b=-1;
		if (special_var[83]<=0)    special_sens_12b= 1;
	}
	// Pour une variable allant de 0 à 255 à 0 et (mode rapide) 1=lent, 2=+rapide...
	// pour une variable allant de 0 à 1023 à 0.  (/\/\/\/\/).
	i=4;
	if (special_var[84]>=1 && special_var[84]<100 ) i=special_var[84];
	if (debug_tic_nb<=2) {special_sens_21a=i; special_sens_22a=i;}	// Pour éviter d'attendre un tour pour avoir les bonnes valeurs de "special_sens".
	special_var[85]=special_var[85]+special_sens_21a;
	special_var[86]=special_var[86]+special_sens_22a;
	if (special_var[85]>=256)  {special_var[85]= 255; special_sens_21a=-i;}
	if (special_var[85]<=0)    {special_var[85]=   0; special_sens_21a= i;}
	if (special_var[86]>=1024) {special_var[86]=1023; special_sens_22a=-i;}
	if (special_var[86]<=0)    {special_var[86]=   0; special_sens_22a= i;}
	i=4;
	if (special_var[87]>=1 && special_var[87]<100 ) i=special_var[87];
	if (debug_tic_nb<=2) {special_sens_21b=i; special_sens_22b=i;}	// Pour éviter d'attendre un tour pour avoir les bonnes valeurs de "special_sens".
	special_var[88]=special_var[88]+special_sens_21b;
	special_var[89]=special_var[89]+special_sens_22b;
	if (special_var[88]>=256)  {special_var[88]= 255; special_sens_21b=-i;}
	if (special_var[88]<=0)    {special_var[88]=   0; special_sens_21b= i;}
	if (special_var[89]>=1024) {special_var[89]=1023; special_sens_22b=-i;}
	if (special_var[89]<=0)    {special_var[89]=   0; special_sens_22b= i;}

	// Suite de variables indiquant l'état de l'horloge 
	//special_var[77

	special_var[90]=horo_tic_on;		// 1=Horloge UTS en marche.
	special_var[91]=horo_blocked;		// 1=Horloge UTS bloquée.
	special_var[92]=horo_j;				// 0-6=jour de la semaine UTS.
	special_var[93]=horo_h;				// 0-23=heure courante UTS.
	special_var[94]=horo_m;				// 00-59=minute courante UTS.
	special_var[95]=60*horo_h+horo_m;	// 60*hh+mm.
}