/*
* core.c
*
* Created: 13.04.2023 14:28:40
*  Author: mrnek
*/
#include <avr/io.h>
#include <stdbool.h>
#include <stdio.h>
#include "keyboard.h"
#include "timer.h"
#include "func.h"

#define MASK_PIND 0b11110000

static void set_key_event(struct key *button);

void get_physical_keys(struct key *keys) {
	uint8_t row;
	for (int i = 0; i < KEYS_AMOUNT / 4; i++) {
		PORTC &= ~(1 << i);
		delay();
		row = PIND & MASK_PIND;
		if (row & (1 << 4)) keys[i * 4].physical = false; else keys[i * 4].physical = true;
		if (row & (1 << 5)) keys[i * 4 + 1].physical = false; else keys[i * 4 + 1].physical = true;
		if (row & (1 << 6)) keys[i * 4 + 2].physical = false; else keys[i * 4 + 2].physical = true;
		if (row & (1 << 7)) keys[i * 4 + 3].physical = false; else keys[i * 4 + 3].physical = true;
		PORTC |= (1 << i);
	}
}

void get_logical_keys(struct key *undc_keys) {
	unsigned long timestamp = get_millis();
	for(int i = 0; i < KEYS_AMOUNT; i++) {
		if (undc_keys[i].physical != undc_keys[i].logical) {
			if (timestamp - undc_keys[i].time >= DEBOUNCE_MS_THRESHOLD) {
				undc_keys[i].logical = undc_keys[i].physical;
				set_key_event(&undc_keys[i]);
			}
			} else { 
				undc_keys[i].time = timestamp;
				
			}
		}
}

void fill_buttons_names(struct key *buttons) {
	for (int i = 0; i < KEYS_AMOUNT; i++) {
		buttons[i].button = i;
	}
}

/************************************************************************/
/*                                                                      */
/************************************************************************/
static void set_key_event(struct key *button) {
	if (button->logical == true) {
		button->on_down = true;
	} else {
		button->on_up = true;	
	}
}

void get_event(struct key *button, bool *up, bool *down) {
	*up = button->on_up;
	*down = button->on_down;
	button->on_up = false;
	button->on_down = false;
}