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:
committed by
Drashna Jael're
parent
063f14f72d
commit
6dc67cfef0
@@ -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;
|
||||||
|
|||||||
@@ -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)); }
|
||||||
|
|||||||
Reference in New Issue
Block a user