68 lines
1.8 KiB
C
68 lines
1.8 KiB
C
/*
|
|
* 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;
|
|
} |