diff --git a/keyboards/binepad/candypad/candypad.h b/keyboards/binepad/candypad/candypad.h index 53bbce9002e..e4259e8726d 100644 --- a/keyboards/binepad/candypad/candypad.h +++ b/keyboards/binepad/candypad/candypad.h @@ -11,12 +11,14 @@ # define OLED_SPLASH_TIMEOUT 2500 # endif +// clang-format off enum oled_modes { OLED_SPLASH, OLED_DEFAULT, OLED_OFF, __NUM_OLED_MODES } oled_modes_t; +// clang-format on bool candypad_render_logo_user(void); bool candypad_render_logo_kb(void); @@ -24,8 +26,8 @@ bool candypad_render_default_user(void); bool candypad_render_default_kb(void); // OLED functions -extern uint8_t oled_mode; -extern bool oled_repaint_requested; +extern uint8_t oled_mode; +extern bool oled_repaint_requested; extern uint32_t oled_splash_timer; #endif diff --git a/keyboards/binepad/candypad/candypad_oled.c b/keyboards/binepad/candypad/candypad_oled.c index 3d335b30508..e88ea747e81 100644 --- a/keyboards/binepad/candypad/candypad_oled.c +++ b/keyboards/binepad/candypad/candypad_oled.c @@ -11,17 +11,17 @@ /* CandyPad Logo */ static void __candypad_render_logo_default(void) { // Generated from https://joric.github.io/qle/ - static const unsigned char PROGMEM raw_logo[] = { + static const char PROGMEM raw_logo[] = { 0, 0, 0, 0, 128, 192, 224, 96, 240, 240, 152, 24, 24, 24, 24, 24, 24, 24, 24, 56, 48, 96, 224, 192, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 0, 0, 192, 248, 62, 7, 15, 28, 56, 112, 225, 195, 135, 14, 28, 56, 112, 224, 192, 128, 0, 0, 0, 0, 1, 7, 62, 252, 192, 0, 128, 192, 224, 112, 48, 48, 48, 112, 96, 0, 128, 192, 224, 96, 48, 48, 48, 112, 224, 240, 240, 0, 0, 240, 240, 96, 112, 48, 48, 48, 112, 224, 192, 128, 0, 0, 128, 192, 224, 112, 48, 48, 48, 112, 224, 255, 255, 0, 48, 112, 224, 128, 0, 0, 0, 0, 128, 224, 112, 48, 0, 240, 240, 224, 112, 48, 48, 48, 112, 224, 192, 128, 0, 0, 128, 192, 224, 96, 48, 48, 48, 112, 224, 240, 240, 0, 0, 128, 192, 224, 112, 48, 48, 48, 112, 224, 255, 255, 0, 0, 3, 31, 124, 224, 192, 0, 0, 0, 0, 1, 3, 7, 14, 28, 56, 112, 225, 195, 135, 14, 28, 56, 240, 224, 124, 63, 3, 0, 15, 31, 56, 112, 96, 96, 96, 112, 48, 0, 15, 31, 56, 112, 96, 96, 96, 112, 56, 127, 127, 0, 0, 127, 127, 0, 0, 0, 0, 0, 0, 1, 127, 127, 0, 0, 15, 31, 56, 112, 96, 96, 96, 112, 56, 127, 127, 0, 0, 0, 3, 15, 62, 240, 248, 62, 15, 3, 0, 0, 0, 255, 255, 56, 112, 96, 96, 96, 112, 56, 31, 15, 0, 0, 15, 31, 56, 112, 96, 96, 96, 112, 56, 127, 127, 0, 0, 15, 63, 56, 112, 96, 96, 96, 112, 56, 127, 127, 0, 0, 0, 0, 0, 1, 3, 7, 6, 14, 12, 24, 24, 24, 24, 24, 24, 24, 24, 25, 15, 15, 6, 7, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 31, 7, 1, 0, 0, 0, 0, 0, 0, 31, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; - oled_write_raw_P((char *)raw_logo, sizeof(raw_logo)); + oled_write_raw_P(raw_logo, sizeof(raw_logo)); } -// weak so that user keymaps can make their own +// Weak so that user keymaps can make their own __attribute__((weak)) bool candypad_render_logo_user(void) { - return false; // return true if your user keymap renders its own + return false; // Return true if your user keymap renders its own } __attribute__((weak)) bool candypad_render_logo_kb(void) { @@ -40,8 +40,8 @@ oled_rotation_t oled_init_kb(oled_rotation_t rotation) { static char *get_enc_mode(uint8_t encoder) { # ifdef ENCODER_MAP_ENABLE - static char s_u_d[4] = {24, 38, 25, 0}; // up and down - static char s_l_r[4] = {27, 38, 26, 0}; // left and right + static char s_u_d[4] = {24, 38, 25, 0}; // Up and down + static char s_l_r[4] = {27, 38, 26, 0}; // Left and right uint8_t layer = get_highest_layer(layer_state); uint16_t keycode = KC_TRNS; @@ -111,14 +111,14 @@ static void __draw_line_v(uint8_t x, uint8_t y, uint8_t len, bool on) { } } -// weak so that user keymaps can make their own +// Weak so that user keymaps can make their own __attribute__((weak)) bool candypad_render_default_user(void) { - return false; // return true if your user keymap renders its own + return false; // Return true if your user keymap renders its own } __attribute__((weak)) bool candypad_render_default_kb(void) { if (candypad_render_default_user()) { - return true; // was handled by user code + return true; // Was handled by user code } bool on; @@ -203,7 +203,7 @@ __attribute__((weak)) bool candypad_render_default_kb(void) { __draw_line_v(MXDS_X - 2, MXDS_Y - 1, 8, true); __draw_line_v(MXDS_X + 5, MXDS_Y - 1, 8, true); - return true; // was handled here + return true; // Was handled here } bool oled_task_kb(void) { @@ -211,7 +211,7 @@ bool oled_task_kb(void) { return false; } // if (!oled_task_needs_to_repaint()) { return false; } - /* !!! oled_clear(); // is broken !!! */ + /* !! : oled_clear(); // Is broken !!! */ if (oled_repaint_requested) { oled_repaint_requested = false; oled_clear(); @@ -220,8 +220,8 @@ bool oled_task_kb(void) { switch (oled_mode) { case OLED_OFF: - // do nothing - // this PCB has no digital switch to power off the OLED :( + // Do nothing + // This PCB has no digital switch to power off the OLED :( break; case OLED_SPLASH: diff --git a/keyboards/binepad/candypad/config.h b/keyboards/binepad/candypad/config.h index 80eb26b062b..20c0c88abcf 100644 --- a/keyboards/binepad/candypad/config.h +++ b/keyboards/binepad/candypad/config.h @@ -15,7 +15,7 @@ /* Configure oled driver for the 128x32 oled */ # define OLED_TIMEOUT (15 * 60 * 1000) // 15 minutes -# define OLED_UPDATE_INTERVAL 33 // ~30fps +# define OLED_UPDATE_INTERVAL 33 // ~30fps /* Font */ # define OLED_FONT_H "keyboards/binepad/candypad/glcdfont.c" @@ -23,7 +23,7 @@ #endif // OLED_ENABLE /* ---- Direct pins, for use in (custom) `matrix.c` (please read that file) ----- */ -// *NB*: DIRECT_PINS_CUSTOM must match the MATRIX_ROWS / MATRIX_COLS matrix structure +// !! : DIRECT_PINS_CUSTOM must match the MATRIX_ROWS / MATRIX_COLS matrix structure // clang-format off #define DIRECT_PINS_CUSTOM \ { \ diff --git a/keyboards/binepad/candypad/halconf.h b/keyboards/binepad/candypad/halconf.h deleted file mode 100644 index 8d0392e4980..00000000000 --- a/keyboards/binepad/candypad/halconf.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2023 binepad (@binepad) -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#define HAL_USE_I2C TRUE - -#include_next diff --git a/keyboards/binepad/candypad/matrix.c b/keyboards/binepad/candypad/matrix.c index 29bc06690e1..2e9867e5b46 100644 --- a/keyboards/binepad/candypad/matrix.c +++ b/keyboards/binepad/candypad/matrix.c @@ -6,104 +6,59 @@ * This file is mostly a copy of `matrix.c` from the QMK core, however * it assumes the matrix is always COL2ROW and that the KB has BOTH * matrix and direct pins. - + * * For direct pins define * `DIRECT_PINS_CUSTOM` - * This stucture must match exactly the MATRIX_ROWS / MATRIX_COLS matrix. + * This stucture must exactly match the MATRIX_ROWS / MATRIX_COLS matrix. * - * NB!!: The ROW that supports direct pins **must** have the row set - * to NO_PIN in the matrix array. -*/ + * !! : The ROW that supports direct pins __must__ have the row set to NO_PIN in the matrix array. + */ #include "matrix.h" #include "debounce.h" #include "atomic_util.h" -#include +#include // For memset, memcmp & memcpy #include "wait.h" -#include "print.h" - -#ifndef DEBOUNCE -# define DEBOUNCE 5 -#endif #ifndef MATRIX_INPUT_PRESSED_STATE # define MATRIX_INPUT_PRESSED_STATE 0 #endif -#ifndef MATRIX_IO_DELAY -# define MATRIX_IO_DELAY 30 -#endif - static pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; static pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; // define DIRECT_PINS_CUSTOM in `config.h` -// ** NB: ** must match the MATRIX_ROWS / MATRIX_COLS matrix structure +// !! : Must match the MATRIX_ROWS / MATRIX_COLS matrix structure static pin_t direct_pins[MATRIX_ROWS][MATRIX_COLS] = DIRECT_PINS_CUSTOM; /* matrix state(1:on, 0:off) */ matrix_row_t raw_matrix[MATRIX_ROWS]; -matrix_row_t matrix[MATRIX_ROWS]; -__attribute__((weak)) void matrix_init_user(void) {} - -__attribute__((weak)) void matrix_init_kb(void) { - matrix_init_user(); -} - -__attribute__((weak)) void matrix_scan_user(void) {} - -__attribute__((weak)) void matrix_scan_kb(void) { - matrix_scan_user(); -} - -#define print_matrix_header() print("\nr/c 01234567\n") -#define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) - -__attribute__((weak)) void matrix_output_select_delay(void) { - waitInputPinDelay(); -} - -__attribute__((weak)) void matrix_output_unselect_delay(uint8_t line, bool key_pressed) { - wait_us(MATRIX_IO_DELAY); -} - -static inline void setPinOutput_writeLow(pin_t pin) { +static inline void gpio_atomic_set_pin_output_low(pin_t pin) { ATOMIC_BLOCK_FORCEON { - setPinOutput(pin); - writePinLow(pin); + gpio_set_pin_output(pin); + gpio_write_pin_low(pin); } } -static inline void setPinInputHigh_atomic(pin_t pin) { +static inline void gpio_atomic_set_pin_input_high(pin_t pin) { ATOMIC_BLOCK_FORCEON { - setPinInputHigh(pin); + gpio_set_pin_input_high(pin); } } -static inline uint8_t readMatrixPin(pin_t pin) { +static inline uint8_t gpio_read_matrix_pin(pin_t pin) { if (pin != NO_PIN) { - return (readPin(pin) == MATRIX_INPUT_PRESSED_STATE) ? 0 : 1; + return (gpio_read_pin(pin) == MATRIX_INPUT_PRESSED_STATE) ? 0 : 1; } else { return 1; } } -void matrix_print(void) { - print_matrix_header(); - - for (uint8_t row = 0; row < MATRIX_ROWS; row++) { - print_hex8(row); - print(": "); - print_matrix_row(row); - print("\n"); - } -} - static bool select_row(uint8_t row) { pin_t pin = row_pins[row]; if (pin != NO_PIN) { - setPinOutput_writeLow(pin); + gpio_atomic_set_pin_output_low(pin); return true; } return false; @@ -112,7 +67,7 @@ static bool select_row(uint8_t row) { static void unselect_row(uint8_t row) { pin_t pin = row_pins[row]; if (pin != NO_PIN) { - setPinInputHigh_atomic(pin); + gpio_atomic_set_pin_input_high(pin); } } @@ -126,7 +81,7 @@ void matrix_init_pins__matrix(void) { unselect_rows(); for (uint8_t x = 0; x < MATRIX_COLS; x++) { if (col_pins[x] != NO_PIN) { - setPinInputHigh_atomic(col_pins[x]); + gpio_atomic_set_pin_input_high(col_pins[x]); } } } @@ -136,42 +91,19 @@ void matrix_init_pins__direct(void) { for (int col = 0; col < MATRIX_COLS; col++) { pin_t pin = direct_pins[row][col]; if (pin != NO_PIN) { - setPinInputHigh(pin); + gpio_atomic_set_pin_input_high(pin); } } } } -inline uint8_t matrix_rows(void) { - return MATRIX_ROWS; -} - -inline uint8_t matrix_cols(void) { - return MATRIX_COLS; -} - -void matrix_init(void) { +void matrix_init_custom(void) { // initialize key pins matrix_init_pins__matrix(); matrix_init_pins__direct(); // initialize matrix state: all keys off memset(raw_matrix, 0, sizeof(raw_matrix)); - memset(matrix, 0, sizeof(matrix)); - - // Unless hardware debouncing - Init the configured debounce routine - debounce_init(MATRIX_ROWS); - - // This *must* be called for correct keyboard behavior - matrix_init_kb(); -} - -inline bool matrix_is_on(uint8_t row, uint8_t col) { - return (matrix[row] & ((matrix_row_t)1 << col)); -} - -inline matrix_row_t matrix_get_row(uint8_t row) { - return matrix[row]; } void matrix_read_cols_on_row__matrix(matrix_row_t current_matrix[], uint8_t current_row) { @@ -186,7 +118,7 @@ void matrix_read_cols_on_row__matrix(matrix_row_t current_matrix[], uint8_t curr // 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 = readMatrixPin(col_pins[col_index]); + uint8_t pin_state = gpio_read_matrix_pin(col_pins[col_index]); // Populate the matrix row with the state of the col pin current_row_value |= pin_state ? 0 : row_shifter; @@ -208,7 +140,7 @@ void matrix_read_cols_on_row__direct(matrix_row_t current_matrix[], uint8_t curr for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++, row_shifter <<= 1) { pin_t pin = direct_pins[current_row][col_index]; if (NO_PIN != pin) { - current_row_value |= readMatrixPin(pin) ? 0 : row_shifter; + current_row_value |= gpio_read_matrix_pin(pin) ? 0 : row_shifter; } } @@ -216,24 +148,23 @@ void matrix_read_cols_on_row__direct(matrix_row_t current_matrix[], uint8_t curr current_matrix[current_row] = current_row_value; } -uint8_t matrix_scan(void) { - matrix_row_t curr_matrix[MATRIX_ROWS] = {0}; +bool matrix_scan_custom(matrix_row_t current_matrix[]) { + bool matrix_has_changed = false; // Matrix keys: Set row, read cols for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) { // if the row is a NO_PIN then assume it's on a direct pins matrix, else assume COL2ROW matrix if (NO_PIN != row_pins[current_row]) { - matrix_read_cols_on_row__matrix(curr_matrix, current_row); + matrix_read_cols_on_row__matrix(current_matrix, current_row); } else { - matrix_read_cols_on_row__direct(curr_matrix, current_row); + matrix_read_cols_on_row__direct(current_matrix, current_row); } } - bool changed = memcmp(raw_matrix, curr_matrix, sizeof(curr_matrix)) != 0; - if (changed) memcpy(raw_matrix, curr_matrix, sizeof(curr_matrix)); + matrix_has_changed = memcmp(raw_matrix, current_matrix, MATRIX_ROWS) != 0; + if (matrix_has_changed) { + memcpy(raw_matrix, current_matrix, MATRIX_ROWS); + } - changed = debounce(raw_matrix, matrix, MATRIX_ROWS, changed); - matrix_scan_kb(); - - return (uint8_t)changed; + return matrix_has_changed; } diff --git a/keyboards/binepad/candypad/rules.mk b/keyboards/binepad/candypad/rules.mk index d0d3e2f4473..4879c468ada 100644 --- a/keyboards/binepad/candypad/rules.mk +++ b/keyboards/binepad/candypad/rules.mk @@ -1,9 +1,7 @@ # Copyright 2023 binepad (@binepad) # SPDX-License-Identifier: GPL-2.0-or-later -CUSTOM_MATRIX = yes +CUSTOM_MATRIX = lite SRC += matrix.c \ candypad_oled.c - -OPT_DEFS += -DHAL_USE_I2C=TRUE