#include <zephyr.h>
#include <nrfx_gpiote.h>

#define SW0		DT_GPIO_PIN(DT_ALIAS(sw0), gpios)
#define SW1		DT_GPIO_PIN(DT_ALIAS(sw1), gpios)
#define SW2		DT_GPIO_PIN(DT_ALIAS(sw2), gpios)
#define SW3		DT_GPIO_PIN(DT_ALIAS(sw3), gpios)
#define LED0	DT_GPIO_PIN(DT_ALIAS(led0), gpios)
#define LED1	DT_GPIO_PIN(DT_ALIAS(led1), gpios)
#define LED2	DT_GPIO_PIN(DT_ALIAS(led2), gpios)
#define LED3	DT_GPIO_PIN(DT_ALIAS(led3), gpios)

static void sw0_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
	nrfx_gpiote_out_toggle(LED0);
}

static void sw1_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
	nrfx_gpiote_out_toggle(LED1);
}

static void sw2_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
	nrfx_gpiote_out_toggle(LED2);
}

static void sw3_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
	nrfx_gpiote_out_toggle(LED3);
}

void button_init(void){

	IRQ_CONNECT(DT_IRQN(DT_NODELABEL(gpiote)),
		    DT_IRQ(DT_NODELABEL(gpiote), priority),
		    nrfx_isr, nrfx_gpiote_irq_handler, 0);

	nrfx_gpiote_in_config_t const in_config = {
		.sense = NRF_GPIOTE_POLARITY_HITOLO,
		.pull = NRF_GPIO_PIN_PULLUP,
		.is_watcher = false,
		.hi_accuracy = true,
		.skip_gpio_setup = false,
	};

	nrfx_gpiote_in_init(SW0, &in_config, sw0_handler);
	nrfx_gpiote_in_init(SW1, &in_config, sw1_handler);
	nrfx_gpiote_in_init(SW2, &in_config, sw2_handler);
	nrfx_gpiote_in_init(SW3, &in_config, sw3_handler);

	nrfx_gpiote_in_event_enable(SW0, true);
	nrfx_gpiote_in_event_enable(SW1, true);
	nrfx_gpiote_in_event_enable(SW2, true);
	nrfx_gpiote_in_event_enable(SW3, true);

}

void led_init(void){

	nrfx_gpiote_init(0);

	nrfx_gpiote_out_config_t const out_config = {
		.action = NRF_GPIOTE_POLARITY_TOGGLE,
		.init_state = 1,
		.task_pin = true,
	};
	
	nrfx_gpiote_out_init(LED0, &out_config);
	nrfx_gpiote_out_init(LED1, &out_config);
	nrfx_gpiote_out_init(LED2, &out_config);
	nrfx_gpiote_out_init(LED3, &out_config);
	nrfx_gpiote_out_init(32, &out_config);

}

void led_toggle(int ledPin){

	nrfx_gpiote_out_toggle(ledPin);

}


void buttonLed_init(void){
	led_init();
	button_init();

}
