/* * core.c * * Created: 13.04.2023 14:28:40 * Author: mrnek */ #include #include #include #include "keyboard.h" #include "timer.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); for(volatile long i = 0; i < 1000; i++){}; 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; }