/* UD5.LAB5A - Clockwise/Counterclockwise */



/*============================== CONFIGURAZIONI ==============================*/
# define PIN_SEG_A 2					  //L'istruzione #define permette di as-
# define PIN_SEG_B 3					  //sociare ad ogni piedino del display a  
# define PIN_SEG_C 4					  //7 segmenti (da A ad F) un corrispon-
# define PIN_SEG_D 6					  //dente PIN digitale sulla scheda 
# define PIN_SEG_E 7					  //ARDUINO UNO
# define PIN_SEG_F 9

# define PIN_BUTTON 10					//Macro per associare ad un piedino del 
										            //pulsante un corrispondente PIN digita-
										            //le sulla scheda ARDUINO UNO

# define T 500							    //Macro per stabilire il tempo di accen-
										            //sione del singolo segmento misurato in
										            //millisecondi
/*============================================================================*/



/*============================ VARIABILI GLOBALI =============================*/
// Array monodimensionale dei PIN collegati ai segmenti
int pinArray[6] = {PIN_SEG_A,PIN_SEG_B,PIN_SEG_C,PIN_SEG_D,PIN_SEG_E,PIN_SEG_F};

int i=0;								        //Indice dell'array

int before=0;							      //Variabile impiegata per rilevare il 
									  	          //fronte di salita alla pressione del 
										            //pulsante

int rotation=0;							    //Flag per stabilire la direzione di ac-
										            //censione sequenziale dei segmenti:
										            //0 = clockwise, 1 = counterclockwise

unsigned long lastMillis=0;			//Variabili utilizzate per temporizzare 
unsigned long nowMillis;				//l'accensione dei segmenti
/*============================================================================*/



/*=========================== FUNZIONI PRINCIPALI ============================*/
void setup() {
	for(int i=0; i<6; i++) {
		pinMode(pinArray[i],OUTPUT);	  //Ciclo per inizializzare in modalità
	}									                //OUTPUT i PIN sulla scheda ARDUINO UNO
										                //abbinati ai segmenti del display (vedi
										                //sezione CONFIGURAZIONI all'inizio di
										                //questo sorgente)
	
	pinMode(PIN_BUTTON,INPUT_PULLUP);	//Inizializzo in modalità INPUT con re- 
										                //sistenza di pullup attiva il PIN sulla 
										                //scheda ARDUINO UNO destinato al 
										                //collegamento di uno dei piedini del
										                //pulsante (l'altro piedino del pulsante
										                //andrà collegato a un piedino GND)
}


void loop() {
	
	
	
	int now = !digitalRead(PIN_BUTTON);		//Alla pressione del pulsante, rile-	
	if( (before == 0) && (now == 1) ) {		//vo il fronte di salita e cambio
		rotation=!rotation;					        //il flag di rotazione
	}											
	before = now;
	delay(30);								            //Debounce (delay per prevenire il 
											                  //"rimbalzo" quando viene premuto il
											                  //pulsante)
	
	
	nowMillis = millis();					        //Sfrutto la funzione millis(), che
	if (nowMillis - lastMillis > T) {		  //restituisce il tempo trascorso
		lastMillis = nowMillis;				      //dall'accensione della scheda Ardu-
		if (rotation == 0) {				        //ino UNO in millisecondi, per ini-
			clockwise();					            //zializzare la variabile nowMillis
		}									                  //Quando la differenza tra il tempo
		if (rotation == 1) {				        //attuale (nowMillis) e l'ultimo
			counterclockwise();				        //tempo rilevato (lastMillis) è mag-
		}									                  //giore di T (vedi sezione CONFIGU-
	}										                  //RAZIONI all'inizio di questo sor-
}											                  //gente), viene eseguito un test sul
											                  //flag di rotazione e richiamo la 
											                  //subroutine corrispondente
/*============================================================================*/



/*============================== ALTRE FUNZIONI ==============================*/
//La seguente subroutine accende i LED in senso orario
void clockwise() {
	digitalWrite(pinArray[i], LOW);		    //Spengo il LED con indice array i 
	i++;								                  //Incremento di uno l'indice array i
	if (i>5) {							              //Gestisco l'eventuale overflow
		i=0;
	}
	digitalWrite(pinArray[i], HIGH);	    //Accendo il LED con indice array i ap-
}										                    //pena incrementato

//La seguente subroutine accende i LED in senso antiorario
void counterclockwise() {
	digitalWrite(pinArray[i], LOW);		    //Spengo il LED con indice array i
	i--;								                  //Decremento di uno l'indice array i
	if (i<0) {							              //Gestisco l'eventuale underflow
		i=5;
	}
	digitalWrite(pinArray[i], HIGH);	    //Accendo il LED con indice array i ap-
}										                    //pena decrementato
/*============================================================================*/