diff options
author | Takeshi ISHII <2170248+mtei@users.noreply.github.com> | 2020-07-04 23:20:49 +0900 |
---|---|---|
committer | Drashna Jael're <drashna@live.com> | 2020-08-08 22:12:53 -0700 |
commit | 6dc67cfef0f3b6c6c45879f5e5c73b47f25e38e0 (patch) | |
tree | 578c59ae26106cffe718b982bad2ce9da62e54a2 | |
parent | 063f14f72d79bb9fada650306bbd6aba6e77258b (diff) |
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.
format code according to conventions [skip ci]
-rw-r--r-- | quantum/dip_switch.c | 59 | ||||
-rw-r--r-- | quantum/matrix_common.c | 2 |
2 files changed, 52 insertions, 9 deletions
diff --git a/quantum/dip_switch.c b/quantum/dip_switch.c index 03c3a56024..b1edd7d9cc 100644 --- a/quantum/dip_switch.c +++ b/quantum/dip_switch.c @@ -21,16 +21,33 @@ // for memcpy #include <string.h> +#if !defined(DIP_SWITCH_PINS) && !defined(DIP_SWITCH_MATRIX_GRID) +# error "Either DIP_SWITCH_PINS or DIP_SWITCH_MATRIX_GRID must be defined." +#endif -#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 "Both DIP_SWITCH_PINS and DIP_SWITCH_MATRIX_GRID are defined." #endif -#define NUMBER_OF_DIP_SWITCHES (sizeof(dip_switch_pad)/sizeof(pin_t)) +#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; -static bool dip_switch_state[NUMBER_OF_DIP_SWITCHES] = { 0 }; -static bool last_dip_switch_state[NUMBER_OF_DIP_SWITCHES] = { 0 }; +#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}; __attribute__((weak)) void dip_switch_update_user(uint8_t index, bool active) {} @@ -45,10 +62,15 @@ __attribute__((weak)) void dip_switch_update_mask_kb(uint32_t state) { dip_switch_update_mask_user(state); } void dip_switch_init(void) { - for (uint8_t i = 0; i < NUMBER_OF_DIP_SWITCHES; i++) { - setPinInputHigh(dip_switch_pad[i]); - } - dip_switch_read(true); +#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 } @@ -56,8 +78,27 @@ 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; diff --git a/quantum/matrix_common.c b/quantum/matrix_common.c index de62b80705..15f1e0e82e 100644 --- a/quantum/matrix_common.c +++ b/quantum/matrix_common.c @@ -112,3 +112,5 @@ __attribute__((weak)) uint8_t matrix_scan(void) { matrix_scan_quantum(); return changed; } + +__attribute__((weak)) bool peek_matrix(uint8_t row_index, uint8_t col_index, bool raw) { return 0 != ((raw ? raw_matrix[row_index] : matrix[row_index]) & (MATRIX_ROW_SHIFTER << col_index)); } |