diff options
author | Drashna Jaelre <drashna@live.com> | 2022-07-26 12:50:45 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-26 20:50:45 +0100 |
commit | 5f36285fc5905913aea0671e037bb343fd84391f (patch) | |
tree | fe678b41ae43d5ff42546a828f0028325eb55c05 /keyboards/work_louder/micro/matrix.c | |
parent | 9dbc0473efd64ae246e171fe0201708725c9eeda (diff) |
[Keyboard] Add work louder micro (#17586)
* [Keyboard] Add work louder micro
* Update keyboards/work_louder/micro/readme.md
* Update readme
* Update kb config files
* Update to use encoder map
Co-authored-by: Tom Barnes <barnestom@me.com>
Diffstat (limited to 'keyboards/work_louder/micro/matrix.c')
-rw-r--r-- | keyboards/work_louder/micro/matrix.c | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/keyboards/work_louder/micro/matrix.c b/keyboards/work_louder/micro/matrix.c new file mode 100644 index 0000000000..d2ae16ad9c --- /dev/null +++ b/keyboards/work_louder/micro/matrix.c @@ -0,0 +1,131 @@ +// Copyright 2022 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com> +// SPDX-License-Identifier: GPL-2.0-or-later + +/* + * scan matrix + */ +#include <stdint.h> +#include <stdbool.h> +#include <avr/io.h> +#include "wait.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "debounce.h" +#include QMK_KEYBOARD_H + +/* matrix state(1:on, 0:off) */ +extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values +extern matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values + +static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; +#define MATRIX_ROW_SHIFTER ((matrix_row_t)1) + +static inline void setPinOutput_writeLow(pin_t pin) { + ATOMIC_BLOCK_FORCEON { + setPinOutput(pin); + writePinLow(pin); + } +} + +static inline void setPinOutput_writeHigh(pin_t pin) { + ATOMIC_BLOCK_FORCEON { + setPinOutput(pin); + writePinHigh(pin); + } +} + +static inline void setPinInputHigh_atomic(pin_t pin) { + ATOMIC_BLOCK_FORCEON { + setPinInputHigh(pin); + } +} + +static inline uint8_t readMatrixPin(pin_t pin) { + if (pin != NO_PIN) { + return readPin(pin); + } else { + return 1; + } +} + +static bool select_row(uint8_t row) { + pin_t pin = row_pins[row]; + if (pin != NO_PIN) { + setPinOutput_writeLow(pin); + return true; + } + return false; +} + +static void unselect_row(uint8_t row) { + pin_t pin = row_pins[row]; + if (pin != NO_PIN) { + setPinInputHigh_atomic(pin); + } +} + +static void unselect_rows(void) { + for (uint8_t x = 0; x < MATRIX_ROWS; x++) { + unselect_row(x); + } +} + +__attribute__((weak)) void matrix_init_custom(void) { + unselect_rows(); + for (uint8_t x = 0; x < MATRIX_COLS; x++) { + if (col_pins[x] != NO_PIN) { + setPinInputHigh_atomic(col_pins[x]); + } + } + setPinInputHigh_atomic(F7); + setPinInputHigh_atomic(F0); +} + +void matrix_read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { + // Start with a clear matrix row + matrix_row_t current_row_value = 0; + + if (!select_row(current_row)) { // Select row + return; // skip NO_PIN row + } + matrix_output_select_delay(); + + // For each col... + matrix_row_t row_shifter = MATRIX_ROW_SHIFTER; + for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++, row_shifter <<= 1) { + uint8_t pin_state = 0; + if (current_row == 3 && col_index == 0) { + pin_state = !readMatrixPin(F7); + } else if (current_row == 3 && col_index == 3) { + pin_state = !readMatrixPin(F0); + } else { + pin_state = readMatrixPin(col_pins[col_index]); + } + // Populate the matrix row with the state of the col pin + current_row_value |= pin_state ? 0 : row_shifter; + } + + // Unselect row + unselect_row(current_row); + matrix_output_unselect_delay(current_row, current_row_value != 0); // wait for all Col signals to go HIGH + + // Update the matrix + current_matrix[current_row] = current_row_value; +} + +bool matrix_scan_custom(matrix_row_t current_matrix[]) { + static matrix_row_t temp_matrix[MATRIX_ROWS] = {0}; + + for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) { + matrix_read_cols_on_row(temp_matrix, current_row); + } + + bool changed = memcmp(current_matrix, temp_matrix, sizeof(temp_matrix)) != 0; + if (changed) { + memcpy(current_matrix, temp_matrix, sizeof(temp_matrix)); + } + return changed; +} |