[Keymap] RGB Changes for Drashna Keyboards (#5803)

* Disable a bunch of reactive modes

* Enable rgb matrix for Corne Keyboard

* Convert CRKBD to rgb matrix

* Add Gergo keyboard layout

* Make Diablo 3 tap dance better

* Add basic support for Planck EZ

* Fix RGB Matrix stuff

* Fix keycodes for Planck EZ

* Update CRKBD OLED stuff

* Fix typo for sleep on ergodox glow

* Improve my gergo layout

* Scrolling OLED key logger!

* Change gergo layout

* Hnadle unicode keycodes if unicode is disabled

* Disable COMMAND/CONSOLE for gergo

* Fix right side control

* Re-enable LTO for all platforms

Since I got updated arm gcc binaries that no longer error out on lto

* Update formatting to match newer community standards

Poor 2 space

* Re-alight startup animation to use new HUE range

* Streamline gitlab ci scripts

* Disabled Space Cadet

* Add support for breathing table

* Enable new LTO Option

And clean up defines that will now be repeatitive

* Remove vscode settings

* Additional formatting cleanup of config.h files
pull/5810/head
Drashna Jaelre 6 years ago committed by MechMerlin
parent 7a751f1141
commit f3d5b1091d

@ -27,7 +27,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// #define MASTER_RIGHT // #define MASTER_RIGHT
#define EE_HANDS #define EE_HANDS
// #define SSD1306OLED #undef USE_I2C
#undef SSD1306OLED
#define USE_SERIAL_PD2 #define USE_SERIAL_PD2
@ -35,17 +36,42 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// #define TAPPING_TERM 100 // #define TAPPING_TERM 100
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
#undef RGBLED_NUM # undef RGBLED_NUM
#define RGBLED_NUM 27 # define RGBLED_NUM 27
#define RGBLIGHT_HUE_STEP 8 # define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8 # define RGBLIGHT_SAT_STEP 8
#define RGBLIGHT_VAL_STEP 8 # define RGBLIGHT_VAL_STEP 8
#define RGBLIGHT_LIMIT_VAL 100 # define RGBLIGHT_LIMIT_VAL 100
#endif #endif
#ifdef RGB_MATRIX_ENABLE
# define RGB_MATRIX_KEYPRESSES // reacts to keypresses
# define RGB_DISABLE_WHEN_USB_SUSPENDED true // turn off effects when suspended
# define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN
# define DISABLE_RGB_MATRIX_CYCLE_ALL
# define DISABLE_RGB_MATRIX_CYCLE_UP_DOWN
# define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
# define DISABLE_RGB_MATRIX_DUAL_BEACON
# define DISABLE_RGB_MATRIX_RAINBOW_BEACON
# define DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS
// #define DISABLE_RGB_MATRIX_RAINDROPS
// #define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
# define DISABLE_RGB_MATRIX_DIGITAL_RAIN
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
# define DISABLE_RGB_MATRIX_SOLID_SPLASH
# define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
#define B6_AUDIO # define B6_AUDIO
// #define NO_MUSIC_MODE // #define NO_MUSIC_MODE
#endif #endif

@ -1,15 +1,5 @@
#include QMK_KEYBOARD_H #include QMK_KEYBOARD_H
#include "drashna.h" #include "drashna.h"
#ifdef PROTOCOL_LUFA
#include "lufa.h"
#include "split_util.h"
#endif
#ifdef SSD1306OLED
#include "ssd1306.h"
#endif
#ifdef OLED_DRIVER_ENABLE
#include "oled_driver.h"
#endif
extern keymap_config_t keymap_config; extern keymap_config_t keymap_config;
extern uint8_t is_master; extern uint8_t is_master;
@ -20,7 +10,7 @@ extern rgblight_config_t rgblight_config;
#endif #endif
enum crkbd_keycodes { enum crkbd_keycodes {
RGBRST = NEW_SAFE_RANGE RGBRST = NEW_SAFE_RANGE
}; };
#define LAYOUT_crkbd_base( \ #define LAYOUT_crkbd_base( \
@ -31,7 +21,7 @@ enum crkbd_keycodes {
LAYOUT_wrapper( \ LAYOUT_wrapper( \
KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_MINS, \ KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_MINS, \
KC_TAB, ALT_T(K11), K12, K13, K14, K15, K16, K17, K18, K19, K1A, RGUI_T(KC_QUOT), \ KC_TAB, ALT_T(K11), K12, K13, K14, K15, K16, K17, K18, K19, K1A, RGUI_T(KC_QUOT), \
OS_LSFT, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, CTL_T(K2A), OS_RSFT, \ OS_LSFT, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, RCTL_T(K2A), OS_RSFT, \
LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE \ LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE \
) )
#define LAYOUT_crkbd_base_wrapper(...) LAYOUT_crkbd_base(__VA_ARGS__) #define LAYOUT_crkbd_base_wrapper(...) LAYOUT_crkbd_base(__VA_ARGS__)
@ -115,35 +105,38 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
}; };
void matrix_init_keymap(void) { void matrix_init_keymap(void) {
//SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h #ifndef CONVERT_TO_PROTON_C
#ifdef SSD1306OLED
iota_gfx_init(!has_usb()); // turns on the display
#endif
#ifndef CONVERT_TO_PROTON_C
setPinOutput(D5); setPinOutput(D5);
writePinHigh(D5); writePinHigh(D5);
setPinOutput(B0); setPinOutput(B0);
writePinHigh(B0); writePinHigh(B0);
#endif #endif
} }
//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
#ifdef SSD1306OLED
// When add source files to SRC in rules.mk, you can use functions. #ifdef OLED_DRIVER_ENABLE
const char *read_logo(void); oled_rotation_t oled_init_user(oled_rotation_t rotation) {
char layer_state_str[24]; if (is_master) {
char modifier_state_str[24]; return OLED_ROTATION_270;
char host_led_state_str[24]; } else {
char keylog_str[24] = {}; return rotation;
char keylogs_str[21] = {}; }
int keylogs_str_idx = 0; }
void render_crkbd_logo(void) {
static const char PROGMEM crkbd_logo[] = {
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94,
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4,
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4,
0};
oled_write_P(crkbd_logo, false);
}
// const char *read_mode_icon(bool swap); #define KEYLOG_LEN (int)(32 / OLED_FONT_WIDTH)
// void set_timelog(void); char keylog_str[KEYLOG_LEN] = {};
// const char *read_timelog(void); uint8_t keylogs_str_idx = 0;
uint16_t log_timer = 0;
const char code_to_name[60] = { const char code_to_name[60] = {
' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
@ -153,261 +146,124 @@ const char code_to_name[60] = {
'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\', 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\',
'#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '}; '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '};
void set_keylog(uint16_t keycode, keyrecord_t *record) { void add_keylog(uint16_t keycode) {
char name = ' '; if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) ||
if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { keycode = keycode & 0xFF; } (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { keycode = keycode & 0xFF; }
if (keycode < 60) {
name = code_to_name[keycode];
}
// update keylog
snprintf(keylog_str, sizeof(keylog_str), "%dx%d, k%2d : %c",
record->event.key.row, record->event.key.col,
keycode, name);
// update keylogs
if (keylogs_str_idx == sizeof(keylogs_str) - 1) {
keylogs_str_idx = 0;
for (int i = 0; i < sizeof(keylogs_str) - 1; i++) {
keylogs_str[i] = ' ';
}
}
keylogs_str[keylogs_str_idx] = name;
keylogs_str_idx++;
}
const char *read_keylog(void) { for (uint8_t i = KEYLOG_LEN - 1; i > 0; i--) {
return keylog_str; keylog_str[i] = keylog_str[i - 1];
}
if (keycode < 60) {
keylog_str[0] = code_to_name[keycode];
}
log_timer = timer_read();
} }
const char *read_keylogs(void) { void update_log(void) {
return keylogs_str; if (timer_elapsed(log_timer) > 750) {
add_keylog(0);
}
} }
const char* read_modifier_state(void) { bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
uint8_t modifiers = get_mods(); if (record->event.pressed) { add_keylog(keycode); }
uint8_t one_shot = get_oneshot_mods(); return true;
snprintf(modifier_state_str, sizeof(modifier_state_str), "Mods:%s %s %s %s",
(modifiers & MOD_MASK_CTRL || one_shot & MOD_MASK_CTRL) ? "CTL" : " ",
(modifiers & MOD_MASK_GUI || one_shot & MOD_MASK_GUI) ? "GUI" : " ",
(modifiers & MOD_MASK_ALT || one_shot & MOD_MASK_ALT) ? "ALT" : " ",
(modifiers & MOD_MASK_SHIFT || one_shot & MOD_MASK_SHIFT) ? "SFT" : " "
);
return modifier_state_str;
} }
const char *read_host_led_state(void) { void render_status(void) {
uint8_t leds = host_keyboard_leds();
snprintf(host_led_state_str, sizeof(host_led_state_str), "NL:%s CL:%s SL:%s",
(leds & (1 << USB_LED_NUM_LOCK)) ? "on" : "- ",
(leds & (1 << USB_LED_CAPS_LOCK)) ? "on" : "- ",
(leds & (1 << USB_LED_SCROLL_LOCK)) ? "on" : "- "
);
return host_led_state_str;
}
const char* read_layer_state(void) { oled_write_P(PSTR("Layer"), false);
switch (biton32(layer_state)) { switch (biton32(layer_state)) {
case _RAISE: case 0:
snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Raise "); oled_write_P(PSTR("Base "), false);
break; break;
case _LOWER: case _RAISE:
snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Lower "); oled_write_P(PSTR("Raise"), false);
break; break;
case _ADJUST: case _LOWER:
snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Adjust "); oled_write_P(PSTR("Lower"), false);
break; break;
default: case _ADJUST:
switch (biton32(default_layer_state)) { oled_write_P(PSTR("Adjst"), false);
break;
default:
oled_write_P(PSTR("Unkn "), false);
break;
}
oled_write_P(PSTR("Lyout"), false);
switch (biton32(default_layer_state)) {
case _QWERTY: case _QWERTY:
snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Qwerty "); oled_write_P(PSTR("QWRTY"), false);
break; break;
case _COLEMAK: case _COLEMAK:
snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Colemak"); oled_write_P(PSTR("COLMK"), false);
break; break;
case _DVORAK: case _DVORAK:
snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Dvorak "); oled_write_P(PSTR("DVRAK"), false);
break; break;
case _WORKMAN: case _WORKMAN:
snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Workman"); oled_write_P(PSTR("WRKMN"), false);
break; break;
} case _NORMAN:
break; oled_write_P(PSTR("NORMN"), false);
} break;
case _MALTRON:
return layer_state_str; oled_write_P(PSTR("MLTRN"), false);
} break;
case _EUCALYN:
void matrix_scan_keymap(void) { oled_write_P(PSTR("ECLYN"), false);
iota_gfx_task(); break;
} case _CARPLAX:
oled_write_P(PSTR("CRPLX"), false);
void matrix_render_user(struct CharacterMatrix *matrix) { break;
if (is_master) { }
//If you want to change the display of OLED, you need to change here
matrix_write_ln(matrix, read_layer_state());
matrix_write_ln(matrix, read_modifier_state());
// matrix_write_ln(matrix, read_keylog());
matrix_write_ln(matrix, read_keylogs());
// matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
// matrix_write(matrix, read_host_led_state());
//matrix_write_ln(matrix, read_timelog());
} else {
matrix_write(matrix, read_logo());
}
}
void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) {
if (memcmp(dest->display, source->display, sizeof(dest->display))) {
memcpy(dest->display, source->display, sizeof(dest->display));
dest->dirty = true;
}
}
void iota_gfx_task_user(void) {
struct CharacterMatrix matrix;
matrix_clear(&matrix);
matrix_render_user(&matrix);
matrix_update(&display, &matrix);
}
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_A ... KC_SLASH:
case KC_F1 ... KC_F12:
case KC_INSERT ... KC_UP:
case KC_KP_SLASH ... KC_KP_DOT:
case KC_F13 ... KC_F24:
if (record->event.pressed) { set_keylog(keycode, record); }
break;
// set_timelog();
}
return true;
}
#endif uint8_t modifiers = get_mods();
uint8_t one_shot = get_oneshot_mods();
oled_write_P(PSTR("Mods:"), false);
oled_write_P( (modifiers & MOD_MASK_SHIFT || one_shot & MOD_MASK_SHIFT) ? PSTR(" SFT ") : PSTR(" "), false);
oled_write_P( (modifiers & MOD_MASK_CTRL || one_shot & MOD_MASK_CTRL ) ? PSTR(" CTL ") : PSTR(" "), false);
oled_write_P( (modifiers & MOD_MASK_ALT || one_shot & MOD_MASK_ALT ) ? PSTR(" ALT ") : PSTR(" "), false);
oled_write_P( (modifiers & MOD_MASK_GUI || one_shot & MOD_MASK_GUI ) ? PSTR(" GUI ") : PSTR(" "), false);
#ifdef OLED_DRIVER_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
if (is_master) {
return OLED_ROTATION_270;
} else {
return rotation;
}
}
void render_crkbd_logo(void) { oled_write_P(PSTR("BTMGK"), false);
static const char PROGMEM crkbd_logo[] = {
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94,
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4,
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4,
0};
oled_write_P(crkbd_logo, false);
}
if (keymap_config.swap_lalt_lgui) {
oled_write_P(PSTR(" Mac "), false);
} else {
oled_write_P(PSTR(" Win "), false);
}
void render_status(void) { uint8_t led_usb_state = host_keyboard_leds();
oled_write_P(PSTR("Lock:"), false);
oled_write_P(led_usb_state & (1<<USB_LED_NUM_LOCK) ? PSTR(" NUM ") : PSTR(" "), false);
oled_write_P(led_usb_state & (1<<USB_LED_CAPS_LOCK) ? PSTR(" CAPS") : PSTR(" "), false);
oled_write_P(led_usb_state & (1<<USB_LED_SCROLL_LOCK) ? PSTR(" SCRL") : PSTR(" "), false);
oled_write_P(PSTR("Layer"), false); oled_write(keylog_str, false);
switch (biton32(layer_state)) {
case 0:
oled_write_P(PSTR("Base "), false);
break;
case _RAISE:
oled_write_P(PSTR("Raise"), false);
break;
case _LOWER:
oled_write_P(PSTR("Lower"), false);
break;
case _ADJUST:
oled_write_P(PSTR("Adjst"), false);
break;
default:
oled_write_P(PSTR("Unkn "), false);
break;
}
oled_write_P(PSTR("Lyout"), false);
switch (biton32(default_layer_state)) {
case _QWERTY:
oled_write_P(PSTR("QWRTY"), false);
break;
case _COLEMAK:
oled_write_P(PSTR("COLMK"), false);
break;
case _DVORAK:
oled_write_P(PSTR("DVRAK"), false);
break;
case _WORKMAN:
oled_write_P(PSTR("WRKMN"), false);
break;
case _NORMAN:
oled_write_P(PSTR("NORMN"), false);
break;
case _MALTRON:
oled_write_P(PSTR("MLTRN"), false);
break;
case _EUCALYN:
oled_write_P(PSTR("ECLYN"), false);
break;
case _CARPLAX:
oled_write_P(PSTR("CRPLX"), false);
break;
}
uint8_t modifiers = get_mods();
uint8_t one_shot = get_oneshot_mods();
oled_write_P(PSTR("Mods:"), false);
oled_write_P( (modifiers & MOD_MASK_CTRL || one_shot & MOD_MASK_CTRL ) ? PSTR(" CTL ") : PSTR(" "), false);
oled_write_P( (modifiers & MOD_MASK_GUI || one_shot & MOD_MASK_GUI ) ? PSTR(" GUI ") : PSTR(" "), false);
oled_write_P( (modifiers & MOD_MASK_ALT || one_shot & MOD_MASK_ALT ) ? PSTR(" ALT ") : PSTR(" "), false);
oled_write_P( (modifiers & MOD_MASK_SHIFT || one_shot & MOD_MASK_SHIFT) ? PSTR(" SFT ") : PSTR(" "), false);
oled_write_P(PSTR("BTMGK"), false);
static const char PROGMEM mode_logo[4][4] = {
{0x95,0x96,0x0a,0},
{0xb5,0xb6,0x0a,0},
{0x97,0x98,0x0a,0},
{0xb7,0xb8,0x0a,0} };
if (keymap_config.swap_lalt_lgui != false) {
oled_write_P(mode_logo[0], false);
oled_write_P(mode_logo[1], false);
} else {
oled_write_P(mode_logo[2], false);
oled_write_P(mode_logo[3], false);
}
uint8_t led_usb_state = host_keyboard_leds();
oled_write_P(PSTR("Lock:"), false);
oled_write_P(led_usb_state & (1<<USB_LED_NUM_LOCK) ? PSTR(" NUM ") : PSTR(" "), false);
oled_write_P(led_usb_state & (1<<USB_LED_CAPS_LOCK) ? PSTR(" CAPS") : PSTR(" "), false);
oled_write_P(led_usb_state & (1<<USB_LED_SCROLL_LOCK) ? PSTR(" SCRL") : PSTR(" "), false);
} }
void oled_task_user(void) { void oled_task_user(void) {
if (is_master) { if (is_master) {
render_status(); // Renders the current keyboard state (layer, lock, caps, scroll, etc) render_status(); // Renders the current keyboard state (layer, lock, caps, scroll, etc)
} else { } else {
render_crkbd_logo(); render_crkbd_logo();
oled_scroll_left(); // Turns on scrolling oled_scroll_left(); // Turns on scrolling
} }
} }
void matrix_scan_keymap(void) { update_log(); }
#endif #endif
uint16_t get_tapping_term(uint16_t keycode) { uint16_t get_tapping_term(uint16_t keycode) {
switch (keycode) { switch (keycode) {
case ALT_T(KC_A): case ALT_T(KC_A):
return TAPPING_TERM + 100; return TAPPING_TERM + 100;
default: default:
return TAPPING_TERM; return TAPPING_TERM;
} }
} }

@ -14,9 +14,10 @@ MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6 AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
SWAP_HANDS_ENABLE = no # Enable one-hand typing SWAP_HANDS_ENABLE = no # Enable one-hand typing
RGBLIGHT_STARTUP_ANIMATION = yes RGBLIGHT_STARTUP_ANIMATION = yes
RGB_MATRIX_ENABLE = WS2812
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
@ -24,3 +25,7 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
BOOTLOADER = qmk-dfu BOOTLOADER = qmk-dfu
OLED_DRIVER_ENABLE = yes OLED_DRIVER_ENABLE = yes
ifneq ($(strip $(OLED_DRIVER_ENABLE)), yes)
RGB_MATRIX_SPLIT_RIGHT=yes
endif

@ -9,23 +9,17 @@
#include QMK_KEYBOARD_H #include QMK_KEYBOARD_H
#include "drashna.h" #include "drashna.h"
// Blank template at the bottom
enum customKeycodes {
URL = 1
};
#define LAYOUT_gergo_wrapper(...) LAYOUT_gergo(__VA_ARGS__)
#define LAYOUT_gergo_base( \ #define LAYOUT_gergo_base( \
K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \ K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \
) \ ) \
LAYOUT_gergo_wrapper( \ LAYOUT_gergo_wrapper( \
KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_PIPE, \ KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_PIPE, \
KC_TAB, ALT_T(K11), K12, K13, K14, K15, _______, _______, K16, K17, K18, K19, K1A, RGUI_T(KC_QUOT), \ KC_TAB, K11, K12, K13, K14, K15, _______, _______, K16, K17, K18, K19, K1A, KC_QUOT, \
OS_LSFT, CTL_T(K21), K22, K23, K24, K25, _______, _______, _______, _______, K26, K27, K28, K29, CTL_T(K2A), OS_RSFT, \ OS_LSFT, CTL_T(K21), K22, K23, K24, K25, _______, _______, _______, _______, K26, K27, K28, K29, RCTL_T(K2A), OS_RSFT, \
_______, _______, KC_SPC, LT(_LOWER, KC_BSPC), LT(_RAISE, KC_DEL), KC_ENT, _______, _______ \ KC_GRV, KC_SPC, BK_LWER, OS_LALT, OS_RGUI, DL_RAIS, KC_ENT, _______ \
) )
#define LAYOUT_gergo_base_wrapper(...) LAYOUT_gergo_base(__VA_ARGS__) #define LAYOUT_gergo_base_wrapper(...) LAYOUT_gergo_base(__VA_ARGS__)

@ -0,0 +1,2 @@
CONSOLE_ENABLE = no
COMMAND_ENABLE = no

@ -29,24 +29,23 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define EE_HANDS #define EE_HANDS
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
#undef RGBLED_NUM # undef RGBLED_NUM
#define RGBLED_NUM 18 // Number of LEDs # define RGBLED_NUM 18 // Number of LEDs
#define RGBLED_SPLIT { 9, 9 } # define RGBLED_SPLIT { 9, 9 }
#define RGBLIGHT_HUE_STEP 12 # define RGBLIGHT_HUE_STEP 12
#define RGBLIGHT_SAT_STEP 12 # define RGBLIGHT_SAT_STEP 12
#define RGBLIGHT_VAL_STEP 12 # define RGBLIGHT_VAL_STEP 12
#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 # define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2
#define RGBLIGHT_EFFECT_SNAKE_LENGTH 2 # define RGBLIGHT_EFFECT_SNAKE_LENGTH 2
#define RGBLIGHT_EFFECT_BREATHE_CENTER 1
# define RGBLIGHT_LIMIT_VAL 225
#define RGBLIGHT_LIMIT_VAL 225
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
#define C6_AUDIO # define C6_AUDIO
#ifdef RGBLIGHT_ENABLE # ifdef RGBLIGHT_ENABLE
#define NO_MUSIC_MODE # define NO_MUSIC_MODE
#endif //RGBLIGHT_ENABLE # endif //RGBLIGHT_ENABLE
#endif //AUDIO_ENABLE #endif //AUDIO_ENABLE
#define QMK_ESC_OUTPUT F6 // usually COL #define QMK_ESC_OUTPUT F6 // usually COL
@ -56,7 +55,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#undef PRODUCT #undef PRODUCT
#ifdef KEYBOARD_keebio_iris_rev2 #ifdef KEYBOARD_keebio_iris_rev2
#define PRODUCT Drashna Hacked Iris Rev.2 # define PRODUCT Drashna Hacked Iris Rev.2
#endif #endif
#define SHFT_LED1 6 #define SHFT_LED1 6

@ -12,7 +12,7 @@
KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, \ KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, \
KC_TAB , K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSLS, \ KC_TAB , K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSLS, \
KC_C1R3, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ KC_C1R3, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \
OS_LSFT, CTL_T(K21), K22, K23, K24, K25, OS_LALT, OS_RGUI, K26, K27, K28, K29, CTL_T(K2A), OS_RSFT, \ OS_LSFT, CTL_T(K21), K22, K23, K24, K25, OS_LALT, OS_RGUI, K26, K27, K28, K29, RCTL_T(K2A), OS_RSFT, \
LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE \ LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE \
) )
#define LAYOUT_iris_base_wrapper(...) LAYOUT_iris_base(__VA_ARGS__) #define LAYOUT_iris_base_wrapper(...) LAYOUT_iris_base(__VA_ARGS__)
@ -113,22 +113,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
void matrix_init_keymap(void) { void matrix_init_keymap(void) {
#ifndef CONVERT_TO_PROTON_C #ifndef CONVERT_TO_PROTON_C
setPinOutput(D5); setPinOutput(D5);
writePinHigh(D5); writePinHigh(D5);
setPinOutput(B0); setPinOutput(B0);
writePinHigh(B0); writePinHigh(B0);
#endif #endif
} }
void keyboard_post_init_keymap(void) { void keyboard_post_init_keymap(void) {
#if BACKLIGHT_ENABLE #if BACKLIGHT_ENABLE
backlight_enable(); backlight_enable();
backlight_level(5); backlight_level(5);
#ifdef BACKLIGHT_BREATHING #ifdef BACKLIGHT_BREATHING
breathing_enable(); breathing_enable();
#endif #endif
#endif #endif
} }

@ -9,6 +9,7 @@ AUDIO_ENABLE = no
NKRO_ENABLE = yes NKRO_ENABLE = yes
BACKLIGHT_ENABLE = no BACKLIGHT_ENABLE = no
SWAP_HANDS_ENABLE = no SWAP_HANDS_ENABLE = no
SPACE_CADET_ENABLE = no
INDICATOR_LIGHTS = no INDICATOR_LIGHTS = no
MACROS_ENABLED = no MACROS_ENABLED = no

@ -21,15 +21,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "../drashna/config.h" #include "../drashna/config.h"
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
#undef RGBLED_NUM # undef RGBLED_NUM
#define RGBLED_NUM 16 // Number of LEDs # define RGBLED_NUM 16 // Number of LEDs
#undef RGBLED_SPLIT # undef RGBLED_SPLIT
#define RGBLED_SPLIT { 8, 8 } # define RGBLED_SPLIT { 8, 8 }
#endif #endif
#undef PRODUCT #undef PRODUCT
#ifdef KEYBOARD_keebio_iris_rev2 #ifdef KEYBOARD_keebio_iris_rev2
#define PRODUCT Drashna Hacked Iris LP Rev.2 (Backlit) # define PRODUCT Drashna Hacked Iris LP Rev.2 (Backlit)
#endif #endif
#undef SHFT_LED1 #undef SHFT_LED1

@ -21,15 +21,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "../drashna/config.h" #include "../drashna/config.h"
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
#undef RGBLED_NUM # undef RGBLED_NUM
#define RGBLED_NUM 16 // Number of LEDs # define RGBLED_NUM 16 // Number of LEDs
#undef RGBLED_SPLIT # undef RGBLED_SPLIT
#define RGBLED_SPLIT { 8, 8 } # define RGBLED_SPLIT { 8, 8 }
#endif #endif
#undef PRODUCT #undef PRODUCT
#ifdef KEYBOARD_keebio_iris_rev2 #ifdef KEYBOARD_keebio_iris_rev2
#define PRODUCT Drashna Hacked Iris Rev.2 (16 LED) # define PRODUCT Drashna Hacked Iris Rev.2 (16 LED)
#endif #endif
#undef SHFT_LED1 #undef SHFT_LED1

@ -21,35 +21,25 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_ROWS 5 #define MATRIX_ROWS 5
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
#undef RGBLED_NUM # undef RGBLED_NUM
#define RGBLED_NUM 16 # define RGBLED_NUM 16
#define RGBLIGHT_HUE_STEP 8 # define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8 # define RGBLIGHT_SAT_STEP 8
#define RGBLIGHT_VAL_STEP 8 # define RGBLIGHT_VAL_STEP 8
#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 # define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2
#define RGBLIGHT_EFFECT_SNAKE_LENGTH 2 # define RGBLIGHT_EFFECT_SNAKE_LENGTH 2
#define RGBLIGHT_EFFECT_BREATHE_CENTER 1
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
#undef LOCKING_SUPPORT_ENABLE
#undef LOCKING_RESYNC_ENABLE
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#undef PRODUCT #undef PRODUCT
#define PRODUCT Drashnas Viterbi Macro Pad #define PRODUCT Drashnas Viterbi Macro Pad
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
#define C6_AUDIO # define C6_AUDIO
#define NO_MUSIC_MODE # define NO_MUSIC_MODE
#endif #endif
#define LAYOUT_ortho_5x7( \ #define LAYOUT_ortho_5x7( \

@ -8,6 +8,7 @@ RGBLIGHT_ENABLE = yes
AUDIO_ENABLE = yes AUDIO_ENABLE = yes
NKRO_ENABLE = yes NKRO_ENABLE = yes
SPLIT_KEYBOARD = no SPLIT_KEYBOARD = no
SPACE_CADET_ENABLE = no
NO_SECRETS = yes NO_SECRETS = yes
MACROS_ENABLED = yes MACROS_ENABLED = yes

@ -20,6 +20,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "../drashna/config.h" #include "../drashna/config.h"
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
#undef RGBLED_NUM # undef RGBLED_NUM
#define RGBLED_NUM 12 # define RGBLED_NUM 12
#endif #endif

@ -39,37 +39,36 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
) )
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
#define RGB_DI_PIN D3 # define RGB_DI_PIN D3
#define RGBLED_NUM 16 // Number of LEDs # define RGBLED_NUM 16 // Number of LEDs
#define RGBLED_SPLIT { 8, 8 } # define RGBLED_SPLIT { 8, 8 }
#define RGBLIGHT_HUE_STEP 12 # define RGBLIGHT_HUE_STEP 12
#define RGBLIGHT_SAT_STEP 12 # define RGBLIGHT_SAT_STEP 12
#define RGBLIGHT_VAL_STEP 12 # define RGBLIGHT_VAL_STEP 12
#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 # define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2
#define RGBLIGHT_EFFECT_SNAKE_LENGTH 2 # define RGBLIGHT_EFFECT_SNAKE_LENGTH 2
#define RGBLIGHT_EFFECT_BREATHE_CENTER 1
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
#define C6_AUDIO # define C6_AUDIO
#ifdef RGBLIGHT_ENABLE # ifdef RGBLIGHT_ENABLE
#define NO_MUSIC_MODE # define NO_MUSIC_MODE
#endif # endif
#endif //AUDIO_ENABLE #endif //AUDIO_ENABLE
#undef PRODUCT #undef PRODUCT
#ifdef KEYBOARD_orthodox_rev1 #ifdef KEYBOARD_orthodox_rev1
#define PRODUCT Drashna Hacked Orthodox Rev.1 # define PRODUCT Drashna Hacked Orthodox Rev.1
#elif KEYBOARD_orthodox_rev3 #elif KEYBOARD_orthodox_rev3
#define PRODUCT Drashna Hacked Orthodox Rev.3 # define PRODUCT Drashna Hacked Orthodox Rev.3
#endif #endif
#define QMK_ESC_OUTPUT D7 // usually COL #define QMK_ESC_OUTPUT D7 // usually COL
#ifdef KEYBOARD_orthodox_rev1 #ifdef KEYBOARD_orthodox_rev1
#define QMK_ESC_INPUT D4 // usually ROW # define QMK_ESC_INPUT D4 // usually ROW
#else #else
#define QMK_ESC_INPUT D2 // usually ROW # define QMK_ESC_INPUT D2 // usually ROW
#endif #endif
#define QMK_LED B0 #define QMK_LED B0
#define QMK_SPEAKER C6 #define QMK_SPEAKER C6

@ -38,8 +38,8 @@ uint8_t last_osm;
) \ ) \
LAYOUT_wrapper( \ LAYOUT_wrapper( \
KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \ KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \
KC_TAB, K11, K12, K13, K14, K15, OS_LALT, OS_LGUI, OS_RALT, RAISE, K16, K17, K18, K19, K1A, KC_QUOT, \ KC_TAB, K11, K12, K13, K14, K15, OS_LALT, OS_LGUI, OS_RALT, RAISE, K16, K17, K18, K19, K1A, KC_QUOT, \
KC_MLSF, CTL_T(K21), K22, K23, K24, K25, LOWER, KC_SPACE,KC_BSPC, KC_DEL, KC_ENT, RAISE, K26, K27, K28, K29, CTL_T(K2A), KC_MRSF \ KC_MLSF, CTL_T(K21), K22, K23, K24, K25, LOWER, KC_SPACE,KC_BSPC, KC_DEL, KC_ENT, RAISE, K26, K27, K28, K29, RCTL_T(K2A), KC_MRSF \
) )
#define LAYOUT_orthodox_base_wrapper(...) LAYOUT_orthodox_base(__VA_ARGS__) #define LAYOUT_orthodox_base_wrapper(...) LAYOUT_orthodox_base(__VA_ARGS__)
@ -123,11 +123,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
}; };
void matrix_init_keymap(void) { void matrix_init_keymap(void) {
#ifndef CONVERT_TO_PROTON_C #ifndef CONVERT_TO_PROTON_C
setPinOutput(D5); setPinOutput(D5);
writePinHigh(D5); writePinHigh(D5);
setPinOutput(B0); setPinOutput(B0);
writePinHigh(B0); writePinHigh(B0);
#endif #endif
} }

@ -7,6 +7,7 @@ TAP_DANCE_ENABLE = no
RGBLIGHT_ENABLE = yes RGBLIGHT_ENABLE = yes
AUDIO_ENABLE = no AUDIO_ENABLE = no
NKRO_ENABLE = yes NKRO_ENABLE = yes
SPACE_CADET_ENABLE = no
INDICATOR_LIGHTS = yes INDICATOR_LIGHTS = yes
MACROS_ENABLED = no MACROS_ENABLED = no

@ -1,12 +1,11 @@
#pragma once #pragma once
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
#undef RGBLIGHT_SAT_STEP # undef RGBLIGHT_SAT_STEP
#define RGBLIGHT_SAT_STEP 12 # define RGBLIGHT_SAT_STEP 12
#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 3 # define RGBLIGHT_EFFECT_KNIGHT_LENGTH 3
#define RGBLIGHT_EFFECT_SNAKE_LENGTH 3 # define RGBLIGHT_EFFECT_SNAKE_LENGTH 3
#define RGBLIGHT_EFFECT_BREATHE_CENTER 1
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE

@ -20,6 +20,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifdef UNICODEMAP_ENABLE #ifdef UNICODEMAP_ENABLE
#include "drashna_unicode.h" #include "drashna_unicode.h"
#endif // UNICODEMAP_ENABLE #endif // UNICODEMAP_ENABLE
#ifndef UNICODE_ENABLE
# define UC(x) KC_NO
#endif
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
extern bool g_suspend_state; extern bool g_suspend_state;
@ -28,7 +31,7 @@ extern rgb_config_t rgb_matrix_config;
extern userspace_config_t userspace_config; extern userspace_config_t userspace_config;
enum more_custom_keycodes { enum more_custom_keycodes {
KC_SWAP_NUM = NEW_SAFE_RANGE KC_SWAP_NUM = NEW_SAFE_RANGE
}; };
//define layer change stuff for underglow indicator //define layer change stuff for underglow indicator
@ -43,7 +46,7 @@ bool skip_leds = false;
KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, \ KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, \
KC_TAB, K01, K02, K03, K04, K05, TG(_DIABLO), TG(_DIABLO), K06, K07, K08, K09, K0A, KC_BSLS, \ KC_TAB, K01, K02, K03, K04, K05, TG(_DIABLO), TG(_DIABLO), K06, K07, K08, K09, K0A, KC_BSLS, \
KC_C1R3, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ KC_C1R3, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \
KC_MLSF, CTL_T(K21), K22, K23, K24, K25, TG(_GAMEPAD), TG(_GAMEPAD), K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ KC_MLSF, CTL_T(K21), K22, K23, K24, K25, TG(_GAMEPAD), TG(_GAMEPAD), K26, K27, K28, K29, RCTL_T(K2A), KC_MRSF, \
KC_GRV, OS_MEH, OS_HYPR, KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, UC(0x2E2E), \ KC_GRV, OS_MEH, OS_HYPR, KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, UC(0x2E2E), \
OS_LALT, OS_LGUI, OS_RGUI, CTL_T(KC_ESCAPE), \ OS_LALT, OS_LGUI, OS_RGUI, CTL_T(KC_ESCAPE), \
KC_APP, KC_MENU, \ KC_APP, KC_MENU, \
@ -305,87 +308,88 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
switch (keycode) { switch (keycode) {
case KC_1: case KC_1:
if (IS_LAYER_ON(_GAMEPAD) && userspace_config.swapped_numbers) { if (IS_LAYER_ON(_GAMEPAD) && userspace_config.swapped_numbers) {
if (record->event.pressed) { if (record->event.pressed) {
register_code(KC_2); register_code(KC_2);
} else { } else {
unregister_code(KC_2); unregister_code(KC_2);
} }
return false; return false;
} }
break; break;
case KC_2: case KC_2:
if (IS_LAYER_ON(_GAMEPAD) && userspace_config.swapped_numbers) { if (IS_LAYER_ON(_GAMEPAD) && userspace_config.swapped_numbers) {
if (record->event.pressed) { if (record->event.pressed) {
register_code(KC_1); register_code(KC_1);
} else { } else {
unregister_code(KC_1); unregister_code(KC_1);
} }
return false; return false;
} }
break; break;
case KC_SWAP_NUM: case KC_SWAP_NUM:
if (record->event.pressed) { if (record->event.pressed) {
userspace_config.swapped_numbers ^= 1; userspace_config.swapped_numbers ^= 1;
eeconfig_update_user(userspace_config.raw); eeconfig_update_user(userspace_config.raw);
} }
} break;
//switch (keycode) { }
// case KC_P00: //switch (keycode) {
// if (!record->event.pressed) { // case KC_P00:
// register_code(KC_KP_0); // if (!record->event.pressed) {
// unregister_code(KC_KP_0); // register_code(KC_KP_0);
// register_code(KC_KP_0); // unregister_code(KC_KP_0);
// unregister_code(KC_KP_0); // register_code(KC_KP_0);
// } // unregister_code(KC_KP_0);
// return false; // }
// break; // return false;
//} // break;
return true; //}
return true;
} }
void matrix_scan_keymap(void) { // runs frequently to update info void matrix_scan_keymap(void) { // runs frequently to update info
uint8_t modifiers = get_mods(); uint8_t modifiers = get_mods();
uint8_t led_usb_state = host_keyboard_leds(); uint8_t led_usb_state = host_keyboard_leds();
uint8_t one_shot = get_oneshot_mods(); uint8_t one_shot = get_oneshot_mods();
if (!skip_leds) { if (!skip_leds) {
ergodox_board_led_off(); ergodox_board_led_off();
ergodox_right_led_1_off(); ergodox_right_led_1_off();
ergodox_right_led_2_off(); ergodox_right_led_2_off();
ergodox_right_led_3_off(); ergodox_right_led_3_off();
// Since we're not using the LEDs here for layer indication anymore, // Since we're not using the LEDs here for layer indication anymore,
// then lets use them for modifier indicators. Shame we don't have 4... // then lets use them for modifier indicators. Shame we don't have 4...
// Also, no "else", since we want to know each, independently. // Also, no "else", since we want to know each, independently.
if ( ( modifiers | one_shot ) & MOD_MASK_SHIFT || led_usb_state & (1<<USB_LED_CAPS_LOCK) ) { if ( ( modifiers | one_shot ) & MOD_MASK_SHIFT || led_usb_state & (1<<USB_LED_CAPS_LOCK) ) {
ergodox_right_led_2_on(); ergodox_right_led_2_on();
ergodox_right_led_2_set( 50 ); ergodox_right_led_2_set( 50 );
} }
if ( ( modifiers | one_shot ) & MOD_MASK_CTRL) { if ( ( modifiers | one_shot ) & MOD_MASK_CTRL) {
ergodox_right_led_1_on(); ergodox_right_led_1_on();
ergodox_right_led_1_set( 10 ); ergodox_right_led_1_set( 10 );
} }
if ( ( modifiers | one_shot ) & MOD_MASK_ALT) { if ( ( modifiers | one_shot ) & MOD_MASK_ALT) {
ergodox_right_led_3_on(); ergodox_right_led_3_on();
ergodox_right_led_3_set( 10 ); ergodox_right_led_3_set( 10 );
} }
} }
}; }
bool indicator_is_this_led_used_keyboard(uint8_t index) { bool indicator_is_this_led_used_keyboard(uint8_t index) {
switch (index) { switch (index) {
case 13 ... 14: case 13 ... 14:
return true; return true;
break; break;
default: default:
return false; return false;
} }
} }
@ -393,101 +397,81 @@ bool indicator_is_this_led_used_keyboard(uint8_t index) {
void suspend_power_down_keymap(void) { void suspend_power_down_keymap(void) {
rgb_matrix_set_suspend_state(true); rgb_matrix_set_suspend_state(true);
rgb_matrix_config.enable = false;
} }
void suspend_wakeup_init_keymap(void) { void suspend_wakeup_init_keymap(void) {
rgb_matrix_config.enable = true;
rgb_matrix_set_suspend_state(false); rgb_matrix_set_suspend_state(false);
} }
void rgb_matrix_layer_helper (uint8_t red, uint8_t green, uint8_t blue) { void rgb_matrix_layer_helper (uint8_t red, uint8_t green, uint8_t blue) {
rgb_led led; rgb_led led;
for (int i = 0; i < DRIVER_LED_TOTAL; i++) { for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
led = g_rgb_leds[i]; led = g_rgb_leds[i];
if (HAS_FLAGS(led.flags, LED_FLAG_MODIFIER)) { if (HAS_FLAGS(led.flags, LED_FLAG_MODIFIER)) {
rgb_matrix_set_color( i, red, green, blue ); rgb_matrix_set_color( i, red, green, blue );
}
} }
}
} }
void rgb_matrix_indicators_user(void) { void rgb_matrix_indicators_user(void) {
if (g_suspend_state || !rgb_matrix_config.enable || !userspace_config.rgb_layer_change) { return; } if ( userspace_config.rgb_layer_change &&
#ifdef RGB_DISABLE_WHEN_USB_SUSPENDED
switch (biton32(layer_state)) { !g_suspend_state &&
case _MODS:
rgb_matrix_layer_helper(0xFF, 0xFF, 0x00); break;
case _GAMEPAD:
rgb_matrix_layer_helper(0xFF, 0x80, 0x00);
rgb_matrix_set_color(32, 0x00, 0xFF, 0x00); // Q
rgb_matrix_set_color(31, 0x00, 0xFF, 0xFF); // W
rgb_matrix_set_color(30, 0xFF, 0x00, 0x00); // E
rgb_matrix_set_color(29, 0xFF, 0x80, 0x00); // R
rgb_matrix_set_color(37, 0x00, 0xFF, 0xFF); // A
rgb_matrix_set_color(36, 0x00, 0xFF, 0xFF); // S
rgb_matrix_set_color(35, 0x00, 0xFF, 0xFF); // D
rgb_matrix_set_color(34, 0x7A, 0x00, 0xFF); // F
rgb_matrix_set_color(27, 0xFF, 0xFF, 0xFF); // 1
rgb_matrix_set_color(26, 0x00, 0xFF, 0x00); // 2
rgb_matrix_set_color(25, 0x7A, 0x00, 0xFF); // 3
break;
case _DIABLO:
rgb_matrix_layer_helper(0xFF, 0x00, 0x00); break;
case _RAISE:
rgb_matrix_layer_helper(0xFF, 0xFF, 0x00); break;
case _LOWER:
rgb_matrix_layer_helper(0x00, 0xFF, 0x00); break;
case _ADJUST:
rgb_matrix_layer_helper(0xFF, 0x00, 0x00); break;
default:
switch (biton32(default_layer_state)) {
case _QWERTY:
rgb_matrix_layer_helper(0x00, 0xFF, 0xFF); break;
case _COLEMAK:
rgb_matrix_layer_helper(0xFF, 0x00, 0xFF); break;
case _DVORAK:
rgb_matrix_layer_helper(0x00, 0xFF, 0x00); break;
case _WORKMAN:
rgb_matrix_layer_helper(0xD9, 0xA5, 0x21); break;
case _NORMAN:
rgb_matrix_layer_helper(0xFF, 0x7C, 0x4D); break;
case _MALTRON:
rgb_matrix_layer_helper(0xFF, 0xFF, 0x00); break;
case _EUCALYN:
rgb_matrix_layer_helper(0xFF, 0x80, 0xBF); break;
case _CARPLAX:
rgb_matrix_layer_helper(0x00, 0x00, 0xFF); break;
}
}
#if 0
if (this_mod & MOD_MASK_SHIFT || this_led & (1<<USB_LED_CAPS_LOCK) || this_osm & MOD_MASK_SHIFT) {
rgb_matrix_set_color(24, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(36, 0x00, 0xFF, 0x00);
}
if (this_mod & MOD_MASK_CTRL || this_osm & MOD_MASK_CTRL) {
rgb_matrix_set_color(25, 0xFF, 0x00, 0x00);
rgb_matrix_set_color(34, 0xFF, 0x00, 0x00);
rgb_matrix_set_color(37, 0xFF, 0x00, 0x00);
}
if (this_mod & MOD_MASK_GUI || this_osm & MOD_MASK_GUI) {
rgb_matrix_set_color(39, 0xFF, 0xD9, 0x00);
}
if (this_mod & MOD_MASK_ALT || this_osm & MOD_MASK_ALT) {
rgb_matrix_set_color(38, 0x00, 0x00, 0xFF);
}
#endif #endif
} #if defined(RGBLIGHT_ENABLE)
(!rgblight_config.enable && rgb_matrix_config.enable)
void matrix_init_keymap(void) { #else
#if 0 rgb_matrix_config.enable
#ifdef RGB_MATRIX_KEYPRESSES
rgblight_mode(RGB_MATRIX_MULTISPLASH);
#else
rgblight_mode(RGB_MATRIX_RAINBOW_MOVING_CHEVRON);
#endif
#endif #endif
) {
switch (biton32(layer_state)) {
case _MODS:
rgb_matrix_layer_helper(0xFF, 0xFF, 0x00); break;
case _GAMEPAD:
rgb_matrix_layer_helper(0xFF, 0x80, 0x00);
rgb_matrix_set_color(32, 0x00, 0xFF, 0x00); // Q
rgb_matrix_set_color(31, 0x00, 0xFF, 0xFF); // W
rgb_matrix_set_color(30, 0xFF, 0x00, 0x00); // E
rgb_matrix_set_color(29, 0xFF, 0x80, 0x00); // R
rgb_matrix_set_color(37, 0x00, 0xFF, 0xFF); // A
rgb_matrix_set_color(36, 0x00, 0xFF, 0xFF); // S
rgb_matrix_set_color(35, 0x00, 0xFF, 0xFF); // D
rgb_matrix_set_color(34, 0x7A, 0x00, 0xFF); // F
rgb_matrix_set_color(27, 0xFF, 0xFF, 0xFF); // 1
rgb_matrix_set_color(26, 0x00, 0xFF, 0x00); // 2
rgb_matrix_set_color(25, 0x7A, 0x00, 0xFF); // 3
break;
case _DIABLO:
rgb_matrix_layer_helper(0xFF, 0x00, 0x00); break;
case _RAISE:
rgb_matrix_layer_helper(0xFF, 0xFF, 0x00); break;
case _LOWER:
rgb_matrix_layer_helper(0x00, 0xFF, 0x00); break;
case _ADJUST:
rgb_matrix_layer_helper(0xFF, 0x00, 0x00); break;
default:
switch (biton32(default_layer_state)) {
case _QWERTY:
rgb_matrix_layer_helper(0x00, 0xFF, 0xFF); break;
case _COLEMAK:
rgb_matrix_layer_helper(0xFF, 0x00, 0xFF); break;
case _DVORAK:
rgb_matrix_layer_helper(0x00, 0xFF, 0x00); break;
case _WORKMAN:
rgb_matrix_layer_helper(0xD9, 0xA5, 0x21); break;
case _NORMAN:
rgb_matrix_layer_helper(0xFF, 0x7C, 0x4D); break;
case _MALTRON:
rgb_matrix_layer_helper(0xFF, 0xFF, 0x00); break;
case _EUCALYN:
rgb_matrix_layer_helper(0xFF, 0x80, 0xBF); break;
case _CARPLAX:
rgb_matrix_layer_helper(0x00, 0x00, 0xFF); break;
}
}
}
} }
#endif //RGB_MATRIX_INIT #endif //RGB_MATRIX_INIT

@ -1,19 +1,20 @@
TAP_DANCE_ENABLE = yes TAP_DANCE_ENABLE = yes
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
COMMAND_ENABLE = no # Commands for debug and configuration COMMAND_ENABLE = no # Commands for debug and configuration
SPACE_CADET_ENABLE = no
ifneq (,$(findstring ergodox_ez,$(KEYBOARD))) ifneq (,$(findstring ergodox_ez,$(KEYBOARD)))
RGBLIGHT_ENABLE = yes RGBLIGHT_ENABLE = yes
RGB_MATRIX_ENABLE = no RGB_MATRIX_ENABLE = no
endif endif
CONSOLE_ENABLE = no CONSOLE_ENABLE = no
BOOTMAGIC_ENABLE = yes BOOTMAGIC_ENABLE = yes
UNICODE_ENABLE = yes UNICODE_ENABLE = yes
UNICDOEMAP_ENABLE = no UNICDOEMAP_ENABLE = no
MACROS_ENABLED = no MACROS_ENABLED = no
RGBLIGHT_TWINKLE = no RGBLIGHT_TWINKLE = no
INDICATOR_LIGHTS = no INDICATOR_LIGHTS = no
RGBLIGHT_STARTUP_ANIMATION = yes RGBLIGHT_STARTUP_ANIMATION = yes
DEBOUNCE_TYPE = eager_pk DEBOUNCE_TYPE = eager_pk

@ -6,10 +6,21 @@
#define PRODUCT DrashnaDox - Hacked ErgoDox EZ Glow #define PRODUCT DrashnaDox - Hacked ErgoDox EZ Glow
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
#define RGB_MATRIX_KEYPRESSES // reacts to keypresses (will slow down matrix scan by a lot) # define RGB_MATRIX_KEYPRESSES // reacts to keypresses (will slow down matrix scan by a lot)
// #define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (not recommened) // #define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (not recommened)
// #define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects // #define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
#define RGB_DISABLE_WHEN_USB_SUSPENDED true// turn off effects when suspended # define RGB_DISABLE_WHEN_USB_SUSPENDED true// turn off effects when suspended
// #define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255 // #define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255
// #define EECONFIG_RGB_MATRIX (uint32_t *)16 // #define EECONFIG_RGB_MATRIX (uint32_t *)16
# define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN
# define DISABLE_RGB_MATRIX_CYCLE_ALL
# define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
# define DISABLE_RGB_MATRIX_DUAL_BEACON
# define DISABLE_RGB_MATRIX_RAINBOW_BEACON
# define DISABLE_RGB_MATRIX_DIGITAL_RAIN
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
# define DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
#endif #endif

@ -3,18 +3,17 @@
// #define B6_AUDIO // #define B6_AUDIO
#if defined(RGBLIGHT_ENABLE) && !defined(RGBLED_NUM) #if defined(RGBLIGHT_ENABLE) && !defined(RGBLED_NUM)
#define RGB_DI_PIN B1 # define RGB_DI_PIN B1
#define RGBLED_NUM 16 // Number of LEDs # define RGBLED_NUM 16 // Number of LEDs
#define RGBLIGHT_HUE_STEP 12 # define RGBLIGHT_HUE_STEP 12
#define RGBLIGHT_SAT_STEP 12 # define RGBLIGHT_SAT_STEP 12
#define RGBLIGHT_VAL_STEP 12 # define RGBLIGHT_VAL_STEP 12
#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 # define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2
#define RGBLIGHT_EFFECT_SNAKE_LENGTH 2 # define RGBLIGHT_EFFECT_SNAKE_LENGTH 2
#define RGBLIGHT_EFFECT_BREATHE_CENTER 1
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
#if defined(KEYBOARD_primekb_prime_m) #if defined(KEYBOARD_primekb_prime_m)
#undef PRODUCT # undef PRODUCT
#define PRODUCT Drashna Hacked Prime_M Macro Pad # define PRODUCT Drashna Hacked Prime_M Macro Pad
#endif #endif

@ -2,49 +2,52 @@
#if defined(RGBLIGHT_ENABLE) && !defined(RGBLED_NUM) #if defined(RGBLIGHT_ENABLE) && !defined(RGBLED_NUM)
#define RGB_DI_PIN B3 # define RGB_DI_PIN B3
#define RGBLED_NUM 13 // Number of LEDs # define RGBLED_NUM 13 // Number of LEDs
#define RGBLIGHT_ANIMATIONS # define RGBLIGHT_ANIMATIONS
#define RGBLIGHT_HUE_STEP 12 # define RGBLIGHT_HUE_STEP 12
#define RGBLIGHT_SAT_STEP 12 # define RGBLIGHT_SAT_STEP 12
#define RGBLIGHT_VAL_STEP 12 # define RGBLIGHT_VAL_STEP 12
#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 # define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2
#define RGBLIGHT_EFFECT_SNAKE_LENGTH 2 # define RGBLIGHT_EFFECT_SNAKE_LENGTH 2
#define RGBLIGHT_EFFECT_BREATHE_CENTER 1 # ifdef RGB_MATRIX_ENABLE
# define RGBLIGHT_DISABLE_KEYCODES
# endif
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
#define RGB_MATRIX_KEYPRESSES // reacts to keypresses (will slow down matrix scan by a lot) # define RGB_MATRIX_KEYPRESSES // reacts to keypresses (will slow down matrix scan by a lot)
// #define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (not recommened) // #define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (not recommened)
// #define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects // #define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
#define RGB_DISABLE_WHEN_USB_SUSPENDED true// turn off effects when suspended
// #define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255 // #define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255
#define EECONFIG_RGB_MATRIX (uint32_t *)15 # define RGB_DISABLE_WHEN_USB_SUSPENDED true// turn off effects when suspended
# ifndef KEYBOARD_planck_ez
# define EECONFIG_RGB_MATRIX (uint32_t *)15
# endif
#endif #endif
#if defined(KEYBOARD_lets_split_rev2) #if defined(KEYBOARD_lets_split_rev2)
#define USE_SERIAL # define USE_SERIAL
#undef USE_I2C # undef USE_I2C
# define EE_HANDS
#define EE_HANDS
#endif #endif
#if !defined(KEYBOARD_planck_light) #if !defined(KEYBOARD_planck_light)
#ifdef RGBLIGHT_ENABLE # ifdef RGBLIGHT_ENABLE
#define NO_MUSIC_MODE # define NO_MUSIC_MODE
#endif // RGBLIGHT_ENABLE # endif // RGBLIGHT_ENABLE
#endif // KEYBOARD_planck_light #endif // KEYBOARD_planck_light
#if defined(KEYBOARD_planck) #if defined(KEYBOARD_planck)
#undef PRODUCT # undef PRODUCT
#if defined(KEYBOARD_planck_light) # if defined(KEYBOARD_planck_light)
#define PRODUCT Drashna Hacked RGB Beacon (Planck Light) # define PRODUCT Drashna Hacked RGB Beacon (Planck Light)
#elif defined(KEYBOARD_planck_rev6) # elif defined(KEYBOARD_planck_rev6)
#define PRODUCT Drashna Hacked Planck Rev6 # define PRODUCT Drashna Hacked Planck Rev6
#elif defined(KEYBOARD_planck_EZ) # elif defined(KEYBOARD_planck_EZ)
#define PRODUCT Drashna Hacked Planck EZ # define PRODUCT Drashna Hacked Planck EZ
#endif # endif
#endif #endif
/* /*
@ -58,7 +61,7 @@
- MIDI notes can be sent when in Music mode is on - MIDI notes can be sent when in Music mode is on
*/ */
#define MIDI_BASIC // #define MIDI_BASIC
/* enable advanced MIDI features: /* enable advanced MIDI features:
- MIDI notes can be added to the keymap - MIDI notes can be added to the keymap

@ -34,6 +34,18 @@ enum planck_keycodes {
#define BACKLIT OSM(MOD_LSFT) #define BACKLIT OSM(MOD_LSFT)
#endif #endif
#ifdef KEYBOARD_planck_ez
# define PLNK_1 BK_LWER
# define PLNK_2 SP_LWER
# define PLNK_3 KC_NO
# define PLNK_4 ET_RAIS
#else
# define PLNK_1 SP_LWER
# define PLNK_2 BK_LWER
# define PLNK_3 DL_RAIS
# define PLNK_4 ET_RAIS
#endif
#define LAYOUT_ortho_4x12_base( \ #define LAYOUT_ortho_4x12_base( \
K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \
K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \
@ -42,8 +54,8 @@ enum planck_keycodes {
LAYOUT_ortho_4x12_wrapper( \ LAYOUT_ortho_4x12_wrapper( \
KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \ KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \
KC_TAB, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ KC_TAB, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \
KC_MLSF, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, CTL_T(K2A), KC_ENT, \ KC_MLSF, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, RCTL_T(K2A), KC_ENT, \
BACKLIT, OS_LCTL, OS_LALT, OS_LGUI, SP_LWER, BK_LWER, DL_RAIS, ET_RAIS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ BACKLIT, OS_LCTL, OS_LALT, OS_LGUI, PLNK_1, PLNK_2, PLNK_3, PLNK_4, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
) )
#define LAYOUT_ortho_4x12_base_wrapper(...) LAYOUT_ortho_4x12_base(__VA_ARGS__) #define LAYOUT_ortho_4x12_base_wrapper(...) LAYOUT_ortho_4x12_base(__VA_ARGS__)
@ -130,128 +142,132 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
switch (keycode) { switch (keycode) {
#ifdef BACKLIGHT_ENABLE
#ifdef BACKLIGHT_ENABLE case BACKLIT:
case BACKLIT: if (record->event.pressed) {
if (record->event.pressed) { register_code(KC_RSFT);
register_code(KC_RSFT); #ifdef BACKLIGHT_ENABLE
#ifdef BACKLIGHT_ENABLE backlight_step();
backlight_step(); #endif
#endif } else {
} else { unregister_code(KC_RSFT);
unregister_code(KC_RSFT); }
} return false;
return false; break;
break;
#endif #endif
} }
return true; return true;
} }
bool music_mask_user(uint16_t keycode) { bool music_mask_user(uint16_t keycode) {
switch (keycode) { switch (keycode) {
case RAISE: case RAISE:
case LOWER: case LOWER:
case BK_LWER: case BK_LWER:
case SP_LWER: case SP_LWER:
case DL_RAIS: case DL_RAIS:
case ET_RAIS: case ET_RAIS:
return false; return false;
default: default:
return true; return true;
} }
} }
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
void suspend_power_down_keymap(void) { void suspend_power_down_keymap(void) {
rgb_matrix_set_suspend_state(true); rgb_matrix_set_suspend_state(true);
rgb_matrix_config.enable = false;
} }
void suspend_wakeup_init_keymap(void) { void suspend_wakeup_init_keymap(void) {
rgb_matrix_config.enable = true;
rgb_matrix_set_suspend_state(false); rgb_matrix_set_suspend_state(false);
} }
void rgb_matrix_layer_helper (uint8_t red, uint8_t green, uint8_t blue, bool default_layer) { void rgb_matrix_layer_helper (uint8_t red, uint8_t green, uint8_t blue) {
rgb_led led; rgb_led led;
for (int i = 0; i < DRIVER_LED_TOTAL; i++) { for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
led = g_rgb_leds[i]; led = g_rgb_leds[i];
if (HAS_FLAGS(led.flags, LED_FLAG_MODIFIER)) { if (HAS_FLAGS(led.flags, LED_FLAG_MODIFIER)) {
rgb_matrix_set_color( i, red, green, blue ); rgb_matrix_set_color( i, red, green, blue );
}
} }
}
} }
void rgb_matrix_indicators_user(void) { void rgb_matrix_indicators_user(void) {
uint8_t this_mod = get_mods(); uint8_t this_mod = get_mods();
uint8_t this_led = host_keyboard_leds(); uint8_t this_led = host_keyboard_leds();
uint8_t this_osm = get_oneshot_mods(); uint8_t this_osm = get_oneshot_mods();
bool is_ez;
if (!g_suspend_state && userspace_config.rgb_layer_change && #ifdef KEYBOARD_planck_ez
#if defined(RGBLIGHT_ENABLE) && defined(RGB_MATRIX_ENABLE) is_ez = true;
(!rgblight_config.enable && rgb_matrix_config.enable) #endif
if ( userspace_config.rgb_layer_change &&
#ifdef RGB_DISABLE_WHEN_USB_SUSPENDED
!g_suspend_state &&
#endif
#if defined(RGBLIGHT_ENABLE)
(!rgblight_config.enable && rgb_matrix_config.enable)
#else #else
rgb_matrix_config.enable rgb_matrix_config.enable
#endif #endif
) { ) {
switch (biton32(layer_state)) { switch (biton32(layer_state)) {
case _RAISE: case _RAISE:
rgb_matrix_layer_helper(0xFF, 0xFF, 0x00, false); break; rgb_matrix_layer_helper(0xFF, 0xFF, 0x00); break;
case _LOWER: case _LOWER:
rgb_matrix_layer_helper(0x00, 0xFF, 0x00, false); break; rgb_matrix_layer_helper(0x00, 0xFF, 0x00); break;
case _ADJUST: case _ADJUST:
rgb_matrix_layer_helper(0xFF, 0x00, 0x00, false); break; rgb_matrix_layer_helper(0xFF, 0x00, 0x00); break;
default: default:
switch (biton32(default_layer_state)) { switch (biton32(default_layer_state)) {
case _QWERTY: case _QWERTY:
rgb_matrix_layer_helper(0x00, 0xFF, 0xFF, true); break; rgb_matrix_layer_helper(0x00, 0xFF, 0xFF); break;
case _COLEMAK: case _COLEMAK:
rgb_matrix_layer_helper(0xFF, 0x00, 0xFF, true); break; rgb_matrix_layer_helper(0xFF, 0x00, 0xFF); break;
case _DVORAK: case _DVORAK:
rgb_matrix_layer_helper(0x00, 0xFF, 0x00, true); break; rgb_matrix_layer_helper(0x00, 0xFF, 0x00); break;
case _WORKMAN: case _WORKMAN:
rgb_matrix_layer_helper(0xD9, 0xA5, 0x21, true); break; rgb_matrix_layer_helper(0xD9, 0xA5, 0x21); break;
case _NORMAN: case _NORMAN:
rgb_matrix_layer_helper(0xFF, 0x7C, 0x4D, true); break; rgb_matrix_layer_helper(0xFF, 0x7C, 0x4D); break;
case _MALTRON: case _MALTRON:
rgb_matrix_layer_helper(0xFF, 0xFF, 0x00, true); break; rgb_matrix_layer_helper(0xFF, 0xFF, 0x00); break;
case _EUCALYN: case _EUCALYN:
rgb_matrix_layer_helper(0xFF, 0x80, 0xBF, true); break; rgb_matrix_layer_helper(0xFF, 0x80, 0xBF); break;
case _CARPLAX: case _CARPLAX:
rgb_matrix_layer_helper(0x00, 0x00, 0xFF, true); break; rgb_matrix_layer_helper(0x00, 0x00, 0xFF); break;
}
} }
} }
}
switch (biton32(default_layer_state)) {
switch (biton32(default_layer_state)) { case _QWERTY:
case _QWERTY: rgb_matrix_set_color(is_ez ? 41 : 42, 0x00, 0xFF, 0xFF); break;
rgb_matrix_set_color(42, 0x00, 0xFF, 0xFF); break; case _COLEMAK:
case _COLEMAK: rgb_matrix_set_color(is_ez ? 41 : 42, 0xFF, 0x00, 0xFF); break;
rgb_matrix_set_color(42, 0xFF, 0x00, 0xFF); break; case _DVORAK:
case _DVORAK: rgb_matrix_set_color(is_ez ? 41 : 42, 0x00, 0xFF, 0x00); break;
rgb_matrix_set_color(42, 0x00, 0xFF, 0x00); break; case _WORKMAN:
case _WORKMAN: rgb_matrix_set_color(is_ez ? 41 : 42, 0xD9, 0xA5, 0x21); break;
rgb_matrix_set_color(42, 0xD9, 0xA5, 0x21); break; }
} if ( (this_mod | this_osm) & MOD_MASK_SHIFT || this_led & (1<<USB_LED_CAPS_LOCK)) {
if ( (this_mod | this_osm) & MOD_MASK_SHIFT || this_led & (1<<USB_LED_CAPS_LOCK)) { rgb_matrix_set_color(24, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(24, 0x00, 0xFF, 0x00); rgb_matrix_set_color(36, 0x00, 0xFF, 0x00);
rgb_matrix_set_color(36, 0x00, 0xFF, 0x00); }
} if ( (this_mod | this_osm) & MOD_MASK_CTRL) {
if ( (this_mod | this_osm) & MOD_MASK_CTRL) { rgb_matrix_set_color(25, 0xFF, 0x00, 0x00);
rgb_matrix_set_color(25, 0xFF, 0x00, 0x00); rgb_matrix_set_color(34, 0xFF, 0x00, 0x00);
rgb_matrix_set_color(34, 0xFF, 0x00, 0x00); rgb_matrix_set_color(37, 0xFF, 0x00, 0x00);
rgb_matrix_set_color(37, 0xFF, 0x00, 0x00);
}
} if ( (this_mod | this_osm) & MOD_MASK_GUI) {
if ( (this_mod | this_osm) & MOD_MASK_GUI) { rgb_matrix_set_color(39, 0xFF, 0xD9, 0x00);
rgb_matrix_set_color(39, 0xFF, 0xD9, 0x00); }
} if ( (this_mod | this_osm) & MOD_MASK_ALT) {
if ( (this_mod | this_osm) & MOD_MASK_ALT) { rgb_matrix_set_color(38, 0x00, 0x00, 0xFF);
rgb_matrix_set_color(38, 0x00, 0x00, 0xFF); }
}
} }
void matrix_init_keymap(void) { void matrix_init_keymap(void) {
@ -260,57 +276,81 @@ void matrix_init_keymap(void) {
#else //RGB_MATRIX_INIT #else //RGB_MATRIX_INIT
void matrix_init_keymap(void) { void matrix_init_keymap(void) {
#if !defined(CONVERT_TO_PROTON_C) && !defined(KEYBOARD_planck) #if !defined(CONVERT_TO_PROTON_C) && !defined(KEYBOARD_planck)
setPinOutput(D5); setPinOutput(D5);
writePinHigh(D5); writePinHigh(D5);
setPinOutput(B0); setPinOutput(B0);
writePinHigh(B0); writePinHigh(B0);
#endif #endif
} }
#endif //RGB_MATRIX_INIT #endif //RGB_MATRIX_INIT
#ifdef ENCODER_ENABLE #ifdef ENCODER_ENABLE
void encoder_update(bool clockwise) { void encoder_update(bool clockwise) {
switch (biton32(layer_state)) { switch (biton32(layer_state)) {
case _RAISE: case _RAISE:
clockwise ? tap_code(KC_VOLD) : tap_code(KC_VOLU); clockwise ? tap_code(KC_VOLD) : tap_code(KC_VOLU);
break; break;
case _LOWER: case _LOWER:
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
clockwise ? rgb_matrix_step() : rgblight_step_reverse(); clockwise ? rgb_matrix_step() : rgblight_step_reverse();
#else #else
clockwise ? tap_code(KC_PGDN) : tap_code(KC_PGUP); clockwise ? tap_code(KC_PGDN) : tap_code(KC_PGUP);
#endif #endif
case _ADJUST: break;
#ifdef AUDIO_CLICKY case _ADJUST:
clockwise ? clicky_freq_up() : clicky_freq_down(); #ifdef AUDIO_CLICKY
#endif clockwise ? clicky_freq_up() : clicky_freq_down();
break; #endif
default: break;
clockwise ? tap_code(KC_DOWN) : tap_code(KC_UP); default:
} clockwise ? tap_code(KC_DOWN) : tap_code(KC_UP);
#ifdef AUDIO_CLICKY }
#ifdef AUDIO_CLICKY
clicky_play(); clicky_play();
#endif #endif
} }
#endif // ENCODER_ENABLE #endif // ENCODER_ENABLE
#ifdef KEYBOARD_planck_rev6 #ifdef KEYBOARD_planck_rev6
void dip_update(uint8_t index, bool active) { void dip_update(uint8_t index, bool active) {
switch (index) { switch (index) {
case 0: case 0:
if(active) { audio_on(); } else { audio_off(); } if(active) { audio_on(); } else { audio_off(); }
break; break;
case 1: case 1:
if(active) { clicky_on(); } else { clicky_off(); } if(active) { clicky_on(); } else { clicky_off(); }
break; break;
case 2: case 2:
keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = active; keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = active;
break; break;
case 3: case 3:
userspace_config.nuke_switch = active; userspace_config.nuke_switch = active;
break; break;
} }
} }
#endif // KEYBOARD_planck_rev6 #endif // KEYBOARD_planck_rev6
#ifdef KEYBOARD_planck_ez
uint32_t layer_state_set_keymap(uint32_t state) {
palClearPad(GPIOB, 8);
palClearPad(GPIOB, 9);
switch (biton32(state)) {
case _LOWER:
palSetPad(GPIOB, 9);
break;
case _RAISE:
palSetPad(GPIOB, 8);
break;
case _ADJUST:
palSetPad(GPIOB, 9);
palSetPad(GPIOB, 8);
break;
default:
break;
}
return state;
}
#endif

@ -5,16 +5,27 @@ CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = no # Commands for debug and configuration COMMAND_ENABLE = no # Commands for debug and configuration
TAP_DANCE_ENABLE = no TAP_DANCE_ENABLE = no
AUDIO_ENABLE = yes AUDIO_ENABLE = yes
SPACE_CADET_ENABLE = no
ifeq (,$(findstring planck/rev6,$(KEYBOARD))) # Make sure it's NOT the Planck Rev6 ifeq (,$(findstring planck/rev6,$(KEYBOARD))) # Make sure it's NOT the Planck Rev6
RGBLIGHT_ENABLE = yes RGBLIGHT_ENABLE = yes
INDICATOR_LIGHTS = yes INDICATOR_LIGHTS = yes
RGBLIGHT_TWINKLE = yes RGBLIGHT_TWINKLE = yes
RGBLIGHT_STARTUP_ANIMATION = yes RGBLIGHT_STARTUP_ANIMATION = yes
endif endif
ifneq (,$(findstring planck/light,$(KEYBOARD))) # Make sure it IS the Planck Light ifneq (,$(findstring planck/light,$(KEYBOARD))) # Make sure it IS the Planck Light
RGB_MATRIX_ENABLE = yes RGB_MATRIX_ENABLE = yes
RGBLIGHT_ENABLE = no RGBLIGHT_ENABLE = no
RGBLIGHT_STARTUP_ANIMATION = no RGBLIGHT_STARTUP_ANIMATION = no
endif
ifneq (,$(findstring planck/ez,$(KEYBOARD))) # Make sure it IS the Planck Light
RGBLIGHT_ENABLE = no
# SERIAL_LINK_ENABLE = yes
ENCODER_ENABLE = no
RGB_MATRIX_ENABLE = IS31FL3737
INDICATOR_LIGHTS = yes
RGBLIGHT_TWINKLE = yes
RGBLIGHT_STARTUP_ANIMATION = yes
endif endif
ifeq ($(strip $(PROTOCOL)), VUSB) ifeq ($(strip $(PROTOCOL)), VUSB)

@ -3,20 +3,19 @@
/* ws2812 RGB LED */ /* ws2812 RGB LED */
#if defined(KEYBOARD_fractal) #if defined(KEYBOARD_fractal)
#define RGB_DI_PIN D2 # define RGB_DI_PIN D2
#undef RGBLED_NUM # undef RGBLED_NUM
#define RGBLIGHT_ANIMATIONS # define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 29 // Number of LEDs # define RGBLED_NUM 29 // Number of LEDs
#undef RGBLIGHT_HUE_STEP # undef RGBLIGHT_HUE_STEP
#define RGBLIGHT_HUE_STEP 8 # define RGBLIGHT_HUE_STEP 8
#undef RGBLIGHT_SAT_STEP # undef RGBLIGHT_SAT_STEP
#define RGBLIGHT_SAT_STEP 8 # define RGBLIGHT_SAT_STEP 8
#undef RGBLIGHT_VAL_STEP # undef RGBLIGHT_VAL_STEP
#define RGBLIGHT_VAL_STEP 8 # define RGBLIGHT_VAL_STEP 8
#define RGBLIGHT_LIMIT_VAL 175 # define RGBLIGHT_LIMIT_VAL 175
#define RGBLIGHT_SLEEP # define RGBLIGHT_SLEEP
#define RGBLIGHT_EFFECT_KNIGHT_OFFSET 3
#define RGBLIGHT_EFFECT_KNIGHT_LED_NUM 14
# define RGBLIGHT_EFFECT_KNIGHT_OFFSET 3
# define RGBLIGHT_EFFECT_KNIGHT_LED_NUM 14
#endif #endif

@ -1,9 +1,7 @@
stages: stages:
- test - test
- build
- deploy
Preliminary Test: QMK Firmware:
stage: test stage: test
variables: variables:
GIT_SUBMODULE_STRATEGY: recursive GIT_SUBMODULE_STRATEGY: recursive
@ -18,36 +16,7 @@ Preliminary Test:
script: script:
- make test:all - make test:all
- make planck/rev6:default planck/rev5:default - make planck/rev6:default planck/rev5:default
- make keebio/iris/rev2:drashna keebio/iris/rev2:drashna_old ergodox_ez:drashna ergodox_ez:drashna_glow keebio/viterbi/rev1:drashna orthodox/rev1:drashna orthodox/rev3:drashna crkbd:drashna planck/light:drashna planck/rev6:drashna fractal:drashna primekb/prime_m:drashna -j2 --output-sync
QMK Firmware Defaults:
stage: deploy
variables:
GIT_SUBMODULE_STRATEGY: recursive
tags:
- linux
image: ubuntu:18.10
before_script:
- apt-get update -qy
- apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip
- avr-gcc --version
- uname -a
script:
- make test:all
- make all:default -j16
Drashna Firmware:
stage: build
variables:
GIT_SUBMODULE_STRATEGY: recursive
tags:
- linux
image: ubuntu:18.10
before_script:
- apt-get update -qy
- apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip
- avr-gcc --version
script:
- make keebio/iris/rev2:drashna keebio/iris/rev2:drashna_old ergodox_ez:drashna ergodox_ez:drashna_glow keebio/viterbi/rev1:drashna orthodox/rev1:drashna orthodox/rev3:drashna crkbd:drashna planck/light:drashna planck/rev6:drashna fractal:drashna primekb/prime_m:drashna -j16 --output-sync
artifacts: artifacts:
name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG" name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
paths: paths:

@ -2,50 +2,43 @@
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
#define AUDIO_CLICKY # define AUDIO_CLICKY
#define STARTUP_SONG SONG(RICK_ROLL) # define STARTUP_SONG SONG(RICK_ROLL)
#define GOODBYE_SONG SONG(SONIC_RING) # define GOODBYE_SONG SONG(SONIC_RING)
#define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ # define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \
SONG(COLEMAK_SOUND), \ SONG(COLEMAK_SOUND), \
SONG(DVORAK_SOUND), \ SONG(DVORAK_SOUND), \
SONG(OVERWATCH_THEME) \ SONG(OVERWATCH_THEME) \
} }
#define AUDIO_CLICKY_FREQ_RANDOMNESS 1.5f # define AUDIO_CLICKY_FREQ_RANDOMNESS 1.5f
// #ifdef RGBLIGHT_ENABLE
// #define NO_MUSIC_MODE # define UNICODE_SONG_OSX SONG(RICK_ROLL)
// #endif //RGBLIGHT_ENABLE/ # define UNICODE_SONG_LNX SONG(RICK_ROLL)
// #ifndef __arm__ # define UNICODE_SONG_WIN SONG(RICK_ROLL)
// #undef NOTE_REST # define UNICODE_SONG_BSD SONG(RICK_ROLL)
// #define NOTE_REST 1.00f # define UNICODE_SONG_WINC SONG(RICK_ROLL)
// #endif // !__arm__
#define UNICODE_SONG_OSX SONG(RICK_ROLL)
#define UNICODE_SONG_LNX SONG(RICK_ROLL)
#define UNICODE_SONG_WIN SONG(RICK_ROLL)
#define UNICODE_SONG_BSD SONG(RICK_ROLL)
#define UNICODE_SONG_WINC SONG(RICK_ROLL)
#endif // !AUDIO_ENABLE #endif // !AUDIO_ENABLE
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
#define RGBLIGHT_SLEEP # define RGBLIGHT_SLEEP
#undef RGBLIGHT_ANIMATIONS # undef RGBLIGHT_ANIMATIONS
#define RGBLIGHT_EFFECT_BREATHING # define RGBLIGHT_EFFECT_BREATHING
#define RGBLIGHT_EFFECT_SNAKE # define RGBLIGHT_EFFECT_SNAKE
#define RGBLIGHT_EFFECT_KNIGHT # define RGBLIGHT_EFFECT_KNIGHT
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
#ifndef ONESHOT_TAP_TOGGLE #ifndef ONESHOT_TAP_TOGGLE
#define ONESHOT_TAP_TOGGLE 2 # define ONESHOT_TAP_TOGGLE 2
#endif // !ONESHOT_TAP_TOGGLE #endif // !ONESHOT_TAP_TOGGLE
#ifndef ONESHOT_TIMEOUT #ifndef ONESHOT_TIMEOUT
#define ONESHOT_TIMEOUT 3000 # define ONESHOT_TIMEOUT 3000
#endif// !ONESHOT_TIMEOUT #endif// !ONESHOT_TIMEOUT
#ifndef QMK_KEYS_PER_SCAN #ifndef QMK_KEYS_PER_SCAN
#define QMK_KEYS_PER_SCAN 4 # define QMK_KEYS_PER_SCAN 4
#endif // !QMK_KEYS_PER_SCAN #endif // !QMK_KEYS_PER_SCAN
@ -62,24 +55,27 @@
#define FORCE_NKRO #define FORCE_NKRO
#ifndef TAPPING_TOGGLE #ifndef TAPPING_TOGGLE
#define TAPPING_TOGGLE 1 # define TAPPING_TOGGLE 1
#endif #endif
#ifdef TAPPING_TERM #ifdef TAPPING_TERM
#undef TAPPING_TERM # undef TAPPING_TERM
#endif // TAPPING_TERM #endif // TAPPING_TERM
#if defined(KEYBOARD_ergodox_ez) #if defined(KEYBOARD_ergodox_ez)
#define TAPPING_TERM 185 # define TAPPING_TERM 185
#elif defined(KEYBOARD_crkbd) #elif defined(KEYBOARD_crkbd)
#define TAPPING_TERM 200 # define TAPPING_TERM 200
#else #else
#define TAPPING_TERM 175 # define TAPPING_TERM 175
#endif #endif
// Disable action_get_macro and fn_actions, since we don't use these
// and it saves on space in the firmware.
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION
#define TAP_CODE_DELAY 5 #define TAP_CODE_DELAY 5
/* Disable unused and unneeded features to reduce on firmware size */
#ifdef LOCKING_SUPPORT_ENABLE
# undef LOCKING_SUPPORT_ENABLE
#endif
#ifdef LOCKING_RESYNC_ENABLE
# undef LOCKING_RESYNC_ENABLE
#endif

@ -19,78 +19,78 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
userspace_config_t userspace_config; userspace_config_t userspace_config;
#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
#define DRASHNA_UNICODE_MODE UC_WIN #define DRASHNA_UNICODE_MODE UC_WIN
#else #else
// set to 2 for UC_WIN, set to 4 for UC_WINC // set to 2 for UC_WIN, set to 4 for UC_WINC
#define DRASHNA_UNICODE_MODE 2 #define DRASHNA_UNICODE_MODE 2
#endif #endif
// This block is for all of the gaming macros, as they were all doing // This block is for all of the gaming macros, as they were all doing
// the same thing, but with differring text sent. // the same thing, but with differring text sent.
bool send_game_macro(const char *str, keyrecord_t *record, bool override) { bool send_game_macro(const char *str, keyrecord_t *record, bool override) {
if (!record->event.pressed || override) { if (!record->event.pressed || override) {
uint16_t keycode; uint16_t keycode;
if (userspace_config.is_overwatch) { if (userspace_config.is_overwatch) {
keycode = KC_BSPC; keycode = KC_BSPC;
} else { } else {
keycode = KC_ENTER; keycode = KC_ENTER;
}
clear_keyboard();
tap_code(keycode);
wait_ms(TAP_CODE_DELAY);
send_string_with_delay(str, TAP_CODE_DELAY);
wait_ms(TAP_CODE_DELAY);
tap_code(KC_ENTER);
} }
clear_keyboard(); if (override) wait_ms(3000);
tap_code(keycode); return false;
wait_ms(TAP_CODE_DELAY);
send_string_with_delay(str, TAP_CODE_DELAY);
wait_ms(TAP_CODE_DELAY);
tap_code(KC_ENTER);
}
if (override) wait_ms(3000);
return false;
} }
bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed) { bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed) {
static uint16_t this_timer; static uint16_t this_timer;
if(pressed) { if(pressed) {
this_timer= timer_read(); this_timer= timer_read();
} else { } else {
if (timer_elapsed(this_timer) < TAPPING_TERM){ if (timer_elapsed(this_timer) < TAPPING_TERM){
tap_code(code); tap_code(code);
} else { } else {
register_code(mod_code); register_code(mod_code);
tap_code(code); tap_code(code);
unregister_code(mod_code); unregister_code(mod_code);
} }
} }
return false; return false;
} }
bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer) { bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer) {
if(pressed) { if(pressed) {
this_timer= timer_read(); this_timer= timer_read();
} else { } else {
if (timer_elapsed(this_timer) < TAPPING_TERM){ if (timer_elapsed(this_timer) < TAPPING_TERM){
tap_code(code); tap_code(code);
} else { } else {
register_code(mod_code); register_code(mod_code);
tap_code(code); tap_code(code);
unregister_code(mod_code); unregister_code(mod_code);
} }
} }
return false; return false;
} }
void bootmagic_lite(void) { void bootmagic_lite(void) {
matrix_scan(); matrix_scan();
#if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0 #if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0
wait_ms(DEBOUNCING_DELAY * 2); wait_ms(DEBOUNCING_DELAY * 2);
#elif defined(DEBOUNCE) && DEBOUNCE > 0 #elif defined(DEBOUNCE) && DEBOUNCE > 0
wait_ms(DEBOUNCE * 2); wait_ms(DEBOUNCE * 2);
#else #else
wait_ms(30); wait_ms(30);
#endif #endif
matrix_scan(); matrix_scan();
if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) { if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) {
bootloader_jump(); bootloader_jump();
} }
} }
// Add reconfigurable functions here, for keymap customization // Add reconfigurable functions here, for keymap customization
@ -103,21 +103,21 @@ void matrix_init_keymap(void) {}
// Call user matrix init, set default RGB colors and then // Call user matrix init, set default RGB colors and then
// call the keymap's init function // call the keymap's init function
void matrix_init_user(void) { void matrix_init_user(void) {
userspace_config.raw = eeconfig_read_user(); userspace_config.raw = eeconfig_read_user();
#ifdef BOOTLOADER_CATERINA #ifdef BOOTLOADER_CATERINA
DDRD &= ~(1<<5); DDRD &= ~(1<<5);
PORTD &= ~(1<<5); PORTD &= ~(1<<5);
DDRB &= ~(1<<0); DDRB &= ~(1<<0);
PORTB &= ~(1<<0); PORTB &= ~(1<<0);
#endif #endif
#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
set_unicode_input_mode(DRASHNA_UNICODE_MODE); set_unicode_input_mode(DRASHNA_UNICODE_MODE);
get_unicode_input_mode(); get_unicode_input_mode();
#endif //UNICODE_ENABLE #endif //UNICODE_ENABLE
matrix_init_keymap(); matrix_init_keymap();
} }
__attribute__((weak)) __attribute__((weak))
@ -125,26 +125,26 @@ void keyboard_post_init_keymap(void){ }
void keyboard_post_init_user(void){ void keyboard_post_init_user(void){
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
keyboard_post_init_rgb(); keyboard_post_init_rgb();
#endif #endif
keyboard_post_init_keymap(); keyboard_post_init_keymap();
} }
__attribute__ ((weak)) __attribute__ ((weak))
void shutdown_keymap(void) {} void shutdown_keymap(void) {}
void shutdown_user (void) { void shutdown_user (void) {
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
rgblight_enable_noeeprom(); rgblight_enable_noeeprom();
rgblight_mode_noeeprom(1); rgblight_mode_noeeprom(1);
rgblight_setrgb_red(); rgblight_setrgb_red();
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
#ifdef RGB_MATRIX_ENABLE #ifdef RGB_MATRIX_ENABLE
// uint16_t timer_start = timer_read(); // uint16_t timer_start = timer_read();
// rgb_matrix_set_color_all( 0xFF, 0x00, 0x00 ); // rgb_matrix_set_color_all( 0xFF, 0x00, 0x00 );
// while(timer_elapsed(timer_start) < 250) { wait_ms(1); } // while(timer_elapsed(timer_start) < 250) { wait_ms(1); }
#endif //RGB_MATRIX_ENABLE #endif //RGB_MATRIX_ENABLE
shutdown_keymap(); shutdown_keymap();
} }
__attribute__ ((weak)) __attribute__ ((weak))
@ -158,7 +158,7 @@ __attribute__ ((weak))
void suspend_wakeup_init_keymap(void) {} void suspend_wakeup_init_keymap(void) {}
void suspend_wakeup_init_user(void) { void suspend_wakeup_init_user(void) {
suspend_wakeup_init_keymap(); suspend_wakeup_init_keymap();
} }
@ -168,54 +168,54 @@ void matrix_scan_keymap(void) {}
// No global matrix scan code, so just run keymap's matrix // No global matrix scan code, so just run keymap's matrix
// scan function // scan function
void matrix_scan_user(void) { void matrix_scan_user(void) {
static bool has_ran_yet; static bool has_ran_yet;
if (!has_ran_yet) { if (!has_ran_yet) {
has_ran_yet = true; has_ran_yet = true;
startup_user(); startup_user();
} }
#ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code. #ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code.
run_diablo_macro_check(); run_diablo_macro_check();
#endif // TAP_DANCE_ENABLE #endif // TAP_DANCE_ENABLE
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
matrix_scan_rgb(); matrix_scan_rgb();
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
matrix_scan_keymap(); matrix_scan_keymap();
} }
__attribute__ ((weak)) __attribute__ ((weak))
uint32_t layer_state_set_keymap (uint32_t state) { uint32_t layer_state_set_keymap (uint32_t state) {
return state; return state;
} }
// on layer change, no matter where the change was initiated // on layer change, no matter where the change was initiated
// Then runs keymap's layer change check // Then runs keymap's layer change check
uint32_t layer_state_set_user(uint32_t state) { uint32_t layer_state_set_user(uint32_t state) {
state = update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST); state = update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST);
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
state = layer_state_set_rgb(state); state = layer_state_set_rgb(state);
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
return layer_state_set_keymap (state); return layer_state_set_keymap (state);
} }
__attribute__ ((weak)) __attribute__ ((weak))
uint32_t default_layer_state_set_keymap (uint32_t state) { uint32_t default_layer_state_set_keymap (uint32_t state) {
return state; return state;
} }
// Runs state check and changes underglow color and animation // Runs state check and changes underglow color and animation
uint32_t default_layer_state_set_user(uint32_t state) { uint32_t default_layer_state_set_user(uint32_t state) {
state = default_layer_state_set_keymap(state); state = default_layer_state_set_keymap(state);
#if 0 #if 0
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
state = default_layer_state_set_rgb(state); state = default_layer_state_set_rgb(state);
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
#endif #endif
return state; return state;
} }
__attribute__ ((weak)) __attribute__ ((weak))
@ -225,16 +225,16 @@ void led_set_keymap(uint8_t usb_led) {}
// So far, I only have keyboard specific code, // So far, I only have keyboard specific code,
// So nothing goes here. // So nothing goes here.
void led_set_user(uint8_t usb_led) { void led_set_user(uint8_t usb_led) {
led_set_keymap(usb_led); led_set_keymap(usb_led);
} }
__attribute__ ((weak)) __attribute__ ((weak))
void eeconfig_init_keymap(void) {} void eeconfig_init_keymap(void) {}
void eeconfig_init_user(void) { void eeconfig_init_user(void) {
userspace_config.raw = 0; userspace_config.raw = 0;
userspace_config.rgb_layer_change = true; userspace_config.rgb_layer_change = true;
eeconfig_update_user(userspace_config.raw); eeconfig_update_user(userspace_config.raw);
#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
set_unicode_input_mode(DRASHNA_UNICODE_MODE); set_unicode_input_mode(DRASHNA_UNICODE_MODE);
get_unicode_input_mode(); get_unicode_input_mode();

@ -22,36 +22,36 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "wrappers.h" #include "wrappers.h"
#include "process_records.h" #include "process_records.h"
#ifdef TAP_DANCE_ENABLE #ifdef TAP_DANCE_ENABLE
#include "tap_dances.h" # include "tap_dances.h"
#endif // TAP_DANCE_ENABLE #endif // TAP_DANCE_ENABLE
#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
#include "rgb_stuff.h" # include "rgb_stuff.h"
#endif #endif
#if defined(AUDIO_ENABLE) && __GNUC__ > 7 #if defined(AUDIO_ENABLE) && __GNUC__ > 7
#if __has_include("drashna_song_list.h") # if __has_include("drashna_song_list.h")
#include "drashna_song_list.h" # include "drashna_song_list.h"
#endif # endif
#endif #endif
/* Define layer names */ /* Define layer names */
enum userspace_layers { enum userspace_layers {
_QWERTY = 0, _QWERTY = 0,
_NUMLOCK = 0, _NUMLOCK = 0,
_COLEMAK, _COLEMAK,
_DVORAK, _DVORAK,
_WORKMAN, _WORKMAN,
_NORMAN, _NORMAN,
_MALTRON, _MALTRON,
_EUCALYN, _EUCALYN,
_CARPLAX, _CARPLAX,
_MODS, /* layer 8 */ _MODS, /* layer 8 */
_GAMEPAD, _GAMEPAD,
_DIABLO, _DIABLO,
_MACROS, _MACROS,
_MEDIA, _MEDIA,
_LOWER, _LOWER,
_RAISE, _RAISE,
_ADJUST, _ADJUST,
}; };
/* /*
@ -73,14 +73,14 @@ void led_set_keymap(uint8_t usb_led);
void eeconfig_init_keymap(void); void eeconfig_init_keymap(void);
typedef union { typedef union {
uint32_t raw; uint32_t raw;
struct { struct {
bool rgb_layer_change :1; bool rgb_layer_change :1;
bool is_overwatch :1; bool is_overwatch :1;
bool nuke_switch :1; bool nuke_switch :1;
uint8_t unicode_mod :4; uint8_t unicode_mod :4;
bool swapped_numbers :1; bool swapped_numbers :1;
}; };
} userspace_config_t; } userspace_config_t;
extern userspace_config_t userspace_config; extern userspace_config_t userspace_config;
@ -92,13 +92,13 @@ But since TD() doesn't work when tap dance is disabled
We use custom codes here, so we can substitute the right stuff We use custom codes here, so we can substitute the right stuff
*/ */
#ifdef TAP_DANCE_ENABLE #ifdef TAP_DANCE_ENABLE
#define KC_D3_1 TD(TD_D3_1) # define KC_D3_1 TD(TD_D3_1)
#define KC_D3_2 TD(TD_D3_2) # define KC_D3_2 TD(TD_D3_2)
#define KC_D3_3 TD(TD_D3_3) # define KC_D3_3 TD(TD_D3_3)
#define KC_D3_4 TD(TD_D3_4) # define KC_D3_4 TD(TD_D3_4)
#else // TAP_DANCE_ENABLE #else // TAP_DANCE_ENABLE
#define KC_D3_1 KC_1 # define KC_D3_1 KC_1
#define KC_D3_2 KC_2 # define KC_D3_2 KC_2
#define KC_D3_3 KC_3 # define KC_D3_3 KC_3
#define KC_D3_4 KC_4 # define KC_D3_4 KC_4
#endif // TAP_DANCE_ENABLE #endif // TAP_DANCE_ENABLE

@ -4,12 +4,12 @@ uint16_t copy_paste_timer;
__attribute__ ((weak)) __attribute__ ((weak))
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
return true; return true;
} }
__attribute__ ((weak)) __attribute__ ((weak))
bool process_record_secrets(uint16_t keycode, keyrecord_t *record) { bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
return true; return true;
} }
// Defines actions tor my global custom keycodes. Defined in drashna.h file // Defines actions tor my global custom keycodes. Defined in drashna.h file
@ -18,140 +18,140 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
// If console is enabled, it will print the matrix position and status of each key pressed // If console is enabled, it will print the matrix position and status of each key pressed
#ifdef KEYLOGGER_ENABLE #ifdef KEYLOGGER_ENABLE
#if defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_keebio_iris_rev2) # if defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_keebio_iris_rev2)
xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.row, record->event.key.col, record->event.pressed); xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.row, record->event.key.col, record->event.pressed);
#else # else
xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed); xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
#endif # endif
#endif //KEYLOGGER_ENABLE #endif //KEYLOGGER_ENABLE
switch (keycode) { switch (keycode) {
case KC_QWERTY ... KC_CARPLAX: case KC_QWERTY ... KC_CARPLAX:
if (record->event.pressed) { if (record->event.pressed) {
set_single_persistent_default_layer(keycode - KC_QWERTY); set_single_persistent_default_layer(keycode - KC_QWERTY);
} }
break; break;
case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
if (!record->event.pressed) { if (!record->event.pressed) {
uint8_t temp_mod = get_mods(); uint8_t temp_mod = get_mods();
uint8_t temp_osm = get_oneshot_mods(); uint8_t temp_osm = get_oneshot_mods();
clear_mods(); clear_oneshot_mods(); clear_mods(); clear_oneshot_mods();
send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), TAP_CODE_DELAY); send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), TAP_CODE_DELAY);
#ifndef MAKE_BOOTLOADER #ifndef MAKE_BOOTLOADER
if ( ( temp_mod | temp_osm ) & MOD_MASK_SHIFT ) if ( ( temp_mod | temp_osm ) & MOD_MASK_SHIFT )
#endif #endif
{ {
#if defined(__arm__) #if defined(__arm__)
send_string_with_delay_P(PSTR(":dfu-util"), TAP_CODE_DELAY); send_string_with_delay_P(PSTR(":dfu-util"), TAP_CODE_DELAY);
#elif defined(BOOTLOADER_DFU) #elif defined(BOOTLOADER_DFU)
send_string_with_delay_P(PSTR(":dfu"), TAP_CODE_DELAY); send_string_with_delay_P(PSTR(":dfu"), TAP_CODE_DELAY);
#elif defined(BOOTLOADER_HALFKAY) #elif defined(BOOTLOADER_HALFKAY)
send_string_with_delay_P(PSTR(":teensy"), TAP_CODE_DELAY); send_string_with_delay_P(PSTR(":teensy"), TAP_CODE_DELAY);
#elif defined(BOOTLOADER_CATERINA) #elif defined(BOOTLOADER_CATERINA)
send_string_with_delay_P(PSTR(":avrdude"), TAP_CODE_DELAY); send_string_with_delay_P(PSTR(":avrdude"), TAP_CODE_DELAY);
#endif // bootloader options #endif // bootloader options
} }
if ( ( temp_mod | temp_osm ) & MOD_MASK_CTRL) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), TAP_CODE_DELAY); } if ( ( temp_mod | temp_osm ) & MOD_MASK_CTRL) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), TAP_CODE_DELAY); }
send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), TAP_CODE_DELAY); send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), TAP_CODE_DELAY);
} }
break; break;
case VRSN: // Prints firmware version case VRSN: // Prints firmware version
if (record->event.pressed) { if (record->event.pressed) {
send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), TAP_CODE_DELAY); send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), TAP_CODE_DELAY);
} }
break; break;
// These are a serious of gaming macros. // These are a serious of gaming macros.
// Only enables for the viterbi, basically, // Only enables for the viterbi, basically,
// to save on firmware space, since it's limited. // to save on firmware space, since it's limited.
#ifdef MACROS_ENABLED #ifdef MACROS_ENABLED
case KC_OVERWATCH: // Toggle's if we hit "ENTER" or "BACKSPACE" to input macros case KC_OVERWATCH: // Toggle's if we hit "ENTER" or "BACKSPACE" to input macros
if (record->event.pressed) { userspace_config.is_overwatch ^= 1; eeconfig_update_user(userspace_config.raw); } if (record->event.pressed) { userspace_config.is_overwatch ^= 1; eeconfig_update_user(userspace_config.raw); }
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
userspace_config.is_overwatch ? rgblight_mode_noeeprom(17) : rgblight_mode_noeeprom(18); userspace_config.is_overwatch ? rgblight_mode_noeeprom(17) : rgblight_mode_noeeprom(18);
#endif //RGBLIGHT_ENABLE #endif //RGBLIGHT_ENABLE
break; break;
case KC_SALT: case KC_SALT:
return send_game_macro("Salt, salt, salt...", record, false); return send_game_macro("Salt, salt, salt...", record, false);
case KC_MORESALT: case KC_MORESALT:
return send_game_macro("Please sir, can I have some more salt?!", record, false); return send_game_macro("Please sir, can I have some more salt?!", record, false);
case KC_SALTHARD: case KC_SALTHARD:
return send_game_macro("Your salt only makes me harder, and even more aggressive!", record, false); return send_game_macro("Your salt only makes me harder, and even more aggressive!", record, false);
case KC_GOODGAME: case KC_GOODGAME:
return send_game_macro("Good game, everyone!", record, false); return send_game_macro("Good game, everyone!", record, false);
case KC_GLHF: case KC_GLHF:
return send_game_macro("Good luck, have fun!!!", record, false); return send_game_macro("Good luck, have fun!!!", record, false);
case KC_SYMM: case KC_SYMM:
return send_game_macro("Left click to win!", record, false); return send_game_macro("Left click to win!", record, false);
case KC_JUSTGAME: case KC_JUSTGAME:
return send_game_macro("It may be a game, but if you don't want to actually try, please go play AI, so that people that actually want to take the game seriously and \"get good\" have a place to do so without trolls like you throwing games.", record, false); return send_game_macro("It may be a game, but if you don't want to actually try, please go play AI, so that people that actually want to take the game seriously and \"get good\" have a place to do so without trolls like you throwing games.", record, false);
case KC_TORB: case KC_TORB:
return send_game_macro("That was positively riveting!", record, false); return send_game_macro("That was positively riveting!", record, false);
case KC_AIM: case KC_AIM:
send_game_macro("That aim is absolutely amazing. It's almost like you're a machine!", record, true); send_game_macro("That aim is absolutely amazing. It's almost like you're a machine!", record, true);
return send_game_macro("Wait! That aim is TOO good! You're clearly using an aim hack! CHEATER!", record, false); return send_game_macro("Wait! That aim is TOO good! You're clearly using an aim hack! CHEATER!", record, false);
case KC_C9: case KC_C9:
return send_game_macro("OMG!!! C9!!!", record, false); return send_game_macro("OMG!!! C9!!!", record, false);
case KC_GGEZ: case KC_GGEZ:
return send_game_macro("That was a fantastic game, though it was a bit easy. Try harder next time!", record, false); return send_game_macro("That was a fantastic game, though it was a bit easy. Try harder next time!", record, false);
#endif // MACROS_ENABLED #endif // MACROS_ENABLED
case KC_DIABLO_CLEAR: // reset all Diablo timers, disabling them case KC_DIABLO_CLEAR: // reset all Diablo timers, disabling them
#ifdef TAP_DANCE_ENABLE #ifdef TAP_DANCE_ENABLE
if (record->event.pressed) { if (record->event.pressed) {
uint8_t dtime; uint8_t dtime;
for (dtime = 0; dtime < 4; dtime++) { for (dtime = 0; dtime < 4; dtime++) {
diablo_key_time[dtime] = diablo_times[0]; diablo_timer[dtime].key_time = diablo_times[0];
} }
} }
#endif // TAP_DANCE_ENABLE #endif // TAP_DANCE_ENABLE
break; break;
case KC_CCCV: // One key copy/paste case KC_CCCV: // One key copy/paste
if(record->event.pressed){ if(record->event.pressed){
copy_paste_timer = timer_read(); copy_paste_timer = timer_read();
} else { } else {
if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy
register_code(KC_LCTL); register_code(KC_LCTL);
tap_code(KC_C); tap_code(KC_C);
unregister_code(KC_LCTL); unregister_code(KC_LCTL);
} else { // Tap, paste } else { // Tap, paste
register_code(KC_LCTL); register_code(KC_LCTL);
tap_code(KC_V); tap_code(KC_V);
unregister_code(KC_LCTL); unregister_code(KC_LCTL);
} }
} }
break; break;
#ifdef UNICODE_ENABLE #ifdef UNICODE_ENABLE
case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻ case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻
if (record->event.pressed) { if (record->event.pressed) {
send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B"); send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
} }
break; break;
case UC_TABL: // ┬─┬ノ( º _ ºノ) case UC_TABL: // ┬─┬ノ( º _ ºノ)
if (record->event.pressed) { if (record->event.pressed) {
send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029"); send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029");
} }
break; break;
case UC_SHRG: // ¯\_(ツ)_/¯ case UC_SHRG: // ¯\_(ツ)_/¯
if (record->event.pressed) { if (record->event.pressed) {
send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF");
} }
break; break;
case UC_DISA: // ಠ_ಠ case UC_DISA: // ಠ_ಠ
if (record->event.pressed) { if (record->event.pressed) {
send_unicode_hex_string("0CA0 005F 0CA0"); send_unicode_hex_string("0CA0 005F 0CA0");
} }
break; break;
#endif #endif
} }
return process_record_keymap(keycode, record) && return process_record_keymap(keycode, record) &&
#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
process_record_user_rgb(keycode, record) && process_record_user_rgb(keycode, record) &&
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
process_record_secrets(keycode, record); process_record_secrets(keycode, record);
} }

@ -2,48 +2,48 @@
#include "drashna.h" #include "drashna.h"
#if defined(KEYMAP_SAFE_RANGE) #if defined(KEYMAP_SAFE_RANGE)
#define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE # define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE
#else #else
#define PLACEHOLDER_SAFE_RANGE SAFE_RANGE # define PLACEHOLDER_SAFE_RANGE SAFE_RANGE
#endif #endif
enum userspace_custom_keycodes { enum userspace_custom_keycodes {
VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info
KC_QWERTY, // Sets default layer to QWERTY KC_QWERTY, // Sets default layer to QWERTY
KC_COLEMAK, // Sets default layer to COLEMAK KC_COLEMAK, // Sets default layer to COLEMAK
KC_DVORAK, // Sets default layer to DVORAK KC_DVORAK, // Sets default layer to DVORAK
KC_WORKMAN, // Sets default layer to WORKMAN KC_WORKMAN, // Sets default layer to WORKMAN
KC_NORMAN, // Sets default layer to NORMAN KC_NORMAN, // Sets default layer to NORMAN
KC_MALTRON, // Sets default layer to MALTRON KC_MALTRON, // Sets default layer to MALTRON
KC_EUCALYN, // Sets default layer to EUCALYN KC_EUCALYN, // Sets default layer to EUCALYN
KC_CARPLAX, // Sets default layer to CARPLAX KC_CARPLAX, // Sets default layer to CARPLAX
KC_DIABLO_CLEAR, // Clears all Diablo Timers KC_DIABLO_CLEAR, // Clears all Diablo Timers
KC_OVERWATCH, // Toggles game macro input mode (so in OW, it defaults to game chat) KC_OVERWATCH, // Toggles game macro input mode (so in OW, it defaults to game chat)
KC_SALT, // See drashna.c for details KC_SALT, // See drashna.c for details
KC_MORESALT, KC_MORESALT,
KC_SALTHARD, KC_SALTHARD,
KC_GOODGAME, KC_GOODGAME,
KC_SYMM, KC_SYMM,
KC_JUSTGAME, KC_JUSTGAME,
KC_GLHF, KC_GLHF,
KC_TORB, KC_TORB,
KC_AIM, KC_AIM,
KC_C9, KC_C9,
KC_GGEZ, KC_GGEZ,
KC_MAKE, // Run keyboard's customized make command KC_MAKE, // Run keyboard's customized make command
KC_RGB_T, // Toggles RGB Layer Indication mode KC_RGB_T, // Toggles RGB Layer Indication mode
KC_SECRET_1, // test1 KC_SECRET_1, // test1
KC_SECRET_2, // test2 KC_SECRET_2, // test2
KC_SECRET_3, // test3 KC_SECRET_3, // test3
KC_SECRET_4, // test4 KC_SECRET_4, // test4
KC_SECRET_5, // test5 KC_SECRET_5, // test5
KC_CCCV, // Hold to copy, tap to paste KC_CCCV, // Hold to copy, tap to paste
KC_NUKE, // NUCLEAR LAUNCH DETECTED!!! KC_NUKE, // NUCLEAR LAUNCH DETECTED!!!
UC_FLIP, // (ಠ痊ಠ)┻━┻ UC_FLIP, // (ಠ痊ಠ)┻━┻
UC_TABL, // ┬─┬ノ( º _ ºノ) UC_TABL, // ┬─┬ノ( º _ ºノ)
UC_SHRG, // ¯\_(ツ)_/¯ UC_SHRG, // ¯\_(ツ)_/¯
UC_DISA, // ಠ_ಠ UC_DISA, // ಠ_ಠ
NEW_SAFE_RANGE //use "NEWPLACEHOLDER for keymap specific codes NEW_SAFE_RANGE //use "NEWPLACEHOLDER for keymap specific codes
}; };
bool process_record_secrets(uint16_t keycode, keyrecord_t *record); bool process_record_secrets(uint16_t keycode, keyrecord_t *record);

@ -11,80 +11,80 @@ extern rgb_config_t rgb_matrix_config;
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
void rgblight_sethsv_default_helper(uint8_t index) { void rgblight_sethsv_default_helper(uint8_t index) {
rgblight_sethsv_at(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, index); rgblight_sethsv_at(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, index);
} }
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
#ifdef INDICATOR_LIGHTS #ifdef INDICATOR_LIGHTS
void set_rgb_indicators(uint8_t this_mod, uint8_t this_led, uint8_t this_osm) { void set_rgb_indicators(uint8_t this_mod, uint8_t this_led, uint8_t this_osm) {
if (userspace_config.rgb_layer_change && biton32(layer_state) == 0) { if (userspace_config.rgb_layer_change && biton32(layer_state) == 0) {
if ( (this_mod | this_osm) & MOD_MASK_SHIFT || this_led & (1<<USB_LED_CAPS_LOCK) ) { if ( (this_mod | this_osm) & MOD_MASK_SHIFT || this_led & (1<<USB_LED_CAPS_LOCK) ) {
#ifdef SHFT_LED1 #ifdef SHFT_LED1
rgblight_sethsv_at(120, 255, 255, SHFT_LED1); rgblight_sethsv_at(120, 255, 255, SHFT_LED1);
#endif // SHFT_LED1 #endif // SHFT_LED1
#ifdef SHFT_LED2 #ifdef SHFT_LED2
rgblight_sethsv_at(120, 255, 255, SHFT_LED2); rgblight_sethsv_at(120, 255, 255, SHFT_LED2);
#endif // SHFT_LED2 #endif // SHFT_LED2
} else { } else {
#ifdef SHFT_LED1 #ifdef SHFT_LED1
rgblight_sethsv_default_helper(SHFT_LED1); rgblight_sethsv_default_helper(SHFT_LED1);
#endif // SHFT_LED1 #endif // SHFT_LED1
#ifdef SHFT_LED2 #ifdef SHFT_LED2
rgblight_sethsv_default_helper(SHFT_LED2); rgblight_sethsv_default_helper(SHFT_LED2);
#endif // SHFT_LED2 #endif // SHFT_LED2
} }
if ( (this_mod | this_osm) & MOD_MASK_CTRL) { if ( (this_mod | this_osm) & MOD_MASK_CTRL) {
#ifdef CTRL_LED1 #ifdef CTRL_LED1
rgblight_sethsv_at(0, 255, 255, CTRL_LED1); rgblight_sethsv_at(0, 255, 255, CTRL_LED1);
#endif // CTRL_LED1 #endif // CTRL_LED1
#ifdef CTRL_LED2 #ifdef CTRL_LED2
rgblight_sethsv_at(0, 255, 255, CTRL_LED2); rgblight_sethsv_at(0, 255, 255, CTRL_LED2);
#endif // CTRL_LED2 #endif // CTRL_LED2
} else { } else {
#ifdef CTRL_LED1 #ifdef CTRL_LED1
rgblight_sethsv_default_helper(CTRL_LED1); rgblight_sethsv_default_helper(CTRL_LED1);
#endif // CTRL_LED1 #endif // CTRL_LED1
#ifdef CTRL_LED2 #ifdef CTRL_LED2
rgblight_sethsv_default_helper(CTRL_LED2); rgblight_sethsv_default_helper(CTRL_LED2);
#endif // CTRL_LED2 #endif // CTRL_LED2
} }
if ( (this_mod | this_osm) & MOD_MASK_GUI) { if ( (this_mod | this_osm) & MOD_MASK_GUI) {
#ifdef GUI_LED1 #ifdef GUI_LED1
rgblight_sethsv_at(51, 255, 255, GUI_LED1); rgblight_sethsv_at(51, 255, 255, GUI_LED1);
#endif // GUI_LED1 #endif // GUI_LED1
#ifdef GUI_LED2 #ifdef GUI_LED2
rgblight_sethsv_at(51, 255, 255, GUI_LED2); rgblight_sethsv_at(51, 255, 255, GUI_LED2);
#endif // GUI_LED2 #endif // GUI_LED2
} else { } else {
#ifdef GUI_LED1 #ifdef GUI_LED1
rgblight_sethsv_default_helper(GUI_LED1); rgblight_sethsv_default_helper(GUI_LED1);
#endif // GUI_LED1 #endif // GUI_LED1
#ifdef GUI_LED2 #ifdef GUI_LED2
rgblight_sethsv_default_helper(GUI_LED2); rgblight_sethsv_default_helper(GUI_LED2);
#endif // GUI_LED2 #endif // GUI_LED2
} }
if ( (this_mod | this_osm) & MOD_MASK_ALT) { if ( (this_mod | this_osm) & MOD_MASK_ALT) {
#ifdef ALT_LED1 #ifdef ALT_LED1
rgblight_sethsv_at(240, 255, 255, ALT_LED1); rgblight_sethsv_at(240, 255, 255, ALT_LED1);
#endif // ALT_LED1 #endif // ALT_LED1
#ifdef GUI_LED2 #ifdef GUI_LED2
rgblight_sethsv_at(240, 255, 255, ALT_LED2); rgblight_sethsv_at(240, 255, 255, ALT_LED2);
#endif // GUI_LED2 #endif // GUI_LED2
} else { } else {
#ifdef GUI_LED1 #ifdef GUI_LED1
rgblight_sethsv_default_helper(ALT_LED1); rgblight_sethsv_default_helper(ALT_LED1);
#endif // GUI_LED1 #endif // GUI_LED1
#ifdef GUI_LED2 #ifdef GUI_LED2
rgblight_sethsv_default_helper(ALT_LED2); rgblight_sethsv_default_helper(ALT_LED2);
#endif // GUI_LED2 #endif // GUI_LED2
}
} }
}
} }
void matrix_scan_indicator(void) { void matrix_scan_indicator(void) {
if (has_initialized) { if (has_initialized) {
set_rgb_indicators(get_mods(), host_keyboard_leds(), get_oneshot_mods()); set_rgb_indicators(get_mods(), host_keyboard_leds(), get_oneshot_mods());
} }
} }
#endif //INDICATOR_LIGHTS #endif //INDICATOR_LIGHTS
@ -95,69 +95,71 @@ __attribute__ ((weak))
bool rgblight_twinkle_is_led_used_keymap(uint8_t index) { return false; } bool rgblight_twinkle_is_led_used_keymap(uint8_t index) { return false; }
bool rgblight_twinkle_is_led_used(uint8_t index) { bool rgblight_twinkle_is_led_used(uint8_t index) {
switch (index) { switch (index) {
#ifdef INDICATOR_LIGHTS #ifdef INDICATOR_LIGHTS
#ifdef SHFT_LED1 #ifdef SHFT_LED1
case SHFT_LED1: case SHFT_LED1:
return true; return true;
#endif //SHFT_LED1 #endif //SHFT_LED1
#ifdef SHFT_LED2 #ifdef SHFT_LED2
case SHFT_LED2: case SHFT_LED2:
return true; return true;
#endif //SHFT_LED2 #endif //SHFT_LED2
#ifdef CTRL_LED1 #ifdef CTRL_LED1
case CTRL_LED1: case CTRL_LED1:
return true; return true;
#endif //CTRL_LED1 #endif //CTRL_LED1
#ifdef CTRL_LED2 #ifdef CTRL_LED2
case CTRL_LED2: case CTRL_LED2:
return true; return true;
#endif //CTRL_LED2 #endif //CTRL_LED2
#ifdef GUI_LED1 #ifdef GUI_LED1
case GUI_LED1: case GUI_LED1:
return true; return true;
#endif //GUI_LED1 #endif //GUI_LED1
#ifdef GUI_LED2 #ifdef GUI_LED2
case GUI_LED2: case GUI_LED2:
return true; return true;
#endif //GUI_LED2 #endif //GUI_LED2
#ifdef ALT_LED1 #ifdef ALT_LED1
case ALT_LED1: case ALT_LED1:
return true; return true;
#endif //ALT_LED1 #endif //ALT_LED1
#ifdef ALT_LED2 #ifdef ALT_LED2
case ALT_LED2: case ALT_LED2:
return true; return true;
#endif //ALT_LED2 #endif //ALT_LED2
#endif //INDICATOR_LIGHTS #endif //INDICATOR_LIGHTS
default: default:
return rgblight_twinkle_is_led_used_keymap(index); return rgblight_twinkle_is_led_used_keymap(index);
} }
} }
void scan_rgblight_fadeout(void) { // Don't effing change this function .... rgblight_sethsv is supppppper intensive void scan_rgblight_fadeout(void) { // Don't effing change this function .... rgblight_sethsv is supppppper intensive
bool litup = false; bool litup = false;
for (uint8_t light_index = 0 ; light_index < RGBLED_NUM ; ++light_index ) { for (uint8_t light_index = 0 ; light_index < RGBLED_NUM ; ++light_index ) {
if (lights[light_index].enabled && timer_elapsed(lights[light_index].timer) > 10) { if (lights[light_index].enabled && timer_elapsed(lights[light_index].timer) > 10) {
rgblight_fadeout *light = &lights[light_index]; rgblight_fadeout *light = &lights[light_index];
litup = true; litup = true;
if (light->life) { if (light->life) {
light->life -= 1; light->life -= 1;
if (biton32(layer_state) == 0) { if (biton32(layer_state) == 0) {
sethsv(light->hue + rand() % 0xF, 255, light->life, (LED_TYPE *)&led[light_index]); sethsv(light->hue + rand() % 0xF, 255, light->life, (LED_TYPE *)&led[light_index]);
}
light->timer = timer_read();
}
else {
if (light->enabled && biton32(layer_state) == 0) {
rgblight_sethsv_default_helper(light_index);
}
litup = light->enabled = false;
}
} }
light->timer = timer_read();
}
else {
if (light->enabled && biton32(layer_state) == 0) { rgblight_sethsv_default_helper(light_index); }
litup = light->enabled = false;
}
} }
} if (litup && biton32(layer_state) == 0) {
if (litup && biton32(layer_state) == 0) { rgblight_set();
rgblight_set(); }
}
} }
void start_rgb_light(void) { void start_rgb_light(void) {
@ -203,42 +205,42 @@ void start_rgb_light(void) {
bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) {
keycode = keycode & 0xFF; keycode = keycode & 0xFF;
} }
switch (keycode) { switch (keycode) {
#ifdef RGBLIGHT_TWINKLE #ifdef RGBLIGHT_TWINKLE
case KC_A ... KC_SLASH: case KC_A ... KC_SLASH:
case KC_F1 ... KC_F12: case KC_F1 ... KC_F12:
case KC_INSERT ... KC_UP: case KC_INSERT ... KC_UP:
case KC_KP_SLASH ... KC_KP_DOT: case KC_KP_SLASH ... KC_KP_DOT:
case KC_F13 ... KC_F24: case KC_F13 ... KC_F24:
case KC_AUDIO_MUTE ... KC_MEDIA_REWIND: case KC_AUDIO_MUTE ... KC_MEDIA_REWIND:
if (record->event.pressed) { start_rgb_light(); } if (record->event.pressed) { start_rgb_light(); }
return true; break; return true; break;
#endif // RGBLIGHT_TWINKLE #endif // RGBLIGHT_TWINKLE
case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal
#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) #if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
if (record->event.pressed) { if (record->event.pressed) {
userspace_config.rgb_layer_change ^= 1; userspace_config.rgb_layer_change ^= 1;
xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
eeconfig_update_user(userspace_config.raw); eeconfig_update_user(userspace_config.raw);
if (userspace_config.rgb_layer_change) { if (userspace_config.rgb_layer_change) {
layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better) layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better)
} }
} }
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
return false; break; return false; break;
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions
if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
if (userspace_config.rgb_layer_change) { if (userspace_config.rgb_layer_change) {
userspace_config.rgb_layer_change = false; userspace_config.rgb_layer_change = false;
xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
eeconfig_update_user(userspace_config.raw); eeconfig_update_user(userspace_config.raw);
} }
} }
return true; break; return true; break;
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
} }
return true; return true;
@ -248,28 +250,28 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
void keyboard_post_init_rgb(void) { void keyboard_post_init_rgb(void) {
#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_STARTUP_ANIMATION) #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_STARTUP_ANIMATION)
if (userspace_config.rgb_layer_change) { rgblight_enable_noeeprom(); } if (userspace_config.rgb_layer_change) { rgblight_enable_noeeprom(); }
if (rgblight_config.enable) { if (rgblight_config.enable) {
layer_state_set_user(layer_state); layer_state_set_user(layer_state);
uint16_t old_hue = rgblight_config.hue; uint16_t old_hue = rgblight_config.hue;
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
for (uint16_t i = 360; i > 0; i--) { for (uint16_t i = 255; i > 0; i--) {
rgblight_sethsv_noeeprom( ( i + old_hue) % 360, 255, 255); rgblight_sethsv_noeeprom( ( i + old_hue) % 255, 255, 255);
matrix_scan(); matrix_scan();
wait_ms(10); wait_ms(10);
}
} }
}
#endif #endif
layer_state_set_user(layer_state); layer_state_set_user(layer_state);
} }
void matrix_scan_rgb(void) { void matrix_scan_rgb(void) {
#ifdef RGBLIGHT_TWINKLE #ifdef RGBLIGHT_TWINKLE
scan_rgblight_fadeout(); scan_rgblight_fadeout();
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
#ifdef INDICATOR_LIGHTS #ifdef INDICATOR_LIGHTS
matrix_scan_indicator(); matrix_scan_indicator();
#endif #endif
} }
@ -277,99 +279,60 @@ void matrix_scan_rgb(void) {
uint32_t layer_state_set_rgb(uint32_t state) { uint32_t layer_state_set_rgb(uint32_t state) {
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
if (userspace_config.rgb_layer_change) { if (userspace_config.rgb_layer_change) {
switch (biton32(state)) { switch (biton32(state)) {
case _MACROS: case _MACROS:
rgblight_sethsv_noeeprom_orange(); rgblight_sethsv_noeeprom_orange();
userspace_config.is_overwatch ? rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 2) : rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 3); userspace_config.is_overwatch ? rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 2) : rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 3);
break; break;
case _MEDIA: case _MEDIA:
rgblight_sethsv_noeeprom_chartreuse(); rgblight_sethsv_noeeprom_chartreuse();
rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 1); rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 1);
break; break;
case _GAMEPAD: case _GAMEPAD:
rgblight_sethsv_noeeprom_orange(); rgblight_sethsv_noeeprom_orange();
rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 2); rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 2);
break; break;
case _DIABLO: case _DIABLO:
rgblight_sethsv_noeeprom_red(); rgblight_sethsv_noeeprom_red();
rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);
break; break;
case _RAISE: case _RAISE:
rgblight_sethsv_noeeprom_yellow(); rgblight_sethsv_noeeprom_yellow();
rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);
break; break;
case _LOWER: case _LOWER:
rgblight_sethsv_noeeprom_green(); rgblight_sethsv_noeeprom_green();
rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);
break; break;
case _ADJUST: case _ADJUST:
rgblight_sethsv_noeeprom_red(); rgblight_sethsv_noeeprom_red();
rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2);
break; break;
default: // for any other layers, or the default layer default: // for any other layers, or the default layer
switch (biton32(default_layer_state)) { switch (biton32(default_layer_state)) {
case _COLEMAK: case _COLEMAK:
rgblight_sethsv_noeeprom_magenta(); break; rgblight_sethsv_noeeprom_magenta(); break;
case _DVORAK: case _DVORAK:
rgblight_sethsv_noeeprom_springgreen(); break; rgblight_sethsv_noeeprom_springgreen(); break;
case _WORKMAN: case _WORKMAN:
rgblight_sethsv_noeeprom_goldenrod(); break; rgblight_sethsv_noeeprom_goldenrod(); break;
case _NORMAN: case _NORMAN:
rgblight_sethsv_noeeprom_coral(); break; rgblight_sethsv_noeeprom_coral(); break;
case _MALTRON: case _MALTRON:
rgblight_sethsv_noeeprom_yellow(); break; rgblight_sethsv_noeeprom_yellow(); break;
case _EUCALYN: case _EUCALYN:
rgblight_sethsv_noeeprom_pink(); break; rgblight_sethsv_noeeprom_pink(); break;
case _CARPLAX: case _CARPLAX:
rgblight_sethsv_noeeprom_blue(); break; rgblight_sethsv_noeeprom_blue(); break;
default: default:
rgblight_sethsv_noeeprom_cyan(); break; rgblight_sethsv_noeeprom_cyan(); break;
} }
biton32(state) == _MODS ? rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING) : rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); // if _MODS layer is on, then breath to denote it biton32(state) == _MODS ? rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING) : rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); // if _MODS layer is on, then breath to denote it
break; break;
}
} }
// layer_state_set_indicator(); // Runs every scan, so need to call this here .... since I can't get it working "right" anyhow
}
#endif // RGBLIGHT_ENABLE #endif // RGBLIGHT_ENABLE
return state; return state;
}
#if 0
uint32_t default_layer_state_set_rgb(uint32_t state) {
#ifdef RGBLIGHT_ENABLE
if (userspace_config.rgb_layer_change) {
rgblight_config_t temp_rgblight_config = rgblight_config;
switch (biton32(state)) {
case _COLEMAK:
temp_rgblight_config.hue = 300;
temp_rgblight_config.val = 255;
temp_rgblight_config.sat = 255;
temp_rgblight_config.mode = 1;
break;
case _DVORAK:
temp_rgblight_config.hue = 150;
temp_rgblight_config.val = 255;
temp_rgblight_config.sat = 255;
temp_rgblight_config.mode = 1;
case _WORKMAN:
temp_rgblight_config.hue = 43;
temp_rgblight_config.val = 218;
temp_rgblight_config.sat = 218;
temp_rgblight_config.mode = 1;
default:
temp_rgblight_config.hue = 180;
temp_rgblight_config.val = 255;
temp_rgblight_config.sat = 255;
temp_rgblight_config.mode = 1;
}
if (temp_rgblight_config.raw != eeconfig_read_rgblight()) {
xprintf("rgblight set default layer hsv [EEPROM]: %u,%u,%u,%u\n", temp_rgblight_config.hue, temp_rgblight_config.sat, temp_rgblight_config.val, temp_rgblight_config.mode);
eeconfig_update_rgblight(temp_rgblight_config.raw);
}
}
#endif // RGBLIGHT_ENABLE
return state;
} }
#endif

@ -0,0 +1,116 @@
#ifndef RGBLIGHT_EFFECT_BREATHE_TABLE
#define RGBLIGHT_EFFECT_BREATHE_TABLE
const uint8_t rgblight_effect_breathe_table[] PROGMEM = {
/* #define RGBLIGHT_EFFECT_BREATHE_CENTER 0.00 */
/* #define RGBLIGHT_EFFECT_BREATHE_MAX 255 */
#if RGBLIGHT_BREATHE_TABLE_SIZE == 256
0x44, 0x45, 0x47, 0x48, 0x4a, 0x4b, 0x4c, 0x4e,
0x4f, 0x51, 0x52, 0x54, 0x55, 0x57, 0x58, 0x5a,
0x5c, 0x5d, 0x5f, 0x60, 0x62, 0x64, 0x65, 0x67,
0x69, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x73, 0x75,
0x77, 0x79, 0x7b, 0x7c, 0x7e, 0x80, 0x82, 0x84,
0x86, 0x88, 0x8a, 0x8b, 0x8d, 0x8f, 0x91, 0x93,
0x95, 0x97, 0x99, 0x9b, 0x9d, 0x9f, 0xa1, 0xa3,
0xa5, 0xa7, 0xa9, 0xaa, 0xac, 0xae, 0xb0, 0xb2,
0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, 0xbf, 0xc1,
0xc3, 0xc5, 0xc7, 0xc9, 0xca, 0xcc, 0xce, 0xd0,
0xd1, 0xd3, 0xd5, 0xd6, 0xd8, 0xda, 0xdb, 0xdd,
0xde, 0xe0, 0xe1, 0xe3, 0xe4, 0xe5, 0xe7, 0xe8,
0xe9, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1,
0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf8,
0xf9, 0xfa, 0xfa, 0xfb, 0xfc, 0xfc, 0xfc, 0xfd,
0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfd,
0xfd, 0xfc, 0xfc, 0xfc, 0xfb, 0xfa, 0xfa, 0xf9,
0xf8, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2,
0xf1, 0xf0, 0xef, 0xee, 0xed, 0xec, 0xeb, 0xe9,
0xe8, 0xe7, 0xe5, 0xe4, 0xe3, 0xe1, 0xe0, 0xde,
0xdd, 0xdb, 0xda, 0xd8, 0xd6, 0xd5, 0xd3, 0xd1,
0xd0, 0xce, 0xcc, 0xca, 0xc9, 0xc7, 0xc5, 0xc3,
0xc1, 0xbf, 0xbe, 0xbc, 0xba, 0xb8, 0xb6, 0xb4,
0xb2, 0xb0, 0xae, 0xac, 0xaa, 0xa9, 0xa7, 0xa5,
0xa3, 0xa1, 0x9f, 0x9d, 0x9b, 0x99, 0x97, 0x95,
0x93, 0x91, 0x8f, 0x8d, 0x8b, 0x8a, 0x88, 0x86,
0x84, 0x82, 0x80, 0x7e, 0x7c, 0x7b, 0x79, 0x77,
0x75, 0x73, 0x72, 0x70, 0x6e, 0x6c, 0x6a, 0x69,
0x67, 0x65, 0x64, 0x62, 0x60, 0x5f, 0x5d, 0x5c,
0x5a, 0x58, 0x57, 0x55, 0x54, 0x52, 0x51, 0x4f,
0x4e, 0x4c, 0x4b, 0x4a, 0x48, 0x47, 0x45, 0x44
#endif /* 256 bytes table */
#if RGBLIGHT_BREATHE_TABLE_SIZE == 128
0x44, 0x47, 0x4a, 0x4c,
0x4f, 0x52, 0x55, 0x58,
0x5c, 0x5f, 0x62, 0x65,
0x69, 0x6c, 0x70, 0x73,
0x77, 0x7b, 0x7e, 0x82,
0x86, 0x8a, 0x8d, 0x91,
0x95, 0x99, 0x9d, 0xa1,
0xa5, 0xa9, 0xac, 0xb0,
0xb4, 0xb8, 0xbc, 0xbf,
0xc3, 0xc7, 0xca, 0xce,
0xd1, 0xd5, 0xd8, 0xdb,
0xde, 0xe1, 0xe4, 0xe7,
0xe9, 0xec, 0xee, 0xf0,
0xf2, 0xf4, 0xf6, 0xf8,
0xf9, 0xfa, 0xfc, 0xfc,
0xfd, 0xfe, 0xfe, 0xfe,
0xfe, 0xfe, 0xfe, 0xfe,
0xfd, 0xfc, 0xfb, 0xfa,
0xf8, 0xf7, 0xf5, 0xf3,
0xf1, 0xef, 0xed, 0xeb,
0xe8, 0xe5, 0xe3, 0xe0,
0xdd, 0xda, 0xd6, 0xd3,
0xd0, 0xcc, 0xc9, 0xc5,
0xc1, 0xbe, 0xba, 0xb6,
0xb2, 0xae, 0xaa, 0xa7,
0xa3, 0x9f, 0x9b, 0x97,
0x93, 0x8f, 0x8b, 0x88,
0x84, 0x80, 0x7c, 0x79,
0x75, 0x72, 0x6e, 0x6a,
0x67, 0x64, 0x60, 0x5d,
0x5a, 0x57, 0x54, 0x51,
0x4e, 0x4b, 0x48, 0x45
#endif /* 128 bytes table */
#if RGBLIGHT_BREATHE_TABLE_SIZE == 64
0x44, 0x4a,
0x4f, 0x55,
0x5c, 0x62,
0x69, 0x70,
0x77, 0x7e,
0x86, 0x8d,
0x95, 0x9d,
0xa5, 0xac,
0xb4, 0xbc,
0xc3, 0xca,
0xd1, 0xd8,
0xde, 0xe4,
0xe9, 0xee,
0xf2, 0xf6,
0xf9, 0xfc,
0xfd, 0xfe,
0xfe, 0xfe,
0xfd, 0xfb,
0xf8, 0xf5,
0xf1, 0xed,
0xe8, 0xe3,
0xdd, 0xd6,
0xd0, 0xc9,
0xc1, 0xba,
0xb2, 0xaa,
0xa3, 0x9b,
0x93, 0x8b,
0x84, 0x7c,
0x75, 0x6e,
0x67, 0x60,
0x5a, 0x54,
0x4e, 0x48
#endif /* 64 bytes table */
};
static const int table_scale = 256/sizeof(rgblight_effect_breathe_table);
#endif /* RGBLIGHT_EFFECT_BREATHE_TABLE */

@ -1,40 +1,40 @@
SRC += drashna.c \ SRC += drashna.c \
process_records.c process_records.c
LINK_TIME_OPTIMIZATION_ENABLE = yes
ifneq ("$(wildcard $(USER_PATH)/secrets.c)","") ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
SRC += secrets.c SRC += secrets.c
endif endif
ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
SRC += tap_dances.c SRC += tap_dances.c
endif endif
ifeq ($(PLATFORM),AVR)
EXTRAFLAGS += -flto
endif
ifeq ($(strip $(NO_SECRETS)), yes) ifeq ($(strip $(NO_SECRETS)), yes)
OPT_DEFS += -DNO_SECRETS OPT_DEFS += -DNO_SECRETS
endif endif
ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
SRC += rgb_stuff.c SRC += rgb_stuff.c
ifeq ($(strip $(INDICATOR_LIGHTS)), yes) ifeq ($(strip $(INDICATOR_LIGHTS)), yes)
OPT_DEFS += -DINDICATOR_LIGHTS OPT_DEFS += -DINDICATOR_LIGHTS
endif endif
ifeq ($(strip $(RGBLIGHT_TWINKLE)), yes) ifeq ($(strip $(RGBLIGHT_TWINKLE)), yes)
OPT_DEFS += -DRGBLIGHT_TWINKLE OPT_DEFS += -DRGBLIGHT_TWINKLE
endif endif
ifeq ($(strip $(RGBLIGHT_NOEEPROM)), yes) ifeq ($(strip $(RGBLIGHT_NOEEPROM)), yes)
OPT_DEFS += -DRGBLIGHT_NOEEPROM OPT_DEFS += -DRGBLIGHT_NOEEPROM
endif endif
ifeq ($(strip $(RGBLIGHT_STARTUP_ANIMATION)), yes) ifeq ($(strip $(RGBLIGHT_STARTUP_ANIMATION)), yes)
OPT_DEFS += -DRGBLIGHT_STARTUP_ANIMATION OPT_DEFS += -DRGBLIGHT_STARTUP_ANIMATION
endif endif
endif endif
ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) ifneq ($(strip $(RGB_MATRIX_ENABLE)), no)
SRC += rgb_stuff.c SRC += rgb_stuff.c
endif endif
@ -43,9 +43,9 @@ ifeq ($(strip $(MACROS_ENABLED)), yes)
endif endif
ifdef CONSOLE_ENABLE ifdef CONSOLE_ENABLE
ifeq ($(strip $(KEYLOGGER_ENABLE)), yes) ifeq ($(strip $(KEYLOGGER_ENABLE)), yes)
OPT_DEFS += -DKEYLOGGER_ENABLE OPT_DEFS += -DKEYLOGGER_ENABLE
endif endif
endif endif
ifeq ($(strip $(MAKE_BOOTLOADER)), yes) ifeq ($(strip $(MAKE_BOOTLOADER)), yes)

@ -7,65 +7,65 @@ void send_unicode_hex_string(const char* str);
/* use X(n) to call the */ /* use X(n) to call the */
#ifdef UNICODEMAP_ENABLE #ifdef UNICODEMAP_ENABLE
enum unicode_name { enum unicode_name {
THINK, // thinking face 🤔 THINK, // thinking face 🤔
GRIN, // grinning face 😊 GRIN, // grinning face 😊
SMRK, // smirk 😏 SMRK, // smirk 😏
WEARY, // good shit 😩 WEARY, // good shit 😩
UNAMU, // unamused 😒 UNAMU, // unamused 😒
SNEK, // snke 🐍 SNEK, // snke 🐍
PENGUIN, // 🐧 PENGUIN, // 🐧
DRAGON, // 🐉 DRAGON, // 🐉
MONKEY, // 🐒 MONKEY, // 🐒
CHICK, // 🐥 CHICK, // 🐥
BOAR, // 🐗 BOAR, // 🐗
OKOK, // 👌 OKOK, // 👌
EFFU, // 🖕 EFFU, // 🖕
INUP, // 👆 INUP, // 👆
THUP, // 👍 THUP, // 👍
THDN, // 👎 THDN, // 👎
BBB, // dat B 🅱 BBB, // dat B 🅱
POO, // poop 💩 POO, // poop 💩
HUNDR, // 100 💯 HUNDR, // 100 💯
EGGPL, // EGGPLANT 🍆 EGGPL, // EGGPLANT 🍆
WATER, // wet 💦 WATER, // wet 💦
TUMBLER, // 🥃 TUMBLER, // 🥃
LIT, // fire 🔥 LIT, // fire 🔥
BANG, // ‽ BANG, // ‽
IRONY, // ⸮ IRONY, // ⸮
DEGREE // ° DEGREE // °
}; };
const uint32_t PROGMEM unicode_map[] = { const uint32_t PROGMEM unicode_map[] = {
[THINK] = 0x1F914, [THINK] = 0x1F914,
[GRIN] = 0x1F600, [GRIN] = 0x1F600,
[BBB] = 0x1F171, [BBB] = 0x1F171,
[POO] = 0x1F4A9, [POO] = 0x1F4A9,
[HUNDR] = 0x1F4AF, [HUNDR] = 0x1F4AF,
[SMRK] = 0x1F60F, [SMRK] = 0x1F60F,
[WEARY] = 0x1F629, [WEARY] = 0x1F629,
[EGGPL] = 0x1F346, [EGGPL] = 0x1F346,
[WATER] = 0x1F4A6, [WATER] = 0x1F4A6,
[LIT] = 0x1F525, [LIT] = 0x1F525,
[UNAMU] = 0x1F612, [UNAMU] = 0x1F612,
[SNEK] = 0x1F40D, [SNEK] = 0x1F40D,
[PENGUIN] = 0x1F427, [PENGUIN] = 0x1F427,
[BOAR] = 0x1F417, [BOAR] = 0x1F417,
[MONKEY] = 0x1F412, [MONKEY] = 0x1F412,
[CHICK] = 0x1F425, [CHICK] = 0x1F425,
[DRAGON] = 0x1F409, [DRAGON] = 0x1F409,
[OKOK] = 0x1F44C, [OKOK] = 0x1F44C,
[EFFU] = 0x1F595, [EFFU] = 0x1F595,
[INUP] = 0x1F446, [INUP] = 0x1F446,
[THDN] = 0x1F44E, [THDN] = 0x1F44E,
[THUP] = 0x1F44D, [THUP] = 0x1F44D,
[TUMBLER] = 0x1F943, [TUMBLER] = 0x1F943,
[BANG] = 0x0203D, [BANG] = 0x0203D,
[IRONY] = 0x02E2E, [IRONY] = 0x02E2E,
[DEGREE] = 0x000B0 [DEGREE] = 0x000B0
}; };
#endif // UNICODEMAP_ENABLE #endif // UNICODEMAP_ENABLE

@ -2,63 +2,64 @@
//define diablo macro timer variables //define diablo macro timer variables
uint16_t diablo_timer[4]; diablo_timer_t diablo_timer[4];
uint8_t diablo_times[] = { 0, 1, 3, 5, 10, 30 };
uint8_t diablo_key_time[4]; uint8_t diablo_times[] = { 0, 0, 1, 3, 5, 10, 30 };
// has the correct number of seconds elapsed (as defined by diablo_times) // has the correct number of seconds elapsed (as defined by diablo_times)
bool check_dtimer(uint8_t dtimer) { return (timer_elapsed(diablo_timer[dtimer]) < (diablo_key_time[dtimer] * 1000)) ? false : true; }; bool check_dtimer(uint8_t dtimer) { return (timer_elapsed(diablo_timer[dtimer].key_time) < (diablo_timer[dtimer].timer * 1000)) ? false : true; };
// Cycle through the times for the macro, starting at 0, for disabled. // Cycle through the times for the macro, starting at 0, for disabled.
// Max of six values, so don't exceed // Max of six values, so don't exceed
void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data, uint8_t diablo_key) { void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data) {
if (state->count >= 7) { int index = (int)user_data;
diablo_key_time[diablo_key] = diablo_times[0]; if (state->count >= 7) {
reset_tap_dance(state); diablo_timer[index].key_time = diablo_times[0];
} else { reset_tap_dance(state);
diablo_key_time[diablo_key] = diablo_times[state->count - 1]; } else {
} diablo_timer[index].key_time = diablo_times[state->count];
}
} }
// Would rather have one function for all of this, but no idea how to do that... // One funtion to rule them all!!
void diablo_tapdance1(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 0); } #define ACTION_TAP_DANCE_DIABLO(arg) { \
void diablo_tapdance2(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 1); } .fn = { NULL, (void *)diablo_tapdance_master, NULL }, \
void diablo_tapdance3(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 2); } .user_data = (void *)arg, \
void diablo_tapdance4(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 3); } }
//Tap Dance Definitions //Tap Dance Definitions
qk_tap_dance_action_t tap_dance_actions[] = { qk_tap_dance_action_t tap_dance_actions[] = {
// tap once to disable, and more to enable timed micros // tap once to disable, and more to enable timed micros
[TD_D3_1] = ACTION_TAP_DANCE_FN(diablo_tapdance1), [TD_D3_1] = ACTION_TAP_DANCE_DIABLO(0),
[TD_D3_2] = ACTION_TAP_DANCE_FN(diablo_tapdance2), [TD_D3_2] = ACTION_TAP_DANCE_DIABLO(1),
[TD_D3_3] = ACTION_TAP_DANCE_FN(diablo_tapdance3), [TD_D3_3] = ACTION_TAP_DANCE_DIABLO(2),
[TD_D3_4] = ACTION_TAP_DANCE_FN(diablo_tapdance4), [TD_D3_4] = ACTION_TAP_DANCE_DIABLO(3),
}; };
// Sends the key press to system, but only if on the Diablo layer // Sends the key press to system, but only if on the Diablo layer
void send_diablo_keystroke(uint8_t diablo_key) { void send_diablo_keystroke(uint8_t diablo_key) {
if (IS_LAYER_ON(_DIABLO)) { if (IS_LAYER_ON(_DIABLO)) {
switch (diablo_key) { switch (diablo_key) {
case 0: case 0:
tap_code(KC_1); break; tap_code(KC_1); break;
case 1: case 1:
tap_code(KC_2); break; tap_code(KC_2); break;
case 2: case 2:
tap_code(KC_3); break; tap_code(KC_3); break;
case 3: case 3:
tap_code(KC_4); break; tap_code(KC_4); break;
}
} }
}
} }
// Checks each of the 4 timers/keys to see if enough time has elapsed // Checks each of the 4 timers/keys to see if enough time has elapsed
// Runs the "send string" command if enough time has passed, and resets the timer. // Runs the "send string" command if enough time has passed, and resets the timer.
void run_diablo_macro_check(void) { void run_diablo_macro_check(void) {
uint8_t dtime; uint8_t dtime;
for (dtime = 0; dtime < 4; dtime++) { for (dtime = 0; dtime < 4; dtime++) {
if (check_dtimer(dtime) && diablo_key_time[dtime]) { if (check_dtimer(dtime) && diablo_timer[dtime].key_time) {
diablo_timer[dtime] = timer_read(); diablo_timer[dtime].timer = timer_read();
send_diablo_keystroke(dtime); send_diablo_keystroke(dtime);
}
} }
}
} }

@ -2,18 +2,21 @@
#include "drashna.h" #include "drashna.h"
//define diablo macro timer variables //define diablo macro timer variables
extern uint16_t diablo_timer[4];
extern uint8_t diablo_times[]; extern uint8_t diablo_times[];
extern uint8_t diablo_key_time[4]; typedef struct {
uint16_t timer;
uint8_t key_time;
} diablo_timer_t;
extern diablo_timer_t diablo_timer[4];
void run_diablo_macro_check(void); void run_diablo_macro_check(void);
#ifdef TAP_DANCE_ENABLE #ifdef TAP_DANCE_ENABLE
enum { enum {
TD_D3_1 = 0, TD_D3_1 = 0,
TD_D3_2, TD_D3_2,
TD_D3_3, TD_D3_3,
TD_D3_4 TD_D3_4
}; };
#endif // TAP_DANCE_ENABLE #endif // TAP_DANCE_ENABLE

@ -6,7 +6,7 @@ arguments, we need a wrapper in order for these definitions to be
expanded before being used as arguments to the LAYOUT_xxx macro. expanded before being used as arguments to the LAYOUT_xxx macro.
*/ */
#if (!defined(LAYOUT) && defined(KEYMAP)) #if (!defined(LAYOUT) && defined(KEYMAP))
#define LAYOUT KEYMAP # define LAYOUT KEYMAP
#endif #endif
#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__) #define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)
@ -15,6 +15,7 @@ expanded before being used as arguments to the LAYOUT_xxx macro.
#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) #define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
#define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) #define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__)
#define LAYOUT_ortho_5x12_wrapper(...) LAYOUT_ortho_5x12(__VA_ARGS__) #define LAYOUT_ortho_5x12_wrapper(...) LAYOUT_ortho_5x12(__VA_ARGS__)
#define LAYOUT_gergo_wrapper(...) LAYOUT_gergo(__VA_ARGS__)
/* /*
Blocks for each of the four major keyboard layouts Blocks for each of the four major keyboard layouts

Loading…
Cancel
Save