|
| 1 | +/* |
| 2 | + * SPDX-License-Identifier: MIT |
| 3 | + * SPDX-FileCopyrightText: 2021 Rafael Silva <perigoso@riseup.net> |
| 4 | + */ |
| 5 | + |
| 6 | +#include "platform/efm32gg/driver/key_matrix.h" |
| 7 | +#include "platform/efm32gg/systick.h" |
| 8 | + |
| 9 | +struct key_matrix_t key_matrix_init( |
| 10 | + struct gpio_pin_t *col_pin_list, |
| 11 | + u8 col_pin_list_size, |
| 12 | + struct gpio_pin_t *row_pin_list, |
| 13 | + u8 row_pin_list_size, |
| 14 | + struct key_t *key_data, |
| 15 | + u8 col_to_row) |
| 16 | +{ |
| 17 | + struct key_matrix_t matrix = {}; |
| 18 | + |
| 19 | + matrix.col_pin_list = col_pin_list; |
| 20 | + matrix.col_pin_list_size = col_pin_list_size; |
| 21 | + matrix.row_pin_list = row_pin_list; |
| 22 | + matrix.row_pin_list_size = row_pin_list_size; |
| 23 | + matrix.key_data = key_data; |
| 24 | + matrix.col_to_row = col_to_row; |
| 25 | + matrix.update_timestamp = systick_get_ticks(); |
| 26 | + |
| 27 | + for (size_t col = 0; col < matrix.col_pin_list_size; col++) gpio_set(col_pin_list[col], !matrix.col_to_row); |
| 28 | + |
| 29 | + return matrix; |
| 30 | +} |
| 31 | + |
| 32 | +void key_matrix_scan(struct key_matrix_t *matrix) |
| 33 | +{ |
| 34 | + u16 t_delta = systick_get_ticks() - matrix->update_timestamp; |
| 35 | + matrix->update_timestamp = systick_get_ticks(); |
| 36 | + |
| 37 | + for (size_t col = 0; col < matrix->col_pin_list_size; col++) { |
| 38 | + /* set col output */ |
| 39 | + gpio_set(matrix->col_pin_list[col], matrix->col_to_row); |
| 40 | + |
| 41 | + for (size_t row = 0; row < matrix->row_pin_list_size; row++) { |
| 42 | + u8 index = (col * matrix->row_pin_list_size) + row; |
| 43 | + enum key_status_t last_status = matrix->key_data[index].key_status; |
| 44 | + |
| 45 | + /* get row input */ |
| 46 | + matrix->key_data[index].key_status = |
| 47 | + (gpio_get(matrix->row_pin_list[row]) ^ matrix->col_to_row) ? key_released : key_pressed; |
| 48 | + |
| 49 | + if (matrix->key_data[index].key_status != last_status) |
| 50 | + matrix->key_data[index].key_t_delta = 0; |
| 51 | + else |
| 52 | + matrix->key_data[index].key_t_delta += t_delta; |
| 53 | + } |
| 54 | + |
| 55 | + /* clear col output */ |
| 56 | + gpio_set(matrix->col_pin_list[col], !matrix->col_to_row); |
| 57 | + |
| 58 | + /* settle time */ |
| 59 | + delay_us(1); |
| 60 | + } |
| 61 | +} |
0 commit comments