
#include <stdio.h>
#include "stm32_unict_lib.h"

#define ST_OFF		0
#define ST_ON		1
#define ST_CONFIG	2

int state = ST_OFF;
int tick_count = 0;
int delta_t = 5;

#define T_MIN	2
#define T_MAX	30

int main(void)
{
	GPIO_init(GPIOB);
	GPIO_init(GPIOC);
	DISPLAY_init();

	GPIO_config_output(GPIOB, 0);
	GPIO_config_output(GPIOC, 3);

	GPIO_config_input(GPIOB, 10);
	GPIO_config_input(GPIOB, 4);
	GPIO_config_input(GPIOB, 5);
	GPIO_config_input(GPIOB, 6);

	GPIO_config_EXTI(GPIOB, EXTI10);
	EXTI_enable(EXTI10, FALLING_EDGE); // X

	GPIO_config_EXTI(GPIOB, EXTI4);
	EXTI_enable(EXTI4, FALLING_EDGE); // Y

	GPIO_config_EXTI(GPIOB, EXTI5);
	EXTI_enable(EXTI5, FALLING_EDGE); // Y

	GPIO_config_EXTI(GPIOB, EXTI6);
	EXTI_enable(EXTI6, FALLING_EDGE); // Z

	for(;;) {
		switch (state) {

		case ST_OFF:
			GPIO_write(GPIOB,0, 0);
			GPIO_write(GPIOC,3, 0);
			DISPLAY_puts(0,"    ");
			break;

		case ST_ON:
			GPIO_write(GPIOB,0, 1);
			DISPLAY_puts(0,"    ");
			delay_ms(500);
			GPIO_toggle(GPIOC,3);
			++tick_count;
			if (tick_count >= (delta_t*2)) {
				state = ST_OFF;
			}
			break;

		case ST_CONFIG:
			{
				char s[5];
				sprintf(s,"%4d", delta_t);
				DISPLAY_puts(0, s);
				break;
			}
		}
	}
	return 0;
}


// tasto 'X'
void EXTI15_10_IRQHandler(void)
{
	if (EXTI_isset(EXTI10)) {
		switch (state) {
		case ST_OFF:
			state = ST_ON;
			tick_count = 0;
			break;
		case ST_ON:
			tick_count = 0;
			break;
		}
		EXTI_clear(EXTI10);
	}
}


// tasto 'Y'
void EXTI4_IRQHandler(void)
{
	if (EXTI_isset(EXTI4)) {
		if (state == ST_OFF) {
			state = ST_CONFIG;
		}
		else if (state == ST_CONFIG) {
			state = ST_OFF;
		}
		EXTI_clear(EXTI4);
	}
}


// tasto 'Z' e 'T'
void EXTI9_5_IRQHandler(void)
{
	if (EXTI_isset(EXTI5)) { //'Z'
		if (state == ST_CONFIG) {
			if (delta_t > T_MIN)
				delta_t--;
		}
		EXTI_clear(EXTI5);
	}
	if (EXTI_isset(EXTI6)) { //'T'
		if (state == ST_CONFIG) {
			if (delta_t < T_MAX)
				delta_t++;
		}
		EXTI_clear(EXTI6);
	}
}
