diff options
Diffstat (limited to 'quantum')
-rw-r--r-- | quantum/dip_switch.c | 52 | ||||
-rw-r--r-- | quantum/matrix_common.c | 5 |
2 files changed, 53 insertions, 4 deletions
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 <string.h> -#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; diff --git a/quantum/matrix_common.c b/quantum/matrix_common.c index de62b80705..e7d2dbb294 100644 --- a/quantum/matrix_common.c +++ b/quantum/matrix_common.c @@ -112,3 +112,8 @@ __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)); +} |