From cf8237e5239f465eeb5623ff7fe0e458f034d86b Mon Sep 17 00:00:00 2001 From: kemonine Date: Fri, 13 Nov 2020 13:56:43 -0500 Subject: [PATCH] Adjust qvex lynepad mouse keys to have on the fly accelleration changes as well as adjusted key layout that's more efficient and more usable --- keyboards/qvex/lynepad/config.h | 4 +- keyboards/qvex/lynepad/keymap.c | 84 +- keyboards/qvex/lynepad/layer-1.json | 8 +- keyboards/qvex/lynepad/layer-1.png | Bin 16261 -> 16909 bytes .../qvex/lynepad/qvex_lynepad_kemonine.hex | 2411 +++++++++-------- keyboards/qvex/lynepad/rules.mk | 1 + .../qvex/lynepad/keymaps/kemonine/config.h | 4 +- .../qvex/lynepad/keymaps/kemonine/keymap.c | 84 +- .../qvex/lynepad/keymaps/kemonine/rules.mk | 1 + 9 files changed, 1395 insertions(+), 1202 deletions(-) create mode 100644 keyboards/qvex/lynepad/rules.mk create mode 100644 qmk/keyboards/qvex/lynepad/keymaps/kemonine/rules.mk diff --git a/keyboards/qvex/lynepad/config.h b/keyboards/qvex/lynepad/config.h index 753cc3c6..15250b4d 100644 --- a/keyboards/qvex/lynepad/config.h +++ b/keyboards/qvex/lynepad/config.h @@ -16,7 +16,8 @@ #pragma once -// place overrides here +#define TAPPING_TERM 200 + #undef RGBLIGHT_ANIMATIONS #define RGBLIGHT_LAYERS @@ -29,3 +30,4 @@ #define MOUSEKEY_WHEEL_INTERVAL 50 #define MOUSEKEY_WHEEL_TIME_TO_MAX 20 #define MOUSEKEY_WHEEL_MAX_SPEED 10 +#define MK_COMBINED diff --git a/keyboards/qvex/lynepad/keymap.c b/keyboards/qvex/lynepad/keymap.c index 3bae156e..1241b3bd 100644 --- a/keyboards/qvex/lynepad/keymap.c +++ b/keyboards/qvex/lynepad/keymap.c @@ -15,6 +15,44 @@ */ #include QMK_KEYBOARD_H +enum { + ACCEL_0 = 0, + ACCEL_1 = 1, + ACCEL_2 = 2, +}; +static uint8_t acceleration_level = ACCEL_0; + +void change_accel(void) { + acceleration_level++; + if (acceleration_level > ACCEL_2) { + acceleration_level = ACCEL_0; + } +} + +// Custom key codes +enum { + ACCEL = SAFE_RANGE, +}; + +// Tap Dance declarations +enum { + TD_LAYER_BOOT, +}; + +void dance_layer_boot_finished(qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + layer_on(1); + } else { + reset_keyboard(); + } +} + +// Tap Dance definitions +qk_tap_dance_action_t tap_dance_actions[] = { + // Tap once for Escape, twice for Caps Lock + [TD_LAYER_BOOT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_layer_boot_finished, NULL), +}; + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap (Base Layer) Default Layer * |----------------------------| @@ -26,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_Lynepad( LCTL(LALT(KC_TAB)), KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, LGUI(KC_DOWN), KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, - KC_MS_BTN3, TO(1), TO(2) + ACCEL, TD(TD_LAYER_BOOT), KC_ESC ), [1] = LAYOUT_Lynepad( LCTL(LALT(KC_2)), LCTL(KC_BSPACE), LSFT(KC_X), LSFT(KC_P), @@ -80,6 +118,40 @@ layer_state_t layer_state_set_user(layer_state_t state) { return state; } +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case ACCEL: + if (record->event.pressed) { + switch(acceleration_level) { + case ACCEL_0: + register_code16(KC_ACL0); + break; + case ACCEL_1: + register_code16(KC_ACL1); + break; + case ACCEL_2: + register_code16(KC_ACL2); + break; + } + } else { + switch(acceleration_level) { + case ACCEL_0: + unregister_code16(KC_ACL0); + break; + case ACCEL_1: + unregister_code16(KC_ACL1); + break; + case ACCEL_2: + unregister_code16(KC_ACL2); + break; + } + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} + // Standard encoder functionality void encoder_update_user(uint8_t index, bool clockwise) { // Process encoder rotational movements @@ -168,19 +240,15 @@ extern int16_t enc2RightPrev; void matrix_scan_user(void) { if (enc1Center != enc1CenterPrev) { if (enc1Center < ENC_TILT_THRESHOLD) { - register_code16(KC_ESC); - } - else { - unregister_code16(KC_ESC); + if (layer_state_is(0)) { + change_accel(); + } } } if (enc2Center != enc2CenterPrev) { if (enc2Center < ENC_TILT_THRESHOLD) { } else { - if (layer_state_is(0)) { - reset_keyboard(); - } } /* * Encoder sets ALL values when center is pressed so bail out at this point\ diff --git a/keyboards/qvex/lynepad/layer-1.json b/keyboards/qvex/lynepad/layer-1.json index 317b4939..cd2c24ba 100644 --- a/keyboards/qvex/lynepad/layer-1.json +++ b/keyboards/qvex/lynepad/layer-1.json @@ -34,9 +34,9 @@ "y": -0.5, "a": 7 }, - "Mouse Btn 3", - "Layer 1", - "Layer 2" + "Accel", + "Layer 1\n\n\n\nBoot", + "Esc" ], [ { @@ -46,6 +46,6 @@ "w": 2, "h": 2 }, - "Esc\n\n\n\n\n\n\n\n\n Wheel" + "Accel Mode\n\n\n\n\n\n\n\n\n Wheel" ] ] \ No newline at end of file diff --git a/keyboards/qvex/lynepad/layer-1.png b/keyboards/qvex/lynepad/layer-1.png index f7a009ff4cb652ea06ce9d32b8711dffd1fafac2..b5d88a1e954102908c440d6c78294c1cda207b86 100644 GIT binary patch literal 16909 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 literal 16261 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 s&09_ ACCEL_2) { + acceleration_level = ACCEL_0; + } +} + +// Custom key codes +enum { + ACCEL = SAFE_RANGE, +}; + +// Tap Dance declarations +enum { + TD_LAYER_BOOT, +}; + +void dance_layer_boot_finished(qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + layer_on(1); + } else { + reset_keyboard(); + } +} + +// Tap Dance definitions +qk_tap_dance_action_t tap_dance_actions[] = { + // Tap once for Escape, twice for Caps Lock + [TD_LAYER_BOOT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_layer_boot_finished, NULL), +}; + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap (Base Layer) Default Layer * |----------------------------| @@ -26,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_Lynepad( LCTL(LALT(KC_TAB)), KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, LGUI(KC_DOWN), KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, - KC_MS_BTN3, TO(1), TO(2) + ACCEL, TD(TD_LAYER_BOOT), KC_ESC ), [1] = LAYOUT_Lynepad( LCTL(LALT(KC_2)), LCTL(KC_BSPACE), LSFT(KC_X), LSFT(KC_P), @@ -80,6 +118,40 @@ layer_state_t layer_state_set_user(layer_state_t state) { return state; } +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case ACCEL: + if (record->event.pressed) { + switch(acceleration_level) { + case ACCEL_0: + register_code16(KC_ACL0); + break; + case ACCEL_1: + register_code16(KC_ACL1); + break; + case ACCEL_2: + register_code16(KC_ACL2); + break; + } + } else { + switch(acceleration_level) { + case ACCEL_0: + unregister_code16(KC_ACL0); + break; + case ACCEL_1: + unregister_code16(KC_ACL1); + break; + case ACCEL_2: + unregister_code16(KC_ACL2); + break; + } + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} + // Standard encoder functionality void encoder_update_user(uint8_t index, bool clockwise) { // Process encoder rotational movements @@ -168,19 +240,15 @@ extern int16_t enc2RightPrev; void matrix_scan_user(void) { if (enc1Center != enc1CenterPrev) { if (enc1Center < ENC_TILT_THRESHOLD) { - register_code16(KC_ESC); - } - else { - unregister_code16(KC_ESC); + if (layer_state_is(0)) { + change_accel(); + } } } if (enc2Center != enc2CenterPrev) { if (enc2Center < ENC_TILT_THRESHOLD) { } else { - if (layer_state_is(0)) { - reset_keyboard(); - } } /* * Encoder sets ALL values when center is pressed so bail out at this point\ diff --git a/qmk/keyboards/qvex/lynepad/keymaps/kemonine/rules.mk b/qmk/keyboards/qvex/lynepad/keymaps/kemonine/rules.mk new file mode 100644 index 00000000..1ba2fa8f --- /dev/null +++ b/qmk/keyboards/qvex/lynepad/keymaps/kemonine/rules.mk @@ -0,0 +1 @@ +TAP_DANCE_ENABLE = yes \ No newline at end of file