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

#define BP1 3		// BP1 sur WPi3
#define APPUYE 0	// APPUYE = Niveau logique 0
#define RELACHE 1	// RELACHE = Niveau logique 1

int main(int argc, char *argv[])
{
        int up;				// Variable d'incrémentation
        char EtatBP1=0;		// Variable d'état de BP1
        char EtatLED=0;		// Varible d'état de la LED

/*	Test de la connexion en root */
      if(getuid()!=0)
      {
        printf("Error:wiringPi must be run as root.\n");
        return 1;
      }
/*	Test initialisation correcte WPi */
      if(wiringPiSetup()==-1)
      {
        printf("Error:wiringPi setup failed.\n");
        return 1;
      }
/* Mise en entrée de la broche liée à BP1 */
        pinMode(BP1,INPUT);
/* Activation du PULL-UP interne pour éviter la résistance de rappel*/
        pullUpDnControl(BP1,PUD_UP);
/* Message à l'écran */
		printf("PWM sur sortie GPIO18\n");

        pinMode(1,PWM_OUTPUT); 		// Configuration briche WPi 1 en mode PWM
        pwmSetMode(PWM_MODE_MS);	// Choix de la configuration du mode de PWM
        pwmSetRange(100);			// Définition du nombre de palier
									// 0 -> 0%
									// 100 -> 100%
while(1)
      {

		EtatBP1 = digitalRead(BP1);	// Lecture Etat de BP1
		
/* Si BP1 appuyé et que la LED est éteinte complétement */
		if((EtatBP1 == APPUYE)&&(EtatLED == 0))
			{
/* Alors allumage de la LED avec 100 paliers séparés d'une pause de 30ms */				
			for(up=0;up<=100;up++)
                {
                    pwmWrite(1,up);
                    delay(30);
                }
            EtatLED = 1;	//Indication que la LED est maintenant allumée
			}
/* Si BP1 appuyé et que la LED est allumée complétement */			
		else if((EtatBP1 == APPUYE) && (EtatLED == 1))
			{
/* Alors extinction de la LED avec 100 paliers séparés d'une pause de 30ms */					
			for(up=100;up>=0;up--)
				{
					pwmWrite(1,up);
					delay(30);
				}
			EtatLED = 0;	//Indication que la LED est maintenant éteinte
			}
      };
  return 0;
}
