#include <termios.h>
#include <unistd.h>
#include <stdio.h>
/*---------------------------------------------------------------------*/
// Réservé à la sauvegarde des paramètres du clavier
struct termios sattr;
// Enregistrement du mode : 0=normal 1=mode immédiat
int mode_clavier=0;
char escape_val=27;
void initialisation_clavier(int val );
char getcharacter(void);
void restauration_clavier(void);
/*-----------------------------------------------------------------------*/
char getch(void) 
{
	char c;
	if (mode_clavier==1) return getcharacter();
	else
	{
		initialisation_clavier(0);
		c=getcharacter();
		restauration_clavier();
		return c;
	}
}
/*-----------------------------------------------------------------------*/
char getche(void) 
{
	char c;
	if (mode_clavier==1) return getcharacter();
	else
	{
		initialisation_clavier(1);
		c=getcharacter();
		restauration_clavier();
		return c;
	}
}
/*----------------------------------------------------------------------*/
void textcolor(int i)
{
	if (i<0 || i> 7) return;
	printf("%c[3%1dm",escape_val,i);
	
}
/*----------------------------------------------------------------------*/
void textblink(int val)
{
  if(val)
    {
      printf("%c[5m",escape_val);
    }
  else
    {
      printf("%c[25m",escape_val);
    }
}
/*-----------------------------------------------------------------------*/
void textreset(voir)
{
  printf("%c[0m",escape_val);
}
/*-----------------------------------------------------------------------*/
void test_asciiart(void)
{
	char c=0;
	int i;
	printf("Test de la procédure getch()\n");
	while (c!='q')
	{
		printf("Tapez une touche (q pour sortir)....\n");
		c=getch();
		printf("Vous avez tapé %c\n",c);
	}
	c=0;
	printf("Test de la procédure getche()\n");
	while (c!='q')
	{
		printf("Tapez une touche (q pour sortir)....\n");
		c=getche();
		printf("Vous avez tapé %c\n",c);
	}
	printf("Test des couleurs...\n");
	for (i=0;i<8;i++)
	  {
	    textcolor(i);
	    printf("============= Couleur %d\n",i);
	  }
	textreset();
	getch();
}
/*========================================================================*/
/*                      PARTIE PRIVEE                                     */
/*========================================================================*/
/*----------------------------------------------------------------------*/
// Permet le passage en mode immédiat. val=1 : echo 
void initialisation_clavier(int val )
{
	struct termios attr;
	// Sauvegarde de la configuration du terminal dans sattr
	if (mode_clavier==0) tcgetattr(STDIN_FILENO,&sattr);
	tcgetattr(STDIN_FILENO,&attr);
	// Modification de la configuration du clavier
	if (val)
	  attr.c_lflag &= ~ (ICANON);
	else
	  attr.c_lflag &= ~ (ICANON | ECHO);
	attr.c_cc[VMIN]=1;
	attr.c_cc[VTIME]=0;
	tcsetattr(STDIN_FILENO,TCSAFLUSH,&attr);
	mode_clavier=1;
}
/*-----------------------------------------------------------------------*/
// Restaure les paramètres clavier sauvegardés lors de
// l'appel à iniitalisation_clavier
void restauration_clavier(void)
{
	if (mode_clavier==1)
	tcsetattr(STDIN_FILENO,TCSAFLUSH,&sattr);
	mode_clavier=0;
}
/*-----------------------------------------------------------------------*/
char getcharacter(void)
{
	char c;
	read(STDIN_FILENO, &c,1);
	return c;
}

//int main(void)
//{
//test_clavier();
//return 0;
//}
