[Keymap] merge jdelkins userspace and associated keymaps (#11276)

* [Keymap] merge jdelkins userspace and associated keymaps

* Add copyright & license info

* Change rgblight_config.enable to rgblight_is_enabled()

* Update keyboards/dz60/keymaps/jdelkins/keymap.c

Co-authored-by: Drashna Jaelre <drashna@live.com>

* Update keyboards/dz60/keymaps/jdelkins/keymap.c

Co-authored-by: Drashna Jaelre <drashna@live.com>

* Update keyboards/dz60/keymaps/jdelkins/keymap.c

Co-authored-by: Drashna Jaelre <drashna@live.com>

* Remove superfluous includes

* Change EXTRAFLAGS+=-flto to LTO_ENABLE=yes

* Remove unnecessary jdelkins_ss symlink in users

* Add copyright and license notices

* Use preferred way to determine capslock / numlock state

Co-authored-by: Drashna Jaelre <drashna@live.com>

* Add #pragma once to a header

Co-authored-by: Drashna Jaelre <drashna@live.com>

* Include QMK_KEYBOARD_H only once, in userspace header

* Remove unnecessary initialization in matrix_init_keymap

* Do process_record_keymap before cases handled in process_record_user

* Reorganize & simplify secrets feature enablement

* Use tap_code16

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

* Remove superfluous break

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

* Remove copyright from rules.mk

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

* Remove copyright from rules.mk

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

* Use tap_code16

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

* include "print.h" instead of <print.h>

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

* Use tap_cod16

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

* Use tap_code16

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

* Use tap_code16

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

* Use tap_code16

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

* Remove copyright from rules.mk

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

* add #pragma once to a header

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

* include "print.h" instead of <print.h>

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

* Remove copyright from rules.mk

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

* Remove copyright from rules.mk

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

* Remove copyright from rules.mk

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

* Use tap_code16

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

* Use tap_code16

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

* Use :flash target where possible

* Remove special case flash target and use PROGRAM_CMD

* dz60/jdelkins_ss: use tap_code16

Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
This commit is contained in:
Joel Elkins 2021-06-02 15:59:52 -05:00 committed by GitHub
parent 93496c8364
commit 35dbe8ba03
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
22 changed files with 2724 additions and 0 deletions

View file

@ -0,0 +1,51 @@
/*
Copyright 2020 Joel Elkins <joel@elkins.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
/* Directional arrangement | LAYOUT_directional
*
* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0e
*
* 10 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e
*
* 20 22 23 24 25 26 27 28 29 2a 2b 2c 2d
*
* 30 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e
*
* 40 41 43 46 4a 4b 4c 4d 4e
*
*/
#define LAYOUT_directional_nosplitspace( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, \
k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \
k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \
k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \
k40, k41, k43, k46, k4a, k4b, k4c, k4d, k4e \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, KC_NO,k0e }, \
{ k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \
{ k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \
{ k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e }, \
{ k40, k41, KC_NO, k43, KC_NO,KC_NO, k46, KC_NO, KC_NO,KC_NO, k4a, k4b, k4c, k4d, k4e } \
}
#define AUTO_SHIFT_TIMEOUT 160
#define RGBLIGHT_LAYERS
#define LEADER_TIMEOUT 400
#define LEADER_PER_KEY_TIMING

View file

@ -0,0 +1,279 @@
/*
Copyright 2020 Joel Elkins <joel@elkins.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "jdelkins.h"
#undef LAYOUT
#define LAYOUT LAYOUT_directional_nosplitspace
#define IDLE_TIMEOUT 360
uint16_t rgb_idle_seconds = 0;
uint16_t rgb_timer;
bool rgb_was_enabled;
// Tap Dance
int ctl_state = 0;
void ctl_finished(qk_tap_dance_state_t *state, void *user_data) {
ctl_state = cur_dance(state);
switch(ctl_state) {
case SINGLE_TAP: qk_leader_start(); break;
case SINGLE_HOLD: register_code(KC_LCTL); break;
case DOUBLE_TAP: tap_code(KC_RCTL); break;
case DOUBLE_HOLD: register_code(KC_RCTL); break;
case TRIPLE_TAP: tap_code(KC_RCTL); tap_code(KC_RCTL); break;
case TRIPLE_HOLD: tap_code(KC_RCTL); register_code(KC_RCTL); break;
}
}
void ctl_reset(qk_tap_dance_state_t *state, void *user_data) {
switch(ctl_state) {
case SINGLE_HOLD: unregister_code(KC_LCTL); break;
case DOUBLE_HOLD:
case TRIPLE_HOLD: unregister_code(KC_RCTL); break;
}
ctl_state = 0;
}
void g_finished(qk_tap_dance_state_t *state, void *user_data) {
switch (cur_dance(state)) {
case SINGLE_TAP:
tap_code16(C(KC_END));
break;
case DOUBLE_TAP:
tap_code16(C(KC_HOME));
break;
}
}
enum {
TD_LDCTL,
TD_G,
};
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_LDCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctl_finished, ctl_reset),
[TD_G] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, g_finished, NULL),
};
// Layers
const uint16_t PROGMEM keymaps[_LAYER_MAX][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT(
KC_GESC, 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,
MY_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_BSPC, MO(_ADJUST),
TD(TD_LDCTL), MY_GUI, MY_ALT, MY_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
[_GAME] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, KC_LALT, KC_SPC, _______, _______, _______, _______, _______
),
[_FUNC] = LAYOUT(
KC_GRV, 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_DEL,
_______, _______, FW_WRD, KB_EOL, _______, _______, KB_COPY, KC_PGUP, _______, _______, KB_PASTE, KC_SLCK, _______, MY_CALC,
_______, KB_BOL, _______, KC_PGDN, _______, TD(TD_G), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______,
_______, _______, KC_DEL, _______, _______, BK_WRD, _______, _______, _______, _______, _______, _______, KC_INS, _______,
_______, MY_RGUI, MY_RALT, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
),
[_KP] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, KC_KP_ASTERISK, _______, _______, _______, _______, _______,
KC_NUMLOCK, _______, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_MINUS, _______, _______, _______,
_______, _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, _______, _______,
_______, _______, _______, _______, _______, _______, _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_SLASH, _______, _______, TG(_KP),
_______, _______, _______, KC_KP_0, KC_KP_DOT, _______, _______, _______, _______
),
[_ADJUST] = LAYOUT(
KC_GRV, 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_DEL,
_______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, _______, _______, _______, KC_PSCR, KC_SLCK, _______, KC_MUTE,
_______, RGB_RMOD, RGB_VAD, RGB_MOD, RGB_HUD, RGB_SAD, _______, _______, TG(_KP), _______, _______, _______, KC_MPLY,
_______, RGB_TOG, KB_MAKE, KB_FLSH, KB_VRSN, KB_BOOT, _______, TG_SYS, _______, _______, _______, _______, KC_DEL, _______,
_______, MY_RGUI, MY_RALT, _______, _______, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT
),
};
const rgblight_segment_t PROGMEM game_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 1, HSV_RED},
{7, 2, HSV_RED},
{15, 1, HSV_RED}
);
const rgblight_segment_t PROGMEM func_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 8, HSV_GREEN}
);
const rgblight_segment_t PROGMEM kp_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 16, HSV_ORANGE}
);
const rgblight_segment_t PROGMEM adjust_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 16, HSV_BLUE}
);
const rgblight_segment_t PROGMEM capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{10, 4, HSV_WHITE}
);
const rgblight_segment_t PROGMEM numlock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 2, HSV_PURPLE},
{14, 2, HSV_PURPLE}
);
enum rgb_layer_index {
L_GAME,
L_FUNC,
L_KP,
L_ADJUST,
L_CAPSLOCK,
L_NUMLOCK,
};
const rgblight_segment_t * const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(
[L_GAME] = game_layer,
[L_FUNC] = func_layer,
[L_KP] = kp_layer,
[L_ADJUST] = adjust_layer,
[L_CAPSLOCK] = capslock_layer,
[L_NUMLOCK] = numlock_layer
);
layer_state_t layer_state_set_keymap(layer_state_t state) {
rgblight_set_layer_state(L_GAME, layer_state_cmp(state, _GAME));
rgblight_set_layer_state(L_FUNC, layer_state_cmp(state, _FUNC));
rgblight_set_layer_state(L_KP, layer_state_cmp(state, _KP));
rgblight_set_layer_state(L_ADJUST, layer_state_cmp(state, _ADJUST));
rgblight_set_layer_state(L_CAPSLOCK, CAPSLOCK_ON);
rgblight_set_layer_state(L_NUMLOCK, NUMLOCK_ON && layer_state_cmp(state, _KP));
if (layer_state_cmp(state, _GAME))
autoshift_disable();
else
autoshift_enable();
return state;
}
bool led_update_user(led_t led_state) {
rgblight_set_layer_state(L_CAPSLOCK, led_state.caps_lock);
rgblight_set_layer_state(L_NUMLOCK, led_state.num_lock && layer_state_is(_KP));
return true;
}
void keyboard_post_init_keymap(void) {
rgblight_layers = my_rgb_layers;
rgb_was_enabled = rgblight_is_enabled();
}
LEADER_EXTERNS();
void matrix_scan_keymap(void) {
if (rgblight_is_enabled() && timer_elapsed(rgb_timer) > 1000) {
rgb_idle_seconds++;
rgb_timer = timer_read();
}
if (rgb_idle_seconds > IDLE_TIMEOUT) {
rgb_was_enabled = rgblight_is_enabled();
rgblight_disable_noeeprom();
rgb_idle_seconds = 0;
}
LEADER_DICTIONARY() {
leading = false;
leader_end();
SEQ_ONE_KEY(KC_K) {
layer_invert(_KP);
}
SEQ_ONE_KEY(KC_G) {
layer_invert(_GAME);
}
SEQ_ONE_KEY(KC_KP_5) {
layer_invert(_KP);
}
SEQ_TWO_KEYS(KC_SCLN, KC_1) {
send_secret_string(0);
}
SEQ_TWO_KEYS(KC_SCLN, KC_2) {
send_secret_string(1);
}
SEQ_TWO_KEYS(KC_SCLN, KC_3) {
send_secret_string(2);
}
SEQ_TWO_KEYS(KC_SCLN, KC_4) {
send_secret_string(3);
}
SEQ_TWO_KEYS(KC_SCLN, KC_5) {
send_secret_string(4);
}
SEQ_TWO_KEYS(KC_SCLN, KC_6) {
send_secret_string(5);
}
SEQ_TWO_KEYS(KC_SCLN, KC_M) {
send_secret_string(0);
}
SEQ_TWO_KEYS(KC_SCLN, KC_COMM) {
send_secret_string(1);
}
SEQ_TWO_KEYS(KC_SCLN, KC_DOT) {
send_secret_string(2);
}
SEQ_TWO_KEYS(KC_SCLN, KC_J) {
send_secret_string(3);
}
SEQ_TWO_KEYS(KC_SCLN, KC_K) {
send_secret_string(4);
}
SEQ_TWO_KEYS(KC_SCLN, KC_L) {
send_secret_string(5);
}
SEQ_ONE_KEY(KC_C) {
tap_code16(C(KC_C));
}
}
}
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
static uint16_t gesc_timer;
rgb_idle_seconds = 0;
if (!rgblight_is_enabled() && rgb_was_enabled)
rgblight_enable_noeeprom();
switch (keycode) {
// custom handle KC_GESC to emulate auto shift on it
case KC_GESC:
if (get_autoshift_state()) {
if (record->event.pressed)
gesc_timer = timer_read();
else {
if (timer_elapsed(gesc_timer) > AUTO_SHIFT_TIMEOUT || MODS_SHIFT) {
tap_code16(S(KC_GRV));
} else if (MODS_GUI)
tap_code(KC_GRV);
else
tap_code(KC_ESC);
}
return false;
}
return false;
}
return true;
}

View file

@ -0,0 +1,7 @@
LEADER_ENABLE = yes
MOUSEKEY_ENABLE = yes
CONSOLE_ENABLE = no
NKRO_ENABLE = no
TAP_DANCE_ENABLE = yes
LTO_ENABLE = yes
AUTO_SHIFT_ENABLE = yes

View file

@ -0,0 +1,51 @@
/*
Copyright 2020 Joel Elkins <joel@elkins.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
/* My hhkb variant
*
* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e
*
* 10 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e
*
* 20 22 23 24 25 26 27 28 29 2a 2b 2c 2d
*
* 30 32 33 34 35 36 37 38 39 3a 3b 3d 3e
*
* 40 41 43 44 46 48 4a 4b 4c 4d 4e
*
*/
#define LAYOUT_hhkb_split( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \
k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \
k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \
k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, k3e, \
k40, k41, k43, k44, k46, k48, k4a, k4b, k4c, k4d, k4e \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \
{ k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \
{ k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \
{ k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, k3e }, \
{ k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \
}
#define AUTO_SHIFT_TIMEOUT 165
#define RGBLIGHT_LAYERS
#define LEADER_TIMEOUT 400
#define LEADER_PER_KEY_TIMING

View file

@ -0,0 +1,367 @@
/*
Copyright 2020 Joel Elkins <joel@elkins.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "jdelkins.h"
#undef LAYOUT
#define LAYOUT LAYOUT_hhkb_split
#define IDLE_TIMEOUT 360
uint16_t rgb_idle_seconds = 0;
uint16_t rgb_timer;
uint16_t bspc_timer;
bool rgb_was_enabled;
enum {
MY_BSPC = USER_SAFE_RANGE,
};
// Tap Dance
int ctl_state = 0;
void ctl_finished(qk_tap_dance_state_t *state, void *user_data) {
ctl_state = cur_dance(state);
switch (ctl_state) {
case SINGLE_TAP: qk_leader_start(); break;
case SINGLE_HOLD: register_code(KC_LCTL); break;
case DOUBLE_TAP: tap_code(KC_RCTL); break;
case DOUBLE_HOLD: register_code(KC_RCTL); break;
case TRIPLE_TAP: tap_code(KC_RCTL); tap_code(KC_RCTL); break;
case TRIPLE_HOLD: tap_code(KC_RCTL); register_code(KC_RCTL); break;
}
}
void ctl_reset(qk_tap_dance_state_t *state, void *user_data) {
switch (ctl_state) {
case SINGLE_HOLD: unregister_code(KC_LCTL); break;
case DOUBLE_HOLD:
case TRIPLE_HOLD: unregister_code(KC_RCTL); break;
}
ctl_state = 0;
}
void g_finished(qk_tap_dance_state_t *state, void *user_data) {
switch (cur_dance(state)) {
case SINGLE_TAP:
tap_code16(C(KC_END));
break;
case DOUBLE_TAP:
tap_code16(C(KC_HOME));
break;
}
}
int kp_state = 0;
void kp_finished(qk_tap_dance_state_t *state, void *user_data) {
kp_state = hold_cur_dance(state);
switch (kp_state) {
case SINGLE_TAP:
tap_code(KC_SPC);
break;
default:
layer_invert(_KP);
break;
}
}
void kp_reset(qk_tap_dance_state_t *state, void *user_data) {
switch (kp_state) {
case SINGLE_HOLD:
case DOUBLE_HOLD:
case TRIPLE_HOLD:
layer_invert(_KP);
break;
}
}
enum {
TD_LDCTL,
TD_G,
TD_KP,
};
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_LDCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctl_finished, ctl_reset),
[TD_G] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, g_finished, NULL),
[TD_KP] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, kp_finished, kp_reset),
};
// Layers
const uint16_t PROGMEM keymaps[_LAYER_MAX][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT(
KC_ESC, 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_GRV,
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,
MY_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, MO(_ADJUST),
TD(TD_LDCTL), MY_GUI, MY_ALT, MY_BSPC, TD(TD_KP), MY_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
),
[_RPT] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
[_GAME] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, KC_LALT, KC_SPC, KC_LALT, _______, _______, _______, _______, _______, _______
),
[_FUNC] = LAYOUT(
KC_GRV, 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_DEL, KC_F13,
_______, _______, FW_WRD, KB_EOL, TG(_RPT), _______, KB_COPY, KC_PGUP, _______, _______, KB_PASTE, KC_SLCK, _______, MY_CALC,
_______, KB_BOL, _______, KC_PGDN, _______, TD(TD_G), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______,
_______, _______, KC_DEL, _______, _______, BK_WRD, _______, _______, _______, _______, _______, _______, KC_NO,
_______, MY_RGUI, MY_RALT, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
),
[_KP] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, KC_KP_ASTERISK, _______, _______, _______, _______, _______, _______,
KC_NUMLOCK, _______, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, _______, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_MINUS, _______, _______, _______,
_______, _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, _______, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, _______, _______,
_______, _______, _______, _______, _______, _______, _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_SLASH, _______, TG(_KP),
_______, _______, _______, _______, _______, KC_KP_0, KC_KP_DOT, _______, _______, _______, _______
),
[_ADJUST] = LAYOUT(
KC_GRV, 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_DEL, KC_F13,
_______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, _______, _______, _______, KC_PSCR, KC_SLCK, _______, KC_MUTE,
_______, RGB_RMOD, RGB_VAD, RGB_MOD, RGB_HUD, RGB_SAD, _______, _______, TG(_KP), _______, _______, _______, KC_MPLY,
_______, RGB_TOG, KB_MAKE, KB_FLSH, KB_VRSN, KB_BOOT, _______, TG_SYS, _______, _______, _______, _______, _______,
_______, MY_RGUI, MY_RALT, KC_DEL, _______, _______, _______, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT
),
};
const rgblight_segment_t PROGMEM rpt_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{8, 8, HSV_PINK}
);
const rgblight_segment_t PROGMEM game_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 1, HSV_RED},
{7, 2, HSV_RED},
{15, 1, HSV_RED}
);
const rgblight_segment_t PROGMEM func_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 8, HSV_GREEN}
);
const rgblight_segment_t PROGMEM kp_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 16, HSV_ORANGE}
);
const rgblight_segment_t PROGMEM adjust_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 16, HSV_BLUE}
);
const rgblight_segment_t PROGMEM capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{10, 4, HSV_WHITE}
);
const rgblight_segment_t PROGMEM numlock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
{0, 2, HSV_PURPLE},
{14, 2, HSV_PURPLE}
);
enum rgb_layer_index {
L_RPT,
L_GAME,
L_FUNC,
L_KP,
L_ADJUST,
L_CAPSLOCK,
L_NUMLOCK,
};
const rgblight_segment_t * const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(
[L_RPT] = rpt_layer,
[L_GAME] = game_layer,
[L_FUNC] = func_layer,
[L_KP] = kp_layer,
[L_ADJUST] = adjust_layer,
[L_CAPSLOCK] = capslock_layer,
[L_NUMLOCK] = numlock_layer
);
layer_state_t layer_state_set_keymap(layer_state_t state) {
rgblight_set_layer_state(L_RPT, layer_state_cmp(state, _RPT));
rgblight_set_layer_state(L_GAME, layer_state_cmp(state, _GAME));
rgblight_set_layer_state(L_FUNC, layer_state_cmp(state, _FUNC));
rgblight_set_layer_state(L_KP, layer_state_cmp(state, _KP));
rgblight_set_layer_state(L_ADJUST, layer_state_cmp(state, _ADJUST));
rgblight_set_layer_state(L_CAPSLOCK, CAPSLOCK_ON);
rgblight_set_layer_state(L_NUMLOCK, NUMLOCK_ON && layer_state_cmp(state, _KP));
if (layer_state_cmp(state, _GAME) || layer_state_cmp(state, _RPT))
autoshift_disable();
else
autoshift_enable();
return state;
}
bool led_update_user(led_t led_state) {
rgblight_set_layer_state(L_CAPSLOCK, led_state.caps_lock);
rgblight_set_layer_state(L_NUMLOCK, led_state.num_lock && layer_state_is(_KP));
return true;
}
void keyboard_post_init_keymap(void) {
rgblight_layers = my_rgb_layers;
rgb_was_enabled = rgblight_is_enabled();
bspc_timer = 0;
}
LEADER_EXTERNS();
void matrix_scan_keymap(void) {
if (rgblight_is_enabled() && timer_elapsed(rgb_timer) > 1000) {
rgb_idle_seconds++;
rgb_timer = timer_read();
}
if (rgb_idle_seconds > IDLE_TIMEOUT) {
rgb_was_enabled = rgblight_is_enabled();
rgblight_disable_noeeprom();
rgb_idle_seconds = 0;
}
// if MY_BSPC is held down too long, pretend like it wasn't and start
// pressing backspace
if (bspc_timer > 0 && timer_elapsed(bspc_timer) > LEADER_TIMEOUT) {
layer_off(_FUNC);
bspc_timer = 0;
register_code(KC_BSPC);
}
LEADER_DICTIONARY() {
leading = false;
leader_end();
SEQ_ONE_KEY(KC_R) {
layer_invert(_RPT);
}
SEQ_ONE_KEY(KC_G) {
layer_invert(_GAME);
}
SEQ_ONE_KEY(KC_K) {
layer_invert(_KP);
}
SEQ_ONE_KEY(KC_KP_5) {
layer_invert(_KP);
}
SEQ_TWO_KEYS(KC_SCLN, KC_1) {
send_secret_string(0);
}
SEQ_TWO_KEYS(KC_SCLN, KC_2) {
send_secret_string(1);
}
SEQ_TWO_KEYS(KC_SCLN, KC_3) {
send_secret_string(2);
}
SEQ_TWO_KEYS(KC_SCLN, KC_4) {
send_secret_string(3);
}
SEQ_TWO_KEYS(KC_SCLN, KC_5) {
send_secret_string(4);
}
SEQ_TWO_KEYS(KC_SCLN, KC_6) {
send_secret_string(5);
}
SEQ_TWO_KEYS(KC_SCLN, KC_M) {
send_secret_string(0);
}
SEQ_TWO_KEYS(KC_SCLN, KC_COMM) {
send_secret_string(1);
}
SEQ_TWO_KEYS(KC_SCLN, KC_DOT) {
send_secret_string(2);
}
SEQ_TWO_KEYS(KC_SCLN, KC_J) {
send_secret_string(3);
}
SEQ_TWO_KEYS(KC_SCLN, KC_K) {
send_secret_string(4);
}
SEQ_TWO_KEYS(KC_SCLN, KC_L) {
send_secret_string(5);
}
SEQ_ONE_KEY(KC_C) {
tap_code16(C(KC_C));
}
}
}
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
static bool bspc_del = false;
static bool bspc_initiated_func = false;
bool rc = true;
rgb_idle_seconds = 0;
if (!rgblight_is_enabled() && rgb_was_enabled)
rgblight_enable_noeeprom();
switch (keycode) {
case MY_BSPC:
if (record->event.pressed) {
if (IS_LAYER_ON(_FUNC)) {
// special case: if _FUNC was turned on by another key,
// treat this as KC_DEL and don't do anything else
bspc_del = true;
register_code(KC_DEL);
return false;
} else {
bspc_timer = timer_read();
bspc_initiated_func = true;
layer_on(_FUNC);
}
} else {
if (bspc_del) {
// special case: if _FUNC was turned on by another key,
// treat this as KC_DEL and don't do anything else
unregister_code(KC_DEL);
bspc_del = false;
return false;
}
if (bspc_initiated_func) {
layer_off(_FUNC);
bspc_initiated_func = false;
}
if (bspc_timer > 0) {
// here the key was pressed and released before the timer
// expired, so treat as a backspace tap and pretend we
// never activated _FUNC
bspc_timer = 0;
tap_code(KC_BSPC);
} else {
// the timer went off, so KC_BSPC was registered in
// matrix_scan_keymap. unregister it now
unregister_code(KC_BSPC);
}
}
return false; // special case, return now without resetting timer
// other paths should set rc and break
break;
}
// if something was pressed while MY_BSPC was held down, keep it pressed by
// disabling the timer
bspc_timer = 0;
return rc;
}

View file

@ -0,0 +1,8 @@
LEADER_ENABLE = yes
MOUSEKEY_ENABLE = yes
CONSOLE_ENABLE = no
NKRO_ENABLE = no
TAP_DANCE_ENABLE = yes
AUTO_SHIFT_ENABLE = yes
LTO_ENABLE = yes
USER_NAME := jdelkins

View file

@ -0,0 +1,23 @@
/*
Copyright 2020 Joel Elkins <joel@elkins.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#define RGB_MATRIX_STARTUP_SPD 20
#define AUTO_SHIFT_TIMEOUT 160
#define LEADER_TIMEOUT 400
#define LEADER_PER_KEY_TIMING

View file

@ -0,0 +1,504 @@
/*
Copyright 2020 Joel Elkins <joel@elkins.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "jdelkins.h"
#include "print.h"
// Idle handling
#define IDLE_TIMEOUT 360
#define _LAYERS _RPT
uint16_t rgb_idle_seconds = 0;
uint16_t rgb_timer;
uint8_t save_layer;
// Macro keycodes
enum alt_keycodes {
U_T_AUTO = USER_SAFE_RANGE, //USB Extra Port Toggle Auto Detect / Always Active
U_T_AGCR, //USB Toggle Automatic GCR control
DBG_TOG, //DEBUG Toggle On / Off
DBG_MTRX, //DEBUG Toggle Matrix Prints
DBG_KBD, //DEBUG Toggle Keyboard Prints
DBG_MOU, //DEBUG Toggle Mouse Prints
};
// Tap Dance
int ctl_state = 0;
void ctl_finished(qk_tap_dance_state_t *state, void *user_data) {
ctl_state = cur_dance(state);
switch(ctl_state) {
case SINGLE_TAP: qk_leader_start(); break;
case SINGLE_HOLD: register_code(KC_LCTL); break;
case DOUBLE_TAP: tap_code(KC_RCTL); break;
case DOUBLE_HOLD: register_code(KC_RCTL); break;
case TRIPLE_TAP: tap_code(KC_RCTL); tap_code(KC_RCTL); break;
case TRIPLE_HOLD: tap_code(KC_RCTL); register_code(KC_RCTL); break;
}
}
void ctl_reset(qk_tap_dance_state_t *state, void *user_data) {
switch(ctl_state) {
case SINGLE_HOLD: unregister_code(KC_LCTL); break;
case DOUBLE_HOLD:
case TRIPLE_HOLD: unregister_code(KC_RCTL); break;
}
ctl_state = 0;
}
void g_finished(qk_tap_dance_state_t *state, void *user_data) {
switch (cur_dance(state)) {
case SINGLE_TAP:
tap_code16(C(KC_END));
break;
case DOUBLE_TAP:
tap_code16(C(KC_HOME));
break;
}
}
enum {
TD_LDCTL,
TD_GUI,
TD_G,
};
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_LDCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctl_finished, ctl_reset),
[TD_GUI] = ACTION_TAP_DANCE_DOUBLE(KC_LGUI, KC_RGUI),
[TD_G] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, g_finished, NULL),
};
// Layers
const uint16_t PROGMEM keymaps[_LAYER_MAX][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT(
KC_GESC, 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_DEL,
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_HOME,
MY_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_PGUP,
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_UP, KC_PGDN,
TD(TD_LDCTL), TD(TD_GUI), KC_LALT, MY_SPC, KC_RALT, MO(_ADJUST),KC_LEFT, KC_DOWN, KC_RGHT
),
[_GAME] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_LCTL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC_NO, _______, KC_SPC, _______, _______, _______, _______, _______
),
[_FUNC] = LAYOUT(
KC_GRV, 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_DEL, KC_INS,
_______, _______, FW_WRD, KC_END, _______, _______, C(KC_INS),KC_PGUP, _______, _______, S(KC_INS),KC_SLCK, KC_PAUS, KC_CALC, KC_END,
_______, KC_HOME, _______, KC_PGDN, _______, TD(TD_G), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______, _______,
_______, _______, KC_DEL, _______, _______, BK_WRD, _______, _______, _______, _______, _______, _______, KC_PGUP, _______,
_______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END
),
[_LAYERS] = LAYOUT(
KC_NO, TO(_QWERTY),TO(_GAME), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, _______, KC_NO, KC_NO, KC_NO
),
[_KP] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, KC_KP_ASTERISK, _______, _______, _______, _______, _______, _______,
KC_NUMLOCK, KC_KP_7, KC_KP_8, KC_KP_9, _______, _______, _______, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_MINUS, _______, _______, _______, _______,
_______, KC_KP_4, KC_KP_5, KC_KP_6, _______, _______, _______, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, _______, _______, _______,
_______, KC_KP_1, KC_KP_2, KC_KP_3, _______, _______, _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_SLASH, _______, _______, _______,
_______, _______, _______, KC_KP_0, KC_KP_DOT, TG(_KP), _______, _______, _______
),
[_SECRETS] = LAYOUT(
KC_NO, KC_SEC1, KC_SEC2, KC_SEC3, KC_SEC4, KC_SEC5, KC_SEC6, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, _______, KC_NO, KC_NO, KC_NO
),
[_ADJUST] = LAYOUT(
KC_GRV, 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_F13, KC_INS,
_______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, U_T_AUTO,U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, KC_CALC, KC_END,
_______, RGB_RMOD,RGB_VAD, RGB_MOD, RGB_HUD, RGB_SAD, _______, _______, TG(_KP), OSL(_LAYERS), OSL(_SECRETS), _______, _______, KC_MPLY,
_______, RGB_TOG, KB_MAKE, KB_FLSH, KB_VRSN, KB_BOOT, NK_TOGG, DBG_TOG, _______, _______, _______, _______, KC_VOLU, KC_MUTE,
_______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT
),
/*
[X] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______
),
*/
};
#ifdef _______
#undef _______
#endif
#define RGB_NULL 254, 254, 254
#define RGB_IS_NULL(rgb) ((rgb).r == 254 && (rgb).g == 254 && (rgb).b == 254)
#define DEFAULT_HSV 255, 255, 128
#define R(COL) { RGB_ ## COL }
#define _______ R(NULL)
#define xxxxxxx R(BLACK)
struct layer_rgb PROGMEM rgbs[_LAYER_MAX] = {
[_QWERTY] = LAYOUT_hsv(LED_FLAG_ALL, RGB_MATRIX_CYCLE_ALL, DEFAULT_HSV),
[_GAME] = LAYOUT_hsv(LED_FLAG_KEYLIGHT, RGB_MATRIX_SOLID_COLOR, DEFAULT_HSV),
[_FUNC] = LAYOUT_rgb(LED_FLAG_KEYLIGHT, RGB_LINK_TO_LAYER(_QWERTY),
R(BLUE), R(RED), R(RED), R(RED), R(RED), R(RED), R(RED), R(RED), R(RED), R(RED), R(RED), R(RED), R(RED), R(RED), R(BLUE),
R(BLUE), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, R(BLUE),
R(BLUE), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, R(BLUE),
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
R(BLUE), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, R(BLUE),
R(BLUE), _______, _______, _______, _______, _______, _______, _______, _______, _______, R(BLUE),
R(BLUE), R(RED), R(RED), R(RED), R(RED), R(RED), R(RED), R(RED), R(RED), R(RED), R(RED), R(RED), R(RED), R(RED), R(BLUE)
),
[_LAYERS] = LAYOUT_rgb(LED_FLAG_NONE, RGB_MATRIX_SOLID_COLOR,
R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN),
R(CYAN), xxxxxxx, R(RED), R(GREEN), xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, R(CYAN),
R(CYAN), xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, R(CYAN),
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
R(CYAN), xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, R(CYAN),
R(CYAN), xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, R(CYAN),
R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN), R(CYAN)
),
[_KP] = LAYOUT_rgb(LED_FLAG_NONE, RGB_MATRIX_SOLID_COLOR,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, R(GREEN), xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, R(YELLOW),xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, xxxxxxx, R(WHITE), R(WHITE), R(WHITE), xxxxxxx, xxxxxxx, xxxxxxx, R(WHITE), R(WHITE), R(WHITE), R(YELLOW), xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, R(WHITE), R(WHITE), R(WHITE), xxxxxxx, xxxxxxx, xxxxxxx, R(WHITE), R(WHITE), R(WHITE), R(YELLOW), xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, xxxxxxx, R(WHITE), R(WHITE), R(WHITE), xxxxxxx, xxxxxxx, xxxxxxx, R(WHITE), R(WHITE), R(WHITE), R(YELLOW), xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, R(WHITE), R(YELLOW), R(GREEN), xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx
),
[_SECRETS] = LAYOUT_rgb(LED_FLAG_NONE, RGB_MATRIX_SOLID_COLOR,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, xxxxxxx, R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx,
xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx
),
[_ADJUST] = LAYOUT_rgb(LED_FLAG_NONE, RGB_MATRIX_SOLID_COLOR,
R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN),
R(GREEN), xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, R(GREEN),
R(GREEN), xxxxxxx, R(BLUE), R(YELLOW), R(BLUE), R(GREEN), R(ORANGE),xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, R(GREEN),
xxxxxxx, R(MAGENTA),R(YELLOW), R(MAGENTA),R(GREEN),R(ORANGE),xxxxxxx, xxxxxxx, R(CORAL), R(CORAL), R(CORAL), xxxxxxx, xxxxxxx, xxxxxxx,
R(GREEN), xxxxxxx, R(WHITE), R(CYAN), R(CYAN), R(CYAN), R(CYAN), xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, R(GREEN),
R(GREEN), xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, R(GREEN),
R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN)
),
/*
[X] = LAYOUT_rgb(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
*/
};
#undef _______
#define _______ KC_TRANS
static void set_rgb_layer(int layer) {
const struct layer_rgb *cur = &rgbs[layer];
switch (cur->type) {
case type_hsv:
for (uint8_t i = 0; i < DRIVER_LED_TOTAL ; i++) {
if (!(g_led_config.flags[i] & cur->flags))
rgb_matrix_set_color(i, 0, 0, 0);
}
rgb_matrix_set_flags(cur->flags);
if (cur->mode >= RGB_MATRIX_EFFECT_MAX)
rgb_matrix_mode_noeeprom(rgbs[cur->mode - RGB_MATRIX_EFFECT_MAX].mode);
else
rgb_matrix_mode_noeeprom(cur->mode);
rgb_matrix_sethsv_noeeprom(cur->hsv.h, cur->hsv.s, cur->hsv.v);
break;
case type_rgb:
rgb_matrix_set_flags(cur->flags);
if (cur->mode >= RGB_MATRIX_EFFECT_MAX)
rgb_matrix_mode_noeeprom(rgbs[cur->mode - RGB_MATRIX_EFFECT_MAX].mode);
else
rgb_matrix_mode_noeeprom(cur->mode);
for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) {
const RGB *m = &cur->rgb[i];
if (!RGB_IS_NULL(*m))
rgb_matrix_set_color(i, m->r, m->g, m->b);
}
break;
}
}
// Runs just one time when the keyboard initializes.
void matrix_init_keymap(void) {
// force numlock on upon startup
if (!NUMLOCK_ON) {
tap_code(KC_NUMLOCK);
}
};
LEADER_EXTERNS();
// Runs constantly in the background, in a loop.
void matrix_scan_keymap(void) {
if (rgb_matrix_get_flags() != LED_FLAG_NONE && timer_elapsed(rgb_timer) > 1000) {
rgb_idle_seconds++;
rgb_timer = timer_read();
}
if (rgb_idle_seconds > IDLE_TIMEOUT) {
rgb_matrix_disable_noeeprom();
rgb_idle_seconds = 0;
}
if (IS_LAYER_ON(_KP)) {
if (NUMLOCK_ON)
rgb_matrix_set_color(15, RGB_GOLD);
else
rgb_matrix_set_color(15, 0, 0, 0);
}
LEADER_DICTIONARY() {
leading = false;
leader_end();
SEQ_ONE_KEY(KC_K) {
layer_invert(_KP);
}
SEQ_ONE_KEY(KC_G) {
layer_invert(_GAME);
}
SEQ_ONE_KEY(KC_KP_5) {
layer_invert(_KP);
}
SEQ_TWO_KEYS(KC_SCLN, KC_1) {
send_secret_string(0);
}
SEQ_TWO_KEYS(KC_SCLN, KC_2) {
send_secret_string(1);
}
SEQ_TWO_KEYS(KC_SCLN, KC_3) {
send_secret_string(2);
}
SEQ_TWO_KEYS(KC_SCLN, KC_4) {
send_secret_string(3);
}
SEQ_TWO_KEYS(KC_SCLN, KC_5) {
send_secret_string(4);
}
SEQ_TWO_KEYS(KC_SCLN, KC_6) {
send_secret_string(5);
}
SEQ_TWO_KEYS(KC_SCLN, KC_M) {
send_secret_string(0);
}
SEQ_TWO_KEYS(KC_SCLN, KC_COMM) {
send_secret_string(1);
}
SEQ_TWO_KEYS(KC_SCLN, KC_DOT) {
send_secret_string(2);
}
SEQ_TWO_KEYS(KC_SCLN, KC_J) {
send_secret_string(3);
}
SEQ_TWO_KEYS(KC_SCLN, KC_K) {
send_secret_string(4);
}
SEQ_TWO_KEYS(KC_SCLN, KC_L) {
send_secret_string(5);
}
}
};
layer_state_t layer_state_set_keymap(layer_state_t state) {
dprintf("layer: %d\n", get_highest_layer(state));
set_rgb_layer(get_highest_layer(state));
#ifdef AUTO_SHIFT_ENABLE
autoshift_enable();
#endif
if (layer_state_cmp(state, _GAME)) {
save_layer = _GAME;
#ifdef AUTO_SHIFT_ENABLE
autoshift_disable();
#endif
}
else if (layer_state_cmp(state, _QWERTY))
save_layer = _QWERTY;
return state;
}
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
struct layer_rgb *rgb_base_layer = &rgbs[save_layer];
rgb_idle_seconds = 0;
rgb_matrix_enable_noeeprom();
switch (keycode) {
// custom handle KC_GESC to emulate auto shift on it
case KC_GESC:
#ifdef AUTO_SHIFT_ENABLE
if (get_autoshift_state()) {
static uint16_t gesc_timer;
if (record->event.pressed)
gesc_timer = timer_read();
else {
if (timer_elapsed(gesc_timer) > AUTO_SHIFT_TIMEOUT || MODS_SHIFT) {
tap_code16(S(KC_GRV));
} else if (MODS_GUI)
tap_code(KC_GRV);
else
tap_code(KC_ESC);
}
return false;
}
#else // AUTO_SHIFT_ENABLE
return true;
#endif // AUTO_SHIFT_ENABLE
break;
case U_T_AUTO:
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode");
}
return false;
case U_T_AGCR:
if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
}
return false;
case DBG_TOG:
if (record->event.pressed) {
TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode");
}
return false;
case DBG_MTRX:
if (record->event.pressed) {
TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix");
}
return false;
case DBG_KBD:
if (record->event.pressed) {
TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard");
}
return false;
case DBG_MOU:
if (record->event.pressed) {
TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse");
}
return false;
case RGB_MOD:
if (record->event.pressed) {
if (++rgb_base_layer->mode >= RGB_MATRIX_EFFECT_MAX)
rgb_base_layer->mode = RGB_MATRIX_NONE;
set_rgb_layer(save_layer);
}
return false;
case RGB_RMOD:
if (record->event.pressed) {
if (--rgb_base_layer->mode <= RGB_MATRIX_NONE)
rgb_base_layer->mode = RGB_MATRIX_EFFECT_MAX - 1;
set_rgb_layer(save_layer);
}
return false;
case RGB_HUI:
if (rgb_base_layer->type == type_hsv && record->event.pressed) {
if (rgb_base_layer->hsv.h > 235)
rgb_base_layer->hsv.h = 255;
else
rgb_base_layer->hsv.h += 20;
}
set_rgb_layer(save_layer);
return false;
case RGB_HUD:
if (rgb_base_layer->type == type_hsv && record->event.pressed) {
if (rgb_base_layer->hsv.h < 20)
rgb_base_layer->hsv.h = 0;
else
rgb_base_layer->hsv.h -= 20;
}
set_rgb_layer(save_layer);
return false;
case RGB_SAI:
if (rgb_base_layer->type == type_hsv && record->event.pressed) {
if (rgb_base_layer->hsv.s > 235)
rgb_base_layer->hsv.s = 255;
else
rgb_base_layer->hsv.s += 20;
}
set_rgb_layer(save_layer);
return false;
case RGB_SAD:
if (rgb_base_layer->type == type_hsv && record->event.pressed) {
if (rgb_base_layer->hsv.s < 20)
rgb_base_layer->hsv.s = 0;
else
rgb_base_layer->hsv.s -= 20;
}
set_rgb_layer(save_layer);
return false;
case RGB_VAI:
if (rgb_base_layer->type == type_hsv && record->event.pressed) {
if (rgb_base_layer->hsv.v > 235)
rgb_base_layer->hsv.v = 255;
else
rgb_base_layer->hsv.v += 20;
}
set_rgb_layer(save_layer);
return false;
case RGB_VAD:
if (rgb_base_layer->type == type_hsv && record->event.pressed) {
if (rgb_base_layer->hsv.v < 20)
rgb_base_layer->hsv.v = 0;
else
rgb_base_layer->hsv.v -= 20;
}
set_rgb_layer(save_layer);
return false;
case RGB_TOG:
if (record->event.pressed) {
switch (rgb_base_layer->flags) {
case LED_FLAG_ALL:
rgb_base_layer->flags = LED_FLAG_KEYLIGHT;
break;
case LED_FLAG_KEYLIGHT:
rgb_base_layer->flags = LED_FLAG_UNDERGLOW;
break;
case LED_FLAG_UNDERGLOW:
rgb_base_layer->flags = LED_FLAG_NONE;
break;
default:
rgb_base_layer->flags = LED_FLAG_ALL;
break;
}
}
set_rgb_layer(save_layer);
return false;
default:
return true; //Process all other keycodes normally
}
return true;
}

View file

@ -0,0 +1,94 @@
/*
Copyright 2020 Joel Elkins <joel@elkins.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
/* RGB LED Layout on the Massdrop ALT
*
*
*
* 100 99 98 97 96 95 94 93 92 91 90 89 88
* 101 87 |
*
*
* ` 1 2 3 4 5 6 7 8 9 0 - = BackSpace Home
* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
* 102 86
*
* Tab Q W E R T Y U I O P [ ] \ Del
* 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
* 103 85
*
* Ctrl/Esc A S D F G H J K L ; ' Return PgUp
* 31 32 33 34 35 36 37 38 39 40 41 42 43 44
* 104 84
*
* Shift Z X C V B N M , . / Shift Up PgDn
* 45 46 47 48 49 50 51 52 53 54 55 56 57 58
* 105 83
*
* Ctrl GUI Alt Space Alt Func Left Down Right
* 59 60 61 62 63 64 65 66 67
*
* 68 82
* 69 70 71 72 73 74 75 76 77 78 79 80 81
*
*
*/
enum layer_rgb_type {
type_hsv,
type_rgb,
};
#define RGB_LINK_TO_LAYER(layer) (layer + RGB_MATRIX_EFFECT_MAX)
struct layer_rgb {
uint8_t type;
led_flags_t flags;
uint8_t mode;
union {
HSV hsv;
RGB rgb[DRIVER_LED_TOTAL];
};
};
#define LAYOUT_rgb(_flags, _mode, \
R101, R100, R99, R98, R97, R96, R95, R94, R93, R92, R91, R90, R89, R88, R87, \
R102, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R86, \
R103, R16, R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R30, R85, \
R31, R32, R33, R34, R35, R36, R37, R38, R39, R40, R41, R42, R43, R44, \
R104, R45, R46, R47, R48, R49, R50, R51, R52, R53, R54, R55, R56, R57, R58, R84, \
R105, R59, R60, R61, R62, R63, R64, R65, R66, R67, R83, \
R68, R69, R70, R71, R72, R73, R74, R75, R76, R77, R78, R79, R80, R81, R82 \
) (struct layer_rgb) { .type = type_rgb, .flags = _flags, .mode = _mode, .rgb = { \
R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R21, \
R22, R23, R24, R25, R26, R27, R28, R29, R30, R31, R32, R33, R34, R35, R36, R37, R38, R39, R40, \
R41, R42, R43, R44, R45, R46, R47, R48, R49, R50, R51, R52, R53, R54, R55, R56, R57, R58, R59, \
R60, R61, R62, R63, R64, R65, R66, R67, R68, R69, R70, R71, R72, R73, R74, R75, R76, R77, R78, \
R79, R80, R81, R82, R83, R84, R85, R86, R87, R88, R89, R90, R91, R92, R93, R94, R95, R96, R97, \
R98, R99, R100, R101, R102, R103, R104, R105 \
}}
#define LAYOUT_hsv(_flags, _mode, _hsv) \
(struct layer_rgb) { \
.type = type_hsv, \
.flags = _flags, \
.mode = _mode, \
.hsv = {_hsv} \
}

View file

@ -0,0 +1,17 @@
ifeq ($(OS),Windows_NT)
PROGRAM_CMD = bin/mdloader_windows --first --download $(TARGET).hex --restart
else
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Darwin)
PROGRAM_CMD = bin/mdloader_mac --first --download $(TARGET).hex --restart
else
PROGRAM_CMD = sudo bin/mdloader_linux --first --download $(TARGET).hex --restart
endif
endif
LEADER_ENABLE = yes
MOUSEKEY_ENABLE = no
CONSOLE_ENABLE = no
NKRO_ENABLE = no
TAP_DANCE_ENABLE = yes
AUTO_SHIFT_ENABLE = no

View file

@ -0,0 +1,20 @@
/*
Copyright 2020 Joel Elkins <joel@elkins.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#define RGB_MATRIX_STARTUP_SPD 20

View file

@ -0,0 +1,280 @@
/*
Copyright 2020 Joel Elkins <joel@elkins.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
#include "print.h"
// Idle handling
#define IDLE_TIMEOUT 360
uint16_t rgb_idle_seconds = 0;
uint16_t rgb_timer;
uint8_t save_layer;
#define NUMLOCK_ON (host_keyboard_leds() & (1<<USB_LED_NUM_LOCK))
#define MODS_SHIFT (get_mods() & MOD_MASK_SHIFT)
#define MODS_CTRL (get_mods() & MOD_MASK_CTRL)
// Macro keycodes
enum alt_keycodes {
KB_BOOT = SAFE_RANGE,
};
enum layers {
_QWERTY,
_ADJUST,
};
// Layers
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT(
KC_GESC, 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_DEL,
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_HOME,
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_PGUP,
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_UP, KC_PGDN,
KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RALT, MO(_ADJUST),KC_LEFT, KC_DOWN, KC_RGHT
),
[_ADJUST] = LAYOUT(
KC_GRV, 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_F13, KC_INS,
_______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_CALC, KC_END,
_______, RGB_RMOD,RGB_VAD, RGB_MOD, RGB_HUD, RGB_SAD, _______, _______, _______, _______, _______, _______, _______, KC_MPLY,
_______, RGB_TOG, _______, _______, _______, KB_BOOT, _______, _______, _______, _______, _______, _______, KC_VOLU, KC_MUTE,
_______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT
),
/*
[X] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______
),
*/
};
#ifdef _______
#undef _______
#endif
#define RGB_NULL 254, 254, 254
#define RGB_IS_NULL(rgb) ((rgb).r == 254 && (rgb).g == 254 && (rgb).b == 254)
#define DEFAULT_HSV 255, 255, 128
#define R(COL) { RGB_ ## COL }
#define _______ R(NULL)
#define xxxxxxx R(BLACK)
struct layer_rgb PROGMEM rgbs[] = {
[_QWERTY] = LAYOUT_hsv(LED_FLAG_ALL, RGB_MATRIX_CYCLE_ALL, DEFAULT_HSV),
[_ADJUST] = LAYOUT_rgb(LED_FLAG_NONE, RGB_MATRIX_SOLID_COLOR,
R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN),
R(GREEN), R(WHITE), R(WHITE), R(WHITE), R(WHITE), R(WHITE), R(WHITE), R(WHITE), R(WHITE), R(WHITE), R(WHITE), R(WHITE), R(WHITE), R(WHITE), R(WHITE), R(WHITE), R(GREEN),
R(GREEN), xxxxxxx, R(BLUE), R(YELLOW), R(BLUE), R(GREEN), R(ORANGE),xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, R(GREEN),
xxxxxxx, R(MAGENTA),R(YELLOW), R(MAGENTA),R(GREEN),R(ORANGE),xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, R(BLUE),
R(GREEN), xxxxxxx, R(WHITE), xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, R(YELLOW),R(ORANGE), R(GREEN),
R(GREEN), xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, xxxxxxx, R(RED), R(YELLOW),R(RED), R(GREEN),
R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN), R(GREEN)
),
/*
[X] = LAYOUT_rgb(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
*/
};
#undef _______
#define _______ KC_TRANS
static void set_rgb_layer(int layer) {
const struct layer_rgb *cur = &rgbs[layer];
switch (cur->type) {
case type_hsv:
for (uint8_t i = 0; i < DRIVER_LED_TOTAL ; i++) {
if (!(g_led_config.flags[i] & cur->flags))
rgb_matrix_set_color(i, 0, 0, 0);
}
rgb_matrix_set_flags(cur->flags);
if (cur->mode >= RGB_MATRIX_EFFECT_MAX)
rgb_matrix_mode_noeeprom(rgbs[cur->mode - RGB_MATRIX_EFFECT_MAX].mode);
else
rgb_matrix_mode_noeeprom(cur->mode);
rgb_matrix_sethsv_noeeprom(cur->hsv.h, cur->hsv.s, cur->hsv.v);
break;
case type_rgb:
rgb_matrix_set_flags(cur->flags);
if (cur->mode >= RGB_MATRIX_EFFECT_MAX)
rgb_matrix_mode_noeeprom(rgbs[cur->mode - RGB_MATRIX_EFFECT_MAX].mode);
else
rgb_matrix_mode_noeeprom(cur->mode);
for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) {
const RGB *m = &cur->rgb[i];
if (!RGB_IS_NULL(*m))
rgb_matrix_set_color(i, m->r, m->g, m->b);
}
break;
}
}
// Runs just one time when the keyboard initializes.
void matrix_init_keymap(void) {
set_rgb_layer(_QWERTY);
// force numlock on upon startup
if (!NUMLOCK_ON) {
tap_code(KC_NUMLOCK);
}
};
// Runs constantly in the background, in a loop.
void matrix_scan_keymap(void) {
if (rgb_matrix_get_flags() != LED_FLAG_NONE && timer_elapsed(rgb_timer) > 1000) {
rgb_idle_seconds++;
rgb_timer = timer_read();
}
if (rgb_idle_seconds > IDLE_TIMEOUT) {
rgb_matrix_disable_noeeprom();
rgb_idle_seconds = 0;
}
};
layer_state_t layer_state_set_keymap(layer_state_t state) {
set_rgb_layer(get_highest_layer(state));
if (layer_state_cmp(state, _QWERTY))
save_layer = _QWERTY;
return state;
}
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
static uint32_t boot_timer;
struct layer_rgb *rgb_base_layer = &rgbs[save_layer];
rgb_idle_seconds = 0;
rgb_matrix_enable_noeeprom();
switch (keycode) {
case KB_BOOT:
if (!get_mods()) {
if (record->event.pressed) {
boot_timer = timer_read32();
} else {
if (timer_elapsed32(boot_timer) >= 750) {
reset_keyboard();
}
}
return false;
}
break;
case RGB_MOD:
if (record->event.pressed) {
if (++rgb_base_layer->mode >= RGB_MATRIX_EFFECT_MAX)
rgb_base_layer->mode = RGB_MATRIX_NONE;
set_rgb_layer(save_layer);
}
return false;
case RGB_RMOD:
if (record->event.pressed) {
if (--rgb_base_layer->mode <= RGB_MATRIX_NONE)
rgb_base_layer->mode = RGB_MATRIX_EFFECT_MAX - 1;
set_rgb_layer(save_layer);
}
return false;
case RGB_HUI:
if (rgb_base_layer->type == type_hsv && record->event.pressed) {
if (rgb_base_layer->hsv.h > 235)
rgb_base_layer->hsv.h = 255;
else
rgb_base_layer->hsv.h += 20;
}
set_rgb_layer(save_layer);
return false;
case RGB_HUD:
if (rgb_base_layer->type == type_hsv && record->event.pressed) {
if (rgb_base_layer->hsv.h < 20)
rgb_base_layer->hsv.h = 0;
else
rgb_base_layer->hsv.h -= 20;
}
set_rgb_layer(save_layer);
return false;
case RGB_SAI:
if (rgb_base_layer->type == type_hsv && record->event.pressed) {
if (rgb_base_layer->hsv.s > 235)
rgb_base_layer->hsv.s = 255;
else
rgb_base_layer->hsv.s += 20;
}
set_rgb_layer(save_layer);
return false;
case RGB_SAD:
if (rgb_base_layer->type == type_hsv && record->event.pressed) {
if (rgb_base_layer->hsv.s < 20)
rgb_base_layer->hsv.s = 0;
else
rgb_base_layer->hsv.s -= 20;
}
set_rgb_layer(save_layer);
return false;
case RGB_VAI:
if (rgb_base_layer->type == type_hsv && record->event.pressed) {
if (rgb_base_layer->hsv.v > 235)
rgb_base_layer->hsv.v = 255;
else
rgb_base_layer->hsv.v += 20;
}
set_rgb_layer(save_layer);
return false;
case RGB_VAD:
if (rgb_base_layer->type == type_hsv && record->event.pressed) {
if (rgb_base_layer->hsv.v < 20)
rgb_base_layer->hsv.v = 0;
else
rgb_base_layer->hsv.v -= 20;
}
set_rgb_layer(save_layer);
return false;
case RGB_TOG:
if (record->event.pressed) {
switch (rgb_base_layer->flags) {
case LED_FLAG_ALL:
rgb_base_layer->flags = LED_FLAG_KEYLIGHT;
break;
case LED_FLAG_KEYLIGHT:
rgb_base_layer->flags = LED_FLAG_UNDERGLOW;
break;
case LED_FLAG_UNDERGLOW:
rgb_base_layer->flags = LED_FLAG_NONE;
break;
default:
rgb_base_layer->flags = LED_FLAG_ALL;
break;
}
}
set_rgb_layer(save_layer);
return false;
default:
return true; //Process all other keycodes normally
}
return true;
}

View file

@ -0,0 +1,94 @@
/*
Copyright 2020 Joel Elkins <joel@elkins.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
/* RGB LED Layout on the Massdrop ALT
*
*
*
* 100 99 98 97 96 95 94 93 92 91 90 89 88
* 101 87 |
*
*
* ` 1 2 3 4 5 6 7 8 9 0 - = BackSpace Home
* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
* 102 86
*
* Tab Q W E R T Y U I O P [ ] \ Del
* 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
* 103 85
*
* Ctrl/Esc A S D F G H J K L ; ' Return PgUp
* 31 32 33 34 35 36 37 38 39 40 41 42 43 44
* 104 84
*
* Shift Z X C V B N M , . / Shift Up PgDn
* 45 46 47 48 49 50 51 52 53 54 55 56 57 58
* 105 83
*
* Ctrl GUI Alt Space Alt Func Left Down Right
* 59 60 61 62 63 64 65 66 67
*
* 68 82
* 69 70 71 72 73 74 75 76 77 78 79 80 81
*
*
*/
enum layer_rgb_type {
type_hsv,
type_rgb,
};
#define RGB_LINK_TO_LAYER(layer) (layer + RGB_MATRIX_EFFECT_MAX)
struct layer_rgb {
uint8_t type;
led_flags_t flags;
uint8_t mode;
union {
HSV hsv;
RGB rgb[DRIVER_LED_TOTAL];
};
};
#define LAYOUT_rgb(_flags, _mode, \
R101, R100, R99, R98, R97, R96, R95, R94, R93, R92, R91, R90, R89, R88, R87, \
R102, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R86, \
R103, R16, R17, R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, R30, R85, \
R31, R32, R33, R34, R35, R36, R37, R38, R39, R40, R41, R42, R43, R44, \
R104, R45, R46, R47, R48, R49, R50, R51, R52, R53, R54, R55, R56, R57, R58, R84, \
R105, R59, R60, R61, R62, R63, R64, R65, R66, R67, R83, \
R68, R69, R70, R71, R72, R73, R74, R75, R76, R77, R78, R79, R80, R81, R82 \
) (struct layer_rgb) { .type = type_rgb, .flags = _flags, .mode = _mode, .rgb = { \
R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R21, \
R22, R23, R24, R25, R26, R27, R28, R29, R30, R31, R32, R33, R34, R35, R36, R37, R38, R39, R40, \
R41, R42, R43, R44, R45, R46, R47, R48, R49, R50, R51, R52, R53, R54, R55, R56, R57, R58, R59, \
R60, R61, R62, R63, R64, R65, R66, R67, R68, R69, R70, R71, R72, R73, R74, R75, R76, R77, R78, \
R79, R80, R81, R82, R83, R84, R85, R86, R87, R88, R89, R90, R91, R92, R93, R94, R95, R96, R97, \
R98, R99, R100, R101, R102, R103, R104, R105 \
}}
#define LAYOUT_hsv(_flags, _mode, _hsv) \
(struct layer_rgb) { \
.type = type_hsv, \
.flags = _flags, \
.mode = _mode, \
.hsv = {_hsv} \
}

View file

@ -0,0 +1,12 @@
ifeq ($(OS),Windows_NT)
PROGRAM_CMD = bin/mdloader_windows --first --download $(TARGET).hex --restart
else
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Darwin)
PROGRAM_CMD = bin/mdloader_mac --first --download $(TARGET).hex --restart
else
PROGRAM_CMD = sudo bin/mdloader_linux --first --download $(TARGET).hex --restart
endif
endif
USER_NAME := jdelkins

View file

@ -0,0 +1,58 @@
/* Copyright 2020 Joel Elkins
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#ifdef AUDIO_ENABLE
#define STARTUP_SONG SONG(PLANCK_SOUND)
// #define STARTUP_SONG SONG(NO_SOUND)
#define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \
SONG(COLEMAK_SOUND), \
SONG(DVORAK_SOUND) \
}
#endif
/*
* MIDI options
*/
/* Prevent use of disabled MIDI features in the keymap */
//#define MIDI_ENABLE_STRICT 1
/* enable basic MIDI features:
- MIDI notes can be sent when in Music mode is on
*/
#define MIDI_BASIC
/* enable advanced MIDI features:
- MIDI notes can be added to the keymap
- Octave shift and transpose
- Virtual sustain, portamento, and modulation wheel
- 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
#define AUTO_SHIFT_TIMEOUT 165
#define LEADER_TIMEOUT 400
#define LEADER_PER_KEY_TIMING

View file

@ -0,0 +1,423 @@
/* Copyright 2015-2017 Jack Humbert
* Portions Copyright 2020 Joel Elkins
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "jdelkins.h"
#include "muse.h"
#ifdef LAYOUT
#undef LAYOUT
#endif
#define LAYOUT LAYOUT_planck_2x2u
uint16_t bspc_timer;
enum {
MY_BSPC = USER_SAFE_RANGE,
BACKLIT,
};
// recycle unused layers defined in my userspace
#define _RAISE _FUNC
#define _LOWER _SECRETS
#define KP MO(_KP)
#define LOWER MO(_LOWER)
#define RAISE MO(_RAISE)
int ctl_state = 0;
void ctl_finished(qk_tap_dance_state_t *state, void *user_data) {
ctl_state = cur_dance(state);
switch (ctl_state) {
case SINGLE_TAP: qk_leader_start(); break;
case SINGLE_HOLD: register_code(KC_LCTL); break;
case DOUBLE_TAP: tap_code(KC_RCTL); break;
case DOUBLE_HOLD: register_code(KC_RCTL); break;
case TRIPLE_TAP: tap_code(KC_RCTL); tap_code(KC_RCTL); break;
case TRIPLE_HOLD: tap_code(KC_RCTL); register_code(KC_RCTL); break;
}
}
void ctl_reset(qk_tap_dance_state_t *state, void *user_data) {
switch (ctl_state) {
case SINGLE_HOLD: unregister_code(KC_LCTL); break;
case DOUBLE_HOLD:
case TRIPLE_HOLD: unregister_code(KC_RCTL); break;
}
ctl_state = 0;
}
void g_finished(qk_tap_dance_state_t *state, void *user_data) {
switch (cur_dance(state)) {
case SINGLE_TAP:
tap_code16(C(KC_END));
break;
case DOUBLE_TAP:
tap_code16(C(KC_HOME));
break;
}
}
int kp_state = 0;
void kp_finished(qk_tap_dance_state_t *state, void *user_data) {
kp_state = hold_cur_dance(state);
switch (kp_state) {
case SINGLE_HOLD: layer_on(_KP); break;
case DOUBLE_HOLD: layer_on(_RPT); break;
}
}
void kp_reset(qk_tap_dance_state_t *state, void *user_data) {
switch (kp_state) {
case SINGLE_HOLD: layer_off(_KP); break;
case DOUBLE_HOLD: layer_off(_RPT); break;
}
kp_state = 0;
}
enum {
TD_LDCTL,
TD_G,
TD_KP
};
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_LDCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctl_finished, ctl_reset),
[TD_G] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, g_finished, NULL),
[TD_KP] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, kp_finished, kp_reset),
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Qwerty
* ,-----------------------------------------------------------------------------------.
* | Tab | Q | W | E | R | T | Y | U | I | O | P | ` |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | A | S | D | F | G | H | J | K | L | ; | " |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | Gui | Alt |Keypad| Bksp | Space | Left | Down | Up |Right |
* `-----------------------------------------------------------------------------------'
*/
[_QWERTY] = LAYOUT(
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_GRV,
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
TD(TD_LDCTL), MO(_ADJUST), MY_GUI, MY_ALT, MY_BSPC, MY_SPC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
[_GAME] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC_NO, KC_LALT, RAISE, KC_SPC, KC_SPC, _______, _______, _______, _______
),
[_RAISE] = LAYOUT(
KC_ESC, _______, FW_WRD, KB_EOL, _______, _______, KB_COPY, KC_PGUP, _______, KC_LPRN, KC_RPRN, KC_MINS,
_______, KB_BOL, _______, KC_PGDN, _______, TD(TD_G), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, KC_BSLS,
_______, _______, KC_DEL, _______, KB_PASTE, BK_WRD, _______, _______, _______, _______, _______, KC_CALC,
_______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
),
/* Same as _QWERTY but disable autoshift */
[_RPT] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, KC_BSPC, KC_SPC, _______, _______, _______, _______
),
[_KP] = LAYOUT(
KC_NUMLOCK, KC_F9, KC_F10, KC_F11, KC_F12, KC_F13, KC_F14, KC_7, KC_8, KC_9, KC_MINS, KC_EQL,
_______, KC_F5, KC_F6, KC_F7, KC_F8, XXXXXXX, XXXXXXX, KC_4, KC_5, KC_6, KC_ASTR, _______,
_______, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX, XXXXXXX, KC_1, KC_2, KC_3, KC_SLSH, _______,
_______, _______, _______, _______, _______, _______, KC_0, KC_DOT, KC_PLUS, KC_END
),
[_LOWER] = LAYOUT(
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LBRC, KC_RBRC, KC_EQL,
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LCBR, KC_RCBR, KC_PIPE,
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_END, KC_MPLY,
_______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT
),
[_ADJUST] = LAYOUT(
_______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL,
_______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______,
_______, RGB_TOG, KB_MAKE, KB_FLSH, KB_VRSN, KB_BOOT, _______, TG_SYS, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
/* [_ADJUST] = LAYOUT( */
/* _______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL , */
/* _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______, */
/* _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, _______, */
/* _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ */
/* ) */
};
#ifdef AUDIO_ENABLE
float plover_song[][2] = SONG(PLOVER_SOUND);
float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND);
#endif
layer_state_t layer_state_set_keymap(layer_state_t state) {
if (layer_state_cmp(state, _GAME) || layer_state_cmp(state, _RPT))
autoshift_disable();
else
autoshift_enable();
return update_tri_layer_state(state, _KP, _RAISE, _LOWER);
}
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
bool rc = true;
static bool bspc_del = false;
static bool bspc_initiated_func = false;
switch (keycode) {
case MY_BSPC:
if (record->event.pressed) {
if (IS_LAYER_ON(_KP)) {
// special case: if _KP was turned on by another key,
// treat this as KC_DEL and don't do anything else
bspc_del = true;
register_code(KC_DEL);
return false;
} else {
bspc_timer = timer_read();
bspc_initiated_func = true;
layer_on(_KP);
}
} else {
if (bspc_del) {
// special case: if _KP was turned on by another key,
// treat this as KC_DEL and don't do anything else
unregister_code(KC_DEL);
bspc_del = false;
return false;
}
if (bspc_initiated_func) {
layer_off(_KP);
bspc_initiated_func = false;
}
if (bspc_timer > 0) {
// here the key was pressed and released before the timer
// expired, so treat as a backspace tap and pretend we
// never activated _KP
bspc_timer = 0;
tap_code(KC_BSPC);
} else {
// the timer went off, so KC_BSPC was registered in
// matrix_scan_keymap. unregister it now
unregister_code(KC_BSPC);
}
}
return false; // special case, return now without resetting timer
// other paths should set rc and break
break;
case BACKLIT:
if (record->event.pressed) {
register_code(KC_RSFT);
#ifdef BACKLIGHT_ENABLE
backlight_step();
#endif
} else {
unregister_code(KC_RSFT);
}
rc = false;
break;
}
bspc_timer = 0;
return rc;
}
bool muse_mode = false;
uint8_t last_muse_note = 0;
uint16_t muse_counter = 0;
uint8_t muse_offset = 70;
uint16_t muse_tempo = 50;
void encoder_update(bool clockwise) {
if (muse_mode) {
if (IS_LAYER_ON(_RAISE)) {
if (clockwise) {
muse_offset++;
} else {
muse_offset--;
}
} else {
if (clockwise) {
muse_tempo+=1;
} else {
muse_tempo-=1;
}
}
} else {
if (clockwise) {
#ifdef MOUSEKEY_ENABLE
tap_code(KC_MS_WH_DOWN);
#else
tap_code(KC_PGDN);
#endif
} else {
#ifdef MOUSEKEY_ENABLE
tap_code(KC_MS_WH_UP);
#else
tap_code(KC_PGUP);
#endif
}
}
}
void dip_switch_update_user(uint8_t index, bool active) {
switch (index) {
case 0: {
#ifdef AUDIO_ENABLE
static bool play_sound = false;
#endif
if (active) {
#ifdef AUDIO_ENABLE
if (play_sound) { PLAY_SONG(plover_song); }
#endif
layer_on(_ADJUST);
} else {
#ifdef AUDIO_ENABLE
if (play_sound) { PLAY_SONG(plover_gb_song); }
#endif
layer_off(_ADJUST);
}
#ifdef AUDIO_ENABLE
play_sound = true;
#endif
break;
}
case 1:
if (active) {
muse_mode = true;
} else {
muse_mode = false;
}
}
}
void keyboard_post_init_keymap(void) {
bspc_timer = 0;
}
LEADER_EXTERNS();
void matrix_scan_keymap(void) {
#ifdef AUDIO_ENABLE
if (muse_mode) {
if (muse_counter == 0) {
uint8_t muse_note = muse_offset + SCALE[muse_clock_pulse()];
if (muse_note != last_muse_note) {
stop_note(compute_freq_for_midi_note(last_muse_note));
play_note(compute_freq_for_midi_note(muse_note), 0xF);
last_muse_note = muse_note;
}
}
muse_counter = (muse_counter + 1) % muse_tempo;
} else {
if (muse_counter) {
stop_all_notes();
muse_counter = 0;
}
}
#endif
// if MY_BSPC is held down too long, pretend like it wasn't and start
// pressing backspace
if (bspc_timer > 0 && timer_elapsed(bspc_timer) > LEADER_TIMEOUT) {
layer_off(_KP);
bspc_timer = 0;
register_code(KC_BSPC);
}
LEADER_DICTIONARY() {
leading = false;
leader_end();
SEQ_ONE_KEY(KC_K) {
layer_invert(_KP);
}
SEQ_ONE_KEY(KC_G) {
layer_invert(_GAME);
}
SEQ_ONE_KEY(KC_KP_5) {
layer_invert(_KP);
}
SEQ_ONE_KEY(KC_5) {
layer_invert(_KP);
}
SEQ_TWO_KEYS(KC_SCLN, KC_1) {
send_secret_string(0);
}
SEQ_TWO_KEYS(KC_SCLN, KC_2) {
send_secret_string(1);
}
SEQ_TWO_KEYS(KC_SCLN, KC_3) {
send_secret_string(2);
}
SEQ_TWO_KEYS(KC_SCLN, KC_4) {
send_secret_string(3);
}
SEQ_TWO_KEYS(KC_SCLN, KC_5) {
send_secret_string(4);
}
SEQ_TWO_KEYS(KC_SCLN, KC_6) {
send_secret_string(5);
}
SEQ_TWO_KEYS(KC_SCLN, KC_M) {
send_secret_string(0);
}
SEQ_TWO_KEYS(KC_SCLN, KC_COMM) {
send_secret_string(1);
}
SEQ_TWO_KEYS(KC_SCLN, KC_DOT) {
send_secret_string(2);
}
SEQ_TWO_KEYS(KC_SCLN, KC_J) {
send_secret_string(3);
}
SEQ_TWO_KEYS(KC_SCLN, KC_K) {
send_secret_string(4);
}
SEQ_TWO_KEYS(KC_SCLN, KC_L) {
send_secret_string(5);
}
SEQ_ONE_KEY(KC_C) {
tap_code16(C(KC_C));
}
}
}
bool music_mask_user(uint16_t keycode) {
switch (keycode) {
case RAISE:
case LOWER:
return false;
default:
return true;
}
}

View file

@ -0,0 +1,13 @@
# jdelkins layout
Features:
- 2x2u layout with the split spaces both operating as layer keys
- No top row numbers; rely on a keypad layer
- My typical leader setup for toggling modes, accessing secrets, etc.
# TODO
- Add/improve audio features
- Fix \_ADJUST layer - there's a bunch of junk on there that needs cleanng up.

View file

@ -0,0 +1,4 @@
SRC += muse.c
LEADER_ENABLE = yes
TAP_DANCE_ENABLE = yes
AUTO_SHIFT_ENABLE = yes

1
users/jdelkins/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
secrets.h

274
users/jdelkins/jdelkins.c Normal file
View file

@ -0,0 +1,274 @@
/*
Copyright 2020 Joel Elkins <joel@elkins.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "jdelkins.h"
#include "version.h"
#ifdef DO_SECRETS
# include "secrets.h"
#else
# ifndef NO_SECRETS
# pragma message("Warning: secrets.h not found")
# endif
#endif
user_config_t user_config;
__attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true;
}
void send_secret_string(uint8_t n) {
#ifdef DO_SECRETS
send_string(secret[n]);
#else
SEND_STRING("");
#endif
}
#ifdef TAP_DANCE_ENABLE
// To activate SINGLE_HOLD, you will need to hold for 200ms first.
// This tap dance favors keys that are used frequently in typing like 'f'
int cur_dance(qk_tap_dance_state_t *state) {
if (state->count == 1) {
// If count = 1, and it has been interrupted - it doesn't matter if it
// is pressed or not: Send SINGLE_TAP
if (state->interrupted) {
// if (!state->pressed) return SINGLE_TAP;
// need "permissive hold" here.
// else return SINsGLE_HOLD;
// If the interrupting key is released before the tap-dance key,
// then it is a single HOLD However, if the tap-dance key is
// released first, then it is a single TAP But how to get access to
// the state of the interrupting key????
return SINGLE_TAP;
} else {
if (!state->pressed)
return SINGLE_TAP;
else
return SINGLE_HOLD;
}
}
// If count = 2, and it has been interrupted - assume that user is trying to
// type the letter associated with single tap.
else if (state->count == 2) {
if (state->interrupted)
return DOUBLE_SINGLE_TAP;
else if (state->pressed)
return DOUBLE_HOLD;
else
return DOUBLE_TAP;
} else if ((state->count == 3) && ((state->interrupted) || (!state->pressed)))
return TRIPLE_TAP;
else if (state->count == 3)
return TRIPLE_HOLD;
else
return 8; // magic number. At some point this method will expand to work for more presses
}
// This works well if you want this key to work as a "fast modifier". It favors
// being held over being tapped.
int hold_cur_dance(qk_tap_dance_state_t *state) {
if (state->count == 1) {
if (state->interrupted) {
if (!state->pressed)
return SINGLE_TAP;
else
return SINGLE_HOLD;
} else {
if (!state->pressed)
return SINGLE_TAP;
else
return SINGLE_HOLD;
}
}
// If count = 2, and it has been interrupted - assume that user is trying to
// type the letter associated with single tap.
else if (state->count == 2) {
if (state->pressed)
return DOUBLE_HOLD;
else
return DOUBLE_TAP;
} else if (state->count == 3) {
if (!state->pressed)
return TRIPLE_TAP;
else
return TRIPLE_HOLD;
} else
return 8; // magic number. At some point this method will expand to work for more presses
}
#endif // TAP_DANCE_ENABLE
__attribute__ ((weak))
void keyboard_post_init_keymap(void) {
}
void keyboard_post_init_user(void) {
user_config.raw = eeconfig_read_user();
keyboard_post_init_keymap();
}
void eeconfig_init_user(void) {
user_config.raw = 0;
user_config.system_mac = false;
eeconfig_update_user(user_config.raw);
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
static uint32_t boot_timer;
if (!process_record_keymap(keycode, record)) {
return false;
}
switch (keycode) {
case FW_WRD:
do_mac_key(LCTL(KC_RIGHT), ROPT(KC_RIGHT), record);
break;
case BK_WRD:
do_mac_key(LCTL(KC_LEFT), ROPT(KC_LEFT), record);
break;
case KB_BOL:
do_mac_key(KC_HOME, RCMD(KC_LEFT), record);
break;
case KB_EOL:
do_mac_key(KC_END, RCMD(KC_RIGHT), record);
break;
case TG_SYS:
if (record->event.pressed) {
user_config.system_mac ^= 1;
eeconfig_update_user(user_config.raw);
}
break;
case KB_COPY:
do_mac_key(LCTL(KC_INS), RCMD(KC_C), record);
break;
case KB_PASTE:
do_mac_key(LSFT(KC_INS), RCMD(KC_V), record);
break;
case MY_GUI:
do_mac_key(KC_LGUI, KC_LOPT, record);
break;
case MY_ALT:
do_mac_key(KC_LALT, KC_LCMD, record);
break;
case MY_RGUI:
do_mac_key(KC_RGUI, KC_ROPT, record);
break;
case MY_RALT:
do_mac_key(KC_RALT, KC_RCMD, record);
break;
case MY_CALC:
do_mac_key(KC_CALC, KC_F14, record);
break;
case KB_MAKE:
if (!get_mods()) {
if (!record->event.pressed)
SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP SS_TAP(X_ENTER));
return false;
}
break;
case KB_VRSN:
if (!get_mods()) {
if (!record->event.pressed) {
if (user_config.system_mac) {
SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION " (mac mode)");
} else {
SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION " (non-mac mode)");
}
}
return false;
}
break;
case KB_BOOT:
if (!get_mods()) {
if (record->event.pressed) {
boot_timer = timer_read32();
} else {
if (timer_elapsed32(boot_timer) >= 500) {
reset_keyboard();
}
}
return false;
}
break;
case KB_FLSH:
if (!get_mods()) {
if (!record->event.pressed) {
SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP ":flash\n");
reset_keyboard();
}
return false;
}
break;
#ifdef DO_SECRETS
case KC_SECRET_1 ... KC_SECRET_5: // Secrets! Externally defined strings, not stored in repo
if (!record->event.pressed) {
clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
send_secret_string(keycode - KC_SECRET_1);
}
return false;
break;
#endif
}
return true;
}
__attribute__ ((weak))
void matrix_init_keymap(void) {
}
void matrix_init_user(void) {
matrix_init_keymap();
}
__attribute__ ((weak))
void matrix_scan_keymap(void) {
}
void matrix_scan_user(void) {
matrix_scan_keymap();
}
__attribute__ ((weak))
layer_state_t layer_state_set_keymap(layer_state_t state) {
return state;
}
layer_state_t layer_state_set_user(layer_state_t state) {
return layer_state_set_keymap(state);
}

134
users/jdelkins/jdelkins.h Normal file
View file

@ -0,0 +1,134 @@
/*
Copyright 2020 Joel Elkins <joel@elkins.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include QMK_KEYBOARD_H
// Secrets
#if !defined(NO_SECRETS) && __has_include("secrets.h")
# define DO_SECRETS
#endif
void send_secret_string(uint8_t n);
// standard layers
enum jdelkins_layers {
_QWERTY = 0,
_RPT,
_GAME,
_FUNC,
_KP,
_SECRETS,
_ADJUST,
_LAYER_MAX
};
// key definitions
typedef union {
uint32_t raw;
struct {
bool system_mac :1;
};
} user_config_t;
extern user_config_t user_config;
static inline void do_mac_key(uint16_t norm_key, uint16_t mac_key, keyrecord_t *record) {
uint16_t key = user_config.system_mac ? mac_key : norm_key;
if (record->event.pressed)
register_code16(key);
else
unregister_code16(key);
}
enum jdelkins_keycodes {
KB_MAKE = SAFE_RANGE,
KB_FLSH,
KB_VRSN,
KB_BOOT,
FW_WRD,
BK_WRD,
KB_BOL,
KB_EOL,
TG_SYS,
KB_COPY,
KB_PASTE,
MY_GUI,
MY_ALT,
MY_RGUI,
MY_RALT,
MY_CALC,
#ifdef DO_SECRETS
KC_SECRET_1,
KC_SECRET_2,
KC_SECRET_3,
KC_SECRET_4,
KC_SECRET_5,
KC_SECRET_6,
#endif
USER_SAFE_RANGE,
};
#ifdef DO_SECRETS
# define KC_SEC1 KC_SECRET_1
# define KC_SEC2 KC_SECRET_2
# define KC_SEC3 KC_SECRET_3
# define KC_SEC4 KC_SECRET_4
# define KC_SEC5 KC_SECRET_5
# define KC_SEC6 KC_SECRET_6
#else
# define KC_SEC1 KC_NO
# define KC_SEC2 KC_NO
# define KC_SEC3 KC_NO
# define KC_SEC4 KC_NO
# define KC_SEC5 KC_NO
# define KC_SEC6 KC_NO
#endif
#define MODS_SHIFT (get_mods() & MOD_MASK_SHIFT)
#define MODS_CTRL (get_mods() & MOD_MASK_CTRL)
#define MODS_ALT (get_mods() & MOD_MASK_ALT)
#define MODS_GUI (get_mods() & MOD_MASK_GUI)
#define MY_CAPS LCTL_T(KC_CAPS)
#define MY_SPC LT(_FUNC, KC_SPC)
#define NUMLOCK_ON host_keyboard_led_state().num_lock
#define CAPSLOCK_ON host_keyboard_led_state().caps_lock
#ifdef TAP_DANCE_ENABLE
enum {
SINGLE_TAP = 1,
SINGLE_HOLD = 2,
DOUBLE_TAP = 3,
DOUBLE_HOLD = 4,
DOUBLE_SINGLE_TAP = 5, //send two single taps
TRIPLE_TAP = 6,
TRIPLE_HOLD = 7
};
int cur_dance(qk_tap_dance_state_t *state); // prefer tap
int hold_cur_dance(qk_tap_dance_state_t *state); // prefer hold
#endif // TAP_DANCE_ENABLE

10
users/jdelkins/rules.mk Normal file
View file

@ -0,0 +1,10 @@
SRC += jdelkins.c
ifeq ($(strip $(NO_SECRETS)), yes)
OPT_DEFS += -DNO_SECRETS
endif
users/jdelkins/secrets.h: users/jdelkins/secrets.h.gpg
gpg -d $< >$@
BOOTMAGIC_ENABLE = no