qmk/qmk_firmware

Proposal of a new form of key matrix configuration.

Open

#14,262 opened on Sep 1, 2021

View on GitHub
 (4 comments) (0 reactions) (0 assignees)C (43,867 forks)batch import
enhancementhelp wantedin progress

Repository metrics

Stars
 (20,368 stars)
PR merge metrics
 (Avg merge 20d 9h) (27 merged PRs in 30d)

Description

Feature Request Type

  • Core functionality
  • Add-on hardware support (eg. audio, RGB, OLED screen, etc.)
  • Alteration (enhancement/optimization) of existing feature(s)
  • New behavior

Description

The configuration of the current key matrix is done by defining one of the following three types.

  • #define DIRECT_PINS {...}
  • #define DIODE_DIRECTION COL2ROW
  • #define DIODE_DIRECTION ROW2COL

For this configuration, quantum/matrix.c has the following structure. This is difficult to read because of the long and complicated ifdef ... endif block.

#ifdef DIRECT_PINS

//// direct_pins code block 27 lines

#elif defined(DIODE_DIRECTION)
#    if defined(MATRIX_ROW_PINS) && defined(MATRIX_COL_PINS)
#        if (DIODE_DIRECTION == COL2ROW)

//// COL2ROW code block 56 lines

#        elif (DIODE_DIRECTION == ROW2COL)

//// ROW2COL code block 58 lines

#        else
#            error DIODE_DIRECTION must be one of COL2ROW or ROW2COL!
#        endif
#    endif  // defined(MATRIX_ROW_PINS) && defined(MATRIX_COL_PINS)
#else
#    error DIODE_DIRECTION is not defined!
#endif

Therefore, I propose a new configuration format as follows.

  • #define KEY_MATRIX_TYPE DIRECT_SWITCH
  • #define KEY_MATRIX_TYPE DIODE_COL2ROW
  • #define KEY_MATRIX_TYPE DIODE_ROW2COL

With this configuration, quantum/matrix.c will have the following structure, which is easier to read.

#if KEY_MATRIX_TYPE == DIRECT_SWITCH
#   ifndef DIRECT_PINS
#       error "DIRECT_PINS is not defined."
#   endif
//// direct_pins code block 27 lines
#endif // KEY_MATRIX_TYPE == DIRECT_SWITCH

#if KEY_MATRIX_TYPE == DIODE_COL2ROW && defined(MATRIX_ROW_PINS) && defined(MATRIX_COL_PINS)
//// COL2ROW code block 56 lines
#endif // KEY_MATRIX_TYPE == DIODE_COL2ROW

#if KEY_MATRIX_TYPE == DIODE_ROW2COL && defined(MATRIX_ROW_PINS) && defined(MATRIX_COL_PINS)
//// ROW2COL code block 58 lines
#endif // KEY_MATRIX_TYPE == DIODE_ROW2COL

Also, add the following code to the top of quantum/matrix.h to ensure backward compatibility.

#ifndef KEY_MATRIX_TYPE
// for backward compatibility
#    ifdef DIRECT_PINS
#        define KEY_MATRIX_TYPE DIRECT_SWITCH
#    else
#        if DIODE_DIRECTION == ROW2COL
#            define KEY_MATRIX_TYPE DIODE_ROW2COL
#        endif
#        if DIODE_DIRECTION == COL2ROW
#            define KEY_MATRIX_TYPE DIODE_COL2ROW
#        endif
#    endif
#    ifndef KEY_MATRIX_TYPE
#       error "KEY_MATRIX_TYPE could not be determined."
#    endif
#endif

#if KEY_MATRIX_TYPE != DIRECT_SWITCH && KEY_MATRIX_TYPE != DIODE_COL2ROW && KEY_MATRIX_TYPE != DIODE_ROW2COL
#    error "Invalid KEY_MATRIX_TYPE config."
#endif

Contributor guide