#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <wiringPi.h>
#include <lcd.h>

// Prototype de la procédure d'affichage du nom de la machine
void Affiche_Host(void);
// Prototype de la procédure d'affichage de l'adresse IP
void Affiche_IP(void);

int main (void)
{

    int lcd1 ;		// Déclaration de l'afficheur

	/* Test du mode "root" et de l'intallation correcte de WiringPi*/
      if(getuid()!=0) //wiringPi requires root privileges
      {
        printf("Error:wiringPi must be run as root.\n");
        return 1;
      }
      if(wiringPiSetup()==-1)
      {
        printf("Error:wiringPi setup failed.\n");
        return 1;
      }
	/**************************************************************/

	// Initialisation de l'afficheur
	lcd1 = lcdInit (2, 16, 4, 8, 9, 0,1,2,3,0,0,0,0) ;

	/* Test de la bonne initialisation de l'afficheur*/
	if (lcd1 == -1)
		{
			printf ("lcdInit failed\n") ;
			return 1 ;
		}
	/************************************************/

	delay(80);

	/* Ecran d'acceuil */
    printf("Programme d'affichage sur écran LCD\n");
    lcdPosition (lcd1, 0, 0) ; lcdPuts (lcd1, "TSTI2D 2012/2013") ;
    lcdPosition (lcd1, 0, 1) ; lcdPuts (lcd1, "  Raspberry Pi  ") ;
    delay(3000);
    lcdClear(lcd1);
    delay(80);

    // Appel de la procédure d'affichage du nom de la machine
    Affiche_Host();
    // Appel de la procédure d'affichage de l'IP machine
    Affiche_IP();

  while(1);

  return 0 ;
}


/********************************************************/
/*     Procédure d'affichage du nom de la Raspberry     */
/********************************************************/
void Affiche_Host(void)
{
    char host[15];	// Déclaration d'un tableau de stockage du nom
    int lcd1 ;		// Déclaration de l'afficheur

	gethostname(host,15); // Récupération du nom de la machine

	// Affichage du nom de la machine

	printf("Nom de machine: %s\n", host);
	lcdClear(lcd1);
	delay(80);
	lcdPosition (lcd1, 0, 0) ; lcdPuts (lcd1, "NOM DE MACHINE:") ;
    lcdPosition (lcd1, 0, 1) ; lcdPuts (lcd1, host) ;

    delay (3000) ;		// Delai d'attente pour lecture
    lcdClear(lcd1);		// Effacement du LCD
    delay(100);			// Delai pour prise en compte de l'effacement


 }
/********************************************************/

/********************************************************/
/*Procédure d'affichage de l'adresse IP de la Raspberry */
/********************************************************/

void Affiche_IP(void)
{
    FILE *f = NULL;	// Déclaration d'un pointeur sur un fichier
    char i =0;		// Déclaration d'un index
    char ip[15];	// Déclaration d'un tableau de stockage de l'IP
    int lcd1 ;		// Déclaration de l'afficheur

    lcdClear(lcd1);	// Effacement du LCD
    delay(80);		// Delai pour prise en compte de l'effacement

	// Récupération de l'adresse IP et redirection de l'affichage
	// dans le fichier texte "ip.txt"
    system("hostname -I > ip.txt");

	// Ouverture du fichier "ip.txt" en lecture seule
    f = fopen("ip.txt","r");
	// Test si le fichier est existant
       if(f != NULL)
    {
		// Lecture de l'adresse IP et stockage dans le tableau "ip"
        while(!feof(f)) fread(ip, 1,15,f);

		// Fermeture du fichier "ip.txt"
        fclose(f);

        lcdPosition (lcd1, 0, 0) ; lcdPuts (lcd1, "Adresse IP Carte") ;
        lcdPosition (lcd1, 0, 1) ;
        i=0;
		// Affichage de l'adresse par commande "lcdPutchar"
		// car il faut tester le caractère de fin qui est
		// un retour chariot "\n".
        while(ip[i] != '\n')
        {
                lcdPutchar(lcd1, ip[i]);
                i++;
        }
    }
    delay (3000) ;		// Delai d'attente pour lecture
    lcdClear(lcd1);		// Effacement du LCD
    delay(100);			// Delai pour prise en compte de l'effacement
}
/********************************************************/
