/*
 * distributore.c
 *
 *  Created on: Nov 12, 2017
 *      Author: corrado
 */

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

enum {
	ST_SCELTA,
	ST_EROGAZIONE,
	ST_EROGAZIONE_COMPLETA
};

int stato = ST_SCELTA;
int importo = 0; // importo selezionato
float importo_erogato = 0;
int flash_count;

#define PREZZO_LITRO	1.5		// euro/litro
#define VELOCITA		0.5		// litri secondo

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

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

    // pushbutton X (PB10)
    GPIO_config_input(GPIOB, 10);
    GPIO_config_EXTI(GPIOB, EXTI10);
    EXTI_enable(EXTI10, FALLING_EDGE);

    // pushbutton Y (PB4)
    GPIO_config_input(GPIOB, 4);
    GPIO_config_EXTI(GPIOB, EXTI4);
    EXTI_enable(EXTI4, FALLING_EDGE);

    // pushbutton Z (PB5)
    GPIO_config_input(GPIOB, 5);
    GPIO_config_EXTI(GPIOB, EXTI5);
    EXTI_enable(EXTI5, FALLING_EDGE);

    // pushbutton T (PB6)
    GPIO_config_input(GPIOB, 6);
    GPIO_config_EXTI(GPIOB, EXTI6);
    EXTI_enable(EXTI6, FALLING_EDGE);

    for (;;) {
    	char str[5];
    	switch (stato) {
    	case ST_SCELTA:
    		sprintf(str,"%2d00", importo);
    		DISPLAY_puts(0, str);
    		DISPLAY_dp(1, 1);
			GPIO_write(GPIOB, 0, 0);
    		break;
    	case ST_EROGAZIONE:
    		if (importo_erogato < importo) {
    			delay_ms(10);
    			++flash_count;
    			if (flash_count >= 50) {
    				GPIO_toggle(GPIOC, 2);
    				flash_count = 0;
    			}
    			float delta_litri_erogati = VELOCITA * 0.01;
    			importo_erogato += (PREZZO_LITRO*delta_litri_erogati);
    		}
    		else {
    			GPIO_write(GPIOB, 0, 1);
    			GPIO_write(GPIOC, 2, 0);
    			stato = ST_EROGAZIONE_COMPLETA;
    		}
    		sprintf(str,"%4d", (int)(importo_erogato * 100));
    		DISPLAY_puts(0, str);
    		DISPLAY_dp(1, 1);
    		break;
    	}
    }
}

// pushbutton 'X'
void EXTI15_10_IRQHandler(void)
{
	if (EXTI_isset(EXTI10)) {
		switch (stato) {
		case ST_SCELTA:
			importo += 20;
			break;
		}
		EXTI_clear(EXTI10);
	}
}

// pushbutton 'Y'
void EXTI4_IRQHandler(void)
{
	if (EXTI_isset(EXTI4)) {
		switch(stato) {
		case ST_SCELTA:
			importo += 5;
			break;
		}
		EXTI_clear(EXTI4);
	}
}

void EXTI9_5_IRQHandler(void)
{
	if (EXTI_isset(EXTI5)) {
		// pushbutton 'Z'
		if (stato == ST_SCELTA) {
			importo = 0;
		}
		EXTI_clear(EXTI5);
	}

	if (EXTI_isset(EXTI6)) {
		// pushbutton 'T'
		switch(stato) {
		case ST_SCELTA:
			importo_erogato = 0;
			stato = ST_EROGAZIONE;
			break;
		case ST_EROGAZIONE_COMPLETA:
			stato = ST_SCELTA;
			importo = 0;
			break;
		}
		EXTI_clear(EXTI6);
	}
}
