diff --git a/keyboards/framework/ansi/keymaps/finger_zones/keymap.c b/keyboards/framework/ansi/keymaps/finger_zones/keymap.c new file mode 100644 index 00000000000..ad701dcf6d1 --- /dev/null +++ b/keyboards/framework/ansi/keymaps/finger_zones/keymap.c @@ -0,0 +1,118 @@ +// Copyright 2022 Framework Computer +// SPDX-License-Identifier: GPL-2.0-or-later + +#include QMK_KEYBOARD_H +#include "framework.h" + +enum _layers { + _BASE, + _FN, + _FN_LOCK, + _FM +}; + +// Custom keycode to activate finger zones effect +// Must start after FN_LOCK which is defined in framework.h +enum custom_keycodes { + RGB_FZ = FN_LOCK + 1, +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ┌─────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬────┐ + * 14 keys │ESC │Mut│vDn│vUp│Prv│Ply│Nxt│bDn│bUp│Scn│Air│Prt│App│Del │ + * ├───┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┤ + * 14 keys │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │Backsp│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬────┤ + * 14 keys │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴────┤ + * 13 keys │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───────┤ + * 12 keys │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ + * ├────┬───┼───┼───┼───┴───┴───┴───┴───┼───┼───┼───┴┬───┬────┤ + * │ │ │ │ │ │ │ │ │↑ │ │ + * 11 keys │Ctrl│FN │GUI│Alt│ │Alt│Ctl│ ← ├───┤ → │ + * │ │ │ │ │ │ │ │ │ ↓│ │ + * └────┴───┴───┴───┴───────────────────┴───┴───┴────┴───┴────┘ + * 78 total + */ + [_BASE] = LAYOUT( + KC_ESC, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPRV, KC_MPLY, KC_MNXT, KC_BRID, KC_BRIU, KC_SCRN, KC_AIRP, KC_PSCR, KC_MSEL, KC_DEL, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, MO(_FN), KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT + ), + /* + * Function layer + * ┌─────┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬────┐ + * 14 keys │FN lk│F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11│F12│Ins │ + * ├───┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┤ + * 14 keys │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬────┤ + * 14 keys │ │ │RGB│Nxt│Hue│Sat│Spd│Brt│ │ │Pau│ │ │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴────┤ + * 13 keys │ │ │SRq│Prv│Hue│Sat│Spd│Brt│ScL│ │ │ │ │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───────┤ + * 12 keys │ │ │ │ │ │ │Brk│ │ │ │ │ │ + * ├────┬───┼───┼───┼───┴───┴───┴───┴───┼───┼───┼───┴┬───┬────┤ + * │ │ │ │ │ │ │ │ │PgU│ │ + * 11 keys │ │ │ │ │ Toggle Backlight │ │ │Home├───┤End │ + * │ │ │ │ │ │ │ │ │PgD│ │ + * └────┴───┴───┴───┴───────────────────┴───┴───┴────┴───┴────┘ + * 78 total + */ + [_FN] = LAYOUT( + FN_LOCK, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_SPI, RGB_VAI, _______, _______, KC_PAUS, RGB_FZ, EE_CLR, QK_BOOT, + _______, _______, KC_SYRQ, RGB_RMOD,RGB_HUD, RGB_SAD, RGB_SPD, RGB_VAD, KC_SCRL, _______, _______, _______, _______, + _______, _______, _______, BL_BRTG, _______, KC_BRK, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, BL_STEP, _______, _______, KC_HOME, KC_PGUP, KC_PGDN, KC_END + ), + // Function lock layer + // Everything on F-row locked to function layer, except ESC and DEL + [_FN_LOCK] = LAYOUT( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, MO(_FM), _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + // Locked+temporary FN (back to base plus extra keys) + [_FM] = LAYOUT( + FN_LOCK, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPRV, KC_MPLY, KC_MNXT, KC_BRID, KC_BRIU, KC_SCRN, KC_AIRP, KC_PSCR, KC_MSEL, KC_INS, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_SPI, RGB_VAI, _______, _______, KC_PAUS, RGB_FZ, EE_CLR, QK_BOOT, + _______, _______, KC_SYRQ, RGB_RMOD,RGB_HUD, RGB_SAD, RGB_SPD, RGB_VAD, KC_SCRL, _______, _______, _______, _______, + _______, _______, _______, BL_BRTG, _______, KC_BRK, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, BL_STEP, _______, _______, KC_HOME, KC_PGUP, KC_PGDN, KC_END + ), +}; + +// Make sure to keep FN Lock even after reset +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case FN_LOCK: + if (record->event.pressed) { + if (layer_state_is(_FN)) { + set_single_persistent_default_layer(_FN_LOCK); + } + if (layer_state_is(_FM)) { + set_single_persistent_default_layer(_BASE); + } + } + return false; + case RGB_FZ: + if (record->event.pressed) { + rgb_matrix_mode(RGB_MATRIX_CUSTOM_FINGER_ZONES); + } + return false; + default: + break; + } + return true; +} diff --git a/keyboards/framework/ansi/keymaps/finger_zones/rgb_matrix_user.inc b/keyboards/framework/ansi/keymaps/finger_zones/rgb_matrix_user.inc new file mode 100644 index 00000000000..b1a572c50d7 --- /dev/null +++ b/keyboards/framework/ansi/keymaps/finger_zones/rgb_matrix_user.inc @@ -0,0 +1,154 @@ +// Finger Zone RGB Effect for Framework 16 ANSI Keyboard +// Maps each key to a finger zone for touch typing visualization +// +// 6 Zones: +// 0 = Pinkies (both) - Pink +// 1 = Ring fingers - Yellow +// 2 = Middle fingers - Blue +// 3 = Left index - Green +// 4 = Thumbs - Cyan +// 5 = Right index - Orange +// +// Mapping derived from cross-referencing LAYOUT macro in ansi.h +// with g_led_config matrix-to-LED mapping in ansi.c + +RGB_MATRIX_EFFECT(FINGER_ZONES) + +#ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS + +// Zone assignments for each LED index (0-96) +// Generated by tracing K## codes through LAYOUT -> matrix -> g_led_config +static const uint8_t PROGMEM g_led_zone[RGB_MATRIX_LED_COUNT] = { + 0, // LED 1 (idx 0): Tab (2nd LED) - Pinky + 0, // LED 2 (idx 1): Tab - Pinky + 2, // LED 3 (idx 2): E - Middle + 1, // LED 4 (idx 3): W - Ring + 3, // LED 5 (idx 4): R - Left Index + 0, // LED 6 (idx 5): Q - Pinky + 5, // LED 7 (idx 6): U - Right Index + 3, // LED 8 (idx 7): T - Left Index + 5, // LED 9 (idx 8): Y - Right Index + 3, // LED 10 (idx 9): 5 - Left Index + 5, // LED 11 (idx 10): 7 - Right Index + 3, // LED 12 (idx 11): 4 - Left Index + 2, // LED 13 (idx 12): 3 - Middle + 1, // LED 14 (idx 13): 2 - Ring + 5, // LED 15 (idx 14): 6 - Right Index + 0, // LED 16 (idx 15): 1 - Pinky + 0, // LED 17 (idx 16): ` - Pinky + 2, // LED 18 (idx 17): 8 - Middle + 2, // LED 19 (idx 18): vUp (F4) - Middle + 1, // LED 20 (idx 19): vDn (F3) - Ring + 3, // LED 21 (idx 20): Prv (F5) - Left Index + 0, // LED 22 (idx 21): Mute (F1) - Pinky + 3, // LED 23 (idx 22): Ply (F6) - Left Index + 0, // LED 24 (idx 23): ESC (2nd LED) - Pinky + 5, // LED 25 (idx 24): Nxt (F7) - Right Index + 0, // LED 26 (idx 25): ESC - Pinky + 5, // LED 27 (idx 26): bDn (F8) - Right Index + 0, // LED 28 (idx 27): Z - Pinky + 0, // LED 29 (idx 28): Caps (2nd LED) - Pinky + 1, // LED 30 (idx 29): X - Ring + 0, // LED 31 (idx 30): Caps (3rd LED) - Pinky + 2, // LED 32 (idx 31): C - Middle + 0, // LED 33 (idx 32): LShift - Pinky + 3, // LED 34 (idx 33): V - Left Index + 0, // LED 35 (idx 34): LCtrl - Pinky + 3, // LED 36 (idx 35): B - Left Index + 0, // LED 37 (idx 36): A - Pinky + 2, // LED 38 (idx 37): D - Middle + 0, // LED 39 (idx 38): LShift (2nd LED) - Pinky + 3, // LED 40 (idx 39): G - Left Index + 5, // LED 41 (idx 40): H - Right Index + 1, // LED 42 (idx 41): S - Ring + 0, // LED 43 (idx 42): LShift (3rd LED) - Pinky + 3, // LED 44 (idx 43): F - Left Index + 0, // LED 45 (idx 44): Caps - Pinky + 0, // LED 46 (idx 45): LCtrl (2nd LED) - Pinky + 4, // LED 47 (idx 46): GUI - Thumb + 4, // LED 48 (idx 47): LAlt - Thumb + 0, // LED 49 (idx 48): ; - Pinky + 5, // LED 50 (idx 49): J - Right Index + 2, // LED 51 (idx 50): K - Middle + 1, // LED 52 (idx 51): L - Ring + 0, // LED 53 (idx 52): ' - Pinky + 0, // LED 54 (idx 53): Enter (2nd LED) - Pinky + 0, // LED 55 (idx 54): ] - Pinky + 0, // LED 56 (idx 55): \ - Pinky + 0, // LED 57 (idx 56): Enter - Pinky + 0, // LED 58 (idx 57): [ - Pinky + 2, // LED 59 (idx 58): I - Middle + 1, // LED 60 (idx 59): O - Ring + 0, // LED 61 (idx 60): P - Pinky + 0, // LED 62 (idx 61): 0 - Pinky + 0, // LED 63 (idx 62): = - Pinky + 0, // LED 64 (idx 63): - - Pinky + 0, // LED 65 (idx 64): Bksp (2nd LED) - Pinky + 0, // LED 66 (idx 65): Bksp - Pinky + 0, // LED 67 (idx 66): Prt (F12) - Pinky + 2, // LED 68 (idx 67): bUp (F9) - Middle + 0, // LED 69 (idx 68): Air (F11) - Pinky + 1, // LED 70 (idx 69): 9 - Ring + 0, // LED 71 (idx 70): App - Pinky + 0, // LED 72 (idx 71): Del (2nd LED) - Pinky + 0, // LED 73 (idx 72): Del (3rd LED) - Pinky + 0, // LED 74 (idx 73): Del - Pinky + 1, // LED 75 (idx 74): Scn (F10) - Ring + 1, // LED 76 (idx 75): . - Ring + 5, // LED 77 (idx 76): N - Right Index + 5, // LED 78 (idx 77): M - Right Index + 2, // LED 79 (idx 78): , - Middle + 0, // LED 80 (idx 79): / - Pinky + 0, // LED 81 (idx 80): RShift (2nd LED) - Pinky + 0, // LED 82 (idx 81): Up - Pinky + 0, // LED 83 (idx 82): RShift (3rd LED) - Pinky + 0, // LED 84 (idx 83): RShift (4th LED) - Pinky + 4, // LED 85 (idx 84): RAlt - Thumb + 4, // LED 86 (idx 85): Space (2nd LED) - Thumb + 4, // LED 87 (idx 86): Space (3rd LED) - Thumb + 4, // LED 88 (idx 87): Space (4th LED) - Thumb + 0, // LED 89 (idx 88): RCtrl - Pinky + 0, // LED 90 (idx 89): Left - Pinky + 0, // LED 91 (idx 90): Down - Pinky + 0, // LED 92 (idx 91): Right - Pinky + 0, // LED 93 (idx 92): RShift - Pinky + 4, // LED 94 (idx 93): Fn - Thumb + 4, // LED 95 (idx 94): Space - Thumb + 4, // LED 96 (idx 95): Space (5th LED) - Thumb + 4, // LED 97 (idx 96): Space (6th LED) - Thumb +}; + +// Zone colors in RGB format +static const uint8_t PROGMEM zone_colors[6][3] = { + {255, 105, 180}, // 0: Pinkies - Pink + {255, 220, 0}, // 1: Ring fingers - Yellow + { 50, 100, 255}, // 2: Middle - Blue + { 50, 255, 50}, // 3: Left index - Green + { 0, 255, 255}, // 4: Thumbs - Cyan + {255, 140, 0}, // 5: Right index - Orange +}; + +static bool FINGER_ZONES(effect_params_t* params) { + RGB_MATRIX_USE_LIMITS(led_min, led_max); + + for (uint8_t i = led_min; i < led_max; i++) { + uint8_t zone = pgm_read_byte(&g_led_zone[i]); + if (zone > 5) zone = 4; // fallback to thumb zone + + uint8_t r = pgm_read_byte(&zone_colors[zone][0]); + uint8_t g = pgm_read_byte(&zone_colors[zone][1]); + uint8_t b = pgm_read_byte(&zone_colors[zone][2]); + + // Apply brightness from current RGB matrix value setting + uint8_t val = rgb_matrix_get_val(); + r = (r * val) / 255; + g = (g * val) / 255; + b = (b * val) / 255; + + rgb_matrix_set_color(i, r, g, b); + } + + return rgb_matrix_check_finished_leds(led_max); +} + +#endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS diff --git a/keyboards/framework/ansi/keymaps/finger_zones/rules.mk b/keyboards/framework/ansi/keymaps/finger_zones/rules.mk new file mode 100644 index 00000000000..1d60f418a09 --- /dev/null +++ b/keyboards/framework/ansi/keymaps/finger_zones/rules.mk @@ -0,0 +1,2 @@ +# Enable custom user RGB effects +RGB_MATRIX_CUSTOM_USER = yes