qmk/qmk_firmware

Proposal of a new form of key matrix configuration.

Open

#14,262 opened on 2021年9月1日

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
 (平均マージ 20d 9h) (30d で 27 merged PRs)

説明

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

コントリビューターガイド