diff --git a/keyboards/boardsource/unicorne/keymaps/markstos/keymap.c b/keyboards/boardsource/unicorne/keymaps/markstos/keymap.c index ed41bf66..1ed5eca1 100644 --- a/keyboards/boardsource/unicorne/keymaps/markstos/keymap.c +++ b/keyboards/boardsource/unicorne/keymaps/markstos/keymap.c @@ -28,7 +28,12 @@ enum custom_keycodes { SHORTCUT, LOCKWIN, M_JIGL, - CTL_ATL_DEL + CTL_ATL_DEL, + SNAP_LFT, + SNAP_RT, + SNAP_TOP, + SNAP_BTM, + KVM_SW }; enum combos { @@ -73,6 +78,51 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { unregister_code(KC_DEL); } break; + case KVM_SW: + if(record->event.pressed) { + register_code(KC_NUM); + register_code(KC_NUM); + } else { + unregister_code(KC_NUM); + unregister_code(KC_NUM); + } + break; + case SNAP_LFT: + if(record->event.pressed) { + register_code(KC_LGUI); + register_code(KC_LEFT); + } else { + unregister_code(KC_LGUI); + unregister_code(KC_LEFT); + } + break; + case SNAP_RT: + if(record->event.pressed) { + register_code(KC_LGUI); + register_code(KC_RIGHT); + } else { + unregister_code(KC_LGUI); + unregister_code(KC_RIGHT); + } + break; + case SNAP_TOP: + if(record->event.pressed) { + register_code(KC_LGUI); + register_code(KC_UP); + } else { + unregister_code(KC_LGUI); + unregister_code(KC_UP); + } + break; + case SNAP_BTM: + if(record->event.pressed) { + register_code(KC_LGUI); + register_code(KC_DOWN); + } else { + unregister_code(KC_LGUI); + unregister_code(KC_DOWN); + } + break; } return true; } @@ -86,21 +136,16 @@ void matrix_scan_user(void) { if (is_mouse_jiggle_active) { if (timer_elapsed(mouse_jiggle_timer) > mouse_jiggle_frequency) { mouse_jiggle_timer = timer_read(); + tap_code(KC_NUM); if (mouse_jiggle_direction) { tap_code(KC_MS_L); } else { tap_code(KC_MS_R); } + tap_code(KC_NUM); mouse_jiggle_direction = !mouse_jiggle_direction; } } - - if (is_alt_tab_active) { - if (timer_elapsed(alt_tab_timer) > 1000) { - unregister_code(KC_LALT); - is_alt_tab_active = false; - } - } } // Each layer gets a name for readability, which is then used in the keymap matrix below. @@ -119,7 +164,7 @@ void matrix_scan_user(void) { #define LOW_TAB LT(_LOWER, KC_TAB) #define RSE_BSP LT(_RAISE, KC_BSPC) #define MOU_GUI LT(_MOUSE, KC_LGUI) -#define SHR_SFT LT(_SHORTCUT, OSM_SFT) +#define SHR_SFT LT(_SHORTCUT, KC_LSFT) #define OSM_SFT OSM(MOD_LSFT) #define OSM_ALT OSM(MOD_LALT) #define OSM_CTL OSM(MOD_LCTL) @@ -156,9 +201,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_RAISE] = LAYOUT_split_3x6_3( \ //,-----------------------------------------------------. ,-----------------------------------------------------. - _______, KC_DEL, KC_HOME, KC_PGUP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, _______,\ + _______, KC_DEL , KC_HOME, KC_PGUP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, _______,\ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - _______, KC_INS, KC_END, KC_PGDN, XXXXXXX, XXXXXXX, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_APP , _______,\ + _______, KC_INS, KC_END, KC_PGDN, XXXXXXX, XXXXXXX, _______, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, _______,\ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPLY, KC_MPRV, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE,\ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| @@ -172,7 +217,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_F12, RGB_VAD, RGB_HUD, RGB_SAD, RGB_RMOD,XXXXXXX, _______,\ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - _______, XXXXXXX, XXXXXXX,CTL_ATL_DEL,M_JIGL,KC_NUM, LOCKWIN, QK_RBT, QK_BOOT, EE_CLR, KC_SLEP, _______,\ + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_NUM, LOCKWIN, QK_RBT, QK_BOOT, EE_CLR, KC_SLEP, _______,\ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS\ //`--------------------------' `--------------------------' @@ -180,11 +225,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_MOUSE] = LAYOUT_split_3x6_3( \ //,-----------------------------------------------------. ,-----------------------------------------------------. - _______, KC_MS_L, KC_MS_U, KC_MS_D, KC_MS_R, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, XXXXXXX, _______,\ + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_U, KC_MS_D, KC_MS_R, _______,\ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,\ + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, XXXXXXX, _______,\ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - _______, XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,\ + _______, XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_APP, XXXXXXX, XXXXXXX, XXXXXXX, _______,\ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS\ //`--------------------------' `--------------------------' @@ -192,9 +237,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_SHORTCUT] = LAYOUT_split_3x6_3( \ //,-----------------------------------------------------. ,-----------------------------------------------------. - CTL_ATL_DEL,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, KC_CALC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,\ + CTL_ATL_DEL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX, KVM_SW, XXXXXXX, SNAP_TOP, XXXXXXX, M_JIGL, _______,\ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,\ + _______,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,SNAP_LFT, SNAP_BTM, SNAP_RT,XXXXXXX, _______,\ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| _______,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,\ //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| diff --git a/keyboards/boardsource/unicorne/keymaps/markstos/rules.mk b/keyboards/boardsource/unicorne/keymaps/markstos/rules.mk index 3c20dcc7..99974126 100644 --- a/keyboards/boardsource/unicorne/keymaps/markstos/rules.mk +++ b/keyboards/boardsource/unicorne/keymaps/markstos/rules.mk @@ -4,6 +4,7 @@ POINTING_DEVICE_DRIVER = analog_joystick OLED_ENABLE = yes AUDIO_ENABLE = yes MOUSEKEY_ENABLE = yes +ENCODER_ENABLE = yes # markstos: enable media keys EXTRAKEY_ENABLE = yes diff --git a/keyboards/boardsource/unicorne/keymaps/unicorne_choc/config.h b/keyboards/boardsource/unicorne/keymaps/unicorne_choc/config.h new file mode 100644 index 00000000..02f636ee --- /dev/null +++ b/keyboards/boardsource/unicorne/keymaps/unicorne_choc/config.h @@ -0,0 +1,71 @@ +#pragma once + +#define RGB_MATRIX_LED_COUNT 54 +#define RGB_MATRIX_DEFAULT_SPD 127 +#define RGB_MATRIX_TIMEOUT 180000 // 3 minutes // 300000 = 5 minutes +#define RGB_MATRIX_LED_FLUSH_LIMIT 16 +#define RGB_MATRIX_DEFAULT_SAT 77 +#define RGB_MATRIX_DEFAULT_VAL 86 +#define RGB_MATRIX_SPLIT { 27, 27 } +#define SPLIT_TRANSPORT_MIRROR +#define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_ALPHAS_MODS +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE +#define RGB_DISABLE_WHEN_USB_SUSPENDED +#define RGB_TRIGGER_ON_KEYDOWN + +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET + +#define SPLIT_ACTIVITY_ENABLE + + +#define I2C_DRIVER I2CD1 +#define I2C1_SDA_PIN GP22 +#define I2C1_SCL_PIN GP23 + +#define AUDIO_PIN GP28 +#define AUDIO_PWM_DRIVER PWMD6 +#define AUDIO_INIT_DELAY +#define AUDIO_PWM_CHANNEL RP2040_PWM_CHANNEL_A +#define STARTUP_SONG SONG(ODE_TO_JOY) +//#define AUDIO_CLICKY + +#define ANALOG_JOYSTICK_Y_AXIS_PIN GP26 +#define ANALOG_JOYSTICK_X_AXIS_PIN GP27 +#define POINTING_DEVICE_INVERT_Y +#define POINTING_DEVICE_INVERT_X + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +// Customized by markstos +#define TAPPING_TERM 200 +#define TAPPING_TERM_PER_KEY +// used for Tapping Term on thumb keys +#define TAPPING_TERM_THUMB 125 + +// If you press a dual-role key, press another key, and then release the +// dual-role key, all within the tapping term, by default the dual-role key +// will perform its tap action. If the HOLD_ON_OTHER_KEY_PRESS option is +// enabled, the dual-role key will perform its hold action instead. +#define HOLD_ON_OTHER_KEY_PRESS + +// markstos: prevent keydown and keyup from firing on different layers +#define PREVENT_STUCK_MODIFER + +// When enabled, typing a mod-tap plus second within term will register as the mod-combo +// Ref: https://beta.docs.qmk.fm/using-qmk/software-features/tap_hold#permissive-hold +#define PERMISSIVE_HOLD + +#define COMBO_COUNT 3 + +// Set the COMBO_TERM so low that I won't type the keys one after each other during normal typing. +// They would have be held together intentionally to trigger this. +#define COMBO_TERM 40 + +// These mostly affect my one-shot Shift key, providing a CapsLock alternative. +// I want a relatively low timeout, so if I accidentally type "Shift", I can pause just briefly and move on. +#define ONESHOT_TAP_TOGGLE 3 /* Tapping this number of times holds the key until tapped once again. */ +#define ONESHOT_TIMEOUT 2000 /* Time (in ms) before the one shot key is released */ diff --git a/keyboards/boardsource/unicorne/keymaps/unicorne_choc/keymap.c b/keyboards/boardsource/unicorne/keymaps/unicorne_choc/keymap.c new file mode 100644 index 00000000..d0c28f82 --- /dev/null +++ b/keyboards/boardsource/unicorne/keymaps/unicorne_choc/keymap.c @@ -0,0 +1,267 @@ +#include QMK_KEYBOARD_H + +extern uint8_t is_master; + +bool is_mouse_jiggle_active = false; +bool mouse_jiggle_direction = false; // used to alternate direction +uint16_t mouse_jiggle_frequency = 3000; // how often to move the mouse (15 seconds) +uint16_t mouse_jiggle_timer = 0; + +bool is_alt_tab_active = false; // ADD this near the beginning of keymap.c +uint16_t alt_tab_timer = 0; // we will be using them soon. + +void keyboard_post_init_user(void) { +#ifdef RGB_MATRIX_ENABLE + rgb_matrix_enable(); + rgb_matrix_set_speed(RGB_MATRIX_DEFAULT_SPD); + //rgb_matrix_mode(RGB_MATRIX_SOLID_REACTIVE); + rgb_matrix_sethsv(HSV_PURPLE); +#endif +} + +enum custom_keycodes { + DEFAULT = SAFE_RANGE, + LOWER, + RAISE, + FUNC, + LOCKWIN, + M_JIGL, + C_ALT_D, + SNAP_LFT, + SNAP_RT, + SNAP_TOP, + SNAP_BTM, + KVM_SW +}; + +enum combos { + JK_ESC +}; + +const uint16_t PROGMEM jk_combo[] = {KC_J, KC_K, COMBO_END}; + + +combo_t key_combos[COMBO_COUNT] = { + // For Vim, put Escape on the home row + [JK_ESC] = COMBO(jk_combo, KC_ESC), + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case LOCKWIN: + if (record->event.pressed) { + // when keycode LOCKWIN is pressed + register_code(KC_LGUI); // press the Windows key + register_code(KC_L); // press the L key + } else { + // when keycode LOCKWIN is released + unregister_code(KC_LGUI); // release the Windows key + unregister_code(KC_L); // release the L key + } + break; + case M_JIGL: + if (record->event.pressed) { + is_mouse_jiggle_active = !is_mouse_jiggle_active; + } + break; + case C_ALT_D: + if(record->event.pressed) { + register_code(KC_LCTL); + register_code(KC_LALT); + register_code(KC_DEL); + } else { + unregister_code(KC_LCTL); + unregister_code(KC_LALT); + unregister_code(KC_DEL); + } + break; + case KVM_SW: + if(record->event.pressed) { + register_code(KC_NUM); + register_code(KC_NUM); + } else { + unregister_code(KC_NUM); + unregister_code(KC_NUM); + } + break; + case SNAP_LFT: + if(record->event.pressed) { + register_code(KC_LGUI); + register_code(KC_LEFT); + } else { + unregister_code(KC_LGUI); + unregister_code(KC_LEFT); + } + break; + case SNAP_RT: + if(record->event.pressed) { + register_code(KC_LGUI); + register_code(KC_RIGHT); + } else { + unregister_code(KC_LGUI); + unregister_code(KC_RIGHT); + } + break; + case SNAP_TOP: + if(record->event.pressed) { + register_code(KC_LGUI); + register_code(KC_UP); + } else { + unregister_code(KC_LGUI); + unregister_code(KC_UP); + } + break; + case SNAP_BTM: + if(record->event.pressed) { + register_code(KC_LGUI); + register_code(KC_DOWN); + } else { + unregister_code(KC_LGUI); + unregister_code(KC_DOWN); + } + break; + } + return true; +} + +void matrix_scan_user(void) { + if (is_keyboard_master()) { + // initialize timer on master half only, remove if statement above for non-split + if (mouse_jiggle_timer == 0) mouse_jiggle_timer = timer_read(); + } + + if (is_mouse_jiggle_active) { + if (timer_elapsed(mouse_jiggle_timer) > mouse_jiggle_frequency) { + mouse_jiggle_timer = timer_read(); + tap_code(KC_NUM); + if (mouse_jiggle_direction) { + tap_code(KC_MS_L); + } else { + tap_code(KC_MS_R); + } + tap_code(KC_NUM); + mouse_jiggle_direction = !mouse_jiggle_direction; + } + } +} + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _FUNC 3 + +// For _QWERTY layer +#define OSL_FUN OSL(_FUNC) +#define LOW_TAB LT(_LOWER, KC_TAB) +#define RSE_BSP LT(_RAISE, KC_BSPC) +#define OSM_SFT OSM(MOD_LSFT) +#define OSM_ALT OSM(MOD_LALT) +#define OSM_CTL OSM(MOD_LCTL) +#define OSM_GUI OSM(MOD_LGUI) + +// For _LOWER layer +#define ALT_TAB LALT(KC_TAB) + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[_QWERTY] = LAYOUT_split_3x6_3( \ + //,-----------------------------------------------------. ,-----------------------------------------------------. + OSM_ALT, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y ,KC_U ,KC_I ,KC_O ,KC_P , KC_BSLS,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + OSM_SFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H ,KC_J ,KC_K ,KC_L , KC_SCLN, KC_QUOT,\ + //|---- ----+--------+--------+--------+--------+-------| |--------+--------+--------+--------+--------+--------| + OSM_CTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,OSL_FUN,\ + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + OSM_GUI, LOW_TAB, KC_SPC, KC_ENT, RSE_BSP, OSM_SFT \ + //`--------------------------' `--------------------------' + ), + +[_LOWER] = LAYOUT_split_3x6_3( \ + //,-----------------------------------------------------. ,-----------------------------------------------------. + KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, XXXXXXX, KC_EQL, KC_LBRC, KC_LCBR, KC_RCBR, KC_RBRC, KC_MINS, XXXXXXX, XXXXXXX,_______,\ + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + //`--------------------------' `--------------------------' + ), + +[_RAISE] = LAYOUT_split_3x6_3( \ + //,-----------------------------------------------------. ,-----------------------------------------------------. + _______, KC_DEL , KC_HOME, KC_PGUP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, _______,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_INS, KC_END, KC_PGDN, XXXXXXX, XXXXXXX, _______, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, _______,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPLY, KC_MPRV, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE,\ + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS\ + //`--------------------------' `--------------------------' + ), + +[_FUNC] = LAYOUT_split_3x6_3( \ + //,-----------------------------------------------------. ,-----------------------------------------------------. + _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KVM_SW, XXXXXXX, SNAP_TOP, XXXXXXX, RGB_TOG, _______,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + C_ALT_D, KC_MS_L, KC_MS_U, KC_MS_D, KC_MS_R, KC_F12, M_JIGL,SNAP_LFT, SNAP_BTM, SNAP_RT, KC_CALC, _______,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_BTN1, KC_BTN2, KC_BTN3, XXXXXXX, KC_NUM, LOCKWIN, QK_RBT, QK_BOOT, EE_CLR, KC_SLEP, _______,\ + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS\ + //`--------------------------' `--------------------------' + ) +}; + +uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case LT(_RAISE, KC_BSPC): + return TAPPING_TERM_THUMB; + case LT(_LOWER, KC_TAB): + return TAPPING_TERM_THUMB; + default: + return TAPPING_TERM; + } +} + +#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + +}; +#endif // defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) + +#ifdef OLED_ENABLE +bool oled_task_user(void) { + // Host Keyboard Layer Status + // Set cursor position + + if (is_keyboard_master()) { + switch (get_highest_layer(layer_state)) { + case _QWERTY: + oled_write_P(PSTR("Default\n"), false); + break; + case _LOWER: + oled_write_P(PSTR("Lower\n"), false); + break; + case _RAISE: + oled_write_P(PSTR("Raise\n"), false); + break; + case _FUNC: + oled_write_P(PSTR("FN\n"), false); + break; + default: + // Or use the write_ln shortcut over adding '\n' to the end of your string + oled_write_ln_P(PSTR("Undefined"), false); + } + } else { + oled_write_raw(logo, sizeof(logo)); + } + return false; +} +#endif \ No newline at end of file diff --git a/keyboards/boardsource/unicorne/keymaps/unicorne_choc/rules.mk b/keyboards/boardsource/unicorne/keymaps/unicorne_choc/rules.mk new file mode 100644 index 00000000..0b947234 --- /dev/null +++ b/keyboards/boardsource/unicorne/keymaps/unicorne_choc/rules.mk @@ -0,0 +1,19 @@ +SERIAL_DRIVER = vendor +AUDIO_DRIVER = pwm_hardware +POINTING_DEVICE_DRIVER = analog_joystick +OLED_ENABLE = yes +AUDIO_ENABLE = yes +MOUSEKEY_ENABLE = yes +ENCODER_ENABLE = yes +VIA_ENABLE = yes + +# markstos: enable media keys +EXTRAKEY_ENABLE = yes + +# markstos: smaller file size, little down-side +LINK_TIME_OPTIMIZATION_ENABLE = yes + +# markstos: for combos! +COMBO_ENABLE = yes + +TAP_DANCE_ENABLE = no \ No newline at end of file diff --git a/keyboards/boardsource/unicorne/keymaps/unicorne_mx/config.h b/keyboards/boardsource/unicorne/keymaps/unicorne_mx/config.h new file mode 100644 index 00000000..02f636ee --- /dev/null +++ b/keyboards/boardsource/unicorne/keymaps/unicorne_mx/config.h @@ -0,0 +1,71 @@ +#pragma once + +#define RGB_MATRIX_LED_COUNT 54 +#define RGB_MATRIX_DEFAULT_SPD 127 +#define RGB_MATRIX_TIMEOUT 180000 // 3 minutes // 300000 = 5 minutes +#define RGB_MATRIX_LED_FLUSH_LIMIT 16 +#define RGB_MATRIX_DEFAULT_SAT 77 +#define RGB_MATRIX_DEFAULT_VAL 86 +#define RGB_MATRIX_SPLIT { 27, 27 } +#define SPLIT_TRANSPORT_MIRROR +#define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_ALPHAS_MODS +#define ENABLE_RGB_MATRIX_SOLID_REACTIVE +#define RGB_DISABLE_WHEN_USB_SUSPENDED +#define RGB_TRIGGER_ON_KEYDOWN + +#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET + +#define SPLIT_ACTIVITY_ENABLE + + +#define I2C_DRIVER I2CD1 +#define I2C1_SDA_PIN GP22 +#define I2C1_SCL_PIN GP23 + +#define AUDIO_PIN GP28 +#define AUDIO_PWM_DRIVER PWMD6 +#define AUDIO_INIT_DELAY +#define AUDIO_PWM_CHANNEL RP2040_PWM_CHANNEL_A +#define STARTUP_SONG SONG(ODE_TO_JOY) +//#define AUDIO_CLICKY + +#define ANALOG_JOYSTICK_Y_AXIS_PIN GP26 +#define ANALOG_JOYSTICK_X_AXIS_PIN GP27 +#define POINTING_DEVICE_INVERT_Y +#define POINTING_DEVICE_INVERT_X + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +// Customized by markstos +#define TAPPING_TERM 200 +#define TAPPING_TERM_PER_KEY +// used for Tapping Term on thumb keys +#define TAPPING_TERM_THUMB 125 + +// If you press a dual-role key, press another key, and then release the +// dual-role key, all within the tapping term, by default the dual-role key +// will perform its tap action. If the HOLD_ON_OTHER_KEY_PRESS option is +// enabled, the dual-role key will perform its hold action instead. +#define HOLD_ON_OTHER_KEY_PRESS + +// markstos: prevent keydown and keyup from firing on different layers +#define PREVENT_STUCK_MODIFER + +// When enabled, typing a mod-tap plus second within term will register as the mod-combo +// Ref: https://beta.docs.qmk.fm/using-qmk/software-features/tap_hold#permissive-hold +#define PERMISSIVE_HOLD + +#define COMBO_COUNT 3 + +// Set the COMBO_TERM so low that I won't type the keys one after each other during normal typing. +// They would have be held together intentionally to trigger this. +#define COMBO_TERM 40 + +// These mostly affect my one-shot Shift key, providing a CapsLock alternative. +// I want a relatively low timeout, so if I accidentally type "Shift", I can pause just briefly and move on. +#define ONESHOT_TAP_TOGGLE 3 /* Tapping this number of times holds the key until tapped once again. */ +#define ONESHOT_TIMEOUT 2000 /* Time (in ms) before the one shot key is released */ diff --git a/keyboards/boardsource/unicorne/keymaps/unicorne_mx/keymap.c b/keyboards/boardsource/unicorne/keymaps/unicorne_mx/keymap.c new file mode 100644 index 00000000..16206939 --- /dev/null +++ b/keyboards/boardsource/unicorne/keymaps/unicorne_mx/keymap.c @@ -0,0 +1,310 @@ +#include QMK_KEYBOARD_H + +extern uint8_t is_master; + +bool is_mouse_jiggle_active = false; +bool mouse_jiggle_direction = false; // used to alternate direction +uint16_t mouse_jiggle_frequency = 3000; // how often to move the mouse (15 seconds) +uint16_t mouse_jiggle_timer = 0; + +bool is_alt_tab_active = false; // ADD this near the beginning of keymap.c +uint16_t alt_tab_timer = 0; // we will be using them soon. + +void keyboard_post_init_user(void) { +#ifdef RGB_MATRIX_ENABLE + rgb_matrix_enable(); + rgb_matrix_set_speed(RGB_MATRIX_DEFAULT_SPD); + //rgb_matrix_mode(RGB_MATRIX_SOLID_REACTIVE); + rgb_matrix_sethsv(HSV_PURPLE); +#endif +} + +enum custom_keycodes { + DEFAULT = SAFE_RANGE, + LOWER, + RAISE, + FUNC, + MOUSE, + SHORTCUT, + LOCKWIN, + M_JIGL, + CTL_ATL_DEL, + SNAP_LFT, + SNAP_RT, + SNAP_TOP, + SNAP_BTM, + KVM_SW +}; + +enum combos { + JK_ESC +}; + +const uint16_t PROGMEM jk_combo[] = {KC_J, KC_K, COMBO_END}; + + +combo_t key_combos[COMBO_COUNT] = { + // For Vim, put Escape on the home row + [JK_ESC] = COMBO(jk_combo, KC_ESC), + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case LOCKWIN: + if (record->event.pressed) { + // when keycode LOCKWIN is pressed + register_code(KC_LGUI); // press the Windows key + register_code(KC_L); // press the L key + } else { + // when keycode LOCKWIN is released + unregister_code(KC_LGUI); // release the Windows key + unregister_code(KC_L); // release the L key + } + break; + case M_JIGL: + if (record->event.pressed) { + is_mouse_jiggle_active = !is_mouse_jiggle_active; + } + break; + case CTL_ATL_DEL: + if(record->event.pressed) { + register_code(KC_LCTL); + register_code(KC_LALT); + register_code(KC_DEL); + } else { + unregister_code(KC_LCTL); + unregister_code(KC_LALT); + unregister_code(KC_DEL); + } + break; + case KVM_SW: + if(record->event.pressed) { + register_code(KC_NUM); + register_code(KC_NUM); + } else { + unregister_code(KC_NUM); + unregister_code(KC_NUM); + } + break; + case SNAP_LFT: + if(record->event.pressed) { + register_code(KC_LGUI); + register_code(KC_LEFT); + } else { + unregister_code(KC_LGUI); + unregister_code(KC_LEFT); + } + break; + case SNAP_RT: + if(record->event.pressed) { + register_code(KC_LGUI); + register_code(KC_RIGHT); + } else { + unregister_code(KC_LGUI); + unregister_code(KC_RIGHT); + } + break; + case SNAP_TOP: + if(record->event.pressed) { + register_code(KC_LGUI); + register_code(KC_UP); + } else { + unregister_code(KC_LGUI); + unregister_code(KC_UP); + } + break; + case SNAP_BTM: + if(record->event.pressed) { + register_code(KC_LGUI); + register_code(KC_DOWN); + } else { + unregister_code(KC_LGUI); + unregister_code(KC_DOWN); + } + break; + } + return true; +} + +void matrix_scan_user(void) { + if (is_keyboard_master()) { + // initialize timer on master half only, remove if statement above for non-split + if (mouse_jiggle_timer == 0) mouse_jiggle_timer = timer_read(); + } + + if (is_mouse_jiggle_active) { + if (timer_elapsed(mouse_jiggle_timer) > mouse_jiggle_frequency) { + mouse_jiggle_timer = timer_read(); + tap_code(KC_NUM); + if (mouse_jiggle_direction) { + tap_code(KC_MS_L); + } else { + tap_code(KC_MS_R); + } + tap_code(KC_NUM); + mouse_jiggle_direction = !mouse_jiggle_direction; + } + } +} + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _FUNC 3 +#define _MOUSE 4 +#define _SHORTCUT 5 + +// For _QWERTY layer +#define OSL_FUN OSL(_FUNC) +#define LOW_TAB LT(_LOWER, KC_TAB) +#define RSE_BSP LT(_RAISE, KC_BSPC) +#define MOU_GUI LT(_MOUSE, KC_LGUI) +#define SHR_SFT LT(_SHORTCUT, KC_LSFT) +#define OSM_SFT OSM(MOD_LSFT) +#define OSM_ALT OSM(MOD_LALT) +#define OSM_CTL OSM(MOD_LCTL) + +// For _LOWER layer +#define ALT_TAB LALT(KC_TAB) + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[_QWERTY] = LAYOUT_split_3x6_3( \ + //,-----------------------------------------------------. ,-----------------------------------------------------. + OSM_ALT, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y ,KC_U ,KC_I ,KC_O ,KC_P , KC_BSLS,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + OSM_SFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H ,KC_J ,KC_K ,KC_L , KC_SCLN, KC_QUOT,\ + //|---- ----+--------+--------+--------+--------+-------| |--------+--------+--------+--------+--------+--------| + OSM_CTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,OSL_FUN,\ + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + MOU_GUI,LOW_TAB, KC_SPC, KC_ENT, RSE_BSP, SHR_SFT \ + //`--------------------------' `--------------------------' + ), + +[_LOWER] = LAYOUT_split_3x6_3( \ + //,-----------------------------------------------------. ,-----------------------------------------------------. + KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, XXXXXXX, KC_EQL, KC_LBRC, KC_LCBR, KC_RCBR, KC_RBRC, KC_MINS, XXXXXXX, XXXXXXX,_______,\ + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + //`--------------------------' `--------------------------' + ), + +[_RAISE] = LAYOUT_split_3x6_3( \ + //,-----------------------------------------------------. ,-----------------------------------------------------. + _______, KC_DEL , KC_HOME, KC_PGUP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, _______,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, KC_INS, KC_END, KC_PGDN, XXXXXXX, XXXXXXX, _______, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, _______,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPLY, KC_MPRV, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE,\ + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS\ + //`--------------------------' `--------------------------' + ), + +[_FUNC] = LAYOUT_split_3x6_3( \ + //,-----------------------------------------------------. ,-----------------------------------------------------. + _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, _______,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_F12, QK_MAKE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_NUM, LOCKWIN, QK_RBT, QK_BOOT, EE_CLR, KC_SLEP, _______,\ + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS\ + //`--------------------------' `--------------------------' + ), + +[_MOUSE] = LAYOUT_split_3x6_3( \ + //,-----------------------------------------------------. ,-----------------------------------------------------. + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_L, KC_MS_U, KC_MS_D, KC_MS_R, _______,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, KC_BTN3, XXXXXXX, _______,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_APP, XXXXXXX, XXXXXXX, XXXXXXX, _______,\ + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS\ + //`--------------------------' `--------------------------' + ), + +[_SHORTCUT] = LAYOUT_split_3x6_3( \ + //,-----------------------------------------------------. ,-----------------------------------------------------. + CTL_ATL_DEL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX, KVM_SW, XXXXXXX, SNAP_TOP, XXXXXXX, M_JIGL, _______,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______,XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX, XXXXXXX,SNAP_LFT, SNAP_BTM, SNAP_RT,XXXXXXX, _______,\ + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,\ + //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------| + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS\ + //`--------------------------' `--------------------------' + ) +}; + +uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case LT(_RAISE, KC_BSPC): + return TAPPING_TERM_THUMB; + case LT(_LOWER, KC_TAB): + return TAPPING_TERM_THUMB; + case LT(_MOUSE, KC_LGUI): + return TAPPING_TERM_THUMB; + case LT(_SHORTCUT, OSM_SFT): + return TAPPING_TERM_THUMB; + default: + return TAPPING_TERM; + } +} + +#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) +const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = { + [_QWERTY] = { ENCODER_CCW_CW(KC_MS_WH_UP, KC_MS_WH_DOWN), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_FUNC] = { ENCODER_CCW_CW(RGB_HUD, RGB_HUI), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) }, + [_RAISE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_LOWER] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [_MOUSE] = { ENCODER_CCW_CW(KC_WH_U, KC_WH_D), ENCODER_CCW_CW(KC_WH_R, KC_WH_L) }, + [_SHORTCUT] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, +}; +#endif // defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) + +#ifdef OLED_ENABLE +bool oled_task_user(void) { + // Host Keyboard Layer Status + + if (is_keyboard_master()) { + switch (get_highest_layer(layer_state)) { + case _QWERTY: + oled_write_P(PSTR("Default\n"), false); + break; + case _LOWER: + oled_write_P(PSTR("Lower\n"), false); + break; + case _RAISE: + oled_write_P(PSTR("Raise\n"), false); + break; + case _FUNC: + oled_write_P(PSTR("FN\n"), false); + break; + case _MOUSE: + oled_write_P(PSTR("Mouse\n"), false); + break; + case _SHORTCUT: + oled_write_P(PSTR("Shortcuts\n"), false); + break; + default: + // Or use the write_ln shortcut over adding '\n' to the end of your string + oled_write_ln_P(PSTR("Undefined"), false); + } + } else { + oled_write_raw(logo, sizeof(logo)); + } + return false; +} +#endif \ No newline at end of file diff --git a/keyboards/boardsource/unicorne/keymaps/unicorne_mx/rules.mk b/keyboards/boardsource/unicorne/keymaps/unicorne_mx/rules.mk new file mode 100644 index 00000000..819024bd --- /dev/null +++ b/keyboards/boardsource/unicorne/keymaps/unicorne_mx/rules.mk @@ -0,0 +1,19 @@ +SERIAL_DRIVER = vendor +AUDIO_DRIVER = pwm_hardware +POINTING_DEVICE_DRIVER = analog_joystick +OLED_ENABLE = yes +AUDIO_ENABLE = yes +MOUSEKEY_ENABLE = yes +ENCODER_ENABLE = yes +ENCODER_MAP_ENABLE = yes + +# markstos: enable media keys +EXTRAKEY_ENABLE = yes + +# markstos: smaller file size, little down-side +LINK_TIME_OPTIMIZATION_ENABLE = yes + +# markstos: for combos! +COMBO_ENABLE = yes + +TAP_DANCE_ENABLE = no \ No newline at end of file