~ruther/qmk_firmware

42cd55e08d5ba1b7b5bbbedaee1737c9febdcd64 — Jack Humbert 1 year, 11 months ago ac14fce
Planck Matrix Fixes (#21196)

* fix non-default keymap compiling, initial matrix state, watchdog options

* fix: allow planck/rev7 to be used with ENCODER_ENABLE = no

* chore: update function name on all cases.

* remove old midi tone option

Co-authored-by: Ryan <fauxpark@gmail.com>

* fixes abhixec's planck keymap

* add audio enable condition to abhixec's planck keymap

* add audio enable condition to all muse includes

* Revert "add audio enable condition to all muse includes"

This reverts commit 9779e908970dbf7cf81b1a3f968ef2e85ae2b76f.

* Revert "add audio enable condition to abhixec's planck keymap"

This reverts commit 24c742a5e8ddd55c45ce9f1917b0cb237d4bf721.

* Revert "fixes abhixec's planck keymap"

This reverts commit 4bb085d1ff00febc92ff6211da4fb776c6379fad.

---------

Co-authored-by: Peter.Falken <luis@bitjester.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
M keyboards/planck/rev6_drop/matrix.c => keyboards/planck/rev6_drop/matrix.c +1 -0
@@ 27,6 27,7 @@ void matrix_init_custom(void) {
    // actual matrix setup - cols
    for (int i = 0; i < MATRIX_COLS; i++) {
        setPinOutput(matrix_col_pins[i]);
        writePinLow(matrix_col_pins[i]);
    }

    // rows

M keyboards/planck/rev7/keymaps/default/config.h => keyboards/planck/rev7/keymaps/default/config.h +0 -6
@@ 41,9 41,3 @@
   - etc.
*/
// #define MIDI_ADVANCED

/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
// #define MIDI_TONE_KEYCODE_OCTAVES 2

// Most tactile encoders have detents every 4 stages
#define ENCODER_RESOLUTION 4

M keyboards/planck/rev7/keymaps/default/keymap.c => keyboards/planck/rev7/keymaps/default/keymap.c +0 -9
@@ 189,17 189,8 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
        case BACKLIT:
            if (record->event.pressed) {
                register_code(KC_RSFT);
#ifdef BACKLIGHT_ENABLE
                backlight_step();
#endif
#ifdef KEYBOARD_planck_rev5
                writePinLow(E6);
#endif
            } else {
                unregister_code(KC_RSFT);
#ifdef KEYBOARD_planck_rev5
                writePinHigh(E6);
#endif
            }
            return false;
            break;

M keyboards/planck/rev7/matrix.c => keyboards/planck/rev7/matrix.c +28 -14
@@ 31,21 31,36 @@
#define STM32_IWDG_RL_MS(s) STM32_IWDG_RL_US(s * 1000.0)
#define STM32_IWDG_RL_S(s) STM32_IWDG_RL_US(s * 1000000.0)

#if !defined(PLANCK_ENCODER_RESOLUTION)
#    define PLANCK_ENCODER_RESOLUTION 4
#endif

#if !defined(PLANCK_WATCHDOG_TIMEOUT)
#   define PLANCK_WATCHDOG_TIMEOUT 1.0
#endif

#ifdef ENCODER_MAP_ENABLE
#error "The encoder map feature is not currently supported by the Planck's encoder matrix"
#endif

/* matrix state(1:on, 0:off) */
static pin_t matrix_row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
static pin_t matrix_col_pins[MATRIX_COLS] = MATRIX_COL_PINS;

static matrix_row_t matrix_inverted[MATRIX_COLS];

#ifdef ENCODER_ENABLE
int8_t  encoder_LUT[]     = {0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0};
uint8_t encoder_state[8]  = {0};
int8_t  encoder_pulses[8] = {0};
uint8_t encoder_value[8]  = {0};
#endif

void matrix_init_custom(void) {
    // actual matrix setup - cols
    for (int i = 0; i < MATRIX_COLS; i++) {
        setPinOutput(matrix_col_pins[i]);
        writePinLow(matrix_col_pins[i]);
    }

    // rows


@@ 57,50 72,47 @@ void matrix_init_custom(void) {
    setPinInputLow(B12);
    setPinInputLow(B13);

    // setup watchdog timer for 1 second
#ifndef PLANCK_WATCHDOG_DISABLE
    wdgInit();

    static WDGConfig wdgcfg;
    wdgcfg.pr   = STM32_IWDG_PR_S(1.0);
    wdgcfg.rlr  = STM32_IWDG_RL_S(1.0);
    wdgcfg.pr   = STM32_IWDG_PR_S(PLANCK_WATCHDOG_TIMEOUT);
    wdgcfg.rlr  = STM32_IWDG_RL_S(PLANCK_WATCHDOG_TIMEOUT);
    wdgcfg.winr = STM32_IWDG_WIN_DISABLED;
    wdgStart(&WDGD1, &wdgcfg);
#endif
}

#ifdef ENCODER_ENABLE
bool encoder_update(uint8_t index, uint8_t state) {
    bool    changed = false;
    uint8_t i       = index;

    encoder_pulses[i] += encoder_LUT[state & 0xF];

    if (encoder_pulses[i] >= ENCODER_RESOLUTION) {
    if (encoder_pulses[i] >= PLANCK_ENCODER_RESOLUTION) {
        encoder_value[index]++;
        changed = true;
#ifdef ENCODER_MAP_ENABLE
        encoder_exec_mapping(index, false);
#else  // ENCODER_MAP_ENABLE
        encoder_update_kb(index, false);
#endif // ENCODER_MAP_ENABLE
    }
    if (encoder_pulses[i] <= -ENCODER_RESOLUTION) {
    if (encoder_pulses[i] <= -PLANCK_ENCODER_RESOLUTION) {
        encoder_value[index]--;
        changed = true;
#ifdef ENCODER_MAP_ENABLE
        encoder_exec_mapping(index, true);
#else  // ENCODER_MAP_ENABLE
        encoder_update_kb(index, true);
#endif // ENCODER_MAP_ENABLE
    }
    encoder_pulses[i] %= ENCODER_RESOLUTION;
    encoder_pulses[i] %= PLANCK_ENCODER_RESOLUTION;
#ifdef ENCODER_DEFAULT_POS
    encoder_pulses[i] = 0;
#endif
    return changed;
}
#endif

bool matrix_scan_custom(matrix_row_t current_matrix[]) {
#ifndef PLANCK_WATCHDOG_DISABLE
    // reset watchdog
    wdgReset(&WDGD1);
#endif

    bool changed = false;



@@ 136,6 148,7 @@ bool matrix_scan_custom(matrix_row_t current_matrix[]) {
        changed |= old != current_matrix[row];
    }

#ifdef ENCODER_ENABLE
    // encoder-matrix functionality

    // set up C/rows for encoder read


@@ 168,6 181,7 @@ bool matrix_scan_custom(matrix_row_t current_matrix[]) {
    for (int i = 0; i < MATRIX_ROWS; i++) {
        setPinInputLow(matrix_row_pins[i]);
    }
#endif

    return changed;
}

M keyboards/planck/rev7/readme.md => keyboards/planck/rev7/readme.md +13 -2
@@ 14,7 14,7 @@ See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_to

## Encoders

Encoders must have matching pulse & detent resolutions (e.g. 24/24) for the scanning to work properly. Multiple encoders can be used at the same time, and are zero-indexed (compared to being one-indexed on the PCB's silkscreen) in the `encoder_update_user(index, clockwise)` function:
Encoders must have matching pulse & detent resolutions (e.g. 24/24) for the scanning to work properly. Multiple encoders can be used at the same time, and are zero-indexed (compared to being one-indexed on the PCB's silkscreen) in the `encoder_update_user(uint8_t index, bool clockwise)` function:

```
,-----------------------------------------------------------------------------------.


@@ 28,4 28,15 @@ Encoders must have matching pulse & detent resolutions (e.g. 24/24) for the scan
`-----------------------------------------------------------------------------------'
```

If an encoder has a switch built-in, it's connected to the key at that location. On the default keymap, each encoder will play its own rising/falling tone sequence when rotated, and will reset the pitch after one second of inactivity.
If an encoder has a switch built-in, it's connected to the key at that location. On the default keymap, each encoder will play its own rising/falling tone sequence when rotated, and will reset the pitch after one second of inactivity. The encoder map feature is not currently supported.

## Some Planck-specific config.h options:

```c
// sets the length (in seconds) of the watchdog timer, which will reset the keyboard due to hang/crash in the code
#define PLANCK_WATCHDOG_TIMEOUT 1.0
// disables the watchdog timer - you may want to disable the watchdog timer if you use longer macros
#define PLANCK_WATCHDOG_DISABLE
// the resolution of the encoders used in the encoder matrix
#define PLANCK_ENCODER_RESOLUTION 4
```

Do not follow this link