// UTS 2000 - 22/09/2019
//
#define VERSION_UTS_V3// IMPORTANT pour compiler UTS en version V2 ou V3 = #define VERSION_UTS_V2 ou #define VERSION_UTS_V3

// Titre affiché dans le bandeau du haut de la fenêtre UTS.
#ifdef VERSION_UTS_V3 // Ne pas toucher à cette ligne !!!
#define TITRE   "UTS - Ulysse Train Système - Version  V3.7f - 22/09/2019"
#define TIMER_PRG                        80  // Timer de boucle dans UTS, 250 msec et 80 msec en V3.7.
#define CLIGNOTE_TRAPIDE       cells_tick&1  // Fréquence de clignotement très rapide = 0 ou !=0
#define CLIGNOTE_RAPIDE        cells_tick&2  // Fréquence de clignotement rapide = 0 ou !=0
#define CLIGNOTE_RAPIDE_1 (cells_tick>>2)&1  // Fréquence de clignotement rapide = 0 ou 1
#define CLIGNOTE_LENT          cells_tick&4  // Fréquence de clignotement lent = 0 ou !=0.
#define CMD_DIVERS_TEMPO_VAL             50  // On a un temps limité pour cliquer sur le canton de destination = N*80 msec.
#define CMD_DIVERS_TEMPO_VAL_R           20  // Temps d'affichage de la confirmation OK ou NOK.
#define FREQ_RAFRAICHISSEMENT debug_tic_nb%2 // On raffraichit l'écran une fois sur deux ticks.
#else
#define TITRE   "UTS - Ulysse Train Système - Version V3.7f---V2.0 - 22/09/2019"
#define TIMER_PRG                       250  // Timer de boucle dans UTS, 250 msec et 80 msec en V3.7.
#define CLIGNOTE_TRAPIDE       cells_tick&1  // Fréquence de clignotement rapide = 0 ou !=0
#define CLIGNOTE_RAPIDE        cells_tick&2  // Fréquence de clignotement rapide = 0 ou !=0
#define CLIGNOTE_RAPIDE_1 (cells_tick>>1)&1  // Fréquence de clignotement rapide = 0 ou 1
#define CLIGNOTE_LENT          cells_tick&2  // Fréquence de clignotement lent = 0 ou !=0.
#define CMD_DIVERS_TEMPO_VAL             18  // On a un temps limité pour cliquer sur le canton de destination = N*250 msec.
#define CMD_DIVERS_TEMPO_VAL_R            7  // Temps d'affichage de la confirmation OK ou NOK.
#define NO_CHANGE                      1000  //
#define FREQ_RAFRAICHISSEMENT             0  // On raffraichit l'écran à chaque tick.
#endif


// Contenu de la fenêtre affichée avec le menu : Aide > A propos
#define SZ_A_PROPOS   \
"UTS - Ulysse Train Système - Version V3.7f - Dev JLF du 22/09/2019\n"\
"est décrit sur le site : http://www.la-tour.info/uts/uts_index.html \n\n"\
"Avec les cartes à PIC 20Mhz en version V3, utiliser la version V3.7c\n"\
"Avec les cartes à PIC  8Mhz en version V2, utiliser la version V3---V2.0\n\n"\
"Améliorations de la version V3.7e :\n"\
" - Annonce sonore avant un déplacement\n"\
"Améliorations de la version V3.7d :\n"\
" - Arrêt d'urgence commandé par bouton poussoir\n"\
"Améliorations de la version V3.7c :\n"\
" - Gestion des trains après passage dans une boucle de retournement\n"\
"Améliorations de la version V3.7b :\n"\
" - Fenêtre d'édition avec cases RAZ, ajout pictogrammes\n"\
"Améliorations de la version V3.7a :\n"\
" - Mémorisation de la position des trains et aiguillages\n"\
" - ajout de couleur dans la palette\n"\
"Améliorations de la version V3.6d :\n"\
" - 23 trains de préconfigurés\n"\
" - Nouvelles variables 'det2p_' et det2m_'\n"\
"Améliorations de la version V3.6c :\n"\
" - Déplacements avec différents sens par canton\n"\
"Améliorations de la version V3.6b :\n"\
" - Simulation du fonctionnement\n"\
" - Train de nettoyage, gain %cpu,\n"\

// Contenu de la fenêtre affichée avec le menu : Aide > Aide
#define STR_AIDE \
 "Voir le manuel sur le site web : http://www.la-tour.info/uts/uts_index.html \n\n"\
 "Les erreurs de fonctionnement sont envoyées dans le fichier 'Train_UTS_log.txt'\n\n"\
 "La version V3.7 ne fonctionne qu'avec des cartes PIC 20Mhz en version V3\n"\
 "La version V3.7---V2.0 ne fonctionne qu'avec des cartes PIC 8Mhz en version V2.0\n\n"\
 "Dans le cas d'une utilisation de la version V3.7---V2.0 :\n"\
 " - L'utilisation de servo-moteur est déconseillée (2 au maximum)\n"\
 " - Le nombre d'entrée/sortie est limité à 40 par carte\n"\
 " - La liaison RS232 est à 19200 Bps\n"\
 " - Le 'tic' de base est de 265 ms  (95ms en V3)\n"\
 " - La liaison RS232 n'est pas gérée avec reprise en cas de coupure.\n\n"\
 "Voir le site d'Ulysse sur FREE-DCC et les automates à base de PIC http://udelmas.e-monsite.com/accueil.html\n\n"\
 "Et poser vos question sur les forums : Forum RMF ou Forum N"

 
// Contenu de la fenêtre affichée en cas d'absence du fichier 'config.txt'.
#define STR_NO_CONFIG_FILE \
 "Le fichier de configuration   'config.txt'   est introuvable \n\n"\
 "UTS a besoin du fichier de configuration  'config.txt'  dans le même répertoire que l'exécutable\n\n"\
 "(si vous voulez juste déboguer la carte alors créez un fichier vide)\n\n"\
 "Fin de UTS"

// Contenu de la fenêtre affichée avec le menu : Fichiers > Editer 'config.txt'.
#define STR_INFO_OPEN_CONFIG \
 "UTS va ouvrir le fichier de config avec l'éditeur par défaut\n\n"\
 "Si ça ne marche pas, éditez le fichier 'config.txt' dans le répertoire UTS\n\n"\
 "N'oubliez pas de le sauver en fin de modification\n\n"\
 "Pour prendre en compte les modifs\n"\
 " - vous pouvez recharger le fichier si la section est rechargeable\n"\
 " - autrement, il faudra relancer UTS"

// Contenu de la fenêtre affichée avec le menu : Fichiers > Recharger 'config.txt'.
#define STR_INFO_RELOAD_CONFIG \
 "UTS va prendre en compte les modifications dans 'config.txt' \n\n"\
 "Les sections rechargées sont : \n"\
 "  horo#  Paramétrage de l'horloge + horodateur \n"\
 "  iti#      Itinéraires\n"\
 "  depl#  Définition des déplacements automatique\n"\
 "  tdv#    Opérations logiques (table de vérité, équations, impulsions)\n"\
 "  exe#    Fichiers à exécuter\n"\
 "  vib#    Configuration du vibreur\n\n"\
 "Pour les autres sections, relancer UTS"

// Contenu de la fenêtre affichée avec le menu : Aide > Variables.
#define STR_VARIABLES \
	"                           	|    Numéro	| carte	|    \n"\
	"                            	|    début-fin	|  0	|    \n"\
	"det_xxx                	| 	| 	| 00xx	|\n"\
	"det2/p/m_xxx         	| 	| 40xx	|	|\n"\
	"in_xxx                  	| 	| 04xx	|	|\n"\
	"can_xxx               	| 	| 	| 08xx	|\n"\
	"out_xxx                 	| 	| 	| 12xx	|\n"\
	"led_xxx                	| 	| 	| 16xx	|\n"\
	"led_cli_xxx           	| 	| 	| 20xx	|\n"\
	"led_phase_xxx     	| 	| 	| 24xx	|\n"\
	"srv_pos_xxx        	| 	| 	| 280x	|\n"\
	"bal_cant_p_xxx   	| 	| 	| 320x	|\n"\
	"bal_cant_m_xxx   	| 	| 	| 360x	|\n"\
	"aig_cmd_xxx        	| 5000	| 5063	| 	|\n"\
	"pos0_aig_xxx       	| 5100	| 5163	| 	|\n"\
	"pos1_aig_xxx       	| 5200	| 5263	| 	|\n"\
	"var_xxx                 	| 5400	| 5999	| 	|\n"\
	"iti_start_xxx          	| 6000	| 6049	| 	|\n"\
	"iti_stop_xxx          	| 6100	| 6149	| 	|\n"\
	"iti_wait_xxx           	| 6200	| 6249	| 	|\n"\
	"iti_ok_xxx             	| 6300	| 6349	| 	|\n"\
	"depl_start_run_     	| 6500	| 6699	| 	|\n"\
	"depl_stop_xxx       	| 6700	| 6899	| 	|\n"\
	"garage_lock_cmd_	| 6900	| 6915	| 	|\n"\
	"garage_lock_status	| 6950	| 6965	| 	|\n"\
	"vib_on                     	| 7000	| 	| 	|\n"\
	"vib_state               	| 7002	| 	| 	|\n"\
	"arret_urg_on              	| 7004	| 	| 	|\n"\
	"arret_urg_state           	| 7005	| 	| 	|\n"\
	"screen_mode         	| 7003	| 	| 	|\n"\
	"srv_cmd_xxx          	| 	| 	| 800x	|\n"\
	"srv_cmd_xxx          	| 	| 	| 801x	|\n"\
	"exe_xxx                	| 8400	| 8499	| 	|\n"\
	"pulse_cmd_xxx      	| 8500	| 8531	| 	|\n"\
	"pb_capt_c_xxx      	| 	| 	| 86xx	|\n"\
	"pb_capt_t_xxx       	| 9000	| 9015	| 	|\n"\
	"special_var_xxx    	| 9100	| 9199	| 	|\n"\
	"separe_xxx            	| 9400	| 9499	| 	|\n"\
	"regroupe_xxx         	| 9500	| 9599	| 	|\n"


// Numéro attribué à l'écran que l'on doit afficher
#define  CM_OPEN             900
#define  CM_SAVE             901
#define  CM_EXIT             902
#define  CM_AIDE             903
#define  CM_A_PROPOS         904
#define  CM_ECRAN_TCO0       905
#define  CM_ECRAN_TCO1       906
#define  CM_ECRAN_TCO2       907
#define  CM_ECRAN_TCO3       908
#define  CM_ECRAN_TCO4       909
#define  CM_ECRAN_TCO5       910
#define  CM_ECRAN_TCO6       911
#define  CM_ECRAN_TCO7       912
#define  CM_CONFIG_EDIT      913
#define  CM_CONFIG_RELOAD    914
#define  CM_CONNEXION        915
#define  CM_ECRAN_AIDE1      916
#define  CM_ECRAN_AIG1       917
#define  CM_ECRAN_AIG2       918
#define  CM_ECRAN_CANTON1    919
#define  CM_ECRAN_CANTON2    920
#define  CM_ECRAN_DEPL1      921
#define  CM_ECRAN_DEPL2      922
#define  CM_ECRAN_DEPL3      923
#define  CM_ECRAN_DEPL4      924
#define  CM_ECRAN_DEPL5      925
#define  CM_ECRAN_DEPL6      926
#define  CM_ECRAN_DEPL7      927
#define  CM_ECRAN_GARAGE     928
#define  CM_ECRAN_HORO_R     929 // Horloge réglage
#define  CM_ECRAN_ITI1       930
#define  CM_ECRAN_ITI2       931
#define  CM_ECRAN_POSLOC1    932
#define  CM_ECRAN_SELECT1    933
#define  CM_ECRAN_SELECT2    934
#define  CM_ECRAN_SELECT3    935
#define  CM_ECRAN_AIGAUTO1   936
#define  CM_ECRAN_AIGAUTO2   937
#define  CM_ECRAN_AIGAUTO3   938
#define  CM_ECRAN_SERIAL     939
#define  CM_ECRAN_SERVO      940
#define  CM_ECRAN_TCOEDIT    941
#define  CM_ECRAN_TCORENDER  942
#define  CM_ECRAN_TCOSAVE    943
#define  CM_ECRAN_TDV1       944	// Tables de vérité.
#define  CM_ECRAN_TRAIN1     945
#define  CM_ECRAN_VAR1       946
#define  CM_ECRAN_VAR2       947
#define  CM_ECRAN_VAR3       948
#define  CM_ECRAN_VIBRATOR   949
#define  CM_VARIABLES        950
#define  CM_ECRAN_VITMAX1    951
#define  CM_ECRAN_VITMAX2    952
#define  CM_ECRAN_HALTE1     953
#define  CM_ECRAN_HALTE2	 954
#define  CM_ECRAN_BALAUTO1   955
#define  CM_ECRAN_BALAUTO2   956
#define  CM_ECRAN_BALAUTO3   957
#define  CM_ECRAN_EXE1       958
#define  CM_ECRAN_EXE2       959
#define  CM_ECRAN_EXE3       960
#define  CM_ECRAN_TDV2       961	// Tables de vérité partie 'pulse:'.
#define  CM_ECRAN_HORO_L1    962 // Horloge Liste
#define  CM_ECRAN_HORO_L2    963 // Horloge Liste
#define  CM_ECRAN_HORO_L3    964 // Horloge Liste
#define  CM_ECRAN_HORO_L4    965 // Horloge Liste
#define  CM_ECRAN_HORO_L5    966 // Horloge Liste
#define  CM_ECRAN_HORO_L6    967 // Horloge Liste
#define  CM_ECRAN_HORO_L7    968 // Horloge Liste
#define  CM_ECRAN_TRAIN2     969
#define  CM_ECRAN_POSLOC2    970
#define  CM_ECRAN_SEPARE1    971
#define  CM_ECRAN_SEPARE2    972
#define  CM_ECRAN_END        973

#define DEBUG_PAINT          0
#define DEBUG_TOTAL_PAINT    1
#define DEBUG_MOUSE          2
#define DEBUG_KEY            3
#define DEBUG_MOUSE_RIGHT    4
#define DEBUG_TICK           5
#define DEBUG_MOUSE_UP       6
#define DEBUG_MOUSE_RIGHT_UP 7

// Pour appeler un écran par son numéro à partir d'un bloc du TCO.
#define MD_ECRAN_TCO0        0
#define MD_ECRAN_TCO1        1
#define MD_ECRAN_TCO2        2
#define MD_ECRAN_TCO3        3
#define MD_ECRAN_TCO4        4
#define MD_ECRAN_TCO5        5
#define MD_ECRAN_TCO6        6
#define MD_ECRAN_TCO7        7
#define MD_ECRAN_TRAIN1      8
#define MD_ECRAN_POSLOC1     9
#define MD_ECRAN_DEPL1      10
#define MD_ECRAN_DEPL2      11
#define MD_ECRAN_DEPL3      12
#define MD_ECRAN_DEPL4      13
#define MD_ECRAN_DEPL5      14
#define MD_ECRAN_DEPL6      15
#define MD_ECRAN_DEPL7      16
#define MD_ECRAN_HORO_R     17
#define MD_ECRAN_VIB        18
#define MD_ECRAN_ITI1       19
#define MD_ECRAN_ITI2       20
#define MD_ECRAN_GARAGE     21
#define MD_ECRAN_AIG1       22
#define MD_ECRAN_AIG2       23
#define MD_ECRAN_SERIAL     24
#define MD_ECRAN_VAR1       25
#define MD_ECRAN_VAR2       26
#define MD_ECRAN_VAR3       27
#define MD_ECRAN_CANTON1    28
#define MD_ECRAN_CANTON2    29
#define MD_ECRAN_SERVO      30
#define MD_ECRAN_TDV1       31
#define MD_ECRAN_SELECT1    32
#define MD_ECRAN_SELECT2    33
#define MD_ECRAN_SELECT3    34
#define MD_ECRAN_AIGAUTO1   35
#define MD_ECRAN_AIGAUTO2   36
#define MD_ECRAN_AIGAUTO3   37
#define MD_ECRAN_VITMAX1    38
#define MD_ECRAN_VITMAX2    39
#define MD_ECRAN_HALTE1     40
#define MD_ECRAN_HALTE2     41
#define MD_ECRAN_BALAUTO1   42
#define MD_ECRAN_BALAUTO2   43
#define MD_ECRAN_BALAUTO3   44
#define MD_ECRAN_EXE1       45
#define MD_ECRAN_EXE2       46
#define MD_ECRAN_EXE3       47
#define MD_ECRAN_TDV2       48
#define MD_ECRAN_HORO_L1    49
#define MD_ECRAN_HORO_L2    50
#define MD_ECRAN_HORO_L3    51
#define MD_ECRAN_HORO_L4    52
#define MD_ECRAN_HORO_L5    53
#define MD_ECRAN_HORO_L6    54
#define MD_ECRAN_HORO_L7    55
#define MD_ECRAN_TRAIN2     56
#define MD_ECRAN_POSLOC2    57
#define MD_ECRAN_SEPARE1    58
#define MD_ECRAN_SEPARE2    59
#define MD_ECRAN_END        60


#define STR_SAME 0==			// Syntaxe pour utiliser 'strcmp' = if(STR_SAME strcmp(ch,"#garage")) {...
#define STR_DIFF 0!=			//
#define PIO_VAR_NAME  pio_var_ch[3*i]		// Utilisé dans pio.cpp
#define PIO_VAR_NB    pio_var_ch[3*i+1]		//
#define PIO_VAR_BASE  pio_var_ch[3*i+2]		//


// Lecture du fichier 'config.txt'
#define CHAR_CONFIG_NB        250	// Nombre de caractères maximum pour une ligne lue dans 'config.txt'
#define BLOC_CONFIG_NB         75	// Nombre de blocs (éléments au sens UTS) maximum pour une ligne lue dans 'config.txt'


#define NB_EXE                100	// Nombre de paramètres possibles pour lancer des exécutables (pour exécuter un '.wav'...)
#define EXE_TAILLE            200	// Nombre de caractères maximum pour stocker le ligne de commande d'un éxecuaable (pour exécuter un '.wav'...)
#define NB_VAR                600	// Nombre de variables utilisateur possible : nom = var_0 à var_599 (en interne = n°5400 à n° 5999).
#define NB_SPECIAL_VAR        100	// Nombre de variables spéciales renseignés par UTS : nom = special_var_0 à special_var_599 (en interne = n°9100 à n° 9199).


// ININERAIRES 
#define ITI_TAB_NB              50	// Nombre maximum d'itinéraires gérés par UTS et dans le fichier 'config.txt'.
#define ITI_TAB_AIG_NB          10	// Nombre maximum d'aiguillages pour un itinéraire. (8 en V2.0)
#define ITI_TAB_NAME_TAILLE     41	// Nombre de caractère maximum + 1 (pour le '/0') pour le nom d'un intinéraire. (100 en V2.0)

#define ITI_TAB_IND_EXIST        0	// 1 = l'itinéraire existe, sinon = 0;
#define ITI_TAB_IND_TYPE         1
#define ITI_TAB_IND_START        2
#define ITI_TAB_IND_STOP         3
#define ITI_TAB_IND_STEP         4
#define ITI_TAB_IND_TEMPO        5
#define ITI_TAB_IND_WAIT         6
#define ITI_TAB_IND_OK           7
#define ITI_TAB_IND_CANT_START   8
#define ITI_TAB_IND_CANT_STOP    9
#define ITI_TAB_IND_AIG_NO      10	// Place pour le premier des 10 aiguillages par itinéraire.
#define ITI_TAB_IND_AIG_POS     11
#define ITI_TAB_IND_TAILLE      ITI_TAB_IND_CANT_STOP + 2*ITI_TAB_AIG_NB + 1  // Ce n'est pas le dernier élément du tableau mais sa taille = +1 pour réserver N éléments + 1 pour le [0].

#define ITI_CST_DIRECT              0
#define ITI_CST_ONOFF               1

#define ITI_CST_STATE_IDLE          0	// Etat en cours des itinéraires => depl_tab[][ITI_TAB_IND_STEP]
#define ITI_CST_STATE_WAIT_CANT_DEP 1
#define ITI_CST_STATE_WAIT_RES      2
#define ITI_CST_STATE_WAIT_VER      3
#define ITI_CST_STATE_WAIT_CANT_FIN 4
#define ITI_CST_STATE_WAIT_WAIT     5
#define ITI_CST_STATE_WAIT_STOP     6
#define ITI_CST_STATE_RELEASE       7


// SEPARATION Loco - Wagons 
#define SEPARE_TAB_NB           100	// Nombre maximum dans le fichier 'config.txt'.

#define SEPARE_TAB_IND_EXIST      0	// -1 => pas défini, 0 => pas actif, 1 => à activer.
#define SEPARE_TAB_IND_C1         1	// n° du premier canton.
#define SEPARE_TAB_IND_C2         2	// n° du deuxieme canton.
#define SEPARE_TAB_IND_TAILLE     3 // Taille.

// REGROUPEMENT Loco - Wagons 
#define REGROUPE_TAB_NB         100 // Nombre maximum dans le fichier 'config.txt'.

#define REGROUPE_TAB_IND_EXIST    0 // -1 => pas défini, 0 => pas actif, 1 => à activer.
#define REGROUPE_TAB_IND_C1       1 // n° du premier canton.
#define REGROUPE_TAB_IND_C2       2 // n° du deuxieme canton.
#define REGROUPE_TAB_IND_TAILLE   3 // Taille.


// BMP
#define BMP_TAB_TYPE_NB        50
#define BMP_TAB_TYPE_IND_NB    11
#define BMP_TAB_TYPE_IND_TYPE   0
#define BMP_TAB_TYPE_IND_DX     1
#define BMP_TAB_TYPE_IND_DY     2
#define BMP_TAB_TYPE_IND_X0     3
#define BMP_TAB_TYPE_IND_Y0     4
#define BMP_TAB_TYPE_IND_X1     5
#define BMP_TAB_TYPE_IND_Y1     6
#define BMP_TAB_TYPE_IND_X2     7
#define BMP_TAB_TYPE_IND_Y2     8
#define BMP_TAB_TYPE_IND_X3     9
#define BMP_TAB_TYPE_IND_Y3    10
#define BMP_TAB_TYPE_IND_C0     3
#define BMP_TAB_TYPE_IND_C1     4
#define BMP_TAB_TYPE_IND_C2     5
#define BMP_TAB_TYPE_IND_C3     6
#define BMP_TAB_TYPE_IND_DIGIT  7
#define BMP_TAB_TYPE_IND_FORMAT 8
#define BMP_TAB_TYPE_IND_MIN    7
#define BMP_TAB_TYPE_IND_MAX    8
#define BMP_TAB_TYPE_IND_DX2    9
#define BMP_TAB_TYPE_IND_DY2   10
#define BMP_TAB_TYPE_IND_HORI   6

// Couleurs indexées pour UTS.
#define BMP_CST_COLOR_NOIR        0
#define BMP_CST_COLOR_BLEU        1
#define BMP_CST_COLOR_VERT        2
#define BMP_CST_COLOR_CYAN        3
#define BMP_CST_COLOR_ROUGE       4
#define BMP_CST_COLOR_VIOLET      5
#define BMP_CST_COLOR_JAUNE       6 // Fond écran RS232.
#define BMP_CST_COLOR_BLANC       7
#define BMP_CST_COLOR_VERTFLUO    8
#define BMP_CST_COLOR_ROUGEF      9 // Relief bouton rouge
#define BMP_CST_COLOR_ORANGE     10
#define BMP_CST_COLOR_MARRON     11
#define BMP_CST_COLOR_KAKI       12
#define BMP_CST_COLOR_BLEUF      13
#define BMP_CST_COLOR_GRISVERT   14 // Fond de fenêtre d'édition
#define BMP_CST_COLOR_VERTFONCE  15
#define BMP_CST_COLOR_GRIS64     16 // Fond écran relief gris  64
#define BMP_CST_COLOR_GRIS128    17 // Fond écran relief gris 128
#define BMP_CST_COLOR_GRIS192    18 // Fond écran relief gris 192
#define BMP_CST_COLOR_GRISWIN    19 // Fond écran relief gris 212,208,200; fond d'écran des TCO
#define BMP_CST_COLOR_MAGENTA    20 // Couleur de Wagons
#define BMP_CST_COLOR_BLEUF2     21 //
#define BMP_CST_COLOR_LILAS      22 // 128, 128, 256
#define BMP_CST_COLOR_CYANF      23 // Relief bouton cyan
#define BMP_CST_COLOR_NB         24 // Nombre de couleurs possible sans celles du train et du canton
// Couleurs spéciales en fin de table
#define BMP_CST_COLOR_TRAIN      24	// On prendre la couleur du train.  Ces 2 lignes doivent se suivre.
#define BMP_CST_COLOR_CANTON     25	// On prendre la couleur du canton. Ces 2 lignes doivent se suivre.
#define BMP_CST_COLOR_NB_AVEC_CT 26 // Nombre de couleurs possible y compris celles du train et du canton
// Couleurs autres, mais pas disponibles dans la palette
#define BMP_CST_COLOR_MAGENTAF   26 // Relief bouton magenta
#define BMP_CST_COLOR_BLEULAGON  27 // 128, 255, 255
#define BMP_CST_COLOR_BLEUF3     28 //  38,  62, 148
#define BMP_CST_COLOR_ROSEFLUO   29 // 255,   0, 128
#define BMP_CST_COLOR_SAUMON     30 // 255, 128, 128
#define BMP_CST_COLOR_ROSE       31 // 255, 128, 255
#define BMP_CST_COLOR_VERTDEAU   32 //   0, 255, 128
#define BMP_CST_COLOR_JAUNECLAIR 33 //
#define BMP_CST_COLOR_VERTTENDRE 34 // 128, 255, 128
#define BMP_CST_COLOR_GRIS220    35 // Couleur grise = 3* 220.
#define BMP_CST_COLOR_GRIS230    36 // = 3 * 230
#define BMP_CST_COLOR_GRIS240    37 // = 3 * 240
#define BMP_CST_COLOR_GRIS32     38 // = 3 *  32


// TCO
#define CELLS_TCO_NB   8	// Nombre de TCO possible (0 à 7)
#define CELLS_X_NB    32	// Dimension max horizontale des TCO en case
#define CELLS_Y_NB    25	// Dimension max verticale des TCO en case
#define CELLS_SIZE    40	// Dimension d'un carreau du TCO (avec la grille)
#define CELLS_SZ_LEN  41

#define CELLS_TYPE     0	// Type de bloc = voie, aiguillage, voyant ou autre
#define CELLS_SUBTYPE  1	// Sous type de bloc pour ce bloc
#define CELLS_CANT     2	// Numéro du canton pour ce bloc
#define CELLS_N1       3
#define CELLS_N2       4
#define CELLS_V1       5	// Variable Vx spécifique à un bloc
#define CELLS_V2       6	//	
#define CELLS_V3       7	//
#define CELLS_V4       8	//
#define CELLS_C1       9	// Couleur spécifique à des éléments de ce bloc
#define CELLS_C2      10	//
#define CELLS_C3      11	//
#define CELLS_C4      12	//
#define CELLS_OPT     13	// Valeur optionnelle
#define CELLS_SENS    14	// Sens du bloc pour l'affichage des flèches
#define CELLS_ENR_NB  15	// Nombre d'informations numériques par cellule = nb de champs numériques dans 'config_tco.txt'

// CELLS_TYPE = 
// Numéro de type de bloc affiché dans les TCO
#define CELLS_TYPE_RIEN   -1
#define CELLS_TYPE_LINK   0		// Bloc de type 'Voie'
#define CELLS_TYPE_AIG    1		// Bloc de type 'Aiguillage'
#define CELLS_TYPE_CMDVOY 2		// Bloc de type 'Commande ou voyant'
#define CELLS_TYPE_SPE    3		// Bloc de type 'Spécial'

// CELLS_SUBTYPE = 
// Numéro de sous-type de bloc affiché dans les TCO
// de 0 à N par type de bloc. Rangé par type de bloc.
#define CELLS_SUBTYPE_LINK_H       0	// Eléments de voies vertical
#define CELLS_SUBTYPE_LINK_V       1	// ... horizontal
#define CELLS_SUBTYPE_LINK_SONE    2	// ... grande diagonale Sud Ouest - Nord Est
#define CELLS_SUBTYPE_LINK_NOSE    3	// ... grande diagonale Nord Ouest - Sud Est
#define CELLS_SUBTYPE_LINK_SE      4    // ... petite diagonale Sud - Est
#define CELLS_SUBTYPE_LINK_OS      5	// ... petite diagonale Ouest - Sud
#define CELLS_SUBTYPE_LINK_NE      6	// ... petite diagonale Nord - Est
#define CELLS_SUBTYPE_LINK_ON      7	// ... petite diagonale Ouest - Nord
#define CELLS_SUBTYPE_LINK_SOE     8	// ... diagonale par le centre Sud Ouest - Est
#define CELLS_SUBTYPE_LINK_OSE     9	// ... diagonale par le centre Ouest Sud - Est
#define CELLS_SUBTYPE_LINK_NOE    10	// ... diagonale par le centre Nord Ouest - Est
#define CELLS_SUBTYPE_LINK_ONE    11	// ... diagonale par le centre Ouest - Nord Est
#define CELLS_SUBTYPE_LINK_BALA   12	// ... Bloc vide mais de couleur de la voie
#define CELLS_SUBTYPE_LINK_SON    13	// ... diagonale par le centre Sud Ouest - Nord
#define CELLS_SUBTYPE_LINK_NSE    14	// ... diagonale par le centre Nord - Sud Est
#define CELLS_SUBTYPE_LINK_NOS    15	// ... diagonale par le centre Nord Ouest - Sud
#define CELLS_SUBTYPE_LINK_SNE    16	// ... diagonale par le centre Sud - Nord Est
#define CELLS_SUBTYPE_LINK_PH     17	// ... pointillés horizontaux
#define CELLS_SUBTYPE_LINK_PV     18	// ... pointillés verticaux
#define CELLS_SUBTYPE_AIG_CH     0		// Aiguillage Centre -> Haut et horizontal
#define CELLS_SUBTYPE_AIG_CB     1		// Aiguillage Centre -> Bas et horizontal
#define CELLS_SUBTYPE_AIG_CHB    2		// Aiguillage Centre -> Haut + Bas et horizontal
#define CELLS_SUBTYPE_AIG_HC     3		// Aiguillage Haut -> Centre  et horizontal
#define CELLS_SUBTYPE_AIG_BC     4		// Aiguillage Bas -> Centre et horizontal
#define CELLS_SUBTYPE_AIG_HBC    5		// Aiguillage Haut + Bas -> Centre et horizontal
#define CELLS_SUBTYPE_AIG_HCV    6		// Aiguillage Haut -> Centre et vertical
#define CELLS_SUBTYPE_AIG_CHV    7		// Aiguillage Centre -> Haut et vertical
#define CELLS_SUBTYPE_AIG_CBV    8		// Aiguillage Centre -> Bas et vertical
#define CELLS_SUBTYPE_AIG_BCV    9		// Aiguillage Bas -> Centre et vertical
#define CELLS_SUBTYPE_CMDVOY_POUSS 0	// Voyants carré et/ou boutons poussoirs
#define CELLS_SUBTYPE_CMDVOY_INT   1	// Voyants carré et/ou interrupteurs
#define CELLS_SUBTYPE_CMDVOY_ITI   2	// Voyants rond à bordure active
#define CELLS_SUBTYPE_CMDVOY_VOY4  3	// 4 voyants carrés
#define CELLS_SUBTYPE_CMDVOY_LABEL 4	// Bloc de texte (4 lignes de texte)
#define CELLS_SUBTYPE_CMDVOY_VOY2  5	// 2 voyants ronds
#define CELLS_SUBTYPE_CMDVOY_VOY1  6	// 1 voyant rond
#define CELLS_SUBTYPE_CMDVOY_GO    7	// Bloc pour aller directement à une autre page (horizontal)
#define CELLS_SUBTYPE_CMDVOY_SRV   8	// Bloc pour commander les servo moteurs
#define CELLS_SUBTYPE_CMDVOY_VAL   9	// Bloc pour afficher 3 lignes de texte + 1 valeur numérique
#define CELLS_SUBTYPE_CMDVOY_DIVERS 10	// Bloc pour avoir la liste des déplacements en cours ou annuler tous les déplacements.
#define CELLS_SUBTYPE_SPE_VOY     0		// Voie + état d'occupation du canton (horizontal)
#define CELLS_SUBTYPE_SPE_DETEL   1		// Voie + affiche un dételeur (pas utilisé)(horizontal)
#define CELLS_SUBTYPE_SPE_CANT    2		// Voie + affiche les valeurs propre à un canton (horizontal)
#define CELLS_SUBTYPE_SPE_IN      3		// Voie + contact au passage du train (horizontal)
#define CELLS_SUBTYPE_SPE_OUT     4		// Voie + signal envoyé par le programme (horizontal)
#define CELLS_SUBTYPE_SPE_SENS    5		// Voie + impose le sens de parcours (horizontal)
#define CELLS_SUBTYPE_SPE_CH      6		// Voie + butoir (horizontal)
#define CELLS_SUBTYPE_SPE_HC      7		// Voie + butoir (horizontal)
#define CELLS_SUBTYPE_SPE_HOR     8		// Bloc d'horloge
#define CELLS_SUBTYPE_SPE_FEU     9		// Voie + feu tricolore (vertical)
#define CELLS_SUBTYPE_SPE_CV     10		// Voie + butoir (vertical)
#define CELLS_SUBTYPE_SPE_VC     11		// Voie + butoir (vertical)
#define CELLS_SUBTYPE_SPE_VOYV   12		// Voie + état d'occupation du canton (vertical)
#define CELLS_SUBTYPE_SPE_CANTV  13		// Voie + affiche les valeurs propre à un canton (vertical)
#define CELLS_SUBTYPE_SPE_INV    14		// Voie + contact au passage du train (vertical)
#define CELLS_SUBTYPE_SPE_OUTV   15		// Voie + signal envoyé par le programme (pas utilisé)(vertical)
#define CELLS_SUBTYPE_SPE_SENSV  16		// Voie + impose le sens de parcours (vertical)
#define CELLS_SUBTYPE_SPE_FEUV   17		// Voie + feu tricolore  (vertical)
#define CELLS_SUBTYPE_SPE_DETELV 18		// Voie + affiche un dételeur (vertical)



// TCO suite
// Les couleurs de ces rendus sont définis à la fin du fichier 'config_tco.txt'
// Ils sont modifiables depuis le menu 'TCO rendu'.
// Chaque rendu est associé à une couleur.
#define RENDU_COLOR_RAIL_LIBRE     0
#define RENDU_COLOR_FOND_LIBRE     1
#define RENDU_USE_GROS_LIBRE       2
#define RENDU_USE_FLECHE_LIBRE     3
#define RENDU_COLOR_RAIL_OCC       4
#define RENDU_COLOR_FOND_OCC       5
#define RENDU_USE_GROS_OCC         6
#define RENDU_USE_FLECHE_OCC       7
#define RENDU_COLOR_RAIL_SELPREV   8
#define RENDU_COLOR_FOND_SELPREV   9
#define RENDU_USE_GROS_SELPREV    10
#define RENDU_USE_FLECHE_SELPREV  11
#define RENDU_COLOR_RAIL_SELOCC   12
#define RENDU_COLOR_FOND_SELOCC   13
#define RENDU_USE_GROS_SELOCC     14
#define RENDU_USE_FLECHE_SELOCC   15
#define RENDU_COLOR_RAIL_AUTOPREV 16
#define RENDU_COLOR_FOND_AUTOPREV 17
#define RENDU_USE_GROS_AUTOPREV   18
#define RENDU_USE_FLECHE_AUTOPREV 19
#define RENDU_COLOR_RAIL_AUTOOCC  20
#define RENDU_COLOR_FOND_AUTOOCC  21
#define RENDU_USE_GROS_AUTOOCC    22
#define RENDU_USE_FLECHE_AUTOOCC  23
#define RENDU_COLOR_RAIL_GARALOCK 24
#define RENDU_COLOR_FOND_GARALOCK 25
#define RENDU_USE_GROS_GARALOCK   26
#define RENDU_USE_FLECHE_GARALOCK 27 // non utilisé.
#define RENDU_COLOR_FOND          28
#define RENDU_COLOR_FOND_RAIL     29
#define RENDU_COLOR_GRILLE        30
#define RENDU_COLOR_TEXT          31
#define RENDU_COLOR_DET_ON        32
#define RENDU_COLOR_DET_OFF       33
#define RENDU_COLOR_AIG_ON        34
#define RENDU_COLOR_AIG_OFF       35
#define RENDU_COLOR_VOY_ON        36
#define RENDU_COLOR_VOY_OFF       37
#define RENDU_COLOR_INT_ON        38
#define RENDU_COLOR_INT_OFF       39
#define RENDU_COLOR_IPP_ON        40
#define RENDU_COLOR_IPP_OFF       41
#define RENDU_COLOR_IPP_LOCKON    42
#define RENDU_COLOR_IPP_LOCKOFF   43
#define RENDU_TAILLE              44 // Taille du tableau


// TCO suite
// Coordonnées des 8 points cardinaux d'un bloc de TCO
#define CELLS_NO x+0 ,y+0
#define CELLS_N  x+20,y+0
#define CELLS_NE x+40,y+0
#define CELLS_E  x+40,y+20
#define CELLS_SE x+40,y+40
#define CELLS_S  x+20,y+40
#define CELLS_SO x+0 ,y+40
#define CELLS_O  x+0 ,y+20
#define CELLS_C  x+20,y+20


// Horodateur
#define HORO_TAB_NB           200 // Nombre d'éléments.
//
#define HORO_TAB_IND_HD_J       0 // => = 0(lundi) à 6(dimanche) ou 'HORO_CST_J_WEEK' ou 'HORO_CST_J_WEEKEND' ou 'HORO_CST_J_NETTOYAGE' = Jour de départ de l'action.
#define HORO_TAB_IND_HD_H       1 // => Heure de l'heure de l'action.
#define HORO_TAB_IND_HD_M       2 // => Minutes de l'heure de l'action.
#define HORO_TAB_IND_HF_H       3 // => Heure de l'heure de fin de l'action.
#define HORO_TAB_IND_HF_M       4 // => Minutes de l'heure de fin de l'action.
#define HORO_TAB_IND_HI_H       5 // => Heure de l'heure d'interval de l'action(Période).
#define HORO_TAB_IND_HI_M       6 // => Minutes de l'heure d'interval (Période).
#define HORO_TAB_IND_HB_H       7 // => Heure ou délais avant blocage. Temps = heure du temps de blocage de l'horloge. Voir HORO_TAB_IND_TYPEB'.
#define HORO_TAB_IND_HB_M       8 // => Heure ou délais avant blocage. Temps = minutes du temps de blocage de l'horloge. Voir HORO_TAB_IND_TYPEB'.
#define HORO_TAB_IND_TYPEB      9 // => 'HORO_CST_BLOCK_H' ou 'HORO_CST_BLOCK_DELAY'
#define HORO_TAB_IND_VB_INV    10 // => Valeur de la variable conditionnant le blocage de l'horloge. 0 si vf:<var>, 1 si vf:!<var>.
#define HORO_TAB_IND_VB_NUM    11 // => Variable conditionnant le blocage de l'horloge. vf:<var>.
#define HORO_TAB_IND_V0_OP     12 // => Actions à lancer. s:<var> ou c:<var> = 'HORO_CST_OP_SET' ou 'HORO_CST_OP_CLR'.
#define HORO_TAB_IND_V0_NUM    13 //    Actions à lancer quand l'heure de départ est arrivée, ou si l'heure périodique revient. s:<var> ou c:<var>
#define HORO_TAB_IND_V1_OP     14 // => 6 actions maximum.
#define HORO_TAB_IND_V1_NUM    15 //       //
#define HORO_TAB_IND_V2_OP     16 //     //
#define HORO_TAB_IND_V2_NUM    17 //       //
#define HORO_TAB_IND_V3_OP     18 //     //
#define HORO_TAB_IND_V3_NUM    19 //       //
#define HORO_TAB_IND_V4_OP     20 //     //
#define HORO_TAB_IND_V4_NUM    21 //       //
#define HORO_TAB_IND_V5_OP     22 //     //
#define HORO_TAB_IND_V5_NUM    23 //       //
#define HORO_TAB_IND_VAR_STATE 24 // => 'HORO_CST_NOTHING' ou 'HORO_CST_WAIT_BLOCKING' ou 'HORO_CST_BLOCKED'.
#define HORO_TAB_IND_VAR_HB_H  25 // => Heure de blocage en cours.
#define HORO_TAB_IND_VAR_HB_M  26 // => Minute de blocage en cours.
#define HORO_TAB_IND_INHIBE    27 // => Validité de l'élément. =1 => Inhibé.
#define HORO_TAB_IND_TAILLE    28 // Taille du tableau
//
#define HORO_CST_NOTHING       0  // Etat de l'action.
#define HORO_CST_WAIT_BLOCKING 1
#define HORO_CST_BLOCKED       2
//
#define HORO_CST_BLOCK_H       0  // Indicateur pour une heure maximum pour réaliser l'action.
#define HORO_CST_BLOCK_DELAY   1  // Indicateur pour un délais maximum pour réaliser l'action.
//
#define HORO_CST_OP_SET        1  //Actions à lancer. Met la variable à 1 = set.  s:<var> = 'HORO_CST_OP_SET'.
#define HORO_CST_OP_CLR        0  //Actions à lancer. met la variable à 0 = clr.  c:<var> = 'HORO_CST_OP_CLR'.
//
#define HORO_CST_J_WEEK        7  // hd j:w = Jour de départ de l'action = Tous les jours de la semaine.
#define HORO_CST_J_WEEKEND     8  // hd j:e = Jour de départ de l'action = Jours de weekend.
#define HORO_CST_J_NETTOYAGE   9  // hd j:n = Jour de départ de l'action = Jours du nettoyage du réseau.

#define HORO_NB_LIGNE_COM      5  // Commentaires dans la section "#horo" pour savoir comment positionner les trains au départ de l'horloge.
#define HORO_TAILLE_LIGNE_COM 80  // 5 lignes de 40 caractères.


// selectif
#define NB_SELECTIF          100	// Nombre maximum de cantons déclarés dans la partie #selectif
#define IND_AIG_NUM_MAX      6		// Maximum de 6 aiguillages par enregistrement selectif (IND_AIG_NUM_BASE_X & IND_AIG_POS_BASE_X avec X = de 0 à 5)
// Pour desc[NB_SELECTIF][IND_SELECTIF_TAILLE] dans 'selectif.h'
#define IND_CANT_COUR_NUM    0
#define IND_CANT_COUR_SENS   1
#define IND_CANT_PREC_NUM    2
#define IND_CANT_PREC_SENS   3
#define IND_AIG_NUM_BASE     4		// IND_AIG_NUM_BASE + 2*N (pour 6 aiguillages maxi)
#define IND_AIG_POS_BASE     5		// IND_AIG_POS_BASE + 2*N (pour 6 aiguillages maxi)
#define IND_AIG_NUM_BASE1    6
#define IND_AIG_POS_BASE1    7
#define IND_AIG_NUM_BASE2    8
#define IND_AIG_POS_BASE2    9
#define IND_AIG_NUM_BASE3   10
#define IND_AIG_POS_BASE3   11
#define IND_AIG_NUM_BASE4   12
#define IND_AIG_POS_BASE4   13
#define IND_AIG_NUM_BASE5   14
#define IND_AIG_POS_BASE5   15
#define IND_SELECTIF_TAILLE 16		// Taille du tableau = IND_AIG_POS_BASE5 + 1 


// aigauto - cant: = Commande automatique d'aiguillages
#define AIGAUTO_TAB_NB				100	// Nombre maximum de lignes déclarées dans la section #aigauto de config.txt.
#define AIGAUTO_TAB_NB_MAX_CANT		  6	// Nombre maximum de cantons déclarées par ligne dans la partie #aigauto
#define AIGAUTO_TAB_NB_MAX_VAR		  6	// Nombre maximum de conditions déclarées dans la partie #aigauto
#define AIGAUTO_TAB_NB_MAX_AIG		  6	// Nombre maximum d'aiguillages déclarés dans la partie #aigauto
//
#define AIGAUTO_TAB_IND_CANT_NO       0	// Numéro du canton.
#define AIGAUTO_TAB_IND_CANT_VIT      1	// Vitesse minimum pour une activation des actions (-64 à -1 et +1 à +64).
#define AIGAUTO_TAB_IND_ACTION_OK     2	// Stock l'état de la dernière action, pour ne la déclencher qu'au passage 0 -> 1.
#define AIGAUTO_TAB_IND_CANT_0_NO     3 // Conditions sur les cantons = n° de cantons.
#define AIGAUTO_TAB_IND_VAR_0         AIGAUTO_TAB_IND_CANT_0_NO+AIGAUTO_TAB_NB_MAX_CANT  // Conditions sur les variables = n° de variables       (Nb de variables max = AIGAUTO_TAB_NB_MAX_VAR).
#define AIGAUTO_TAB_IND_VAL_0         AIGAUTO_TAB_IND_VAR_0+AIGAUTO_TAB_NB_MAX_VAR       //                              = état de la variables
#define AIGAUTO_TAB_IND_AIG_0_NO      AIGAUTO_TAB_IND_VAL_0+AIGAUTO_TAB_NB_MAX_VAR       // Si conditions remplies, active les aiguillages = n° de l'aiguillage  (Nb aig max = AIGAUTO_TAB_NB_MAX_AIG).
#define AIGAUTO_TAB_IND_AIG_0_POS     AIGAUTO_TAB_IND_AIG_0_NO+AIGAUTO_TAB_NB_MAX_AIG    //                                                = position de l'aiguillage
#define AIGAUTO_TAB_IND_TAILLE        AIGAUTO_TAB_IND_AIG_0_POS+AIGAUTO_TAB_NB_MAX_AIG   // Taille du tableau.


// balauto - vitmax: = vitesse maximum sur un canton
#define BALAUTO_VITMAX_NB			   	    60	// Nombre maximum de lignes 'vitmax:' déclarées dans la partie 'vitmax:' de la section #balauto de config.txt.
#define BALAUTO_VITMAX_NB_MAX_VAR		     6	// Nombre maximum de conditions déclarées dans la partie 'vitmax:' de #balauto
//
#define BALAUTO_VITMAX_TAB_IND_CANT_NO       0	// Numéro du canton.
#define BALAUTO_VITMAX_TAB_IND_CANT_VIT      1	// Vitesse maximum pour une conduite manuelle sur ce canton (-64 à -1 et +1 à +64).
#define BALAUTO_VITMAX_TAB_IND_ACTION_OK     2	// Si actions OK pour limitation de vitesse.
#define BALAUTO_VITMAX_TAB_IND_VAR_0         3  // Conditions sur les variables = n° de variables       (Nb de variables max = BALAUTO_VITMAX_TAB_NB_MAX_VAR).
#define BALAUTO_VITMAX_TAB_IND_VAL_0		 BALAUTO_VITMAX_TAB_IND_VAR_0+BALAUTO_VITMAX_NB_MAX_VAR // = état de la variables
#define BALAUTO_VITMAX_TAB_IND_TAILLE        BALAUTO_VITMAX_TAB_IND_VAL_0+BALAUTO_VITMAX_NB_MAX_VAR     // Taille du tableau.


// balauto - halt: = stop imposée sur un canton
#define BALAUTO_HALT_NB					    60	// Nombre maximum de lignes déclarées dans la partie 'halt:' de la section de #aigauto de config.txt.
#define BALAUTO_HALT_NB_MAX_VAR			     6	// Nombre maximum de conditions déclarées dans la partie 'halt:' de #balauto
//
#define BALAUTO_HALT_TAB_IND_CANT_NO         0	// Numéro du canton.
#define BALAUTO_HALT_TAB_IND_CANT_SENS       1	// Sens de parcours.
#define BALAUTO_HALT_TAB_IND_ACTION_OK       2	// Si actions OK pour halte.
#define BALAUTO_HALT_TAB_IND_VAR_0           3  // Conditions sur les variables = n° de variables       (Nb de variables max = BALAUTO_HALT_TAB_NB_MAX_VAR).
#define BALAUTO_HALT_TAB_IND_VAL_0			 BALAUTO_HALT_TAB_IND_VAR_0+BALAUTO_HALT_NB_MAX_VAR // = état de la variables
#define BALAUTO_HALT_TAB_IND_TAILLE          BALAUTO_HALT_TAB_IND_VAL_0+BALAUTO_HALT_NB_MAX_VAR     // Taille du tableau.


// balauto - cant: = bloc automatique
#define BALAUTO_CANT_NB					   100	// Nombre maximum de lignes déclarées dans la partie 'cant:' de la section #aigauto de config.txt.
#define BALAUTO_CANT_NB_MAX_CANT		     6	// Nombre maximum de cantons déclarées par ligne dans la partie 'cant: de  #balauto
#define BALAUTO_CANT_NB_MAX_VAR				22	// Nombre maximum de conditions déclarées dans la partie 'cant:' de #balauto
//
#define BALAUTO_CANT_TAB_IND_CANT_NO         0 // Numéro du canton.
#define BALAUTO_CANT_TAB_IND_CANT_SENS       1 // Sens de parcours.
#define BALAUTO_CANT_TAB_IND_DEC             2 // Inertie = -1 ou 1 à 28.
#define BALAUTO_CANT_TAB_IND_RAL             3 // Consigne de ralentissement si !=0  (de 1 à 64) (en valeur absolue).
#define BALAUTO_CANT_TAB_IND_ACTION_OK       4 // Stock l'état du blocage. =1  => ralenti, =2 => blocage.
#define BALAUTO_CANT_TAB_IND_CANT_0_NO       5 // Conditions sur les cantons = n° de cantons.
#define BALAUTO_CANT_TAB_IND_VAR_0           BALAUTO_CANT_TAB_IND_CANT_0_NO+BALAUTO_CANT_NB_MAX_CANT  // Conditions sur les variables = n° de variables       (Nb de variables max = AIGAUTO_TAB_NB_MAX_VAR).
#define BALAUTO_CANT_TAB_IND_VAL_0           BALAUTO_CANT_TAB_IND_VAR_0+BALAUTO_CANT_NB_MAX_VAR       //                              = état de la variables
#define BALAUTO_CANT_TAB_IND_TAILLE          BALAUTO_CANT_TAB_IND_VAL_0+BALAUTO_CANT_NB_MAX_VAR       // Taille du tableau.


// Garages
#define NB_GARAGE			16	// Nombre total de garages (place réservée dans la majorité des tableaux).
#define NB_GARAGE_REEL		16	// Nombre total de garages utilisé pour le moment.


// Déplacements
#define DEPL_TAB_INERTIE_ACC            0	// Valeurs pour tous les déplacements. Accélération et décélérations = depl_acc_dec[DEPL_TAB_INERTIE_NB].
#define DEPL_TAB_INERTIE_DEC            1	// si =-1 => On prend la valeur du train.
#define DEPL_TAB_INERTIE_NB             2	// 

#define DEPL_TAB_NB                   200	// Nombre maximum de déplacements configurables. (100 en V2.0).
#define DEPL_TAB_NOM_TAILLE            41	// Nombre de caractère maximum + 1 (pour le '/0') pour les noms des déplacements (70 en V2.0).

#define DEPL_CST_NB_MAX_CANT           10	// 10 cantons  configurables par déplacement en V3.3 (8 en V2.0).
#define DEPL_TAB_IND_CANT_0_NO          0	// Numéro des DEPL_CST_NB_MAX_CANT (10) cantons concernés par un déplacements (+1000 pour les garages).
#define DEPL_TAB_IND_CANT_0_VIT         1	// Vitesses de parcours de ces cantons (-1 pour les garages).

#define DEPL_CST_NB_MAX_AIG            10	// 10 aiguillages configurables par déplacement en V3.3 (8 en V2.0).
#define DEPL_TAB_IND_AIG_0_NO          20	// offset = 2*DEPL_CST_NB_MAX_CANT = Numéro des (10) aiguillages concernés par un déplacements 
#define DEPL_TAB_IND_AIG_0_POS         21	// Positions des aiguillages.
											// offset = 2*DEPL_CST_NB_MAX_AIG + 2*DEPL_CST_NB_MAX_CANT = conditon de passage = pass:
// Exemple : pass:canton2,  libe:canton4,  fin:=canton5,  => le train doit être passé sur le canton2, arriver sur le canton 4 et libérer le canton 5.
#define DEPL_TAB_IND_FIN_P_VAR         40	// Condition de fin = pass:<var> condition de passage avant la fin, généralement un canton intérmédiaire
#define DEPL_TAB_IND_FIN_P_VAL         41	
#define DEPL_TAB_IND_FIN_L_VAR         42	// Condition de fin = libe1:<var> condition de fin généralement utilisé pour libérer complétement le canton précédent.
#define DEPL_TAB_IND_FIN_L_VAL         43
#define DEPL_TAB_IND_FIN_F_VAR         44	// Condition de fin = fin:<var> condition de fin = canton d'arrivée ou contact.
#define DEPL_TAB_IND_FIN_F_VAL         45	
#define DEPL_TAB_IND_FIN_H_VAR         46	// Condition de fin = halt:<var> condition de fin = contact en fin de canton, pour arrêter net le train.
#define DEPL_TAB_IND_FIN_H_VAL         47	// Passe la vitesse du train = 0, sans inertie. 
                                            // Utile quand on décroche une locomotive et que l'on passe au canton suivant, si les essieux des wagons sont résistifs,
                                            // la directive libe:<canton> ne suffit pas à arrêter la loco dans ce cas.
#define DEPL_TAB_IND_TAF               48	// taf<0-999> : Temps en secondes entre la détection de fin et la mise hors tension des cantons= temps de freinage.
#define DEPL_TAB_IND_TSF               49	// tsf<0-999> : Temps en secondes entre la détection de fin et la libération des cantons.
#define DEPL_TAB_IND_START_RUN         50	// Si = 1 = demande de démarrage manuel du déplacement, menu : 'Tables > Déplacements' + colonne 'Start'.
#define DEPL_TAB_IND_STOP              51	// Si = 1 = demande d'arrêt manuel du déplacement, menu : 'Tables > Déplacements' + colonne 'Stop'.
#define DEPL_TAB_IND_STEP              52   // Pas d'avancé en cours par déplacements
#define DEPL_TAB_IND_TEMPO             53

#define DEPL_CST_NB_MAX_ACTION          4   // 4 actions maximum.
#define DEPL_TAB_IND_ACTION_OP         54	// La place reservée pour les 4 actions 'sdeb:,cdeb:,sfin:,cfin:,sc:' 
#define DEPL_TAB_IND_ACTION_VAR        55	// Dépend du nombre 'DEPL_CST_NB_MAX_ACTION'. Place reservée dans le tableau corrigée en V3.3.
#define DEPL_TAB_IND_ACTION_OP1        56	
#define DEPL_TAB_IND_ACTION_VAR1       57
#define DEPL_TAB_IND_ACTION_OP2        58	
#define DEPL_TAB_IND_ACTION_VAR2       59
#define DEPL_TAB_IND_ACTION_OP3        60	
#define DEPL_TAB_IND_ACTION_VAR3       61	//
#define DEPL_TAB_IND_TR_NUM_SAVE       62	// Numéro du train empruntant le déplacement
#define DEPL_TAB_IND_TR_NUM_ONLY       63	// Si déclaration de   name:Nom_du_train    pour ne démarrer le déplacement qu'avec ce n° de train.
#define DEPL_TAB_IND_CANT_START        64	// Si déclaration de  start:c<numéro_de_canton>   ou   stop:g<numéro_de_garage>
#define DEPL_TAB_IND_CANT_START2       65	// Si déclaration de start2:c<numéro_de_canton>
#define DEPL_TAB_IND_CANT_STOP         66	// Si déclaration de   stop:c<numéro_de_canton>   ou   stop:g<numéro_de_garage>
#define DEPL_TAB_IND_END_GARAGE_LOCKED 67	// 1 = il faut ne pas remettre les cantons en mdoe sélectif, car l'on arrive sur un garage que l'on isole en fin de parcours.
#define DEPL_TAB_IND_CONS              68   // Consigne de vitesse à appliquer au cantons.
#define DEPL_TAB_IND_VIT               69   // Vitesse à appliquer aux cantons avec inertie d'accélération ou de freinage. 
#define DEPL_TAB_IND_SRV_NO            70	// N° de servo si déclaration de servo<numéro_de_servo>:<valeur>
#define DEPL_TAB_IND_SRV_VAL           71	// Valeur si déclaration de servo<numéro_de_servo>:<valeur>
#define DEPL_TAB_IND_TEMPO_DEB_VAL     72	// Valeur de la temporisation en tics avant d'initier le déplacement.
#define DEPL_TAB_IND_TAILLE            73	// Taille du tableau.

#define DEPL_CST_ACTION_OP_SET_DEB      0
#define DEPL_CST_ACTION_OP_SET_FIN      1
#define DEPL_CST_ACTION_OP_CLR_DEB      2
#define DEPL_CST_ACTION_OP_CLR_FIN      3
#define DEPL_CST_ACTION_OP_SET_CLR      4

#define DEPL_CST_STATE_IDLE             0	//  Etat en cours des déplacements => depl_tab[][DEPL_TAB_IND_STEP]
#define DEPL_CST_STATE_RESERVATION      1	//  En attente reserve cant et aig   
#define DEPL_CST_STATE_ACTION_DEB       2	//  Positionne les variables début_déplacement  
#define DEPL_CST_STATE_TEMPO_DEB        3	//  Attend x secondes avant d'initier le déplacement  
#define DEPL_CST_STATE_ACTION_AIG       4	//  Etablie positions des aiguillages   
#define DEPL_CST_STATE_WAIT_AIG         5	//  Attente fin position des aiguillages  
#define DEPL_CST_STATE_ACTION_CANTON    6	//  Réservation + alimentation cantons  
#define DEPL_CST_STATE_WAIT_FIN0        7	//  Attente passage sur canton pass:  
#define DEPL_CST_STATE_WAIT_FIN1        8	//  Attente arrivee fin:canton/garages  
#define DEPL_CST_STATE_ACTION_TAF       9	//  Mise en place tempo d'arrêt tafx  
#define DEPL_CST_STATE_WAIT_TAF        10	//  Attente fin tempo d'arrêt tafx   
#define DEPL_CST_STATE_ACTION_CANTON0  11	//  Fin deplacement, raz des cantons  
#define DEPL_CST_STATE_ACTION_TSF      12	//  Mise en place tempo liberation tsfx  
#define DEPL_CST_STATE_WAIT_TSF        13	//  Attente fin tempo liberation tsfx   
#define DEPL_CST_STATE_ACTION_FIN      14	//  Positionne les variables fin_deplacement  
#define DEPL_CST_STATE_DERESERVATION   15   //  Fin réservation cantons,aig,srv  


// Boutons aux fonctions diverses
// OPT=3 Déplacements commandés par deux clics sur deux cases "rail+voyant d'occupation" d'un TCO
// OPT=4 STOP UTS.

#define CMD_DIVERS_TEMPO         0  // 1ére désignation. On a un temps limité pour cliquer sur le canton de destination.
#define CMD_DIVERS_C_DEPART      1  // n° du canton de départ (>1000 si c'est un garage)
#define CMD_DIVERS_C_ARRIVEE     2  // n° du canton de d'arrivée (>1000 si c'est un garage)
#define CMD_DIVERS_NUMERO        3  // n° du déplacement correspondant
#define CMD_DIVERS_RESULT        4  // 0 = déplacement annulé, 1 = Déplacement valide. 2 = Jonction Locomotive+Wagons.
#define CMD_DIVERS_TEMPO_RESULT  5  // 2éme désignation. Pendant cette tempo on affiche si déplacement OK => un cadre vert sinon rouge
#define CMD_DIVERS_VAR_BOUTON1   6  // Pour animer le bouton poussoir si 'OPT'=1
#define CMD_DIVERS_VAR_BOUTON2   7  // Pour animer le bouton poussoir si 'OPT'=2....
#define CMD_DIVERS_VAR_BOUTON3   8  // 
#define CMD_DIVERS_VAR_BOUTON4   9  // 
#define CMD_DIVERS_VAR_BOUTON5  10  // En ajouter si plus d'option
#define CMD_DIVERS_VAR_BOUTON6  11  // En ajouter si plus d'option
#define CMD_DIVERS_VAR_BOUTON56 12  // = 5 + 6 En ajouter si plus d'option
#define CMD_DIVERS_VAR_DEPL1    13  // 
#define CMD_DIVERS_VAR_DEPL2    14  // 
#define CMD_DIVERS_VAR_DEPL3    15  // 
#define CMD_DIVERS_VAR_ITI1     16  // 
#define CMD_DIVERS_VAR_ITI2     17  // 
#define CMD_DIVERS_VAR_ITI3     18  // 
#define CMD_DIVERS_OPT3_OK      19  // Si=1 on à un défaut sur un train et un canton.
#define CMD_DIVERS_OPT3_TRAIN   20  // n° du train
#define CMD_DIVERS_OPT3_CARTE   21  // n° de la carte
#define CMD_DIVERS_OPT3_CANTON  22  // n° du canton
#define CMD_DIVERS_OPT4_ARRET   23  // Arret momentanée de tous les trains UTS.
#define CMD_DIVERS_OPT5_HALTE   24  // Pour inhiber la fonction '#balauto' + 'halt:'.
#define CMD_DIVERS_OPT6_BLOCAG  25  // Pour inhiber la fonction '#balauto' + 'cant:'.
#define CMD_DIVERS_VAR_HALT1    26  // Canton en halte
#define CMD_DIVERS_VAR_HALT2    27  //   //
#define CMD_DIVERS_VAR_HALT3    28  //   //
#define CMD_DIVERS_VAR_BLOCAG1  29  // Canton en halte
#define CMD_DIVERS_VAR_BLOCAG2  30  //   //
#define CMD_DIVERS_VAR_BLOCAG3  31  //   //
#define CMD_DIVERS_RELACHE      32  // 0 ou 1 => 1 On clique sur une case 'rectangle rouge' et le bouton gauche de la souris reste enfoncé.
#define CMD_DIVERS_VAR_BOUTON7  33  // Pour animer le bouton poussoir si 'OPT'=7
#define CMD_DIVERS_VAR_BOUTON8  34  // Pour animer le bouton poussoir si 'OPT'=8
#define CMD_DIVERS_VAR_INVS1    35  // 
#define CMD_DIVERS_VAR_INVS2    36  // 
#define CMD_DIVERS_VAR_INVS3    37  // En ajouter si plus d'option 
#define CMD_DIVERS_TAILLE       38  // Taille du tableau  cmd_divers[].     Raz du tableau au démarrage.



//  Aiguillages
#define NB_AIG                    64	// Nombre d'aiguillages gérés par UTS
// aig_state =
#define SM_IDLE   0
#define SM_PREP   1		// Changement d'état à faire.
#define SM_GO     2		// Changement d'état en cours.
#define SM_LIB    3		// Libération de l'aiguillage en cours.


// aig_descr[NB_AIG][AIG_DESCR_IND_PREGOLIB_NB][AIG_DESCR_IND_OUTTIME_NB]
#define AIG_DESCR_IND_PREP_POS_0   0
#define AIG_DESCR_IND_GO_POS_0     1
#define AIG_DESCR_IND_LIB_POS_0    2
#define AIG_DESCR_IND_PREP_POS_1   3
#define AIG_DESCR_IND_GO_POS_1     4
#define AIG_DESCR_IND_LIB_POS_1    5
#define AIG_DESCR_IND_PREGOLIB_NB  6
//
#define AIG_DESCR_NB_OUT           8	// Descriptif pour pour activer 8 sorties (8 relais) pour commander un aiguillage 
#define AIG_DESCR_IND_OUT_NO_0     0	// N° de sortie
#define AIG_DESCR_IND_OUT_VAL_0    1	// Valeur en sortoe <0-1>.
#define AIG_DESCR_IND_OUT_NO_1     2
#define AIG_DESCR_IND_OUT_VAL_1    3
#define AIG_DESCR_IND_OUT_NO_2     4
#define AIG_DESCR_IND_OUT_VAL_2    5
#define AIG_DESCR_IND_OUT_NO_3     6
#define AIG_DESCR_IND_OUT_VAL_3    7
#define AIG_DESCR_IND_OUT_NO_4     8
#define AIG_DESCR_IND_OUT_VAL_4    9
#define AIG_DESCR_IND_OUT_NO_5    10
#define AIG_DESCR_IND_OUT_VAL_5   11
#define AIG_DESCR_IND_OUT_NO_6    12
#define AIG_DESCR_IND_OUT_VAL_6   13
#define AIG_DESCR_IND_OUT_NO_7    14
#define AIG_DESCR_IND_OUT_VAL_7   15
#define AIG_DESCR_IND_TIME        16
#define AIG_DESCR_IND_OUTTIME_NB  17

// Dans 'config.txt' = repos:out0=0 out1=0 out2=0 out4=0 out5=0 out6=0
// aig_descr_idle[2*AIG_DESCR_IDLE_NB_OUT]
#define AIG_DESCR_IDLE_IND_OUT_NO_0     0	// Fois x 40 variables pour la directive repos: !
#define AIG_DESCR_IDLE_IND_OUT_VAL_0    1
#define AIG_DESCR_IDLE_NB_OUT          40	// Taille du tableau = 2*AIG_DESCR_IDLE_NB_OUT

// Dans 'config.txt' = verifX:in_xx x
// aig_descr_info[NB_AIG][AIG_DESCR_INFO_IND_NB]
#define AIG_DESCR_INFO_IND_EXIST            0	// '1' si l'aiguillage existe dans 'config.txt'
#define AIG_DESCR_INFO_IND_VERIF_NUM_POS_0  1	// Si verif0:inxxx y, capteur d'entrée pour vérifier si l'aiguillage est en position '0'
#define AIG_DESCR_INFO_IND_VERIF_VAL_POS_0  2
#define AIG_DESCR_INFO_IND_VERIF_NUM_POS_1  3	// Si verif1:inxxx y, capteur d'entrée pour vérifier si l'aiguillage est en position '1'
#define AIG_DESCR_INFO_IND_VERIF_VAL_POS_1  4
#define AIG_DESCR_INFO_IND_NB               5

//
#define MD_RIEN     0
#define MD_FIXE     1
#define MD_POT      2
#define MD_REG      3
#define MD_AUTO     4
#define MD_SELECTIF 5
#define MD_MIXTE    6
#define MD_MIXTEA   7
#define MD_MIXTES   8
#define MD_PROG     9    //new


// TRAINS
#define NB_TRAIN                    32 // Nombre de trains gérés par UTS et dans le fichier 'config.txt'
#define NB_TRAIN_COULEUR            16 // Nombre de trains ayant une couleur spécifique dans le fichier 'config.txt'
#define NB_TRAIN_RESERVE            23 // Nombre de trains en réserve dans le fichier 'config.txt'

#define NB_TRAIN_RESERVE_COM        40 // Nombre caractères pour les commentaires des trains en réserve dans le fichier 'config.txt'

#define TRAIN_SAISIE_CMDE			 0 // Etats pour le programme train.ccp.
#define TRAIN_SAISIE_CMDE_N_TRAIN    1 
#define TRAIN_SAISIE_CANTON			 2
#define TRAIN_SAISIE_NOM			 3
#define TRAIN_SAISIE_PROFILE		 4
#define TRAIN_SAISIE_GARAGE_ISOLE	 5
#define TRAIN_SAISIE_NOUVEAU_TRAIN   6

#define VITESSE_CANT_MIN			 1 // Vitesse minimum d'un train pour que le canton suivant soit réservé.
#define VITESSE_CANT_MAXI			64 // Vitesse maximum d'un train.
#define VITESSE_MINI				50 // La vitesse minimum d'un train ne peut depasser cette valeur.
#define VITESSE_INERTIE_MINI		 1 // Inertie minimum d'un train.
#define VITESSE_INERTIE_MAXI		28 // Inertie maximum d'un train.
#define VITESSE_INERTIE_PAS			12 // Pas d'inertie d'un train.
#define NB_PROGRESSIF                8 // Nombre d'éléments du tableau pour une acc-déccélération progressive.


// Nombre de cartes gérées
#define NB_CARTE	4

// Nombre de leds par carte
#define NB_LED	48

// Nombre de servo moteur par carte
#define NB_SERVO		5	// Nombre réel de servo par carte
#define NB_SERVO_VIT	10	// Nombre théorique maximum de servo par carte, sert à placer dans un tableau à la suite des consignes, les vitesses des servo.
					// "vio_srv_cmd[x][i]"              = consigne du servo n° i.
					// "vio_srv_cmd[x][i+NB_SERVO_VIT]" = vitesse  du servo n° i.
					// srv_cmd_000 = position du servo n° 0, srv_cmd_010 = vitesse du servo n° 0.

// Nombre d'entrées numériques par carte.
#define NB_IN	80

// Nombre de sorties numériques par carte.
#define NB_OUT	80

// Nombre de cantons par carte
#define NB_CANTON	16

// Nombre d'entrées analogiques par carte.
#define NB_CAN		5

// Nombre global de potentiomètres virtuels, avec le clavier ou télécommande infrarouge.
#define NB_POT_VIR	5


//PIO
#define PIO_BASE_AIG_CMD  5000
#define PIO_BASE_AIG_POS0 5100
#define PIO_BASE_AIG_POS1 5200
#define PIO_BASE_AIG_RES  5000


// TDV = Tables de vérité
//   <var> = nom d'une variable = 'det_1', 'can5', 'out_112', 'var_10', 'srv_cmd5'...
//   <val> = valeur numérique   = '0', '1', 100, '100', '200' '1023'...
//
#define NB_TDV       50		// Nombre maximum de table de vérité gérées par UTS et dans le fichier 'config.txt'
#define NB_TAB    20000
#define NB_TAB_IN    20		// Nombre maximum de variables en entrée dans les définitions "tdv:".
#define NB_TAB_OUT   20		// Nombre maximum de variables en sortie dans les définitions "tdv:".
#define NB_PULSE     32

#define TDV_START 0			// Table de vérité : PHASE DANS UNE TABLE :
#define TDV_IN    1			// Données en entrée dans une TDV
#define TDV_INIT  2			// Initialise les données dans une TDV
#define TDV_EQ    3			// Une ligne d'équation dans une TDV
#define TDV_OUT   4			// Données en sortie dans une TDV
#define TDV_PULSE 5			// Données en sortie (de type impulsion) dans une TDV
#define TDV_EQU   6			// Une ligne d'équation indépendante

#define TDV_CLR   0			// init: clear pour mettre à '0' une variable dans une tdv
#define TDV_SET   1			// init: set   pour mettre à '1' une variable dans une tdv
#define TDV_VAL   2			// V3.3 init: var   pour mettre une valeur numérique dans une variable dans une tdv
#define TDV_VAR   3			// V3.3 init: val   pour mettre le contenue d'une variable dans une variable dans une tdv
                   			// tdv:   0
                   			//   on:    1
                   			//   init:  set out_0   clr out_1    val var_2 123   var var_3 var_4
                   			//              out_0=0     out_1=1      var_2=123       var_3=contenu de 'var_4'

#define EQ_BASE      30100

#define EQ_L            0	// 'l' Load          l in_0          résultat du test = in_0
#define EQ_A           10	// 'a' And           l in_0 a in_1          //        = in_0 and in_1
#define EQ_O           20	// 'o' Or            l in_0 o in_1          //        = in_0 or  in_1
#define EQ_X           30	// 'x' ou eXclusif   l in_0 x in_1          //        = in_0 xor in_1
#define EQ_INV        100	// (100-130)Inverse la valeur du résultat pour 'l','a','o','x'  => 'ln','an','on','xn'

#define EQ_EGA         40	// '=' EGAlité
#define EQ_EGASET      50	// '=set' Dans une équation 'equ:' si le test est ok '=set <var>' alors <var>=1.
                            //        Exemple : equ: l in_23 =set out_45 (met la sortie n°45 à 1 si l'entrée n°23 = 1).
#define EQ_EGACLR      60	// '=clr' Dans une équation 'equ:' si le test est ok '=set <var>' alors <var>=0.
                            //        Exemple : equ: l in_23 =clr out_45 (met la sortie n°45 à 0 si l'entrée n°23 = 1).
#define EQ_EGANUM      70	// '=num'
#define EQ_EGAVAL      80	// '=val' Dans une équation 'equ:' si le test est ok '=val <var> valeur' alors <var>=valeur.
                            //        Exemple : equ: l in_23 =val var_45 789 (met 789 dans la variable n°45 si l'entrée n°23 = 1).
#define EQ_EGAVAR      90	// '=var' Dans une équation 'equ:' si le test est ok '=var <var> <var2>' alors <var>=contenu de <var2>.
                            //        Exemple : equ: l in_23 =var var_45 var_46  (copie la valeur de la variable n°46
                            //        dans la variable n°45 si l'entrée n°23 = 1).

#define EQ_EGAVARX4   140	// '=varx4' Dans une équation 'equ:' si le test est ok '=varx4 <var> <var2>' alors <var>= 4 fois le contenu de <var2>.
                            //        Exemple : equ: l in_23 =varx4 var_45 can_0  (copie la valeur de l'entrée can_0 multiplié par 4 
                            //        dans la variable n°45 si l'entrée n°23 = 1). Cela sert à commander un servo-moteur(0-1023) par une entrée CAN(0-255). 

#define EQ_TSTNO      0		// !   Tests de valeurs analogiques (0-255 ) ("EQ_TSTNO" pas  implanté dans le code).
#define EQ_TSTEGA     1		// ==
#define EQ_TSTDIFF    2		// !=
#define EQ_TSTSUP     3		// >
#define EQ_TSTSUPEGA  4		// >=
#define EQ_TSTINF     5		// < 
#define EQ_TSTINFEGA  6		// <=
