From c2ca57c8f4defd8fc7b7911cc1ba1e49f3d483e1 Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Sat, 4 Jul 2020 23:20:49 +0900 Subject: add DIP_SWITCH_MATRIX_GRID support (#8772) * dipsw test on helix/rev2/sc/back:five_rows * add peek_matrix() to matrix_common.c * add DIP_SWITCH_MATRIX_GRID support to quantum/dip_switch.c * update docs/feature_dip_switch.md about DIP_SWITCH_MATRIX_GRID * Test end. remove test code. Revert "dipsw test on helix/rev2/sc/back:five_rows" This reverts commit 6d4304c74557597c9fb4d324f79c3ae4793ae874. --- quantum/dip_switch.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 4 deletions(-) (limited to 'quantum/dip_switch.c') diff --git a/quantum/dip_switch.c b/quantum/dip_switch.c index 66c166ce45..879326d21f 100644 --- a/quantum/dip_switch.c +++ b/quantum/dip_switch.c @@ -21,12 +21,31 @@ // for memcpy #include -#if !defined(DIP_SWITCH_PINS) -# error "No DIP switch pads defined by DIP_SWITCH_PINS" +#if !defined(DIP_SWITCH_PINS) && !defined(DIP_SWITCH_MATRIX_GRID) +# error "Either DIP_SWITCH_PINS or DIP_SWITCH_MATRIX_GRID must be defined." #endif -#define NUMBER_OF_DIP_SWITCHES (sizeof(dip_switch_pad) / sizeof(pin_t)) -static pin_t dip_switch_pad[] = DIP_SWITCH_PINS; +#if defined(DIP_SWITCH_PINS) && defined(DIP_SWITCH_MATRIX_GRID) +# error "Both DIP_SWITCH_PINS and DIP_SWITCH_MATRIX_GRID are defined." +#endif + +#ifdef DIP_SWITCH_PINS +# define NUMBER_OF_DIP_SWITCHES (sizeof(dip_switch_pad) / sizeof(pin_t)) +static pin_t dip_switch_pad[] = DIP_SWITCH_PINS; +#endif + +#ifdef DIP_SWITCH_MATRIX_GRID +typedef struct matrix_index_t { + uint8_t row; + uint8_t col; +} matrix_index_t; + +# define NUMBER_OF_DIP_SWITCHES (sizeof(dip_switch_pad) / sizeof(matrix_index_t)) +static matrix_index_t dip_switch_pad[] = DIP_SWITCH_MATRIX_GRID; +extern bool peek_matrix(uint8_t row_index, uint8_t col_index, bool read_raw); +static uint16_t scan_count; +#endif /* DIP_SWITCH_MATRIX_GRID */ + static bool dip_switch_state[NUMBER_OF_DIP_SWITCHES] = {0}; static bool last_dip_switch_state[NUMBER_OF_DIP_SWITCHES] = {0}; @@ -39,18 +58,43 @@ __attribute__((weak)) void dip_switch_update_mask_user(uint32_t state) {} __attribute__((weak)) void dip_switch_update_mask_kb(uint32_t state) { dip_switch_update_mask_user(state); } void dip_switch_init(void) { +#ifdef DIP_SWITCH_PINS for (uint8_t i = 0; i < NUMBER_OF_DIP_SWITCHES; i++) { setPinInputHigh(dip_switch_pad[i]); } dip_switch_read(true); +#endif +#ifdef DIP_SWITCH_MATRIX_GRID + scan_count = 0; +#endif } void dip_switch_read(bool forced) { bool has_dip_state_changed = false; uint32_t dip_switch_mask = 0; +#ifdef DIP_SWITCH_MATRIX_GRID + bool read_raw = false; + + if (scan_count < 500) { + scan_count ++; + if (scan_count == 10) { + read_raw = true; + forced = true; /* First reading of the dip switch */ + } else { + return; + } + } +#endif + for (uint8_t i = 0; i < NUMBER_OF_DIP_SWITCHES; i++) { +#ifdef DIP_SWITCH_PINS dip_switch_state[i] = !readPin(dip_switch_pad[i]); +#endif +#ifdef DIP_SWITCH_MATRIX_GRID + dip_switch_state[i] = peek_matrix(dip_switch_pad[i].row, dip_switch_pad[i].col, + read_raw); +#endif dip_switch_mask |= dip_switch_state[i] << i; if (last_dip_switch_state[i] != dip_switch_state[i] || forced) { has_dip_state_changed = true; -- cgit v1.2.3