Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mitosis:datagrok add layer select, more layouts #3835

Merged
merged 21 commits into from
Sep 4, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
df4612f
mitosis:datagrok: fix typo'd inconsistent brace arrangement
datagrok Sep 1, 2018
1bb29ee
mitosis:datagrok: add makefile argument MITOSIS_DATAGROK_SLOWUART
datagrok Sep 2, 2018
faa901d
mitosis:datagrok: return backspace to opposite space, use TT(), more
datagrok Sep 2, 2018
d3e3991
mitosis:datagrok: modularize features, add default layer rotator key
datagrok Sep 2, 2018
e9a2945
mitosis: add MITOSIS_DATAGROK_BOTTOMSPACE makefile argument
datagrok Sep 2, 2018
9a59c57
mitosis:datagrok: README improvements; document new features
datagrok Sep 2, 2018
06f45f7
mitosis:datagrok: dot. not "number pad dot." in numbers layer
datagrok Sep 2, 2018
0b16eda
mitosis:datagrok remove unnecessary _user audio code
datagrok Sep 2, 2018
293afca
mitosis:datagrok: return to MO() for red/blue, keep TT() for purple
datagrok Sep 2, 2018
04bfc88
mitosis:datagrok: add colemak and dvorak default layers
datagrok Sep 2, 2018
e53ebd7
mitosis:datagrok update readme re: available default layouts
datagrok Sep 2, 2018
0794d50
mitosis: remove unneeded code that was overriding led_set_user
datagrok Sep 2, 2018
094952e
mitosis:datagrok: updated led setting code for new layers
datagrok Sep 2, 2018
dd254ff
mitosis:datagrok: update LEDs when setting the default layer
datagrok Sep 2, 2018
94cd181
mitosis:datagrok update readme with new imgur links + other improvements
datagrok Sep 2, 2018
53a4b56
mitosis:datagrok fix typo in image urls
datagrok Sep 2, 2018
0b58487
mitosis:datagrok remove useless #include (ty @drashna)
datagrok Sep 4, 2018
25166d1
mitosis:datagrok undo unnecessary change to quantum/quantum.h
datagrok Sep 4, 2018
519e7a2
mitosis:datagrok move customized layout to my keymap
datagrok Sep 4, 2018
3de7ecd
mitosis:datagrok update comment describing my led indicator logic
datagrok Sep 4, 2018
89428c9
datagrok:mitosis update readme to document LED indicator.
datagrok Sep 4, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 33 additions & 8 deletions keyboards/mitosis/keymaps/datagrok/config.h
Original file line number Diff line number Diff line change
@@ -1,12 +1,21 @@
#ifndef CONFIG_USER_H
#define CONFIG_USER_H

#include "../../config.h"
#ifdef MITOSIS_DATAGROK_SLOWUART
// This is the highest possible baud rate that a pro micro clocked at 8Mhz can
// support without errors. I don't notice any difference in behavior at this
// slower speed. (So I think it should maybe be the default, to allow a single
// codebase to support both available flavors of pro micro.) This requires a
// corresponding change to the wireless module firmware; see
// https://github.com/reversebias/mitosis/pull/10
#undef SERIAL_UART_BAUD // avoids redefinition warning
#define SERIAL_UART_BAUD 250000
#endif

// I want to place an underscore as tap behavior on the right shift key. But
// RSFT_T(KC_UNDS) doesn't work; mod-tap doesn't work with pre-shifted keys. So
// instead we take advantage of Space Cadet Shift that does something similar
// and just tweak it to use the -_ key instead of 0) See
// instead I take advantage of Space Cadet Shift that does something similar
// and just tweak it to use the -/_ key instead of 0/). See
// https://github.com/qmk/qmk_firmware/pull/2055
#define RSPC_KEY KC_MINS

Expand All @@ -18,15 +27,31 @@
//#define NO_ACTION_FUNCTION

#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) \
#define STARTUP_SONG SONG(MARIO_MUSHROOM)
#define DEFAULT_LAYER_SONGS { \
SONG(QWERTY_SOUND), \
SONG(COLEMAK_SOUND), \
SONG(DVORAK_SOUND), \
SONG(ZELDA_TREASURE), \
}
#define AUDIO_VOICES
#define AUDIO_CLICKY
#define C6_AUDIO
#endif

#endif

#define LAYOUT_bottomspace( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, \
k31, k32, k33, k34, k35, k36, k37, k38, \
k41, k42, k43, k44, k45, k46, k47, k48 \
) \
{ \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09 }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19 }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29 }, \
{ KC_NO, k31, k32, k43, k44, k45, k46, k37, k38, KC_NO }, \
{ KC_NO, k41, k42, k33, k34, k35, k36, k47, k48, KC_NO } \
}
233 changes: 150 additions & 83 deletions keyboards/mitosis/keymaps/datagrok/keymap.c
Original file line number Diff line number Diff line change
@@ -1,16 +1,34 @@
#include QMK_KEYBOARD_H

#ifdef AUDIO_ENABLE
#include "audio.h"
#ifdef DEFAULT_LAYER_SONGS
extern float default_layer_songs[][][];
#endif
#endif

enum mitosis_layers
{
{
_xQ, // qwerty
_xC, // colemak
_xD, // dvorak
_xW, // workman
_xS, // symbols
_xN, // numbers
_xF // functions
};
};

enum mitosis_keycodes
{
KC_LAYO = SAFE_RANGE
};

// Setting MITOSIS_DATAGROK_BOTTOMSPACE in rules.mk will swap the upper and
// lower center four thumb-keys. See keymaps/datagrok/rules.mk.
#ifdef MITOSIS_DATAGROK_BOTTOMSPACE
#undef LAYOUT
#define LAYOUT LAYOUT_bottomspace
#endif

// Fillers to make layering more clear
#define _______ KC_TRNS // Transparent
Expand All @@ -31,58 +49,125 @@ enum mitosis_layers

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_xQ] = LAYOUT(
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_QUOT,
/*, */ KC_LGUI, KC_LCTL, MO(_xS), KC_TAB, KC_SPC, MO(_xS), KC_RCTL, KC_RGUI,
/*, */ KC_HENK, KC_LALT, MO(_xN), KC_LSFT, KC_RSPC, MO(_xN), KC_RALT, KC_MHEN),
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_QUOT,
/*, */ KC_LGUI, KC_LCTL, MO(_xS), KC_BSPC, KC_SPC, MO(_xS), KC_RCTL, KC_RGUI,
/*, */ KC_HENK, KC_LALT, MO(_xN), LSFT_T(KC_TAB), KC_RSPC, MO(_xN), KC_RALT, KC_MHEN),
[_xC] = LAYOUT(
KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN,
KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_QUOT,
/*, */ _______, _______, _______, _______, _______, _______, _______, _______,
/*, */ _______, _______, _______, _______, _______, _______, _______, _______),
[_xD] = LAYOUT(
KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L,
KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S,
KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z,
/*, */ _______, _______, _______, _______, _______, _______, _______, _______,
/*, */ _______, _______, _______, _______, _______, _______, _______, _______),
[_xW] = LAYOUT(
KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_SCLN,
KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I,
KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_QUOT,
/*, */ _______, _______, _______, _______, _______, _______, _______, _______,
/*, */ _______, _______, _______, _______, _______, _______, _______, _______),
KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_SCLN,
KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I,
KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_QUOT,
/*, */ _______, _______, _______, _______, _______, _______, _______, _______,
/*, */ _______, _______, _______, _______, _______, _______, _______, _______),
[_xS] = LAYOUT(
KC_ESC, KC_GRV , KC_UP, KC_EQL , KC_TILD, KC_PLUS, KC_CIRC, KC_AMPR, KC_PERC, KC_MINS,
KC_BSPC, KC_LEFT, KC_DOWN, KC_RGHT, _______, KC_PIPE, KC_AT, KC_DLR, KC_HASH, KC_ENT,
KC_BSLS, KC_LABK, KC_LCBR, KC_LPRN, KC_LBRC, KC_RBRC, KC_RCBR, KC_RPRN, KC_RABK, KC_SLSH,
/*, */ _______, _______, _______, _______, _______, _______, _______, _______,
/*, */ _______, _______, MO(_xF), _______, _______, MO(_xF), _______, _______),
KC_ESC, KC_GRV , KC_UP, KC_EQL , KC_TILD, KC_PLUS, KC_CIRC, KC_AMPR, KC_PERC, KC_MINS,
_______, KC_LEFT, KC_DOWN, KC_RGHT, _______, KC_PIPE, KC_AT, KC_DLR, KC_HASH, KC_ENT,
KC_BSLS, KC_LABK, KC_LCBR, KC_LPRN, KC_LBRC, KC_RBRC, KC_RPRN, KC_RCBR, KC_RABK, KC_SLSH,
/*, */ _______, _______, _______, KC_DEL, _______, _______, _______, _______,
/*, */ _______, _______, TT(_xF), _______, _______, TT(_xF), _______, _______),
[_xN] = LAYOUT(
_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_PPLS, KC_7, KC_8, KC_9, KC_PMNS,
_______, KC_F4, KC_F5, KC_F6, KC_F11, KC_NLCK, KC_4, KC_5, KC_6, KC_PENT,
_______, KC_F1, KC_F2, KC_F3, KC_F12, KC_PAST, KC_1, KC_2, KC_3, KC_PSLS,
/*, */ _______, _______, MO(_xF), _______, _______, MO(_xF), KC_0, KC_PDOT,
/*, */ _______, _______, _______, _______, _______, _______, _______, _______),
KC_PSCR, KC_F7, KC_F8, KC_F9, KC_F10, KC_PPLS, KC_7, KC_8, KC_9, KC_PMNS,
KC_SLCK, KC_F4, KC_F5, KC_F6, KC_F11, KC_NLCK, KC_4, KC_5, KC_6, KC_PENT,
KC_PAUS, KC_F1, KC_F2, KC_F3, KC_F12, KC_PAST, KC_1, KC_2, KC_3, KC_PSLS,
/*, */ _______, _______, TT(_xF), _______, _______, TT(_xF), KC_0, KC_DOT,
/*, */ _______, _______, _______, _______, _______, _______, _______, _______),
[_xF] = LAYOUT(
RESET, KC_INS, KC_PGUP, KC_DEL, KC_VOLU, KC_PPLS, KC_P7, KC_P8, KC_P9, KC_PMNS,
CK_TOGG, KC_HOME, KC_PGDN, KC_END, KC_VOLD, KC_NLCK, KC_P4, KC_P5, KC_P6, KC_PENT,
TG(_xW), KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_PAST, KC_P1, KC_P2, KC_P3, KC_PSLS,
/*, */ CK_UP, MU_TOG, _______, _______, _______, _______, KC_P0, KC_PDOT,
/*, */ CK_DOWN, MU_MOD, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS),
RESET, KC_INS, KC_PGUP, DEBUG, KC_VOLU, KC_PPLS, KC_P7, KC_P8, KC_P9, KC_PMNS,
CK_TOGG, KC_HOME, KC_PGDN, KC_END, KC_VOLD, KC_NLCK, KC_P4, KC_P5, KC_P6, KC_PENT,
KC_LAYO, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_PAST, KC_P1, KC_P2, KC_P3, KC_PSLS,
/*, */ CK_UP, MU_TOG, _______, _______, _______, _______, KC_P0, KC_PDOT,
/*, */ CK_DOWN, MU_MOD, _______, _______, _______, _______, _______, _______),
};
const bool defaultlayers[] = {
[_xQ] = true,
[_xC] = true,
[_xD] = true,
[_xW] = true,
[_xS] = false,
[_xN] = false,
[_xF] = false,
};
const size_t defaultlayers_n = sizeof(defaultlayers) / sizeof(defaultlayers[0]);

// New keycode KC_LAYO rotates between available default layers (for e.g.,
// selecting a base layout). Shift+KC_LAYO makes the current one persistent.
bool process_record_layout(uint16_t keycode, keyrecord_t *record) {
uint32_t default_layer;
uint8_t i;
#if defined(AUDIO_ENABLE)
float saved_song[][2] = SONG(COIN_SOUND);
#endif

if (keycode != KC_LAYO || !record->event.pressed) {
return true;
}

// This is a hack to place <question mark> on <shift-comma> and <exclaimation
if (get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))) { // shift pressed
// save default layer. whatever the current default layer is, store that
eeconfig_update_default_layer(default_layer_state);
#if defined(AUDIO_ENABLE)
PLAY_SONG(saved_song);
#endif
} else {
// rotate default layer.
// find the current default layer
default_layer = biton32(default_layer_state);
// find next valid default layer
for (i = 1; i < defaultlayers_n; i++) {
if (defaultlayers[(default_layer + i) % defaultlayers_n]) {
break;
}
}
if (i == defaultlayers_n) {
// we fell out of the loop without finding another default layer to switch
// to.
return false;
}
default_layer = (default_layer + i) % defaultlayers_n;
default_layer_set(1U<<default_layer);
led_set(host_keyboard_leds());
#if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS)
PLAY_SONG(default_layer_songs[default_layer]);
#endif
}
return false;
}

// This is a hack to place <question mark> on <shift-comma> and <exclamation
// mark> on <shift-period>, when using an operating system configured for a
// US/qwerty layout.
// cdeq = "comma dot exclamation question"
bool comm_shifted = false;
bool ques_shifted = false;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
bool process_record_cdeq(uint16_t keycode, keyrecord_t *record) {
uint8_t shifted;
uint16_t s_keycode;
bool *k_shifted;

switch (keycode) {
case KC_COMM:
s_keycode = KC_SLSH;
k_shifted = &comm_shifted;
break;
case KC_DOT:
s_keycode = KC_1;
k_shifted = &ques_shifted;
break;
default:
return true;
case KC_COMM:
s_keycode = KC_SLSH;
k_shifted = &comm_shifted;
break;
case KC_DOT:
s_keycode = KC_1;
k_shifted = &ques_shifted;
break;
default:
return true;
}

shifted = get_mods() & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT));
Expand All @@ -104,47 +189,29 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
}

#ifdef AUDIO_ENABLE
float tone_qwerty[][2] = SONG(QWERTY_SOUND);
float tone_dyn_macro_rec[][2] = SONG(DVORAK_SOUND);
float tone_dyn_macro_play[][2] = SONG(COLEMAK_SOUND);
float tone_fnpc[][2] = SONG(PLOVER_SOUND);
float tone_fnmac[][2] = SONG(PLOVER_GOODBYE_SOUND);

void startup_user()
{
float tone_startup[][2] = SONG(STARTUP_SOUND);
_delay_ms(20); // gets rid of tick
PLAY_SONG(tone_startup);
}

void shutdown_user()
{
float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
PLAY_SONG(tone_goodbye);
_delay_ms(150);
stop_all_notes();
}

void music_on_user(void)
{
music_scale_user();
}

void music_scale_user(void)
{
float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
PLAY_SONG(music_scale);
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return \
process_record_cdeq(keycode, record) && \
process_record_layout(keycode, record);
}

#endif

// Set the bits of A selected by MASK to the corresponding bits of B
#define setbits(A, B, MASK) A = (A & (B | ~MASK)) | (B & MASK)
void matrix_scan_user(void) {

void led_set_user(uint8_t usb_leds) {
// A simple (but technically inaccurate) model of the momentary layer state:
// Red layer active -> indicator = red
// Blue layer active -> indicator = blue
// Purple layer active -> indicator = purple
// the Pro Micro tx LED displays Num Lock status.
//
// Workman layout active -> indicator = green
// Workman red layer -> indicator = yellow (red + green)
// Workman blue layer -> indicator = cyan (blue + green)
// Workman purple layer -> indicator = white (red + blue + green)

// Bit # 7 6 5 4 3 2 1 0
// layer_state: [ | | | _xF | _xN | _xS | _xQ | _xW ]
// layer_state: [ | _xF | _xN | _xS | _xW | _xD | _xC | _xQ ]
// usb_led [ | | |kana |cmps |scrl |caps | num ]
// PORTB: [ NC | 10 | 9 | 8 | 14 | 16 | 15 |rxled]
// PORTC: [ NC | 5 | | | | | | ]
Expand All @@ -158,16 +225,16 @@ void matrix_scan_user(void) {
// board. Each may be connected to an LED by way of a resistor (4.7k to
// match the others) for a total of 14 additional indicators.

// A simple (but technically inaccurate) model of the momentary layer state:
// Fn1 key makes _xS active; indicator = red
// Fn2 key makes _xN active; indicator = blue
// Both keys make _xF active; indicator = purple
// Toggling QWERTY mode makes indicator include green, so (red/blue/purple becomes yellow/cyan/white)

uint32_t portf_bits = \
((layer_state|default_layer_state)&0b01100000)>>1 | \
((layer_state|default_layer_state)&0b00010000)<<1 | \
((layer_state|default_layer_state)&0b01000000)>>2;
uint32_t portd_bits = \
(usb_leds&0b1)<<5 | \
((layer_state|default_layer_state)&0b1000)>>2;
// negated because for ports 0=LED on.
uint32_t portf_bits = ~(layer_state|layer_state<<1|(layer_state&0b100)<<3);
setbits(PORTF, portf_bits, 0b00110000);
setbits(PORTD, ~layer_state, 0b00000010);
setbits(PORTF, ~portf_bits, 0b00110000);
setbits(PORTD, ~portd_bits, 0b00100010);
}

// vim: set sw=2 et:
Loading