/*
 * Dé électronique
 *
 * Christophe Le Lann <totofwebcreation@gmail.com>
 * http://www.totofweb.net/robots.php?projet=48
 *
 * Le programme n'est volontairement pas optimisé
 * mais cela n'a aucune incidence puisque le temps
 * n'est pas du tout critique pour cette application.
 *
 * Bouton sur B0
 * LEDs sur port A
 *  - centrale sur A3
 *  - centres latéraux sur A1 et A5
 *  - coins haut gauche et bas droit sur A6 et A0
 *  - coins haut droite et bas gauche sur A2 et A4
 */

//******************************
// Inclusion de librairies
//******************************

#include <avr/io.h>
#include <compat/deprecated.h>

//******************************
// Attribution des IO
//******************************

#define BOUTON_PORTIN	PINB	// Bouton de lancer
#define BOUTON_DDR		DDRB
#define BOUTON_PIN		0
#define LED_C_PORT		PORTA	// Led centrale
#define LED_C_DDR		DDRA
#define LED_C_PIN		3
#define LED_GC_PORT		PORTA	// Centre gauche
#define LED_GC_DDR		DDRA
#define LED_GC_PIN		1
#define LED_DC_PORT		PORTA	// Centre droit
#define LED_DC_DDR		DDRA
#define LED_DC_PIN		5
#define LED_GH_PORT		PORTA	// Coin haut gauche
#define LED_GH_DDR		DDRA
#define LED_GH_PIN		6
#define LED_GB_PORT		PORTA	// Coin bas gauche
#define LED_GB_DDR		DDRA
#define LED_GB_PIN		4
#define LED_DH_PORT		PORTA	// Coin haut droit
#define LED_DH_DDR		DDRA
#define LED_DH_PIN		2
#define LED_DB_PORT		PORTA	// Coin bas droit
#define LED_DB_DDR		DDRA
#define LED_DB_PIN		0

//******************************
// Fonction principale
//******************************

int main() {

	unsigned char numero = 1;

	// 1 pour sortie, 0 pour entrée
	sbi(LED_C_DDR,  LED_C_PIN);
	sbi(LED_GC_DDR, LED_GC_PIN);
	sbi(LED_DC_DDR, LED_DC_PIN);
	sbi(LED_GH_DDR, LED_GH_PIN);
	sbi(LED_GB_DDR, LED_GB_PIN);
	sbi(LED_DH_DDR, LED_DH_PIN);
	sbi(LED_DB_DDR, LED_DB_PIN);
	cbi(BOUTON_DDR, BOUTON_PIN);

	// Au départ, on allume toutes les leds
	sbi(LED_C_PORT,  LED_C_PIN);
	sbi(LED_GC_PORT, LED_GC_PIN);
	sbi(LED_DC_PORT, LED_DC_PIN);
	sbi(LED_GH_PORT, LED_GH_PIN);
	sbi(LED_GB_PORT, LED_GB_PIN);
	sbi(LED_DH_PORT, LED_DH_PIN);
	sbi(LED_DB_PORT, LED_DB_PIN);

	while(1) {

		// Tant que le bouton est enfoncé, on fait défiler très vite les numéros
		while (bit_is_clear(BOUTON_PORTIN, BOUTON_PIN)) {
			switch (numero) {
				case 1:
					sbi(LED_C_DDR,  LED_C_PIN);
					cbi(LED_GC_DDR, LED_GC_PIN);
					cbi(LED_DC_DDR, LED_DC_PIN);
					cbi(LED_GH_DDR, LED_GH_PIN);
					cbi(LED_GB_DDR, LED_GB_PIN);
					cbi(LED_DH_DDR, LED_DH_PIN);
					cbi(LED_DB_DDR, LED_DB_PIN);
					numero++;
					break;
				case 2:
					cbi(LED_C_DDR,  LED_C_PIN);
					cbi(LED_GC_DDR, LED_GC_PIN);
					cbi(LED_DC_DDR, LED_DC_PIN);
					cbi(LED_GH_DDR, LED_GH_PIN);
					sbi(LED_GB_DDR, LED_GB_PIN);
					sbi(LED_DH_DDR, LED_DH_PIN);
					cbi(LED_DB_DDR, LED_DB_PIN);
					numero++;
					break;
				case 3:
					sbi(LED_C_DDR,  LED_C_PIN);
					cbi(LED_GC_DDR, LED_GC_PIN);
					cbi(LED_DC_DDR, LED_DC_PIN);
					cbi(LED_GH_DDR, LED_GH_PIN);
					sbi(LED_GB_DDR, LED_GB_PIN);
					sbi(LED_DH_DDR, LED_DH_PIN);
					cbi(LED_DB_DDR, LED_DB_PIN);
					numero++;
					break;
				case 4:
					cbi(LED_C_DDR,  LED_C_PIN);
					cbi(LED_GC_DDR, LED_GC_PIN);
					cbi(LED_DC_DDR, LED_DC_PIN);
					sbi(LED_GH_DDR, LED_GH_PIN);
					sbi(LED_GB_DDR, LED_GB_PIN);
					sbi(LED_DH_DDR, LED_DH_PIN);
					sbi(LED_DB_DDR, LED_DB_PIN);
					numero++;
					break;
				case 5:
					sbi(LED_C_DDR,  LED_C_PIN);
					cbi(LED_GC_DDR, LED_GC_PIN);
					cbi(LED_DC_DDR, LED_DC_PIN);
					sbi(LED_GH_DDR, LED_GH_PIN);
					sbi(LED_GB_DDR, LED_GB_PIN);
					sbi(LED_DH_DDR, LED_DH_PIN);
					sbi(LED_DB_DDR, LED_DB_PIN);
					numero++;
					break;
				case 6:
				default:
					cbi(LED_C_DDR,  LED_C_PIN);
					sbi(LED_GC_DDR, LED_GC_PIN);
					sbi(LED_DC_DDR, LED_DC_PIN);
					sbi(LED_GH_DDR, LED_GH_PIN);
					sbi(LED_GB_DDR, LED_GB_PIN);
					sbi(LED_DH_DDR, LED_DH_PIN);
					sbi(LED_DB_DDR, LED_DB_PIN);
					numero = 1;
					break;
			}
		}
	}

	return 0;
}

