//  Copyright (C) 2016, mituhiromatuura all right reserved.

#include <kernel.h>
#include "iodefine.h"

#include "button.h"
#include "gpio.h"

volatile int mirror = 0;
volatile int hb_on = 0;

static volatile int button_a_stat = 0;
static volatile int button_b_stat = 0;
static volatile int button_c_stat = 0;
static volatile int button_hb_stat = 0;
static volatile int button_sdcd_stat = 0;

void init_button(void)
{
	gpio_pfr_set(BUTTON_A_PORT, BUTTON_A_BIT, 0);
	gpio_pcr_set(BUTTON_A_PORT, BUTTON_A_BIT, 1);
	gpio_ade_set(BUTTON_A_PORT, BUTTON_A_BIT, 0);
	button_a_stat = 0;

	gpio_pfr_set(BUTTON_B_PORT, BUTTON_B_BIT, 0);
	gpio_pcr_set(BUTTON_B_PORT, BUTTON_B_BIT, 1);
	gpio_ade_set(BUTTON_B_PORT, BUTTON_B_BIT, 0);
	button_b_stat = 0;

	if(gpio_pdir_get(BUTTON_B_PORT, BUTTON_B_BIT) ? 0 : 1)
	{
		mirror = 1;
	}

	gpio_pfr_set(BUTTON_C_PORT, BUTTON_C_BIT, 0);
	gpio_pcr_set(BUTTON_C_PORT, BUTTON_C_BIT, 1);
	gpio_ade_set(BUTTON_C_PORT, BUTTON_C_BIT, 0);
	button_c_stat = 0;

	gpio_pfr_set(BUTTON_HB_PORT, BUTTON_HB_BIT, 0);
	gpio_pcr_set(BUTTON_HB_PORT, BUTTON_HB_BIT, 1);
	gpio_ade_set(BUTTON_HB_PORT, BUTTON_HB_BIT, 0);
	button_hb_stat = 0;

	gpio_pfr_set(BUTTON_SDCD_PORT, BUTTON_SDCD_BIT, 0);
	gpio_pcr_set(BUTTON_SDCD_PORT, BUTTON_SDCD_BIT, 1);
	gpio_ade_set(BUTTON_SDCD_PORT, BUTTON_SDCD_BIT, 0);
	button_sdcd_stat = 0;

	return;
}

static
void button_handler_div(void)
{
	if(gpio_pdir_get(BUTTON_A_PORT, BUTTON_A_BIT) ? 0 : 1)
	{
		if(button_a_stat < 2)
		{
			button_a_stat++;
		}
	}
	else
	{
		button_a_stat = 0;
	}

	if(gpio_pdir_get(BUTTON_B_PORT, BUTTON_B_BIT) ? 0 : 1)
	{
		if(button_b_stat < 2)
		{
			button_b_stat++;
		}
	}
	else
	{
		button_b_stat = 0;
	}

	if(gpio_pdir_get(BUTTON_C_PORT, BUTTON_C_BIT) ? 0 : 1)
	{
		if(button_c_stat < 2)
		{
			button_c_stat++;
		}
	}
	else
	{
		button_c_stat = 0;
	}

	if(gpio_pdir_get(BUTTON_HB_PORT, BUTTON_HB_BIT) ? 0 : 1)
	{
		if(button_hb_stat < 2)
		{
			button_hb_stat++;
		}
	}
	else
	{
		button_hb_stat = 0;
	}

	if(gpio_pdir_get(BUTTON_SDCD_PORT, BUTTON_SDCD_BIT) ? 0 : 1)
	{
		if(button_sdcd_stat < 2)
		{
			button_sdcd_stat++;
		}
	}
	else
	{
		button_sdcd_stat = 0;
	}

	return;
}

void button_handler(void)
{
	static int div = 0;
	if(div++ > 100)
	{
		div = 0;
		button_handler_div();
	}
}

int button_a_is_on(void)
{
	return (2 == button_a_stat) ? 1 : 0;
}

int button_b_is_on(void)
{
	return (2 == button_b_stat) ? 1 : 0;
}

int button_c_is_on(void)
{
	return (2 == button_c_stat) ? 1 : 0;
}

int button_hb_is_on(void)
{
	return (2 == button_hb_stat) ? 1 : 0;
}

int button_sdcd_is_on(void)
{
	return (2 == button_sdcd_stat) ? 1 : 0;
}
