From bd2c0b9648b67db51a92f69bc862c0eb7bccf14c Mon Sep 17 00:00:00 2001 From: Nephiel Date: Wed, 10 May 2017 19:26:39 +0200 Subject: Call led_set for layer action events to update LEDs on layer changes --- tmk_core/common/action.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'tmk_core/common') diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 4ba1cc251..8640dfab3 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -537,6 +537,21 @@ void process_action(keyrecord_t *record, action_t action) break; } +#ifndef NO_ACTION_LAYER + // if this event is a layer action, update the leds + switch (action.kind.id) { + case ACT_LAYER: + #ifndef NO_ACTION_TAPPING + case ACT_LAYER_TAP: + case ACT_LAYER_TAP_EXT: + #endif + led_set(host_keyboard_leds()); + break; + default: + break; + } +#endif + #ifndef NO_ACTION_ONESHOT /* Because we switch layers after a oneshot event, we need to release the * key before we leave the layer or no key up event will be generated. -- cgit v1.2.3-24-g4f1b From 849ed5a6a03b14defa94a50b66169abac89b9c08 Mon Sep 17 00:00:00 2001 From: Jeremiah Date: Sat, 13 May 2017 08:51:20 -0700 Subject: anti-ghost improvement for older keyboards with empty spots in matrix --- tmk_core/common/keyboard.c | 36 ++++++++++++++++++++++++++++++------ tmk_core/common/keyboard.h | 2 +- 2 files changed, 31 insertions(+), 7 deletions(-) (limited to 'tmk_core/common') diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index eac1f1dd8..93a066e57 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -64,20 +64,41 @@ along with this program. If not, see . #ifdef MATRIX_HAS_GHOST +static uint16_t matrix_ghost_check[MATRIX_ROWS]; static bool has_ghost_in_row(uint8_t row) { - matrix_row_t matrix_row = matrix_get_row(row); - // No ghost exists when less than 2 keys are down on the row - if (((matrix_row - 1) & matrix_row) == 0) + matrix_row_t matrix_row = (matrix_get_row(row) & matrix_ghost_check[row]); + /* No ghost exists when less than 2 keys are down on the row. + If there are "active" blanks in the matrix, the key can't be pressed by the user, + there is no doubt as to which keys are really being pressed. + The ghosts will be ignored, they are KC_NO. */ + if (((matrix_row - 1) & matrix_row) == 0){ return false; - - // Ghost occurs when the row shares column line with other row + } + // Ghost occurs when the row shares column line with other row, blanks in the matrix don't matter + // If there are more than two real keys pressed and they match another row's real keys, the row will be ignored. for (uint8_t i=0; i < MATRIX_ROWS; i++) { - if (i != row && (matrix_get_row(i) & matrix_row)) + if (i != row && __builtin_popcount((matrix_get_row(i) & matrix_ghost_check[i]) & matrix_row) > 1){ return true; + } } return false; + return false; } + +extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +// bit map of true keys and empty spots in matrix, each row is reversed +void make_ghost_check_array(){ + for (int row = 0; row < MATRIX_ROWS; row++) { + for (int col = 0; col < MATRIX_COLS; col++) { + if (keymaps[0][row][col] & 0xFF) + matrix_ghost_check[row] |= 1< Date: Sat, 13 May 2017 13:19:28 -0700 Subject: improvements --- tmk_core/common/keyboard.c | 39 ++++++++++++++++----------------------- tmk_core/common/keyboard.h | 1 - 2 files changed, 16 insertions(+), 24 deletions(-) (limited to 'tmk_core/common') diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 93a066e57..116914e1a 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -62,12 +62,21 @@ along with this program. If not, see . #endif - #ifdef MATRIX_HAS_GHOST -static uint16_t matrix_ghost_check[MATRIX_ROWS]; +extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +// bit map of true keys and empty spots in matrix, each row is reversed +static uint16_t get_row_ghost_check(uint16_t row){ + for (int col = 0; col < MATRIX_COLS; col++) { + if (keymaps[0][row][col]) + row &= 1< 1){ + if (i != row && __builtin_popcount( + get_row_ghost_check(matrix_get_row(i)) & matrix_row + ) > 1){ return true; } } return false; - return false; } - -extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -// bit map of true keys and empty spots in matrix, each row is reversed -void make_ghost_check_array(){ - for (int row = 0; row < MATRIX_ROWS; row++) { - for (int col = 0; col < MATRIX_COLS; col++) { - if (keymaps[0][row][col] & 0xFF) - matrix_ghost_check[row] |= 1< Date: Sat, 13 May 2017 16:57:23 -0700 Subject: a bit smaller --- tmk_core/common/keyboard.c | 53 ++++++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 18 deletions(-) (limited to 'tmk_core/common') diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 116914e1a..d1794c887 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -63,40 +63,54 @@ along with this program. If not, see . #ifdef MATRIX_HAS_GHOST -extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -// bit map of true keys and empty spots in matrix, each row is reversed -static uint16_t get_row_ghost_check(uint16_t row){ +static uint16_t matrix_ghost_check[MATRIX_ROWS]; + +static inline bool countones(uint16_t data) +{ + int count = 0; for (int col = 0; col < MATRIX_COLS; col++) { - if (keymaps[0][row][col]) - row &= 1< 1){ + return true; } - return row; + return false; } -static bool has_ghost_in_row(uint8_t row) +static inline bool has_ghost_in_row(uint8_t row, uint16_t rowdata) { - matrix_row_t matrix_row = (get_row_ghost_check(matrix_get_row(row))); + rowdata &= matrix_ghost_check[row]; + if (((rowdata - 1) & rowdata) == 0){ + return false; + } /* No ghost exists when less than 2 keys are down on the row. If there are "active" blanks in the matrix, the key can't be pressed by the user, there is no doubt as to which keys are really being pressed. The ghosts will be ignored, they are KC_NO. */ - if (((matrix_row - 1) & matrix_row) == 0){ - return false; - } // Ghost occurs when the row shares column line with other row, blanks in the matrix don't matter - // If there are two or more real keys pressed and they match another row's real keys, the row will be ignored. + // If there are more than two real keys pressed and they match another row's real keys, the row will be ignored. for (uint8_t i=0; i < MATRIX_ROWS; i++) { - if (i != row && __builtin_popcount( - get_row_ghost_check(matrix_get_row(i)) & matrix_row - ) > 1){ + if (i != row && countones((matrix_get_row(i) & matrix_ghost_check[i]) & rowdata)){ return true; } } return false; } + +extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +// bit map of true keys and empty spots in matrix, each row is reversed +static inline void make_ghost_check_array(void){ + for (int row = 0; row < MATRIX_ROWS; row++) { + for (int col = 0; col < MATRIX_COLS; col++) { + if (pgm_read_byte(&keymaps[0][row][col]) != 0) + matrix_ghost_check[row] |= 1< Date: Sat, 13 May 2017 17:01:27 -0700 Subject: a bit smaller --- tmk_core/common/keyboard.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'tmk_core/common') diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index d1794c887..0116053fb 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -161,7 +161,7 @@ void keyboard_task(void) { static matrix_row_t matrix_prev[MATRIX_ROWS]; #ifdef MATRIX_HAS_GHOST - static matrix_row_t matrix_ghost[MATRIX_ROWS]; + // static matrix_row_t matrix_ghost[MATRIX_ROWS]; #endif static uint8_t led_status = 0; matrix_row_t matrix_row = 0; @@ -178,13 +178,13 @@ void keyboard_task(void) * debugging. But don't update matrix_prev until un-ghosted, or * the last key would be lost. */ - if (debug_matrix && matrix_ghost[r] != matrix_row) { - matrix_print(); - } - matrix_ghost[r] = matrix_row; + //if (debug_matrix && matrix_ghost[r] != matrix_row) { + // matrix_print(); + //} + //matrix_ghost[r] = matrix_row; continue; } - matrix_ghost[r] = matrix_row; + //matrix_ghost[r] = matrix_row; #endif if (debug_matrix) matrix_print(); for (uint8_t c = 0; c < MATRIX_COLS; c++) { -- cgit v1.2.3-24-g4f1b From 7b7e285a984a5bf1f7f38f1b5846811dfcb3a185 Mon Sep 17 00:00:00 2001 From: Jeremiah Date: Sat, 13 May 2017 17:22:38 -0700 Subject: should be using matrix_row_t --- tmk_core/common/keyboard.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'tmk_core/common') diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 0116053fb..24cc28892 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -63,9 +63,9 @@ along with this program. If not, see . #ifdef MATRIX_HAS_GHOST -static uint16_t matrix_ghost_check[MATRIX_ROWS]; +static matrix_row_t matrix_ghost_check[MATRIX_ROWS]; -static inline bool countones(uint16_t data) +static inline bool countones(matrix_row_t data) { int count = 0; for (int col = 0; col < MATRIX_COLS; col++) { @@ -77,7 +77,7 @@ static inline bool countones(uint16_t data) } return false; } -static inline bool has_ghost_in_row(uint8_t row, uint16_t rowdata) +static inline bool has_ghost_in_row(uint8_t row, matrix_row_t rowdata) { rowdata &= matrix_ghost_check[row]; if (((rowdata - 1) & rowdata) == 0){ -- cgit v1.2.3-24-g4f1b From 37f6f92765513cd66c92178f48785d492eb06b89 Mon Sep 17 00:00:00 2001 From: Jeremiah Date: Sat, 13 May 2017 18:24:43 -0700 Subject: faster and less bits --- tmk_core/common/keyboard.c | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) (limited to 'tmk_core/common') diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 24cc28892..d8b5dc403 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -63,14 +63,25 @@ along with this program. If not, see . #ifdef MATRIX_HAS_GHOST -static matrix_row_t matrix_ghost_check[MATRIX_ROWS]; +extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; +static matrix_row_t get_real_keys(uint8_t row, matrix_row_t rowdata){ + matrix_row_t out = 0; + for (int col = 0; col < MATRIX_COLS; col++) { + if (pgm_read_byte(&keymaps[0][row][col]) && ((rowdata & (1< 1){ return true; @@ -79,7 +90,7 @@ static inline bool countones(matrix_row_t data) } static inline bool has_ghost_in_row(uint8_t row, matrix_row_t rowdata) { - rowdata &= matrix_ghost_check[row]; + rowdata = get_real_keys(row, rowdata); if (((rowdata - 1) & rowdata) == 0){ return false; } @@ -90,24 +101,13 @@ static inline bool has_ghost_in_row(uint8_t row, matrix_row_t rowdata) // Ghost occurs when the row shares column line with other row, blanks in the matrix don't matter // If there are more than two real keys pressed and they match another row's real keys, the row will be ignored. for (uint8_t i=0; i < MATRIX_ROWS; i++) { - if (i != row && countones((matrix_get_row(i) & matrix_ghost_check[i]) & rowdata)){ + if (i != row && countones(get_real_keys(i, matrix_get_row(i)) & rowdata)){ return true; } } return false; } -extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; -// bit map of true keys and empty spots in matrix, each row is reversed -static inline void make_ghost_check_array(void){ - for (int row = 0; row < MATRIX_ROWS; row++) { - for (int col = 0; col < MATRIX_COLS; col++) { - if (pgm_read_byte(&keymaps[0][row][col]) != 0) - matrix_ghost_check[row] |= 1< Date: Sat, 13 May 2017 19:07:05 -0700 Subject: faster and less bits... again --- tmk_core/common/keyboard.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'tmk_core/common') diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index d8b5dc403..fa17ffca2 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -74,20 +74,19 @@ static matrix_row_t get_real_keys(uint8_t row, matrix_row_t rowdata){ return out; } - -static inline bool countones(matrix_row_t data) +static inline bool countones(matrix_row_t row) { int count = 0; - for (int col = 0; col < MATRIX_COLS; col++) { - if (data & (1< 0){ + count += 1; + row &= row-1; } if (count > 1){ return true; } return false; } + static inline bool has_ghost_in_row(uint8_t row, matrix_row_t rowdata) { rowdata = get_real_keys(row, rowdata); -- cgit v1.2.3-24-g4f1b From b9b2244b8275066d1226fba0fb75747a194f0553 Mon Sep 17 00:00:00 2001 From: Jeremiah Date: Sun, 14 May 2017 08:01:01 -0700 Subject: faster, less bits :) --- tmk_core/common/keyboard.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) (limited to 'tmk_core/common') diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index fa17ffca2..20b867285 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -76,15 +76,8 @@ static matrix_row_t get_real_keys(uint8_t row, matrix_row_t rowdata){ static inline bool countones(matrix_row_t row) { - int count = 0; - while (row > 0){ - count += 1; - row &= row-1; - } - if (count > 1){ - return true; - } - return false; + row &= row-1; + return row; } static inline bool has_ghost_in_row(uint8_t row, matrix_row_t rowdata) -- cgit v1.2.3-24-g4f1b From 84395e8a0427bcb51c4ef4ff24c7901d1fbb0764 Mon Sep 17 00:00:00 2001 From: Jeremiah Date: Sun, 14 May 2017 09:36:50 -0700 Subject: whoops --- tmk_core/common/keyboard.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'tmk_core/common') diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index 20b867285..a3fe559f3 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -67,7 +67,7 @@ extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; static matrix_row_t get_real_keys(uint8_t row, matrix_row_t rowdata){ matrix_row_t out = 0; for (int col = 0; col < MATRIX_COLS; col++) { - if (pgm_read_byte(&keymaps[0][row][col]) && ((rowdata & (1< Date: Sun, 14 May 2017 15:36:44 -0700 Subject: added comments and made function name clearer --- tmk_core/common/keyboard.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'tmk_core/common') diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index a3fe559f3..97a8f1cd8 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -61,39 +61,45 @@ along with this program. If not, see . # include "visualizer/visualizer.h" #endif - #ifdef MATRIX_HAS_GHOST extern const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS]; static matrix_row_t get_real_keys(uint8_t row, matrix_row_t rowdata){ matrix_row_t out = 0; - for (int col = 0; col < MATRIX_COLS; col++) { + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + //read each key in the row data and check if the keymap defines it as a real key if (pgm_read_byte(&keymaps[0][row][col]) && (rowdata & (1< Date: Fri, 19 May 2017 17:24:47 -0700 Subject: Workaround for the macOS caps lock delay (#1308) * Add 80ms delay for KC_CAPS when used as a tap key Workaround for the macOS caps lock delay * Revert "Increase TAPPING_TERM for the Clueboard" This reverts commit a74e69e9fa889113ee31fbc8dc7e6848fdb07576. --- tmk_core/common/action.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'tmk_core/common') diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 8640dfab3..a534f818e 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -26,6 +26,7 @@ along with this program. If not, see . #include "action_macro.h" #include "action_util.h" #include "action.h" +#include "wait.h" #ifdef DEBUG_ACTION #include "debug.h" @@ -438,6 +439,9 @@ void process_action(keyrecord_t *record, action_t action) } else { if (tap_count > 0) { dprint("KEYMAP_TAP_KEY: Tap: unregister_code\n"); + if (action.layer_tap.code == KC_CAPS) { + wait_ms(80); + } unregister_code(action.layer_tap.code); } else { dprint("KEYMAP_TAP_KEY: No tap: Off on release\n"); -- cgit v1.2.3-24-g4f1b