qmk-keychron-q3-colemak-dh/keyboards/mexsistor/ludmila/matrix.c

122 lines
3.6 KiB
C
Raw Normal View History

[Keyboard] Add mexsistor/ludmila (#10506) * Add files via upload * Update keyboards/mexsistor/ludmila/config.h Co-authored-by: Drashna Jaelre <drashna@live.com> * Update keyboards/mexsistor/ludmila/ludmila.h Co-authored-by: Drashna Jaelre <drashna@live.com> * Update ludmila.h * Update keymap.c Disable unnecessary code * Update rules.mk * Update matrix.c * Update keyboards/mexsistor/ludmila/rules.mk Co-authored-by: Ryan <fauxpark@gmail.com> * Update keymap.c * Update keyboards/mexsistor/ludmila/readme.md Co-authored-by: Ryan <fauxpark@gmail.com> * Update keymap.c * Update keymap.c * Update ludmila.h * Update keyboards/mexsistor/ludmila/readme.md Co-authored-by: Ryan <fauxpark@gmail.com> * Update keyboards/mexsistor/ludmila/rules.mk Co-authored-by: Ryan <fauxpark@gmail.com> * Update keyboards/mexsistor/ludmila/rules.mk Co-authored-by: Ryan <fauxpark@gmail.com> * Update keyboards/mexsistor/ludmila/rules.mk Co-authored-by: Ryan <fauxpark@gmail.com> * Update keyboards/mexsistor/ludmila/keymaps/default/keymap.c Co-authored-by: Ryan <fauxpark@gmail.com> * Update keyboards/mexsistor/ludmila/readme.md Co-authored-by: Ryan <fauxpark@gmail.com> * Add files via upload * Add files via upload * Delete config.h * Delete * Update readme.md * Update readme.md * Delete tapdance timing * Delete matrix.c * Create matrix.c * Deleted ludmila, add ludmila_v1 * Update readme.md * add ludmila * delete ludmila_v1, create ludmila * Create matrix.c * Change in matrix.c code and sustitute yes/lite custom_matrix in rules.mk * Update keymap.c * Add description; Change on RGB PIN * Revert "Add description; Change on RGB PIN" This reverts commit cfbe5349259446f49e8885e995d9cac1b77dac01. * config.h and rules.mk update * Update keyboards/mexsistor/ludmila/info.json Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/mexsistor/ludmila/info.json Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com> * Update keyboards/mexsistor/ludmila/rules.mk Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com> Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: Ryan <fauxpark@gmail.com> Co-authored-by: U-MEXSISTOR\Macropads <Kevin M> Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
2020-10-18 22:45:47 +02:00
/*
Copyright 2012-2018 Jun Wako, Jack Humbert, Yiancar
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <stdbool.h>
#include "wait.h"
#include "util.h"
#include "matrix.h"
#include "quantum.h"
// Encoder things
#define ENC_SW F7
static bool read_encoder_switches(matrix_row_t current_matrix[], uint8_t current_row);
static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
/* matrix state(1:on, 0:off) */
extern matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values
extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values
static void select_row(uint8_t row) {
setPinOutput(row_pins[row]);
writePinLow(row_pins[row]);
}
static void unselect_row(uint8_t row) { setPinInputHigh(row_pins[row]); }
static void unselect_rows(void) {
for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
setPinInputHigh(row_pins[x]);
}
}
static void init_pins(void) {
unselect_rows();
for (uint8_t x = 0; x < MATRIX_COLS; x++) {
setPinInputHigh(col_pins[x]);
}
}
static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) {
// Store last value of row prior to reading
matrix_row_t last_row_value = current_matrix[current_row];
// Clear data in matrix row
current_matrix[current_row] = 0;
// Select row and wait for row selecton to stabilize
select_row(current_row);
wait_us(30);
// For each col...
for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
// Select the col pin to read (active low)
uint8_t pin_state = readPin(col_pins[col_index]);
// Populate the matrix row with the state of the col pin
current_matrix[current_row] |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index);
}
// Unselect row
unselect_row(current_row);
return (last_row_value != current_matrix[current_row]);
}
void matrix_init_custom(void) {
// initialize key pins
setPinInput(ENC_SW);
init_pins();
}
bool matrix_scan_custom(void) {
bool changed = false;
// Set row, read cols
for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) {
changed |= read_cols_on_row(raw_matrix, current_row);
}
// Read encoder switches, already debounced
changed |= read_encoder_switches(matrix, 2);
return changed;
}
static bool read_encoder_switches(matrix_row_t current_matrix[], uint8_t current_row) {
// Store last value of row prior to reading
matrix_row_t last_row_value = current_matrix[current_row];
// Clear data in matrix row
current_matrix[current_row] = 0;
// Debounce the encoder buttons using a shift register
static uint8_t btn_1_array;
bool btn_1_pressed = 0;
btn_1_array <<= 1;
btn_1_array |= readPin(ENC_SW);
(btn_1_array == 0b11111111) ? (btn_1_pressed = 1) : (btn_1_pressed = 0);
// Populate the matrix row with the state of the encoder
current_matrix[current_row] |= btn_1_pressed ? (1 << 0) : 0;
return (last_row_value != current_matrix[current_row]);
}