diff options
| author | Stick <nstickney@gmail.com> | 2017-06-02 19:50:54 -0500 | 
|---|---|---|
| committer | Stick <nstickney@gmail.com> | 2017-06-02 19:50:54 -0500 | 
| commit | 4ba9917f829885b13ea1b3610a2f988e539c9e01 (patch) | |
| tree | 612da1c6de929e6e0a5b0847d7b594cb3becdf27 /tmk_core/common/keyboard.c | |
| parent | 8665ed3efc62e649d0eac5b88761d7b3f8f30cd7 (diff) | |
| parent | aaa67f69305c5c78e15a1090ba7058adea59ff36 (diff) | |
| download | firmware-4ba9917f829885b13ea1b3610a2f988e539c9e01.tar.gz firmware-4ba9917f829885b13ea1b3610a2f988e539c9e01.tar.bz2 firmware-4ba9917f829885b13ea1b3610a2f988e539c9e01.zip | |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'tmk_core/common/keyboard.c')
| -rw-r--r-- | tmk_core/common/keyboard.c | 58 | 
1 files changed, 43 insertions, 15 deletions
| diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c index eac1f1dd8..97a8f1cd8 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++) { | 
