diff options
| author | Nick Choi <iinikchi@gmail.com> | 2017-05-23 13:13:23 -0400 | 
|---|---|---|
| committer | Nick Choi <iinikchi@gmail.com> | 2017-05-23 13:13:23 -0400 | 
| commit | 0e174fcb48471b6af79f1456d65edf7c22d8b903 (patch) | |
| tree | 0aee5e6db3c2c54acdfaac6ea0feeed3520d43d6 /tmk_core/common | |
| parent | 3ed2147a888401ef31a008db02a4ef8bd25d4380 (diff) | |
| parent | ec86fac6eee6e5148bc491497aadf2abed09a8ea (diff) | |
Merge branch 'master' of https://github.com/nikchi/qmk_firmware
Diffstat (limited to 'tmk_core/common')
| -rw-r--r-- | tmk_core/common/action.c | 4 | ||||
| -rw-r--r-- | tmk_core/common/keyboard.c | 58 | ||||
| -rw-r--r-- | tmk_core/common/keyboard.h | 1 | 
3 files changed, 47 insertions, 16 deletions
diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 8640dfab35..a534f818ec 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -26,6 +26,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #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"); diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index eac1f1dd81..97a8f1cd8c 100644 --- a/tmk_core/common/keyboard.c +++ b/tmk_core/common/keyboard.c @@ -61,23 +61,51 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.  #   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 (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<<col))){ +            //this creates new row data, if a key is defined in the keymap, it will be set here +            out |= 1<<col; +        } +    } +    return out; +} +static inline bool popcount_more_than_one(matrix_row_t rowdata) +{ +    rowdata &= rowdata-1; //if there are less than two bits (keys) set, rowdata will become zero +    return rowdata; +} -#ifdef MATRIX_HAS_GHOST -static bool has_ghost_in_row(uint8_t row) +static inline bool has_ghost_in_row(uint8_t row, matrix_row_t rowdata)  { -    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) +    /* 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.   */ +    rowdata = get_real_keys(row, rowdata); +    if ((popcount_more_than_one(rowdata)) == 0){          return false; - -    // Ghost occurs when the row shares column line with other row +    } +    /* Ghost occurs when the row shares a column line with other row, +    and two columns are read on each row. Blanks in the matrix don't matter, +    so they are filtered out. +    If there are two or more real keys pressed and they match columns with +    at least two of another row's real keys, the row will be ignored. Keep in mind, +    we are checking one row at a time, not all of them at once. +    */      for (uint8_t i=0; i < MATRIX_ROWS; i++) { -        if (i != row && (matrix_get_row(i) & matrix_row)) +        if (i != row && popcount_more_than_one(get_real_keys(i, matrix_get_row(i)) & rowdata)){              return true; +        }      }      return false;  } +  #endif  __attribute__ ((weak)) @@ -127,7 +155,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; @@ -139,18 +167,18 @@ void keyboard_task(void)          matrix_change = matrix_row ^ matrix_prev[r];          if (matrix_change) {  #ifdef MATRIX_HAS_GHOST -            if (has_ghost_in_row(r)) { +            if (has_ghost_in_row(r, matrix_row)) {                  /* Keep track of whether ghosted status has changed for                   * 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++) { diff --git a/tmk_core/common/keyboard.h b/tmk_core/common/keyboard.h index 7738251b64..f17003c2ff 100644 --- a/tmk_core/common/keyboard.h +++ b/tmk_core/common/keyboard.h @@ -57,7 +57,6 @@ static inline bool IS_RELEASED(keyevent_t event) { return (!IS_NOEVENT(event) &&      .time = (timer_read() | 1)                          \  } -  /* it runs once at early stage of startup before keyboard_init. */  void keyboard_setup(void);  /* it runs once after initializing host side protocol, debug and MCU peripherals. */  | 
