diff --git a/keyboards/planck/keymaps/bbaserdem/Makefile b/keyboards/planck/keymaps/bbaserdem/Makefile new file mode 100644 index 00000000..9c6bd8e1 --- /dev/null +++ b/keyboards/planck/keymaps/bbaserdem/Makefile @@ -0,0 +1,23 @@ +# Build options + +# ENABLE +TAP_DANCE_ENABLE = yes +UNICODE_ENABLE = yes +MOUSEKEY_ENABLE = yes +EXTRAKEY_ENABLE = yes +NKRO_ENABLE = yes +BACKLIGHT_ENABLE = yes +AUDIO_ENABLE = yes + +# DISABLE +BOOTMAGIC_ENABLE = no +MIDI_ENABLE = no + +# Not for planck +RGBLIGHT_ENABLE = no #Clashes with audio +BLUETOOTH_ENABLE = no #No bluetooth +SLEEP_LED_ENABLE = no #Uses BACKLIGHT_ENABLE rimer + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/planck/keymaps/bbaserdem/README.md b/keyboards/planck/keymaps/bbaserdem/README.md new file mode 100644 index 00000000..88130756 --- /dev/null +++ b/keyboards/planck/keymaps/bbaserdem/README.md @@ -0,0 +1,35 @@ +# Planck Layout + +Built this planck layout to use DVORAK with an unorthodox Turkish layout. +If you used a previous layout with a persistent base layer change, +change it to 0 before proceeding. +The layout has the following functionality + +* **QWERTY** can be toggled on/off from **Function** layer. +* **Mouse** layer allows manipulation of the mouse. +* **Function** layer has F and special keys. +* **Symbol** layer has numericals and symbols. +* **Game** layout can be toggled on/off from **Function** layer. +* **Music** layer allows playing sounds like a keyboard. + +Double tapping **Mouse**, **Function** and **Symbol** layers activate them until deacivation. +Topleftmost key turns off **Function**, **Symbol**, **Game** and **Music** layers, +and puts the board into *reset* mode from the **Mouse** layer. + +# Using Turkish letters + +Instead of a turkish F keyboard layout (very inconvenient to code in), +I opted to modulate characters like an *AltGr* impleentation. +Tap and holding *Alt* on **DVORAK** and **QWERTY** layer will change some letters +to Turkish equivelants. +Shifting these letters will work. +The keycodes should transmit the correct unicode characters combined with shift. +The turkish letters are sent via the unicode implementation. +No software layout change is neccessary (hence making coding easier). +By default, the unicode is set to Linux mode. Switch to windows (non-persistent) +can be done from the associated key in **Function** layer. +**Symbol** layer also has the symbol for Turkish Lira. + +# To improve + +I want to write a couple pieces of my own music for layer switching. diff --git a/keyboards/planck/keymaps/bbaserdem/config.h b/keyboards/planck/keymaps/bbaserdem/config.h new file mode 100644 index 00000000..d7632aec --- /dev/null +++ b/keyboards/planck/keymaps/bbaserdem/config.h @@ -0,0 +1,44 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +#ifdef AUDIO_ENABLE + // Compose own song in future + #define STARTUP_SONG SONG(PLANCK_SOUND) + + #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ + SONG(COLEMAK_SOUND), \ + SONG(DVORAK_SOUND) \ + } +#endif + +// Enables tap magic +#define TAPPING_TERM 300 +#define TAPPING_TOGGLE 1 + +/* + * 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 + +#endif diff --git a/keyboards/planck/keymaps/bbaserdem/keymap.c b/keyboards/planck/keymaps/bbaserdem/keymap.c new file mode 100644 index 00000000..74dfabde --- /dev/null +++ b/keyboards/planck/keymaps/bbaserdem/keymap.c @@ -0,0 +1,413 @@ +/* Copyright 2015-2017 Jack Humbert + * + * 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 . + */ + +#include "planck.h" + +#define _______ KC_TRNS +#define XXX KC_NO + +#define _DV 0 +#define _TD 1 +#define _GM 2 +#define _MO 3 +#define _SY 4 +#define _FN 5 +#define _MS 6 + +#define PARAN TD(PAR) +#define CURLY TD(CUR) +#define SQUAR TD(SQU) +#define ANGUL TD(ANG) + +#define UNDO LCTL(KC_Z) +#define REDO LCTL(KC_Y) +#define COPYCUT TD(CPC) +#define PASTE LCTL(KC_V) + +#define MO_SC_U KC_MS_WH_UP +#define MO_SC_D KC_MS_WH_DOWN +#define MO_SC_L KC_MS_WH_LEFT +#define MO_SC_R KC_MS_WH_RIGHT +#define MO_U KC_MS_UP +#define MO_D KC_MS_DOWN +#define MO_L KC_MS_LEFT +#define MO_R KC_MS_RIGHT +#define MO_CL_L KC_MS_BTN1 +#define MO_CL_R KC_MS_BTN2 +#define MO_CL_M KC_MS_BTN3 +#define MO_CL_1 KC_MS_BTN4 +#define MO_CL_2 KC_MS_BTN5 +#define MO_AC_0 KC_MS_ACCEL0 +#define MO_AC_1 KC_MS_ACCEL1 +#define MO_AC_2 KC_MS_ACCEL2 + +#define PHY_HB UC(0x0127) +#define PHY_DE UC(0xc2b0) +#define TUR_TL UC(0x20ba) +#define EUR_ER UC(0x20ac) +#define EUR_PN UC(0x00a3) + +enum custom_keycodes { + TUR_A = SAFE_RANGE, + TUR_C, + TUR_G, + TUR_I, + TUR_O, + TUR_S, + TUR_U, + UNI_LI, + UNI_WN +}; + +// Tap dance +enum { + ATD = 0, + CLS, + SCL, + QUO, + PAR, + CUR, + SQU, + ANG, + CPC +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Dvorak + * ,------------------------------------------------------------------------. + * | Blt | " | , | . | P | Y || F | G | C | R | L | Bkp | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Esc | A | O | E | U | I || D | H | T | N | S | Del | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * |Sh\CL| ; : | Q | J | K | X || B | M | W | V | Z |MOUSE| + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Ctl | Alt | Meta| Tab | SYM | Spc || Ent | FUN | Lft | Dwn | Up | Rgt | + * `------------------------------------------------------------------------' + */ +[_DV] = { + {BL_STEP,TD(QUO),KC_COMM,KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, + {KC_ESC ,KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_DEL }, + {TD(CLS),TD(SCL),KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, TT(_MO)}, + {KC_LCTL,TD(ATD),KC_LGUI,KC_TAB, TT(_SY),KC_SPC, KC_ENT, TT(_FN),KC_LEFT,KC_DOWN,KC_UP, KC_RGHT} +}, +[_TD] = { + {_______,_______,_______,_______,_______,_______,_______, TUR_G, TUR_C, _______,_______,_______}, + {_______, TUR_A, TUR_O, _______, TUR_U, TUR_I, _______, PHY_HB,_______,_______, TUR_S, _______}, + {_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______}, + {_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______} +}, + +/* Game layer + * ,------------------------------------------------------------------------. + * | OFF | Q | W | E | R | T || F1 | F2 | Ctrl| ^ |Shift| Esc | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | ~ | A | S | D | F | G || F3 | F4 | < | v | > |Enter| + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Shf | Z | X | C | V | B || F5 | F6 | , | . | / ? | Alt | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Alt | Ctrl| ` ~ | - _ | | Spc || Spc | | 1 | 2 | 3 | 4 | + * `------------------------------------------------------------------------' + */ +[_GM] = { + {TG(_GM),KC_Q, KC_W, KC_E, KC_R, KC_T, KC_F1, KC_F2, KC_RCTL,KC_UP, KC_RSFT,KC_ESC }, + {KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_F3, KC_F4, KC_LEFT,KC_DOWN,KC_RGHT,KC_ENT }, + {KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_F5, KC_F6, KC_COMM,KC_DOT, KC_SLSH,KC_RALT}, + {KC_LALT,KC_LCTL,KC_GRV, KC_MINS,_______,KC_SPC, KC_SPC, _______,KC_1, KC_2, KC_3, KC_4 } +}, + +/* Mouse control layer + * ,------------------------------------------------------------------------. + * | |.....| ^ |.....|.....|Acc 2||.....|.....|.....| |^| |.....| | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | < | v | > |.....|Acc 1||.....|.....| <-- | |v| | --> | | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | Left| Mid |Right|.....|Acc 0||.....|.....|Btn 4|.....|Btn 5| | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | | | | | || | | | | | | + * `------------------------------------------------------------------------' + */ +[_MO] = { + {TG(_MO),XXX, MO_U, XXX, XXX, MO_AC_2,XXX, XXX, XXX, MO_SC_U,XXX, _______}, + {_______,MO_L, MO_D, MO_R, XXX, MO_AC_1,XXX, XXX, MO_SC_L,MO_SC_D,MO_SC_R,_______}, + {_______,MO_CL_L,MO_CL_M,MO_CL_R,XXX, MO_AC_0,XXX, XXX, MO_CL_1,XXX, MO_CL_2,_______}, + {_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______} +}, + +/* Symbols layer + * ,------------------------------------------------------------------------. + * | OFF | ! | 1 | 2 | 3 | & || = | + | - | * | % | | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | _ | ( ) | 4 | 5 | 6 | \ || / | [ ] | { } | < > | | | | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * |degre| ? | 7 | 8 | 9 | ~ || ` | @ | # | $ | ^ | | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | | | 0 | | || | |TLira| Euro|Pound| | + * `------------------------------------------------------------------------' + */ + +[_SY] = { + {TG(_SY),KC_EXLM,KC_1, KC_2, KC_3, KC_AMPR,KC_EQL, KC_PLUS,KC_MINS,KC_ASTR,KC_PERC,_______}, + {KC_UNDS,PARAN, KC_4, KC_5, KC_6, KC_BSLS,KC_SLSH,SQUAR, CURLY, ANGUL, KC_PIPE,_______}, + {PHY_DE, KC_QUES,KC_7, KC_8, KC_9, KC_TILD,KC_GRV, KC_AT, KC_HASH,KC_DLR, KC_CIRC,_______}, + {_______,_______,_______,KC_0, _______,_______,_______,_______,TUR_TL, EUR_ER, EUR_PN, _______} +}, + +/* Function layer + * ,------------------------------------------------------------------------. + * | OFF | game|music| | |RESET||RESET| win | lin | wake|sleep|power| + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | F1 | F2 | F3 | F4 | F5 | F6 || F7 | F8 | F9 | F10 | F11 | F12 | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | undo| redo|cutcp|paste|vol 0||prtsc| ins | rev.| stop| play| next| + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | | | | |vol -||vol +| | home|pg dn|pg up| end | + * `------------------------------------------------------------------------' + */ + +[_FN] = { + {TG(_FN),TG(_GM),MU_ON, _______,_______,RESET, RESET, UNI_LI, UNI_WN ,KC_WAKE,KC_SLEP,KC_PWR }, + {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 }, + {_______,UNDO, REDO, COPYCUT,PASTE, KC_MUTE,KC_PSCR,KC_INS, KC_MPRV,KC_MSTP,KC_MPLY,KC_MNXT}, + {_______,_______,_______,_______,_______,KC_VOLD,KC_VOLU,_______,KC_HOME,KC_PGDN,KC_PGUP,KC_END } +}, + +/* Music layer + * ,-----------------------------------------------------------------------. + * | OFF |rec S| stop| play|sped^|spedv|cycle|.....|.....|.....|.....|.....| + * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| + * |.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....| + * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| + * |.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....| + * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| + * |.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....|.....| + * `-----------------------------------------------------------------------' + */ +[_MS] = { + { MU_OFF, KC_LCTL, KC_LALT, KC_LGUI, KC_UP, KC_DOWN, MU_MOD, XXX, XXX, XXX, XXX, XXX }, + { XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX }, + { XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX }, + { XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX } +} +}; + +// Set unicode method to linux. +void matrix_init_user(){ + set_unicode_input_mode(UC_LNX); +} + +// User defined keys +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + // This section is a bit tedious in VIM, so I shortened lines + // Check for shift letter + bool is_capital = ( keyboard_report->mods & + (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) ) ^ + ( keyboard_report->mods & MOD_BIT(KC_CAPS) ); + switch (keycode) { + // Add music layer to music functionality + case MU_ON: + if (record->event.pressed) { layer_on(_MS); } + return true; break; + case MU_OFF: + if (record->event.pressed) { layer_off(_MS); } + return true; break; + // Turkish letters keycodes + case TUR_A: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); register_hex(0x00c2); unicode_input_finish(); + } else { + unicode_input_start(); register_hex(0x00e2); unicode_input_finish(); + } + } + return false; break; + case TUR_U: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); register_hex(0x00dc); unicode_input_finish(); + } else { + unicode_input_start(); register_hex(0x00fc); unicode_input_finish(); + } + } + return false; break; + case TUR_I: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); register_hex(0x0130); unicode_input_finish(); + } else { + unicode_input_start(); register_hex(0x0131); unicode_input_finish(); + } + } + return false; break; + case TUR_O: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); register_hex(0x00d6); unicode_input_finish(); + } else { + unicode_input_start(); register_hex(0x00f6); unicode_input_finish(); + } + } + return false; break; + case TUR_S: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); register_hex(0x015e); unicode_input_finish(); + } else { + unicode_input_start(); register_hex(0x015f); unicode_input_finish(); + } + } + return false; break; + case TUR_G: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); register_hex(0x011e); unicode_input_finish(); + } else { + unicode_input_start(); register_hex(0x011f); unicode_input_finish(); + } + } + return false; break; + case TUR_C: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); register_hex(0x00c7); unicode_input_finish(); + } else { + unicode_input_start(); register_hex(0x00e7); unicode_input_finish(); + } + } + return false; break; + // Keys to change unicode mode + case UNI_LI: + if( record->event.pressed ) { + set_unicode_input_mode(UC_LNX); + } + return false; break; + case UNI_WN: + if( record->event.pressed ) { + set_unicode_input_mode(UC_WIN); + } + return false; break; + } + return true; +} + +// Tap dance feature for the altgr implementation +void altgr_dvo_tap (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + register_code (KC_RALT); + } else if (state->count == 2) { + unregister_code (KC_RALT); + layer_on(_TD); + } else if (state->count == 3) { + layer_off(_TD); + } +} +void altgr_dvo_end (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + unregister_code (KC_RALT); + } else if (state->count == 2) { + layer_off(_TD); + } +} + +// Shift vs capslock function +void caps_tap (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + register_code (KC_LSFT); + } else if (state->count == 2) { + unregister_code (KC_LSFT); + register_code (KC_CAPS); + } +} +void caps_tap_end (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + unregister_code (KC_LSFT); + } else { + unregister_code (KC_CAPS); + } +} + +// Parantheses +void paranthesis_dance (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + SEND_STRING("()"); register_code(KC_LEFT); unregister_code(KC_LEFT); + } else if (state->count == 2) { + SEND_STRING("("); + } else if (state->count == 3) { + SEND_STRING(")"); + } +} +void curly_dance (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + SEND_STRING("{}"); register_code(KC_LEFT); unregister_code(KC_LEFT); + } else if (state->count == 2) { + SEND_STRING("{"); + } else if (state->count == 3) { + SEND_STRING("}"); + } +} + +void square_dance (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + SEND_STRING("[]"); register_code(KC_LEFT); unregister_code(KC_LEFT); + } else if (state->count == 2) { + SEND_STRING("["); + } else if (state->count == 3) { + SEND_STRING("]"); + } +} + +void angular_dance (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + SEND_STRING("<>"); register_code(KC_LEFT); unregister_code(KC_LEFT); + } else if (state->count == 2) { + SEND_STRING("<"); + } else if (state->count == 3) { + SEND_STRING(">"); + } +} + +// Copy or cut feature +void copy_cut (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + register_code (KC_LCTL); + register_code (KC_C); + unregister_code (KC_C); + unregister_code (KC_LCTL); + } else if (state->count == 2) { + register_code (KC_LCTL); + register_code (KC_X); + unregister_code (KC_X); + unregister_code (KC_LCTL); + } +} + +// Tap dance feature +qk_tap_dance_action_t tap_dance_actions[] = { + // Tap once for Left Ctrl, second one is momentory switch to layer TUR + [ATD] = ACTION_TAP_DANCE_FN_ADVANCED( altgr_dvo_tap, NULL, altgr_dvo_end ) + // Advanced tap dance feature allows for immediate response to shift + ,[CLS] = ACTION_TAP_DANCE_FN_ADVANCED( caps_tap, NULL, caps_tap_end ) + // Shifting for double quote and semicolon + ,[SCL] = ACTION_TAP_DANCE_DOUBLE( KC_SCLN, KC_COLN ) + ,[QUO] = ACTION_TAP_DANCE_DOUBLE( KC_QUOT, KC_DQUO ) + // Tap dances for paranthesis, which sends macros + ,[PAR] = ACTION_TAP_DANCE_FN_ADVANCED( NULL, NULL, paranthesis_dance ) + ,[CUR] = ACTION_TAP_DANCE_FN_ADVANCED( NULL, NULL, curly_dance ) + ,[SQU] = ACTION_TAP_DANCE_FN_ADVANCED( NULL, NULL, square_dance ) + ,[ANG] = ACTION_TAP_DANCE_FN_ADVANCED( NULL, NULL, angular_dance ) + // Tap dance for copy/cutting + ,[CPC] = ACTION_TAP_DANCE_FN( copy_cut ) +};