Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 118 additions & 0 deletions keyboards/framework/ansi/keymaps/finger_zones/keymap.c
Original file line number Diff line number Diff line change
@@ -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;
}
154 changes: 154 additions & 0 deletions keyboards/framework/ansi/keymaps/finger_zones/rgb_matrix_user.inc
Original file line number Diff line number Diff line change
@@ -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
2 changes: 2 additions & 0 deletions keyboards/framework/ansi/keymaps/finger_zones/rules.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Enable custom user RGB effects
RGB_MATRIX_CUSTOM_USER = yes
Loading