
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#include <unistd.h>
#include <string.h>
#include <time.h>


#include <wiringPi.h>
#include <lcd.h>

// Prototype de la procédure d'affichage de l'adresse MAC
void Affiche_MAC(void);
// Prototype de la procédure d'affichage de l'adresse IP
void Affiche_IP(void);
// Prototype de la procédure d'affichage du nom de la machine
void Affiche_Host(void);
// Prototype de la procédure d'affichage de la date et de l'heure
void Affiche_Heure(void);

void Affiche_Temp(void);

int main (void)
{

    int lcd1 ;		// Déclaration de l'afficheur
    char i = 0;		// Variable d'incrémentation
    unsigned char EtatIO =0; // Variable d'état de la sortie WPi 4


	/* 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;
      }
	/**************************************************************/

	// Broche WPi 4 en sortie
	pinMode(4,OUTPUT);
	// Initialisation de l'afficheur
	//lcd1 = lcdInit (2, 16, 4, 11, 10, 0,1,2,3,0,0,0,0) ;
	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(300);

	/* 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);
	/*******************/


	// Affichage du nom de la machine
    Affiche_Host();

    Affiche_MAC();
	// Affichage de l'adresse IP de la machine
    Affiche_IP();

    Affiche_Temp();

  while(1)
  {
	/* Clignotement d'une LED sur WPi 4 */
	digitalWrite(4,EtatIO);
    EtatIO = !EtatIO;
	/************************************/

	// Affichage heure et date
   Affiche_Heure();


    delay (1000) ;
    /* Toutes les 10sec affichage IP */
	i++;
	if(i==10)
      {
          digitalWrite(4,0); // Extinction LED
          i=0;
          Affiche_IP();
          Affiche_Temp();
      }
	/************************************/
 };

  return 0 ;
}


/********************************************************/
/*    Procédure d'affichage de l'heure et de la date    */
/********************************************************/
void Affiche_Heure(void)
{
    int lcd1 ;		// Déclaration de l'afficheur
    char buf1 [30] ;// Déclaration d'un buffer de stockage

    struct tm *t ;
    time_t tim ;


    lcdPosition (lcd1, 0, 0) ; lcdPuts (lcd1, "Heure:") ;
    lcdPosition (lcd1, 0, 1) ; lcdPuts (lcd1, "Date:") ;

	// Initialisation de la récupération de la date et de l'heure
    tim = time (NULL) ;
    t = localtime (&tim) ;

	// Construction du buffer pour l'heure
    sprintf (buf1, "%02d:%02d:%02d", t->tm_hour, t->tm_min, t->tm_sec) ;
	// Affichage du contenu du buffer: l'heure
    lcdPosition (lcd1, 8, 0) ; lcdPuts (lcd1, buf1) ;

	// Construction du buffer pour la date
    sprintf (buf1, "%02d/%02d/%02d", t->tm_mday, t->tm_mon + 1, t->tm_year+1900) ;
	// Affichage du contenu du buffer: la date
    lcdPosition (lcd1, 6, 1) ; lcdPuts (lcd1, buf1) ;

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

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

void Affiche_MAC(void)
{
    FILE *f = NULL;	// Déclaration d'un pointeur sur un fichier
    char i =0;		// Déclaration d'un index
    char mac[18];	// Déclaration d'un tableau de stockage de l'adresse MAC
    int lcd1 ;		// Déclaration de l'afficheur

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

	// Récupération de l'adresse MAC et redirection de l'affichage
	// dans le fichier texte "mac.txt"
    system("ifconfig eth0 | grep 'HWaddr' | cut -c39- > mac.txt");

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

        fgets(mac,18,f);
		// Fermeture du fichier "ip.txt"
        fclose(f);

        lcdPosition (lcd1, 0, 0) ; lcdPuts (lcd1, "Adresse MAC:") ;
        lcdPosition (lcd1, 0, 1) ;  lcdPuts (lcd1, mac) ;

    }
    digitalWrite(4,0);  // Extinction LED
    delay (3000) ;		// Delai d'attente pour lecture
    lcdClear(lcd1);		// Effacement du LCD
    delay(150);			// 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(150);		// 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:") ;
        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++;

        }
    }
    digitalWrite(4,0);  // Extinction LED
    delay (3000) ;		// Delai d'attente pour lecture
    lcdClear(lcd1);		// Effacement du LCD
    delay(150);			// Delai pour prise en compte de l'effacement
}
/********************************************************/


/********************************************************/
/*     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
    lcdPosition (lcd1, 0, 0) ; lcdPuts (lcd1, "Nom 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 la température du processeur de la Raspberry */
/********************************************************/

void Affiche_Temp(void)
{
    FILE *f = NULL;	// Déclaration d'un pointeur sur un fichier
    char i =0;		// Déclaration d'un index
    char temp[10];	// Déclaration d'un tableau de stockage de la température
    int lcd1 ;		// Déclaration de l'afficheur

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

	// Récupération température dans le fichier texte "temp.txt"
    system("/opt/vc/bin/vcgencmd measure_temp | cut -c6- > temp.txt");

	// Ouverture du fichier "ip.txt" en lecture seule
    f = fopen("temp.txt","r");
	// Test si le fichier est existant
       if(f != NULL)
    {
        //fseek(f,5,SEEK_SET);
		fgets(temp,7,f);
		// Fermeture du fichier "ip.txt"
        fclose(f);
        lcdPosition (lcd1, 0, 0) ;  lcdPuts (lcd1, "TEMP processeur:") ;
        lcdPosition (lcd1, 0, 1) ;  lcdPuts (lcd1, temp) ;
    }
    digitalWrite(4,0);  // Extinction LED
    delay (3000) ;		// Delai d'attente pour lecture
    lcdClear(lcd1);		// Effacement du LCD
    delay(150);			// Delai pour prise en compte de l'effacement
}
/********************************************************/
