#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/select.h>

int main(int argc, char * argv[])
{
	int fd;
	fd_set fds;
	struct timeval tv;
	char buffer[2];

	// On attend en argument un fichier "value" de GPIO.
	// Par exemple : /sys/class/gpio/gpio23/value
	if (argc != 2) {
		fprintf(stderr, "usage: %s <gpio-file>\n", argv[0]);
		exit(EXIT_FAILURE);
	}
	// Ouvrir le fichier
	if ((fd = open(argv[1], O_RDONLY)) < 0) {
		perror(argv[1]);
		exit(EXIT_FAILURE);
	}

	while (1) {
		// Preparer la table des evenements exceptionnels attendus
		FD_ZERO(& fds);
		// Avec uniquement le descripteur du fichier.
		FD_SET(fd, & fds);
		// Attente passive (pas de timeout, donc infinie...
		if (select(fd+1, NULL, NULL, & fds, NULL) < 0) {
			perror("select");
			break;
		}
		// Lire l'heure du changement d'etat.
		gettimeofday(& tv, NULL);
		// Revenir au debut du fichier (lectures successives).
		lseek(fd, 0, SEEK_SET);
		// Lire la valeur actuelle du GPIO.
		if (read(fd, & buffer, 2) != 2) {
			perror("read");
			break;
		}
		// Effacer le retour-chariot.
		buffer[1] = '\0';
		// Afficher l'heure et l'etat.
		fprintf(stdout, "[%ld.%06ld]: %s\n", tv.tv_sec, tv.tv_usec, buffer);
	}
	close(fd);
	return EXIT_SUCCESS;
}


