Skip to content

Commit

Permalink
add DIP_SWITCH_MATRIX_GRID support (qmk#8772)
Browse files Browse the repository at this point in the history
* 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]
  • Loading branch information
mtei authored and drashna committed Aug 9, 2020
1 parent 063f14f commit 6dc67cf
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 9 deletions.
59 changes: 50 additions & 9 deletions quantum/dip_switch.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {}
Expand All @@ -45,19 +62,43 @@ __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
}


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;
Expand Down
2 changes: 2 additions & 0 deletions quantum/matrix_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)); }

0 comments on commit 6dc67cf

Please sign in to comment.