// UTS 2000 - Fichier 'var.cpp' Gére les variables utilisateur et affiche la fenêtre de debug.
// V3.6b - Le 18/06/2015
//
// Les 600 variables libres pour l'utilisateur ont les numéros compris entre 5400 et 5999.
// var_0   = variable n° 5400 (contenu 0 à 1023)
// var_1   = variable n° 5401 (contenu 0 à 1023)
// var_599 = variable n° 5999 (contenu 0 à 1023)
//
/*****************************************************************************/
/* VAR  Affichage pour débug                                                 */
/*****************************************************************************/
#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++

// Déclaration des fonctions externes
extern void EasyTextOut(int, int, char*);
extern void EasyLine(int, int, int, int);
extern int pio_get_val(int);
extern int pio_get_val_(int);
extern void bmp_SetTextColor(int no_color);

// Déclaration des variables externes
extern HDC   hMemDC;
extern HFONT bmp_fonte;
extern HPEN  bmp_stylo_noir, bmp_stylo_gris128, bmp_stylo_gris192, bmp_stylo_blanc, bmp_stylo_jaune;
extern HBRUSH  bmp_pinceau_blanc, bmp_pinceau_gris128, bmp_pinceau_gris192, bmp_pinceau_gris220, bmp_pinceau_gris230, bmp_pinceau_gris240, bmp_pinceau_vert, bmp_pinceau_jaune;
extern int screen_mode;

extern int pio_var[NB_VAR];
extern int special_var[NB_SPECIAL_VAR];
extern int x_mouse,y_mouse, screen_mode_retour;

// Déclaration des variables globales
int decal_affvar=0;	// Affiche les numéros de variables à partir de 0 ou 5400. 
int decal_affvar_spe=0;	// Affiche les numéros de variables spéciales à partir de 0 ou 9100. 
int var_deb=0;		// Numéro de la premiere variable à afficher.


// Affiche un tableau avec le contenu des variables utilisateur. Appel à parir du menu : 'Debug > Variables'.
// Suivant la valeur de 'screen_mode' on affiche les variables à patir de 0,200 ou 400.
//
void var_debug(int action)
{
	static int i,j;
	static int dimnx=44;	// Dimension horizontal d'une cellule 'Numéro'
	static int dimcx=55;	// Dimension horizontal d'une cellule 'Contenu'
	static int dimy=16;		// Dimension vertical d'une cellule
	static int nblignes=30;	// Nombre de ligne du tableau (sans le titre).
	static int decaly=16;	// Décalage vers le bas de la premiére ligne du tableau.
	char ch[200];

	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,800,700);SelectObject(hMemDC,bmp_stylo_gris192);
		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);

		bmp_SetTextColor(BMP_CST_COLOR_NOIR);	// Texte en noir.
		EasyTextOut(2,2,"AFFICHE LES VALEURS NON NULLES DES VARIABLES UTILISATEUR (5400-5999)");
		EasyTextOut(800-140,2,"(QUITTER = ESC)");
		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+4);
		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+3, 95, decaly+(nblignes+3)*dimy+2);	// Relief rectangle.
		SelectObject(hMemDC,bmp_stylo_noir);
		EasyLine(97-10,  decaly+(nblignes+3)*dimy+4-2,97, decaly+(nblignes+3)*dimy+4-12);  // Dessine un trait dans l'angle = valeurs modifiables.
		EasyTextOut(2,decaly+(nblignes+2)*dimy+4," CLIC-DROIT :AFFICHE LES PAGES 1->2->3, [000-239]->[240-479]->[480-599]");
		SelectObject(hMemDC,bmp_stylo_noir); SelectObject(hMemDC,bmp_pinceau_gris240); // Rectangle gris.
		Rectangle(hMemDC,0, decaly+(nblignes+3)*dimy+4, 97, decaly+(nblignes+4)*dimy+6);
		SelectObject(hMemDC,bmp_stylo_gris128);
		EasyLine(1,  decaly+(nblignes+4)*dimy+4, 96, decaly+(nblignes+4)*dimy+4);  	// Relief rectangle.
		EasyLine(95, decaly+(nblignes+3)*dimy+5, 95, decaly+(nblignes+4)*dimy+4);	// Relief rectangle.
		SelectObject(hMemDC,bmp_stylo_noir);
		EasyLine(97-10,  decaly+(nblignes+4)*dimy+4,97, decaly+(nblignes+4)*dimy+6-12);  // Dessine un trait dans l'angle = valeurs modifiables.
		EasyTextOut(2,decaly+(nblignes+3)*dimy+6,"    CLIC    :AFFICHE LES N° de VARIABLE [var_xxx ou special_var_xxx]<->[n° INTERNE]");
		SelectObject(hMemDC,bmp_pinceau_blanc);  SelectObject(hMemDC,bmp_stylo_gris192);
		bmp_SetTextColor(BMP_CST_COLOR_ROUGE);			// Texte en rouge.
		for (i=0;i<8;i++) {						// Nb de lignes verticales/2.
			EasyTextOut(2+(dimnx+dimcx)*i      ,2+decaly,"n°VAR" );
			EasyTextOut(4+(dimnx+dimcx)*i+dimnx,2+decaly,"VALEUR");
		}
	}

	SelectObject(hMemDC,bmp_stylo_gris192);
	if(action==DEBUG_MOUSE) {   // ACTION = CLIC GAUCHE DE LA SOURIS
		if ((x_mouse > 0 && x_mouse < 97) && (y_mouse > decaly+(nblignes+2)*dimy+2 && y_mouse < decaly+(nblignes+3)*dimy+4)) { //	Clique dans [CLIC DROIT]
			action=DEBUG_MOUSE_RIGHT; //	Simule le clique-droit traité plus loin.
		}
		else {
			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.
			}
			SelectObject(hMemDC,bmp_stylo_blanc);
    		Rectangle(hMemDC,0,decaly+dimy,799,dimy*(nblignes+1)+decaly);			// N'efface que la partie du tableau.
    		Rectangle(hMemDC,0,dimy*(nblignes+4)+decaly+8,799,dimy*(nblignes+6)+decaly+12);	// N'efface que le texte en bas facultatif.
			SelectObject(hMemDC,bmp_stylo_gris192);
			if (decal_affvar!=5400) {decal_affvar=5400; decal_affvar_spe=9100;}
			else                    {decal_affvar=0;    decal_affvar_spe=0;}
			}
		}

	if(action==DEBUG_MOUSE_RIGHT) { // ACTION = CLIC DROIT DE LA SOURIS
		SelectObject(hMemDC,bmp_stylo_blanc);
    	Rectangle(hMemDC,0,decaly+dimy,799,dimy*(nblignes+1)+decaly);				// N'efface que la partie du tableau.
    	Rectangle(hMemDC,0,dimy*(nblignes+4)+decaly+8,799,dimy*(nblignes+6)+decaly+12);	// N'efface que le texte en bas facultatif.
		SelectObject(hMemDC,bmp_stylo_gris192);
		switch(screen_mode) {
			case MD_ECRAN_VAR1 : { screen_mode=MD_ECRAN_VAR2; break;}
			case MD_ECRAN_VAR2 : { screen_mode=MD_ECRAN_VAR3; break;}
			case MD_ECRAN_VAR3 : { screen_mode=MD_ECRAN_VAR1; break;}
			default: break;
		}
	}

	if (screen_mode==MD_ECRAN_VAR1) var_deb=0;		// N° de la premiere variable à afficher
	if (screen_mode==MD_ECRAN_VAR2) var_deb=240;
	if (screen_mode==MD_ECRAN_VAR3) var_deb=480;

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

	SelectObject(hMemDC,bmp_pinceau_blanc); SelectObject(hMemDC,bmp_stylo_blanc);
	Rectangle(hMemDC,1, decaly+(nblignes+4)*dimy+8, 799, decaly+(nblignes+6)*dimy+10); SelectObject(hMemDC,bmp_stylo_gris192);

	bmp_SetTextColor(BMP_CST_COLOR_BLEUF);			// Texte en bleu foncé.
	if ((screen_mode==MD_ECRAN_VAR2) || (screen_mode==MD_ECRAN_VAR3)) { 
		bmp_SetTextColor(BMP_CST_COLOR_MARRON);		// Texte en marron.
		EasyTextOut(2,decaly+(nblignes+4)*dimy+8,"AFFICHE LES VARIABLES DE DEBUG DES CANTONS EN MARRON 'var_450' à 'var_599' (Voir Doc UTS)");
	}
	if (screen_mode==MD_ECRAN_VAR3) { 
		bmp_SetTextColor(BMP_CST_COLOR_VIOLET);		// Texte en violet.
		EasyTextOut(2,decaly+(nblignes+5)*dimy+10,"AFFICHE LES VARIABLES SPECIALES 'special_var_xxx' EN VIOLET");

	}

	SelectObject(hMemDC,bmp_pinceau_blanc); SelectObject(hMemDC,bmp_stylo_blanc);
	Rectangle(hMemDC,1, dimy+decaly, 799, (nblignes+1)*dimy+decaly); SelectObject(hMemDC,bmp_stylo_gris192);


	// Dessine les lignes horizontales.
	for (i=0;i<nblignes+2;i++) { EasyLine(0,dimy*i+decaly,8*(dimnx+dimcx),dimy*i+decaly); }
	// Dessine les lignes verticales.
	for (i=0;i<8;i++) {						// Nb de lignes verticales/2.
		EasyLine((dimnx+dimcx)*i+dimnx      ,decaly,(dimnx+dimcx)*i+dimnx      ,(nblignes+1)*dimy+decaly); 
		EasyLine((dimnx+dimcx)*i+dimnx+dimcx,decaly,(dimnx+dimcx)*i+dimnx+dimcx,(nblignes+1)*dimy+decaly); 
	}

	for(i=0;i<nblignes;i++) {
		for (j=0;j<8;j++) {							// Nb de lignes verticales/2.
			if((var_deb+i+nblignes*j)>=NB_VAR) {	// 600 variables maximum en mémoire.
				continue;
			}
			bmp_SetTextColor(BMP_CST_COLOR_BLEUF);	// Texte en bleu foncé.
			if((450<=var_deb+i+nblignes*j)&&(var_deb+i+nblignes*j<=600)) bmp_SetTextColor(BMP_CST_COLOR_MARRON);
			sprintf_s(ch,"%4d",var_deb+i+nblignes*j+decal_affvar); 
			EasyTextOut(7+(dimnx+dimcx)*j,dimy+2+dimy*i+decaly,ch);
			bmp_SetTextColor(BMP_CST_COLOR_NOIR);	// Texte en noir.
			Rectangle(hMemDC,dimnx+(dimnx+dimcx)*j, dimy+2+dimy*i+decaly-2, dimnx+(dimnx+dimcx)*j+dimcx+1, dimy+2+dimy*(i+1)+decaly-1);
			if(pio_var[var_deb+i+nblignes*j]!=0) {	// Affiche les valeurs non nulle
				sprintf_s(ch,"%5d",pio_var[var_deb+i+nblignes*j]);
				EasyTextOut(7+dimnx+(dimnx+dimcx)*j,dimy+2+dimy*i+decaly,ch);
			}
		}
	}

	// Sur le troisième écran, on affiche en plus les 100 variables spéciales à UTS
	//
	if (screen_mode==MD_ECRAN_VAR3) {
		for(i=0;i<nblignes;i++) {
			for (j=0;j<8-4;j++) {						// Nb de lignes verticales/2.
				if((i+nblignes*j)>=NB_SPECIAL_VAR) {	// 100 variables spéciales maximum en mémoire.
					continue;
				}
				bmp_SetTextColor(BMP_CST_COLOR_VIOLET);		// Texte en violet.
				sprintf_s(ch,"%4d",i+nblignes*j+decal_affvar_spe); 
				EasyTextOut(7+(dimnx+dimcx)*(j+4),dimy+2+dimy*i+decaly,ch);
				bmp_SetTextColor(BMP_CST_COLOR_NOIR);		// Texte en noir.
				Rectangle(hMemDC,dimnx+(dimnx+dimcx)*(j+4), dimy+2+dimy*i+decaly-2, dimnx+(dimnx+dimcx)*(j+4)+dimcx+1, dimy+2+dimy*(i+1)+decaly-1);
				if (special_var[i+nblignes*j]!=0) {
					sprintf_s(ch,"%5d",special_var[i+nblignes*j]);
					EasyTextOut(7+dimnx+(dimnx+dimcx)*(j+4),dimy+2+dimy*i+decaly,ch);
				}
			}
		}
	}
}
