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]
This commit is contained in:
Takeshi ISHII
2020-07-04 23:20:49 +09:00
committed by Drashna Jael're
parent 063f14f72d
commit 6dc67cfef0
2 changed files with 54 additions and 11 deletions

View File

@@ -21,16 +21,33 @@
// for memcpy // for memcpy
#include <string.h> #include <string.h>
#if !defined(DIP_SWITCH_PINS) && !defined(DIP_SWITCH_MATRIX_GRID)
#if !defined(DIP_SWITCH_PINS) # error "Either DIP_SWITCH_PINS or DIP_SWITCH_MATRIX_GRID must be defined."
# error "No DIP switch pads defined by DIP_SWITCH_PINS"
#endif #endif
#define NUMBER_OF_DIP_SWITCHES (sizeof(dip_switch_pad)/sizeof(pin_t)) #if defined(DIP_SWITCH_PINS) && defined(DIP_SWITCH_MATRIX_GRID)
static pin_t dip_switch_pad[] = DIP_SWITCH_PINS; # error "Both DIP_SWITCH_PINS and DIP_SWITCH_MATRIX_GRID are defined."
static bool dip_switch_state[NUMBER_OF_DIP_SWITCHES] = { 0 }; #endif
static bool last_dip_switch_state[NUMBER_OF_DIP_SWITCHES] = { 0 };
#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};
__attribute__((weak)) __attribute__((weak))
void dip_switch_update_user(uint8_t index, bool active) {} 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_update_mask_kb(uint32_t state) { dip_switch_update_mask_user(state); }
void dip_switch_init(void) { void dip_switch_init(void) {
for (uint8_t i = 0; i < NUMBER_OF_DIP_SWITCHES; i++) { #ifdef DIP_SWITCH_PINS
setPinInputHigh(dip_switch_pad[i]); for (uint8_t i = 0; i < NUMBER_OF_DIP_SWITCHES; i++) {
} setPinInputHigh(dip_switch_pad[i]);
dip_switch_read(true); }
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; bool has_dip_state_changed = false;
uint32_t dip_switch_mask = 0; 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++) { for (uint8_t i = 0; i < NUMBER_OF_DIP_SWITCHES; i++) {
#ifdef DIP_SWITCH_PINS
dip_switch_state[i] = !readPin(dip_switch_pad[i]); 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; dip_switch_mask |= dip_switch_state[i] << i;
if (last_dip_switch_state[i] != dip_switch_state[i] || forced) { if (last_dip_switch_state[i] != dip_switch_state[i] || forced) {
has_dip_state_changed = true; has_dip_state_changed = true;

View File

@@ -112,3 +112,5 @@ __attribute__((weak)) uint8_t matrix_scan(void) {
matrix_scan_quantum(); matrix_scan_quantum();
return changed; 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)); }