/*
 * led-state-3.c
 *
 *  Created on: Oct 3, 2018
 *      Author: corrado
 */

#include "stm32_unict_lib.h"

typedef struct {
	GPIO_TypeDef * port;
	int pin;
	int prev_state;
	int current_state;
} t_key;

#define EVT_KEY_NONE	0
#define EVT_KEY_PRESS	1
#define EVT_KEY_RELEASE	2

void KEY_init(t_key * k)
{
	GPIO_init(k->port);
	GPIO_config_input(k->port, k->pin);
	k->prev_state = GPIO_read(k->port, k->pin);
}

int KEY_get(t_key * k)
{
	int event = EVT_KEY_NONE;
	k->current_state = GPIO_read(k->port, k->pin);
	if (k->prev_state == 1 && k->current_state == 0) {
		// keypress
		event = EVT_KEY_PRESS;
	}
	if (k->prev_state == 0 && k->current_state == 1) {
		// keyrelease
		event = EVT_KEY_RELEASE;
	}
	k->prev_state = k->current_state;
	return event;
}

int main(void)
{
	t_key X, Y, Z;
	X.port = GPIOB;
	X.pin = 10;
	KEY_init(&X);

	Y.port = GPIOB;
	Y.pin = 4;
	KEY_init(&Y);

	Z.port = GPIOB;
	Z.pin = 5;
	KEY_init(&Z);

	GPIO_init(GPIOB);
	GPIO_config_output(GPIOB, 0);
	int led_state = 0;
	int flash_count = 0;
	for(;;) {

		if (KEY_get(&Y) == EVT_KEY_PRESS)
			led_state = 0;

		if (KEY_get(&X) == EVT_KEY_PRESS)
			led_state = 1;

		if (KEY_get(&Z) == EVT_KEY_PRESS)
			led_state = 2;

		switch (led_state) {
		case 0:
			GPIO_write(GPIOB,0, 0);
			break;
		case 1:
			delay_ms(100);
			++flash_count;
			if (flash_count == 5) {
				GPIO_toggle(GPIOB, 0);
				flash_count = 0;
			}
			break;
		case 2:
			GPIO_write(GPIOB,0, 1);
			break;
		}
	}
	return 0;
}

