Merge remote-tracking branch 'origin/master' into iso_split_rshift

whatever
pull/640/head
Toni 8 years ago
commit 5e2e8c89e8

1
.gitignore vendored

@ -26,3 +26,4 @@ CMakeLists.txt
.project .project
.settings/ .settings/
.idea .idea
.browse.VC.db*

@ -0,0 +1,28 @@
FROM debian:jessie
MAINTAINER Erik Dasque <erik@frenchguys.com>
RUN apt-get update
RUN apt-get install --no-install-recommends -y build-essential \
gcc \
unzip \
wget \
zip \
gcc-avr \
binutils-avr \
avr-libc \
dfu-programmer \
dfu-util \
gcc-arm-none-eabi \
binutils-arm-none-eabi \
libnewlib-arm-none-eabi \
git
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/*
ENV keyboard=ergodox_ez
ENV keymap=default
VOLUME /qmk
WORKDIR /qmk
CMD make clean ; make keyboard=${keyboard} keymap=${keymap}

@ -181,7 +181,7 @@ endif
ifeq ($(strip $(MIDI_ENABLE)), yes) ifeq ($(strip $(MIDI_ENABLE)), yes)
OPT_DEFS += -DMIDI_ENABLE OPT_DEFS += -DMIDI_ENABLE
SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c
endif endif
ifeq ($(strip $(AUDIO_ENABLE)), yes) ifeq ($(strip $(AUDIO_ENABLE)), yes)

@ -0,0 +1,4 @@
Alps64 keyboard firmware
======================
TODO: to be updated.

@ -12,14 +12,14 @@
#define KEYMAP( \ #define KEYMAP( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, \ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, \ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a \ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b \
) \ ) \
{ \ { \
{ k00, k01, k02, k03, k04, KC_NO, k05, k06, k07, k08, k09 }, \ { k00, k01, k02, k03, k04, KC_NO, k05, k06, k07, k08, k09 }, \
{ k10, k11, k12, k13, k14, KC_NO, k15, k16, k17, k18, k19 }, \ { k10, k11, k12, k13, k14, KC_NO, k15, k16, k17, k18, k19 }, \
{ k20, k21, k22, k23, k24, k35, k25, k26, k27, k28, k29 }, \ { k20, k21, k22, k23, k24, k35, k25, k26, k27, k28, k29 }, \
{ k2a, k30, k31, k32, k33, k34, k36, k37, k38, k39, k3a } \ { k30, k31, k32, k33, k34, k36, k37, k38, k39, k3a, k3b } \
} }
#endif #endif

@ -0,0 +1,4 @@
Clueboard keyboard firmware
======================
TODO: to be updated.

@ -0,0 +1,4 @@
Cluepad number pad firmware
======================
TODO: to be updated.

@ -3,6 +3,9 @@ COMMAND_ENABLE=no
SLEEP_LED_ENABLE=no SLEEP_LED_ENABLE=no
UNICODE_ENABLE=no UNICODE_ENABLE=no
FORCE_NKRO ?= yes FORCE_NKRO ?= yes
DEBUG_ENABLE = no
CONSOLE_ENABLE = yes
TAP_DANCE_ENABLE = yes
ifeq (${FORCE_NKRO},yes) ifeq (${FORCE_NKRO},yes)
OPT_DEFS += -DFORCE_NKRO OPT_DEFS += -DFORCE_NKRO

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

@ -10,12 +10,13 @@
#include "mousekey.h" #include "mousekey.h"
#include "timer.h" #include "timer.h"
#include "keymap_plover.h" #include "keymap_plover.h"
#include "eeconfig.h"
/* Layers */ /* Layers */
enum { enum {
BASE = 0, BASE = 0,
EXPRM, ADORE,
ARRW, ARRW,
APPSEL, APPSEL,
HUN, HUN,
@ -94,7 +95,7 @@ enum {
/* Custom keycodes */ /* Custom keycodes */
enum { enum {
CT_CLN = 0x7101 CT_CLN = 0
}; };
/* States & timers */ /* States & timers */
@ -114,8 +115,7 @@ uint16_t oh_left_blink_timer = 0;
uint8_t oh_right_blink = 0; uint8_t oh_right_blink = 0;
uint16_t oh_right_blink_timer = 0; uint16_t oh_right_blink_timer = 0;
uint8_t ct_cln_count = 0; bool log_enable = false;
uint16_t ct_cln_timer = 0;
/* The Keymap */ /* The Keymap */
@ -124,18 +124,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Base Layer /* Keymap 0: Base Layer
* *
* ,-----------------------------------------------------. ,-----------------------------------------------------. * ,-----------------------------------------------------. ,-----------------------------------------------------.
* | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr | | 1HND | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| F11 | * | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr | | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| F11 |
* |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
* | Next/Prev | ' | , | . | P | Y | [ | | ] | F | G | C | R | L | \ | * | Next/Prev | ' | , | . | P | Y | [ | | ] | F | G | C | R | L | \ |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | Tab | A | O | E | U | I |------| |------| D | H | T | N | S | = | * | Tab/ARROW | A | O | E | U | I |------| |------| D | H | T | N | S | = / Arrow |
* |-----------+------+------+------+------+------| ( | | ) |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| ( | | ) |------+------+------+------+------+-----------|
* | Play/Pause| / | Q | J | K | X | | | | B | M | W | V | Z | Stop | * | Play/Pause| / | Q | J | K | X | | | | B | M | W | V | Z | Stop |
* `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------' * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
* | | | Left | Up | : | | - | Down | Rght | | | * | | | | | : | | - | | | | |
* `-----------------------------------' `-----------------------------------' * `-----------------------------------' `-----------------------------------'
* ,-------------. ,-------------. * ,-------------. ,-------------.
* | LAlt | GUI | | MDIA | ARRW | * | LAlt | GUI | | MDIA | 1HND |
* ,------|------|------| |------+------+------. * ,------|------|------| |------+------+------.
* | | | Ctrl | | LEAD | | | * | | | Ctrl | | LEAD | | |
* |Backsp|LShift|------| |------| Enter| Space| * |Backsp|LShift|------| |------| Enter| Space|
@ -146,67 +146,67 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// left hand // left hand
KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR) KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
,M(A_MPN) ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC ,M(A_MPN) ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC
,KC_TAB ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I ,LT(ARRW,KC_TAB) ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I
,KC_MPLY ,KC_SLSH ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN ,KC_MPLY ,KC_SLSH ,KC_Q ,KC_J ,KC_K ,KC_X ,KC_LPRN
,KC_NO ,KC_NO ,KC_LEFT ,KC_UP ,CT_CLN ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
,F(F_ALT),F(F_GUI) ,F(F_ALT),F(F_GUI)
,F(F_CTRL) ,F(F_CTRL)
,KC_BSPC,F(F_SFT),M(A_ESC) ,KC_BSPC,F(F_SFT),M(A_ESC)
// right hand // right hand
,M(OH_LEFT),M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11 ,KC_APP ,M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
,KC_RBRC ,KC_F ,KC_G ,KC_C ,KC_R ,KC_L ,KC_BSLS ,KC_RBRC ,KC_F ,KC_G ,KC_C ,KC_R ,KC_L ,KC_BSLS
,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,KC_EQL ,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,LT(ARRW, KC_EQL)
,KC_RPRN ,KC_B ,KC_M ,KC_W ,KC_V ,KC_Z ,KC_MSTP ,KC_RPRN ,KC_B ,KC_M ,KC_W ,KC_V ,KC_Z ,KC_MSTP
,KC_MINS,KC_DOWN,KC_RGHT ,KC_NO ,KC_NO ,KC_MINS,KC_NO ,KC_NO ,KC_NO ,KC_NO
,OSL(NMDIA),OSL(ARRW) ,OSL(NMDIA),M(OH_LEFT)
,KC_LEAD ,KC_LEAD
,F(F_HUN) ,KC_ENT ,KC_SPC ,F(F_HUN) ,KC_ENT ,KC_SPC
), ),
/* Keymap 1: Experimental layer /* Keymap 1: Adore layer
* *
* ,-----------------------------------------------------. ,-----------------------------------------------------. * ,-----------------------------------------------------. ,-----------------------------------------------------.
* | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr | | 1HND | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| F11 | * | `~ | 1 F1 | 2 F2 | 3 F3 | 4 F4 | 5 F5 | Plvr | | Apps | 6 F6 | 7 F7 | 8 F8 | 9 F9 | 0 F10| F11 |
* |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
* | Next/Prev | ' | , | . | P | Y | [ | | ] | L | F | C | R | J | = | * | Next/Prev | , | . | L | W | M | [ | | ] | F | H | C | P | Y | \ |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | Tab | A | O | E | U | I |------| |------| D | H | T | N | S | \ | * | Tab/Arrow | A | O | E | I | U |------| |------| D | R | T | N | S | = / Arrow |
* |-----------+------+------+------+------+------| ( | | ) |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| ( | | ) |------+------+------+------+------+-----------|
* | Play/Pause| Z | G | V | K | X | | | | Q | M | W | B | / | Stop | * | Play/Pause| / | Z | ' | K | X | | | | B | G | V | J | Q | Stop |
* `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------' * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
* | | | Left | Up | : | | - | Down | Rght | | | * | | | | | : | | - | | | | |
* `-----------------------------------' `-----------------------------------' * `-----------------------------------' `-----------------------------------'
* ,-------------. ,-------------. * ,-------------. ,-------------.
* | LAlt | GUI | | MDIA | ARRW | * | LAlt | GUI | | MDIA | 1HND |
* ,------|------|------| |------+------+------. * ,------|------|------| |------+------+------.
* | | | Ctrl | | LEAD | | | * | | | Ctrl | | LEAD | | |
* |Backsp|LShift|------| |------| Enter| Space| * |Backsp|LShift|------| |------| Enter| Space|
* | | | ESC | | HUN | | | * | | | ESC | | HUN | | |
* `--------------------' `--------------------' * `--------------------' `--------------------'
*/ */
[EXPRM] = KEYMAP( [ADORE] = KEYMAP(
// left hand // left hand
KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR) KC_GRV ,M(KF_1) ,M(KF_2) ,M(KF_3),M(KF_4),M(KF_5),M(A_PLVR)
,M(A_MPN) ,KC_QUOT ,KC_COMM ,KC_DOT ,KC_P ,KC_Y ,KC_LBRC ,M(A_MPN) ,KC_COMM ,KC_DOT ,KC_L ,KC_W ,KC_M ,KC_LBRC
,KC_TAB ,KC_A ,KC_O ,KC_E ,KC_U ,KC_I ,LT(ARRW, KC_TAB) ,KC_A ,KC_O ,KC_E ,KC_I ,KC_U
,KC_MPLY ,KC_Z ,KC_G ,KC_V ,KC_K ,KC_X ,KC_LPRN ,KC_MPLY ,KC_SLSH ,KC_Z ,KC_QUOT,KC_K ,KC_X ,KC_LPRN
,KC_NO ,KC_NO ,KC_LEFT ,KC_UP ,CT_CLN ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
,F(F_ALT),F(F_GUI) ,F(F_ALT),F(F_GUI)
,F(F_CTRL) ,F(F_CTRL)
,KC_BSPC,F(F_SFT),M(A_ESC) ,KC_BSPC,F(F_SFT),M(A_ESC)
// right hand // right hand
,M(OH_LEFT),M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11 ,KC_APP ,M(KF_6),M(KF_7),M(KF_8),M(KF_9) ,M(KF_10) ,KC_F11
,KC_RBRC ,KC_L ,KC_F ,KC_C ,KC_R ,KC_J ,KC_BSLS ,KC_RBRC ,KC_F ,KC_H ,KC_C ,KC_P ,KC_Y ,KC_BSLS
,KC_D ,KC_H ,KC_T ,KC_N ,KC_S ,KC_EQL ,KC_D ,KC_R ,KC_T ,KC_N ,KC_S ,LT(ARRW, KC_EQL)
,KC_RPRN ,KC_Q ,KC_M ,KC_W ,KC_B ,KC_SLSH ,KC_MSTP ,KC_RPRN ,KC_B ,KC_G ,KC_V ,KC_J ,KC_Q ,KC_MSTP
,KC_MINS,KC_DOWN,KC_RGHT ,KC_NO ,KC_NO ,KC_MINS,KC_NO ,KC_NO ,KC_NO ,KC_NO
,OSL(NMDIA),OSL(ARRW) ,OSL(NMDIA),M(OH_LEFT)
,KC_LEAD ,KC_LEAD
,F(F_HUN) ,KC_ENT ,KC_SPC ,F(F_HUN) ,KC_ENT ,KC_SPC
), ),
@ -216,19 +216,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* ,-----------------------------------------------------. ,-----------------------------------------------------. * ,-----------------------------------------------------. ,-----------------------------------------------------.
* | | | | | | | | | | | | | | | | * | | | | | | | | | | | | | | | |
* |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------| * |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
* | | | | | | | | | | | | | | | | * | | | | | | | | | | | Home | Up | End | | |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | | | | | | |------| |------| | | | | | | * | | | | | | |------| |------| | Left | Down | Rght | | |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------| * |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | | | | | | | | | | | | | | | | * | | | | | | | | | | | | | | | |
* `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------' * `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
* | | | Home | PgUp | | | | PgDn | End | | | * | | | | | | | | | | | |
* `----------------------------------' `----------------------------------' * `----------------------------------' `----------------------------------'
* ,-------------. ,-------------. * ,-------------. ,-------------.
* | | | | | | * | | | | | |
* ,------|------|------| |------+------+------. * ,------|------|------| |------+------+------.
* | | | | | | | | * | | | | | | | |
* | | |------| |------| | | * | | |------| |------| PgUp | PgDn |
* | | | | | | | | * | | | | | | | |
* `--------------------' `--------------------' * `--------------------' `--------------------'
*/ */
@ -239,7 +239,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_HOME ,KC_PGUP ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS
@ -247,14 +247,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// right hand // right hand
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_HOME ,KC_UP ,KC_END ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_LEFT ,KC_DOWN ,KC_RGHT ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_PGDN ,KC_END ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_PGUP ,KC_PGDN
), ),
/* Keymap 3: Application select layer /* Keymap 3: Application select layer
@ -843,8 +843,12 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
return MACRO_NONE; return MACRO_NONE;
}; };
uint8_t is_adore = 0;
// Runs just one time when the keyboard initializes. // Runs just one time when the keyboard initializes.
void matrix_init_user(void) { void matrix_init_user(void) {
uint8_t dl;
ergodox_led_all_on(); ergodox_led_all_on();
for (int i = LED_BRIGHTNESS_HI; i > LED_BRIGHTNESS_LO; i--) { for (int i = LED_BRIGHTNESS_HI; i > LED_BRIGHTNESS_LO; i--) {
ergodox_led_all_set (i); ergodox_led_all_set (i);
@ -856,6 +860,12 @@ void matrix_init_user(void) {
_delay_ms (10); _delay_ms (10);
} }
ergodox_led_all_off(); ergodox_led_all_off();
if (!eeconfig_is_enabled())
eeconfig_init();
dl = eeconfig_read_default_layer ();
if (dl == (1UL << ADORE))
is_adore = 1;
}; };
LEADER_EXTERNS(); LEADER_EXTERNS();
@ -882,30 +892,33 @@ void ang_tap (uint16_t codes[]) {
register_code (code); \ register_code (code); \
unregister_code (code) unregister_code (code)
uint8_t is_exp = 0; void ang_tap_dance (qk_tap_dance_state_t *state) {
switch (state->keycode) {
// Runs constantly in the background, in a loop. case TD(CT_CLN):
void matrix_scan_user(void) { if (state->count == 1) {
uint8_t layer = biton32(layer_state);
if (gui_timer && timer_elapsed (gui_timer) > TAPPING_TERM)
unregister_code (KC_LGUI);
if (ct_cln_timer && timer_elapsed (ct_cln_timer) > TAPPING_TERM) {
if (ct_cln_count == 1) {
register_code (KC_RSFT); register_code (KC_RSFT);
register_code (KC_SCLN); register_code (KC_SCLN);
unregister_code (KC_SCLN); unregister_code (KC_SCLN);
unregister_code (KC_RSFT); unregister_code (KC_RSFT);
} else if (ct_cln_count == 2) { } else if (state->count == 2) {
register_code (KC_SCLN); register_code (KC_SCLN);
unregister_code (KC_SCLN); unregister_code (KC_SCLN);
reset_tap_dance (state);
}
} }
ct_cln_count = 0;
ct_cln_timer = 0;
} }
const qk_tap_dance_action_t tap_dance_actions[] = {
[CT_CLN] = ACTION_TAP_DANCE_FN (ang_tap_dance)
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
if (gui_timer && timer_elapsed (gui_timer) > TAPPING_TERM)
unregister_code (KC_LGUI);
if (layer != OHLFT) if (layer != OHLFT)
oh_left_blink = 0; oh_left_blink = 0;
if (layer != OHRGT) if (layer != OHRGT)
@ -921,7 +934,7 @@ void matrix_scan_user(void) {
ergodox_right_led_1_on (); ergodox_right_led_1_on ();
ergodox_right_led_2_on (); ergodox_right_led_2_on ();
ergodox_right_led_3_on (); ergodox_right_led_3_on ();
} else if (layer == EXPRM) { } else if (layer == ADORE) {
ergodox_right_led_1_on (); ergodox_right_led_1_on ();
ergodox_right_led_2_on (); ergodox_right_led_2_on ();
ergodox_right_led_3_on (); ergodox_right_led_3_on ();
@ -961,7 +974,7 @@ void matrix_scan_user(void) {
ergodox_right_led_1_on (); ergodox_right_led_1_on ();
} else { } else {
ergodox_right_led_1_set (LED_BRIGHTNESS_LO); ergodox_right_led_1_set (LED_BRIGHTNESS_LO);
if (layer != OHLFT && layer != NMDIA && layer != PLVR && layer != EXPRM) if (layer != OHLFT && layer != NMDIA && layer != PLVR && layer != ADORE)
ergodox_right_led_1_off (); ergodox_right_led_1_off ();
} }
@ -971,7 +984,7 @@ void matrix_scan_user(void) {
ergodox_right_led_2_on (); ergodox_right_led_2_on ();
} else { } else {
ergodox_right_led_2_set (LED_BRIGHTNESS_LO); ergodox_right_led_2_set (LED_BRIGHTNESS_LO);
if (layer != OHRGT && layer != HUN && layer != OHLFT && layer != NMDIA && layer != PLVR && layer != EXPRM) if (layer != OHRGT && layer != HUN && layer != OHLFT && layer != NMDIA && layer != PLVR && layer != ADORE)
ergodox_right_led_2_off (); ergodox_right_led_2_off ();
} }
@ -981,7 +994,7 @@ void matrix_scan_user(void) {
ergodox_right_led_3_on (); ergodox_right_led_3_on ();
} else { } else {
ergodox_right_led_3_set (LED_BRIGHTNESS_LO); ergodox_right_led_3_set (LED_BRIGHTNESS_LO);
if (layer != OHRGT && layer != HUN && layer != PLVR && layer != EXPRM) if (layer != OHRGT && layer != HUN && layer != PLVR && layer != ADORE)
ergodox_right_led_3_off (); ergodox_right_led_3_off ();
} }
@ -989,6 +1002,10 @@ void matrix_scan_user(void) {
leading = false; leading = false;
leader_end (); leader_end ();
SEQ_ONE_KEY (KC_D) {
log_enable = !log_enable;
}
SEQ_ONE_KEY (KC_U) { SEQ_ONE_KEY (KC_U) {
ang_do_unicode (); ang_do_unicode ();
} }
@ -1036,11 +1053,12 @@ void matrix_scan_user(void) {
unregister_code (KC_LGUI); unregister_code (KC_LGUI);
} }
SEQ_ONE_KEY (KC_E) { SEQ_ONE_KEY (KC_A) {
if (is_exp == 0) { if (is_adore == 0) {
default_layer_and (0); default_layer_and (0);
default_layer_or ((1 << EXPRM)); default_layer_or ((1UL << ADORE));
is_exp = 1; eeconfig_update_default_layer ((1UL << ADORE));
is_adore = 1;
ergodox_led_all_off (); ergodox_led_all_off ();
ergodox_right_led_3_on (); ergodox_right_led_3_on ();
@ -1054,9 +1072,10 @@ void matrix_scan_user(void) {
_delay_ms (100); _delay_ms (100);
ergodox_right_led_1_off (); ergodox_right_led_1_off ();
} else { } else {
is_exp = 0; is_adore = 0;
default_layer_and (0); default_layer_and (0);
default_layer_or (1 << BASE); default_layer_or (1UL << BASE);
eeconfig_update_default_layer ((1UL << BASE));
ergodox_led_all_off (); ergodox_led_all_off ();
ergodox_right_led_1_on (); ergodox_right_led_1_on ();
@ -1075,29 +1094,11 @@ void matrix_scan_user(void) {
} }
bool process_record_user (uint16_t keycode, keyrecord_t *record) { bool process_record_user (uint16_t keycode, keyrecord_t *record) {
switch(keycode) { uint8_t layer = biton32(layer_state);
case CT_CLN:
if (record->event.pressed) {
ct_cln_count++;
ct_cln_timer = timer_read ();
} else {
}
return false;
break;
default: if (log_enable && layer == BASE) {
if (ct_cln_count == 1) { xprintf ("KL: col=%d, row=%d\n", record->event.key.col,
register_code (KC_RSFT); record->event.key.row);
register_code (KC_SCLN);
unregister_code (KC_SCLN);
unregister_code (KC_RSFT);
} else if (ct_cln_count == 2) {
register_code (KC_SCLN);
unregister_code (KC_SCLN);
}
ct_cln_count = 0;
ct_cln_timer = 0;
break;
} }
return true; return true;

@ -1,25 +1,26 @@
<!-- -*- mode: markdown; fill-column: 8192 -*- -->
algernon's layout algernon's layout
======================= =======================
This is an unconventional layout for the ErgoDox EZ. For more details about the This is an unconventional layout for the ErgoDox EZ. For more details about the history of the layout, see my [blog posts about my ErgoDox journey][blog-ergodox].
history of the layout, see my
[blog posts about my ErgoDox journey][blog-ergodox].
[blog-ergodox]: https://asylum.madhouse-project.org/blog/tags/ergodox/ [blog-ergodox]: https://asylum.madhouse-project.org/blog/tags/ergodox/
Some of the things in the layout only work when one uses Spacemacs and GNOME Some of the things in the layout only work when one uses Spacemacs and GNOME under Linux. Your mileage may vary.
under Linux. Your mileage may vary.
## Table of Contents ## Table of Contents
* [Layouts](#layouts) * [Layouts](#layouts)
- [Base layer](#base-layer) - [Base layer](#base-layer)
- [Experimental layer](#experimental-layer) - [ADORE layer](#adore-layer)
- [Hungarian layer](#hungarian-layer) - [Hungarian layer](#hungarian-layer)
- [Navigation and media layer](#navigation-and-media-layer) - [Navigation and media layer](#navigation-and-media-layer)
- [One-handed layer](#one-handed-layer) - [One-handed layer](#one-handed-layer)
- [Steno layer](#steno-layer) - [Steno layer](#steno-layer)
- [LED states](#led-states) - [LED states](#led-states)
* [Tools](#tools)
- [Heatmap](#heatmap)
* [Building](#building) * [Building](#building)
- [Using on Windows](#using-on-windows) - [Using on Windows](#using-on-windows)
* [Changelog](#changelog) * [Changelog](#changelog)
@ -31,133 +32,98 @@ under Linux. Your mileage may vary.
[![Base layer](images/base-layer.png)](http://www.keyboard-layout-editor.com/#/gists/28f7eb305fdbff943613e1dc7aa9e82b) [![Base layer](images/base-layer.png)](http://www.keyboard-layout-editor.com/#/gists/28f7eb305fdbff943613e1dc7aa9e82b)
At its core, this is a Dvorak layout, with some minor changes. The more At its core, this is a Dvorak layout, with some minor changes. The more interesting parts are how certain keys behave:
interesting parts are how certain keys behave:
* The keys on the number row double as function keys, when held for a bit longer than an usual tap. This allows me to use the function keys without having to switch layers.
* The keys on the number row double as function keys, when held for a bit longer * The `Shift`, `Alt`, and `Control` modifiers are one-shot. When tapped, they are considered active for the next key press only. When double tapped, they toggle on, until a third, single tap sometime later. When held, they act as expected. My usual pattern is that I use these for the next keypress only, so this behaviour is perfect. If I need them held, I'll just double-tap.
than an usual tap. This allows me to use the function keys without having to * The `GUI` key is special, because when I double-tap it, it sends `GUI + w`, which pops up an application selector. It also switches to a one-shot layer, where the number row on the left half turns into app selector macros, for the most common things I usually want to switch to. Otherwise it behaves as on a normal layout.
switch layers. * The `ESC` key also doubles as a one-shot cancel key: if tapped while any of the one-shot modifiers are in-flight (as in, single-tapped, and not expired yet), it cancels all one-shot modifiers. It also cancels the **Hun** layer, if active. Otherwise it sends the usual keycode.
* The `Shift`, `Alt`, and `Control` modifiers are one-shot. When tapped, they * The **Media** and **Hun** layer keys are one-shot, the **1Hand** and **STENO** keys are toggles.
are considered active for the next key press only. When double tapped, they * When holding any of the **Arrow** layer keys, the arrow layer activates while the layer key is held. Tapping the key produces the normal key.
toggle on, until a third, single tap sometime later. When held, they act as
expected. My usual pattern is that I use these for the next keypress only, so
this behaviour is perfect. If I need them held, I'll just double-tap.
* The `GUI` key is special, because when I double-tap it, it sends `GUI + w`,
which pops up an application selector. It also switches to a one-shot layer,
where the number row on the left half turns into app selector macros, for the
most common things I usually want to switch to. Otherwise it behaves as on a
normal layout.
* The `ESC` key also doubles as a one-shot cancel key: if tapped while any of
the one-shot modifiers are in-flight (as in, single-tapped, and not expired
yet), it cancels all one-shot modifiers. It also cancels the **Hun** layer, if
active. Otherwise it sends the usual keycode.
* The **Media**, **Arrow**, and **Hun** layer keys are one-shot, the **1Hand**
and **STENO** keys are toggles.
* Toggling the **Arrow** layer toggles between the cursor arrows and the paging
keys on the bottom row.
* Tapping the `:` key once yields `:`, tapping it twice yields `;`. * Tapping the `:` key once yields `:`, tapping it twice yields `;`.
* The **Lead** key allows me to type in a sequence of keys, and trigger some * The **Lead** key allows me to type in a sequence of keys, and trigger some actions:
actions: - `LEAD u` enters unicode input mode, by sending the GTK+ key sequence that does this.
- `LEAD u` enters unicode input mode, by sending the GTK+ key sequence that
does this.
- `LEAD l` uses the unicode input method to enter a `λ`. - `LEAD l` uses the unicode input method to enter a `λ`.
- `LEAD s` does a lot of magic to type in a shruggie: `¯\_(ツ)_/¯` - `LEAD s` does a lot of magic to type in a shruggie: `¯\_(ツ)_/¯`
- `LEAD y` types `\o/`. - `LEAD y` types `\o/`.
- `LEAD w m` maximises the currently focused window. - `LEAD w m` maximises the currently focused window.
- `LEAD e` makes the [experimental layer](#experimental-layer) the default. - `LEAD a` makes the [ADORE layer](#adore-layer) the default.
- `LEAD v` prints the firmware version, the keyboard and the keymap. - `LEAD v` prints the firmware version, the keyboard and the keymap.
- `LEAD d` toggles logging keypress positions to the HID console.
## Experimental layer ## ADORE layer
[![Experimental layer](images/experimental-layer.png)](http://www.keyboard-layout-editor.com/#/gists/6ff50bf71248e05aab5b3fec4fae3d08) [![ADORE layer](images/adore-layer.png)](http://www.keyboard-layout-editor.com/#/gists/45681a17453d235925b6028dd83bf12a)
While using the standard Dvorak layout, I encountered a number of While using the standard Dvorak layout, I encountered a number of inconveniences, and on this layer, I am playing with ideas to make the layout feel better. Initially, it was based on [Capewell-Dvorak][cpd], but that too, had shortcomings I was not happy with. So now this is something inbetween, with own observations thrown in. How it works out in the long run remains to be seen.
inconveniences, and on this layer, I am playing with ideas to make the layout
feel better. Initially, it was based on [Capewell-Dvorak][cpd], but that too,
had shortcomings I was not happy with. So now this is something inbetween, with
own observations thrown in. How it works out in the long run remains to be seen.
[cpd]: http://www.michaelcapewell.com/projects/keyboard/layout_capewell-dvorak.htm [cpd]: http://www.michaelcapewell.com/projects/keyboard/layout_capewell-dvorak.htm
Based on a week and a half of typing, the keys were rearranged, and the home row neatly spelled out **ADORE**, that gave the layout its name.
## Hungarian layer ## Hungarian layer
[![Hungarian layer](images/hun-layer.png)](http://www.keyboard-layout-editor.com/#/gists/b160f6ec90d58c127c114c89f66e9dc9) [![Hungarian layer](images/hun-layer.png)](http://www.keyboard-layout-editor.com/#/gists/b160f6ec90d58c127c114c89f66e9dc9)
On this layer, the accented characters are at the same position as their base On this layer, the accented characters are at the same position as their base variant. For some, which can have other diatribes, the long one is on top, short's on bottom. Tapping any of the accented characters takes us back to the base layer.
variant. For some, which can have other diatribes, the long one is on top,
short's on bottom. Tapping any of the accented characters takes us back to the
base layer.
## Navigation and media layer ## Navigation and media layer
[![Navigation and media layer](images/nav-n-media-layer.png)](http://www.keyboard-layout-editor.com/#/gists/c59c453f9fe1a3238ba1494e7e5c6892) [![Navigation and media layer](images/nav-n-media-layer.png)](http://www.keyboard-layout-editor.com/#/gists/c59c453f9fe1a3238ba1494e7e5c6892)
This layer is primarily for navigating with the cursor or the mouse, and some This layer is primarily for navigating with the cursor or the mouse, and some media things.
media things.
## One-handed layer ## One-handed layer
[![One-handed layer](images/one-handed-layer.png)](http://www.keyboard-layout-editor.com/#/gists/edff2495135955b8963198dace7f7ece) [![One-handed layer](images/one-handed-layer.png)](http://www.keyboard-layout-editor.com/#/gists/edff2495135955b8963198dace7f7ece)
The one-handed layer is used in situations where the right hand is occupied, by The one-handed layer is used in situations where the right hand is occupied, by mousing around, for example. Tapping the `OTHER` key switches which side is active. For the most part, keys remain in their usual position. When the right half is active, keys are mirrored to the left half.
mousing around, for example. Tapping the `OTHER` key switches which side is
active. For the most part, keys remain in their usual position. When the right
half is active, keys are mirrored to the left half.
The differences are as follows: The differences are as follows:
* The `ESC` key has been moved to the bottom row, so the `OTHER` key is easier * The `ESC` key has been moved to the bottom row, so the `OTHER` key is easier to tap.
to tap. * Most keys on the thumb cluster now have dual uses, and these do not change when switching sides:
* Most keys on the thumb cluster now have dual uses, and these do not change - The `Space`/`Backspace` key sends `Space` on tap, `Backspace` when held for longer than a normal tap.
when switching sides:
- The `Space`/`Backspace` key sends `Space` on tap, `Backspace` when held
for longer than a normal tap.
- The `Enter`/`Shift` key sends `Enter` on short-tap, `Shift` on long-tap. - The `Enter`/`Shift` key sends `Enter` on short-tap, `Shift` on long-tap.
* The `Apps`/`BASE` key can be used to go back to the base layer, by * The `Apps`/`BASE` key can be used to go back to the base layer, by long-tapping it. A short-tap will send the `App` key, as usual.
long-tapping it. A short-tap will send the `App` key, as usual.
## Steno layer ## Steno layer
[![Steno layer for Plover](images/steno-layer.png)](http://www.keyboard-layout-editor.com/#/gists/401ef9a84369e47c57f9aedcf0a0d667) [![Steno layer for Plover](images/steno-layer.png)](http://www.keyboard-layout-editor.com/#/gists/401ef9a84369e47c57f9aedcf0a0d667)
This is to be used with [Plover](http://www.openstenoproject.org/plover/), This is to be used with [Plover](http://www.openstenoproject.org/plover/), nothing really fancy here. The **STENO** key toggles the layer on and off, and sends the toggle command to Plover too.
nothing really fancy here. The **STENO** key toggles the layer on and off, and
sends the toggle command to Plover too.
## LED states ## LED states
The primary purpose of the LEDs is to show the modifier status, a secondary, to The primary purpose of the LEDs is to show the modifier status, a secondary, to show which layer is active. Each modifier, `Shift`, `Alt` and `Control` each have their designated LEDs: the *red*, *green* and *blue*, respectively. When a modifier is in a one-shot state, the respective LED will turn on with a dimmer light. If the modifier is toggled on, the brightness of the LED turns full.
show which layer is active. Each modifier, `Shift`, `Alt` and `Control` each
have their designated LEDs: the *red*, *green* and *blue*, respectively. When a
modifier is in a one-shot state, the respective LED will turn on with a dimmer
light. If the modifier is toggled on, the brightness of the LED turns full.
For the layers, the following rules apply: For the layers, the following rules apply:
* When the [Experimental layer](#experimental-layer) is toggled on, LEDs will * When the [ADORE layer](#adore-layer) is toggled on, LEDs will light up from left to right in a sequence, then turn off. When the layer is toggled off, the LEDs light up and turn off in the other direction. No LEDs are on while the layer is active.
light up from left to right in a sequence, then turn off. When the layer is * When the [Hungarian layer](#hungarian-layer) is active, the *green* and *blue* LEDs are on.
toggled off, the LEDs light up and turn off in the other direction. No LEDs * When the [Navigation and media layer](#navigation-and-media-layer) is active, the *red* and *green* ones are on.
are on while the layer is active. * When the [One-handed layer](#one-handed-layer) is active, the *green* LED is on and bright, and either the *red* or the *blue* one is going to slowly blink, depending on the currently active side.
* When the [Hungarian layer](#hungarian-layer) is active, the *green* and *blue*
LEDs are on.
* When the [Navigation and media layer](#navigation-and-media-layer) is active,
the *red* and *green* ones are on.
* When the [One-handed layer](#one-handed-layer) is active, the *green* LED is
on and bright, and either the *red* or the *blue* one is going to slowly
blink, depending on the currently active side.
* For the [Steno layer](#steno-layer), all LEDs will be turned on. * For the [Steno layer](#steno-layer), all LEDs will be turned on.
Unless noted otherwise, the layers use a dim light for the LEDs, while modifiers Unless noted otherwise, the layers use a dim light for the LEDs, while modifiers use a stronger one, and modifiers override any layer preferences. For example, when on the one-handed layer, with the left side active (*red* light blinking), if `Shift` is on, the *red* light will be constantly on.
use a stronger one, and modifiers override any layer preferences. For example,
when on the one-handed layer, with the left side active (*red* light blinking), # Tools
if `Shift` is on, the *red* light will be constantly on.
## Heatmap
When the keypress logging functionality is enabled (by `LEAD d`), the keyboard will output a line every time a key is pressed, containing the position of the key in the matrix. This allows one to collect this information, and build analytics over it, such as a heat map, including dead keys too.
Included with the firmware is a small tool that can parse these logs, and create a heatmap that one can import into [KLE][kle]. To use it, simply point `tools/log-to-heatmap.py` to a base layout file (one is included in the `tools/` directory), and the key position log. The latter one can create by running `hid-listen`, and redirecting its output to a file.
[kle]: http://www.keyboard-layout-editor.com/
The generated heatmap looks somewhat like this:
![Heatmap](images/heatmap.png)
# Building # Building
To make my workflow easier, this layout is maintained in To make my workflow easier, this layout is maintained in [its own repository][algernon:ez-layout]. To build it, you will need the [QMK][qmk] firmware checked out, and this repo either checked out to something like `keyboards/ergodox_ez/algernon-master`. One way to achieve that is this:
[its own repository][algernon:ez-layout]. To build it, you will need the
[QMK][qmk] firmware checked out, and this repo either checked out to something
like `keyboards/ergodox_ez/algernon-master`. One way to achieve that is this:
[algernon:ez-layout]: https://github.com/algernon/ergodox-layout [algernon:ez-layout]: https://github.com/algernon/ergodox-layout
[qmk]: https://github.com/jackhumbert/qmk_firmware [qmk]: https://github.com/jackhumbert/qmk_firmware
@ -170,9 +136,7 @@ $ git clone https://github.com/algernon/ergodox-layout.git \
$ make KEYBOARD=ergodox_ez KEYMAP=algernon-master $ make KEYBOARD=ergodox_ez KEYMAP=algernon-master
``` ```
From time to time, updates may be submitted back to the QMK repository. If you From time to time, updates may be submitted back to the QMK repository. If you are reading it there, you can build the firmware like any other firmware included with it (assuming you are in the root directory of the firmware):
are reading it there, you can build the firmware like any other firmware
included with it (assuming you are in the root directory of the firmware):
``` ```
$ make KEYBOARD=ergodox_ez KEYMAP=algernon $ make KEYBOARD=ergodox_ez KEYMAP=algernon
@ -180,36 +144,33 @@ $ make KEYBOARD=ergodox_ez KEYMAP=algernon
## Using on Windows ## Using on Windows
The keymap default to forcing NKRO, which seems to upset Windows, and except the The keymap default to forcing NKRO, which seems to upset Windows, and except the modifiers, none of them work. If you experience this problem, recompile the firmware with `FORCE_NKRO=no` added to the `make` command line.
modifiers, none of them work. If you experience this problem, recompile the
firmware with `FORCE_NKRO=no` added to the `make` command line.
# Changelog # Changelog
## v1.3 - 2016-07-06
* Added support for logging keys, by pressing `LEAD d`. Also included is a tool to generate a [heatmap](#heatmap) out of the logs.
* The arrow and navigation keys were rearranged again, and now require an additional key being held to activate. See the [base layer](#base-layer) for an image that shows where arrows are.
* The **experimental** layer has been redone, and is now called [ADORE](#adore-layer), and as such, can be enabled by `LEAD a` now.
* Switching between Dvorak and ADORE is now persisted into EEPROM, and survives a reboot.
## v1.2 - 2016-06-22 ## v1.2 - 2016-06-22
* The forced NKRO mode can be easily toggled off at compile-time, to make the * The forced NKRO mode can be easily toggled off at compile-time, to make the firmware compatible with [certain operating systems](#using-on-windows).
firmware compatible with [certain operating systems](#using-on-windows). * The `:;` key has changed behaviour: to access the `;` symbol, the key needs to be double-tapped, instead of shifted.
* The `:;` key has changed behaviour: to access the `;` symbol, the key needs to * The `=` and `\` keys were swapped, `=` moved to the home row, on both the [base](#base-layer) and the **experimental** layers.
be double-tapped, instead of shifted. * The arrow and navigation keys were redone, they are now more accessible, but the navigation keys require an extra tap to access.
* The `=` and `\` keys were swapped, `=` moved to the home row, on both the * The **Emacs** layer is gone, replaced by a simplified [navigation and media](#navigation-and-media-layer) layer.
[base](#base-layer) and the [experimental](#experimental-layer) layers.
* The arrow and navigation keys were redone, they are now more accessible, but
the navigation keys require an extra tap to access.
* The **Emacs** layer is gone, replaced by a simplified
[navigation and media](#navigation-and-media-layer) layer.
* `LEAD v` types the firmware version, and the keymap version. * `LEAD v` types the firmware version, and the keymap version.
* On the [experimental](#experimental-layer) layer, the `L` and `Q`, and the `K` * On the **experimental** layer, the `L` and `Q`, and the `K` and `G` keys were swapped.
and `G` keys were swapped. * The [Steno](#steno-layer) layer gained a few more `#` and `*` keys, to make it easier on my fingers.
* The [Steno](#steno-layer) layer gained a few more `#` and `*` keys, to make it
easier on my fingers.
## v1.1 - 2016-06-14 ## v1.1 - 2016-06-14
* The keyboard starts in NKRO mode, bootmagic and other things are disabled. * The keyboard starts in NKRO mode, bootmagic and other things are disabled.
* A [Steno](#steno-layer) layer was added, to be used with Plover. * A [Steno](#steno-layer) layer was added, to be used with Plover.
* An [experimental](#experimental-layer) layer was added, something halfway * An **experimental** layer was added, something halfway between Dvorak and Capewell-Dvorak. A work in progress.
between Dvorak and Capewell-Dvorak. A work in progress.
* `LEAD y` types `\o/`. * `LEAD y` types `\o/`.
* Some keys on the [Base](#base-layer) layer have been moved around: * Some keys on the [Base](#base-layer) layer have been moved around:
- `?` moved to the left pinky, left of `Q`. - `?` moved to the left pinky, left of `Q`.
@ -225,6 +186,4 @@ Initial version.
# License # License
The layout, being a derivative of the original TMK firmware which is under the The layout, being a derivative of the original TMK firmware which is under the GPL-2+, this layout is under the GPL as well, but GPL-3+, rather than the older version.
GPL-2+, this layout is under the GPL as well, but GPL-3+, rather than the older
version.

@ -0,0 +1,533 @@
[
{
"backcolor": "#ffffff",
"name": "ErgoDox - algernon's layout: Heatmap",
"author": "Gergely Nagy <kbd@gergo.csillger.hu>",
"notes": "See [here](https://github.com/algernon/ergodox-layout#readme) for the QMK keymap source.",
"switchMount": "cherry",
"switchBrand": "gateron",
"switchType": "KS-3-Tea",
"pcb": true,
"css": ".keyborder { -webkit-filter: blur(5px); filter: blur(5px); } .keytop { -webkit-filter: blur(10px); } .keylabels { border: 1px solid black; }"
},
[
{
"x": 3.5,
"c": "#a7d0db",
"fa": [
0,
0,
2
]
},
"#\n3\nF3",
{
"x": 10.5,
"c": "#a7d0db",
"t": "#000000",
"a": 4,
"fa": [
0,
0,
2
]
},
"*\n8\nF8"
],
[
{
"y": -0.875,
"x": 2.5,
"c": "#bfbad1",
"t": "#0d0d0b"
},
"@\n2\nF2",
{
"x": 1,
"c": "#7adabd",
"t": "#000000"
},
"$\n4\nF4",
{
"x": 8.5
},
"&\n7\nF7",
{
"x": 1,
"c": "#bfbad1",
"t": "#0d0d0b"
},
"(\n9\nF9"
],
[
{
"y": -0.875,
"x": 5.5,
"c": "#7adabd",
"t": "#000000"
},
"%\n5\nF5",
{
"c": "#f9cd31",
"a": 7,
"f": 2
},
"STENO",
{
"x": 4.5,
"f": 6
},
"<i class='mss mss-Unicode-Option-3'></i>",
{
"c": "#7adabd",
"a": 4,
"f": 3,
"fa": [
0,
0,
2
]
},
"^\n6\nF6"
],
[
{
"y": -0.875,
"c": "#ffb2d2",
"f": 3,
"w": 1.5
},
"\n\n~\n`",
{
"t": "#0d0d0b"
},
"!\n1\nF1",
{
"x": 14.5
},
")\n0\nF10",
{
"a": 7,
"w": 1.5
},
"F11"
],
[
{
"y": -0.375,
"x": 3.5,
"c": "#a7d0db",
"t": "#000000",
"a": 4
},
">\n.",
{
"x": 10.5,
"a": 6
},
"C"
],
[
{
"y": -0.875,
"x": 2.5,
"c": "#bfbad1",
"t": "#0d0d0b",
"a": 4
},
"<\n,",
{
"x": 1,
"c": "#7adabd",
"t": "#000000",
"a": 6
},
"P",
{
"x": 8.5
},
"G",
{
"x": 1,
"c": "#bfbad1",
"t": "#0d0d0b"
},
"R"
],
[
{
"y": -0.875,
"x": 5.5,
"c": "#7adabd",
"t": "#000000"
},
"Y",
{
"c": "#93c9b7",
"a": 4,
"h": 1.5
},
"{\n[",
{
"x": 4.5,
"h": 1.5
},
"}\n]",
{
"c": "#7adabd",
"a": 6
},
"F"
],
[
{
"y": -0.875,
"c": "#ffb07b",
"t": "#0d0d0b",
"f": 6,
"w": 1.5
},
"<i class='fa fa-fast-backward'></i>\n\n<i class='fa fa-fast-forward'></i>",
{
"c": "#ffb2d2",
"a": 4,
"f": 3
},
"\"\n'",
{
"x": 14.5,
"a": 6
},
"L",
{
"a": 4,
"w": 1.5
},
"|\n\\"
],
[
{
"y": -0.375,
"x": 3.5,
"c": "#a7d0db",
"t": "#000000",
"a": 6
},
"E",
{
"x": 10.5
},
"T"
],
[
{
"y": -0.875,
"x": 2.5,
"c": "#bfbad1",
"t": "#0d0d0b"
},
"O",
{
"x": 1,
"c": "#7adabd",
"t": "#000000",
"n": true
},
"U",
{
"x": 8.5,
"n": true
},
"H",
{
"x": 1,
"c": "#bfbad1",
"t": "#0d0d0b"
},
"N"
],
[
{
"y": -0.875,
"x": 5.5,
"c": "#7adabd",
"t": "#000000"
},
"I",
{
"x": 6.5
},
"D"
],
[
{
"y": -0.875,
"c": "#ffb2d2",
"t": "#0d0d0b",
"fa": [
6
],
"w": 1.5
},
"<i class='fa fa-arrows'></i>\n\nTab",
{
"f": 3
},
"A",
{
"x": 14.5,
"f": 3
},
"S",
{
"a": 4,
"fa": [
0,
0,
0,
0,
0,
0,
0,
6
],
"w": 1.5
},
"+\n="
],
[
{
"y": -0.625,
"x": 6.5,
"c": "#93c9b7",
"t": "#000000",
"a": 7,
"h": 1.5
},
"(",
{
"x": 4.5,
"h": 1.5
},
")"
],
[
{
"y": -0.75,
"x": 3.5,
"c": "#a7d0db",
"a": 6
},
"J",
{
"x": 10.5
},
"W"
],
[
{
"y": -0.875,
"x": 2.5,
"c": "#bfbad1",
"t": "#0d0d0b"
},
"Q",
{
"x": 1,
"c": "#7adabd",
"t": "#000000"
},
"K",
{
"x": 8.5
},
"M",
{
"x": 1,
"c": "#bfbad1",
"t": "#0d0d0b"
},
"V"
],
[
{
"y": -0.875,
"x": 5.5,
"c": "#7adabd",
"t": "#000000"
},
"X",
{
"x": 6.5
},
"B"
],
[
{
"y": -0.875,
"c": "#ffb07b",
"f": 9,
"w": 1.5
},
"\n\n<i class='kb kb-Multimedia-Play-Pause'></i>",
{
"c": "#ffb2d2",
"t": "#0d0d0b",
"a": 4,
"f": 3
},
"?\n/",
{
"x": 14.5,
"a": 6
},
"Z",
{
"c": "#ffb07b",
"t": "#000000",
"f": 9,
"w": 1.5
},
"<i class='kb kb-Multimedia-Stop'></i>"
],
[
{
"y": -0.375,
"x": 3.5,
"c": "#d9dae0",
"g": true,
"a": 7,
"f": 3
},
"",
{
"x": 10.5
},
""
],
[
{
"y": -0.875,
"x": 2.5
},
"",
{
"x": 1,
"c": "#d4872a",
"g": false,
"a": 5
},
";\n:",
{
"x": 8.5
},
"_\n-",
{
"x": 1,
"c": "#d9dae0",
"g": true,
"a": 7
},
""
],
[
{
"y": -0.75,
"x": 0.5
},
"",
{},
"",
{
"x": 14.5
},
"",
{},
""
],
[
{
"r": 30,
"rx": 6.5,
"ry": 4.25,
"y": -1,
"x": 1,
"c": "#f9cd31",
"g": false
},
"Alt",
{
"a": 4,
"fa": [
0,
0,
0,
9
]
},
"\n\n\n<i class='kb kb-logo-linux-debian fa-large'></i>"
],
[
{
"c": "#d4872a",
"a": 7,
"f": 9,
"h": 2
},
"<i class='kb kb-Unicode-BackSpace-DeleteLeft-Big'></i>",
{
"h": 2
},
"<i class='fa fa-angle-double-up'></i>",
{
"c": "#f9cd31",
"f": 3
},
"Ctrl"
],
[
{
"x": 2,
"c": "#e26757"
},
"ESC"
],
[
{
"r": -30,
"rx": 13,
"y": -1,
"x": -3,
"c": "#f9cd31",
"f": 2
},
"MEDIA",
{},
"1HAND"
],
[
{
"x": -3
},
"LEAD",
{
"c": "#d4872a",
"f": 9,
"h": 2
},
"<i class='kb kb-Return-2'></i>",
{
"f": 3,
"h": 2
},
"SPC"
],
[
{
"x": -3,
"c": "#f9cd31",
"f": 2
},
"HUN"
]
]

@ -0,0 +1,145 @@
#! /usr/bin/env python
import json
import os
import sys
import re
from math import floor
cr_coord_map = [
[
# Row 0
[ 4, 0], [ 4, 2], [ 2, 0], [ 1, 0], [ 2, 2], [ 3, 0], [ 3, 2],
[ 3, 4], [ 3, 6], [ 2, 4], [ 1, 2], [ 2, 6], [ 4, 4], [ 4, 6],
],
[
# Row 1
[ 8, 0], [ 8, 2], [ 6, 0], [ 5, 0], [ 6, 2], [ 7, 0], [ 7, 2],
[ 7, 4], [ 7, 6], [ 6, 4], [ 5, 2], [ 6, 6], [ 8, 4], [ 8, 6],
],
[
# Row 2
[12, 0], [12, 2], [10, 0], [ 9, 0], [10, 2], [11, 0], [ ],
[ ], [11, 2], [10, 4], [ 9, 2], [10, 6], [12, 4], [12, 6],
],
[
# Row 3
[17, 0], [17, 2], [15, 0], [14, 0], [15, 2], [16, 0], [13, 0],
[13, 2], [16, 2], [15, 4], [14, 2], [15, 6], [17, 4], [17, 6],
],
[
# Row 4
[20, 0], [20, 2], [19, 0], [18, 0], [19, 2], [], [], [], [],
[19, 4], [18, 2], [19, 6], [20, 4], [20, 6],
],
[
# Row 5
[ ], [23, 0], [22, 2], [22, 0], [22, 4], [21, 0], [21, 2],
[24, 0], [24, 2], [25, 0], [25, 4], [25, 2], [26, 0], [ ],
],
]
def set_attr_at(j, b, n, attr, fn, val):
blk = j[b][n]
if attr in blk:
blk[attr] = fn(blk[attr], val)
else:
blk[attr] = fn(None, val)
def coord(col, row):
return cr_coord_map[row][col]
def set_attr(orig, new):
return new
def set_bg(j, (b, n), color):
set_attr_at(j, b, n, "c", set_attr, color)
#set_attr_at(j, b, n, "g", set_attr, False)
def _set_tap_info(o, count, cap):
ns = 4 - o.count ("\n")
return o + "\n" * ns + "%.02f%%" % (float(count) / float(cap) * 100)
def set_tap_info(j, (b, n), count, cap):
j[b][n + 1] = _set_tap_info (j[b][n + 1], count, cap)
def heatmap_color (v):
colors = [ [0.3, 0.3, 1], [0.3, 1, 0.3], [1, 1, 0.3], [1, 0.3, 0.3]]
fb = 0
if v <= 0:
idx1, idx2 = 0, 0
elif v >= 1:
idx1, idx2 = len(colors) - 1, len(colors) - 1
else:
val = v * (len(colors) - 1)
idx1 = int(floor(val))
idx2 = idx1 + 1
fb = val - float(idx1)
r = (colors[idx2][0] - colors[idx1][0]) * fb + colors[idx1][0]
g = (colors[idx2][1] - colors[idx1][1]) * fb + colors[idx1][1]
b = (colors[idx2][2] - colors[idx1][2]) * fb + colors[idx1][2]
r, g, b = [x * 255 for x in r, g, b]
return "#%02x%02x%02x" % (r, g, b)
# Load the keylog
def load_keylog(fname, restrict_row):
keylog = {}
total = 0
with open(fname, "r") as f:
lines = f.readlines()
for line in lines:
m = re.search ('KL: col=(\d+), row=(\d+)', line)
if not m:
continue
(c, r) = (int(m.group (2)), int(m.group (1)))
if restrict_row != None and r != int(restrict_row):
continue
if (c, r) in keylog:
keylog[(c, r)] = keylog[(c, r)] + 1
else:
keylog[(c, r)] = 1
total = total + 1
return total / 2, keylog
def l_flat(s):
f = s.split("\n")
return ", ".join (f)
def main(base_fn, log_fn, restrict_row = None):
with open(base_fn, "r") as f:
layout = json.load (f)
## Reset colors
for row in cr_coord_map:
for col in row:
if col != []:
set_bg (layout, col, "#d9dae0")
#set_attr_at (layout, col[0], col[1], "g", set_attr, True)
total, log = load_keylog (log_fn, restrict_row)
max_cnt = 0
for (c, r) in log:
max_cnt = max(max_cnt, log[(c, r)])
# Create the heatmap
for (c, r) in log:
coords = coord(c, r)
b, n = coords
cap = max_cnt
v = float(log[(c, r)]) / cap
print >> sys.stderr, "%s => %d/%d => %f = %s" % (l_flat(layout[b][n+1]), log[(c,r)], cap, v, heatmap_color(v))
set_bg (layout, coord(c, r), heatmap_color (v))
set_tap_info (layout, coord (c, r), log[(c, r)], total)
print json.dumps(layout)
if __name__ == "__main__":
if len(sys.argv) < 3:
print """Log to Heatmap -- creates a heatmap out of keyboard logs
Usage: log-to-heatmap.py base-layout.json logfile [row] >layout.json"""
sys.exit (1)
main(*sys.argv[1:])

@ -10,7 +10,7 @@ There are four layers:
Looking for IJKL arrows? [Here we Looking for IJKL arrows? [Here we
go](../romanzolotarev-norman-plover-osx/). go](../romanzolotarev-norman-plover-osx/).
[![keyboard-layout](romanzolotarev-norman-plover-osx-hjkl.png)](rttp://www.keyboard-layout-editor.com/#/gists/56ffedceb0668dda47c993e7271563e0) [![keyboard-layout](romanzolotarev-norman-plover-osx-hjkl.png)](http://www.keyboard-layout-editor.com/#/gists/56ffedceb0668dda47c993e7271563e0)
## Switching ## Switching

@ -0,0 +1,455 @@
#include "ergodox_ez.h"
#include "led.h"
#include "debug.h"
#include "action_layer.h"
#include "action_util.h"
#include "mousekey.h"
#define BASE 0 // default layer
#define SYMB 1 // symbols layer
#define MDIA 2 // media layer
#define SPEC 3 // special layer
#define LCaps 10 // left caps-shift key
#define LSymb 11 // left symbol-shift key
#define LMdia 12 // left media-shift key
#define LSpec 13 // left special-shift key
#define RCaps 14 // right caps-shift key
#define RSymb 15 // right symbol-shift key
#define RMdia 16 // right media-shift key
#define RSpec 17 // right special-shift key
#define MUL 20 // mouse up left
#define MUR 21 // mouse up right
#define MDL 22 // mouse down left
#define MDR 23 // mouse down right
/*
* teckinesis layout for ErgoDox (EZ)
*
* Modifications from The Ordinary Layout v4 by Will Wolff-Myren willwm@gmail.com
* Modifications from default by Nicholas Keene ergodoxez@nicholaskeene.com
*
* No rights reserved. This software is in the public domain.
* Credit me if you are friendly but if you're a jerk don't bother.
*
* Details: readme.md
* https://github.com/willwm/qmk_firmware/tree/master/keyboard/ergodox_ez/keymaps/teckinesis
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/******* Base Layer ********************************************************************************************************
*
* ,------------------------------------------------------. ,------------------------------------------------------.
* | Special =+ | 1 | 2 | 3 | 4 | 5 | ESC | | ` | 6 | 7 | 8 | 9 | 0 | -_ Special |
* |------------+------+------+------+------+-------------| |------+------+------+------+------+------+------------|
* | Media Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \| Media |
* |------------+------+------+------+------+------| | | |------+------+------+------+------+------------|
* | Symbol | A | S | D | F | G |------| |------| H | J | K | L | ; | '" Symbol |
* |------------+------+------+------+------+------|Shift | | Tab |------+------+------+------+------+------------|
* | Capitals | Z | X | C | V | B | -Tab | | | N | M | , | . | / | Capitals |
* `------------+------+------+------+------+-------------' `-------------+------+------+------+------+------------'
* | LCtrl |Meh/\ |Hypr//| LAlt | LGui | | RGui | RAlt |Hypr/[|Meh/] | RCtrl |
* `-----------------------------------' `-----------------------------------'
* ,-------------. ,-------------.
* | Home | End | | Left | Right|
* ,------|------|------| |------+------+------.
* | | | PgUp | | Up | | |
* |Backsp| Del |------| |------| Enter| Space|
* | | | PgDn | | Down | | |
* `--------------------' `--------------------'
*/
[BASE] = KEYMAP(
// left hand
F(LSpec),KC_1,KC_2,KC_3 ,KC_4 ,KC_5 ,KC_ESC
,F(LMdia) ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_LBRC
,M(LSymb) ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G
,M(LCaps) ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,LSFT(KC_TAB)
,KC_LCTL,MEH_T(KC_BSLS),ALL_T(KC_SLSH),KC_LALT,KC_LGUI
,KC_HOME,KC_END
,KC_PGUP
,KC_BSPC,KC_DEL ,KC_PGDN
// right hand
,KC_GRV ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,F(RSpec)
,KC_RBRC ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,F(RMdia)
,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,F(RSymb)
,KC_TAB ,KC_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH ,M(RCaps)
,KC_RGUI,KC_RALT,ALL_T(KC_LBRC),MEH_T(KC_RBRC),KC_RCTL
,KC_LEFT ,KC_RGHT
,KC_UP
,KC_DOWN ,KC_ENT ,KC_SPC
),
/******* Symbols Layer *****************************************************************************************************
*
* ,-----------------------------------------------------. ,-----------------------------------------------------.
* | | F1 | F2 | F3 | F4 | F5 | Esc | | - | F6 | F7 | F8 | F9 | F10 | |
* |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
* | | ! | @ | { | } | & | < | | > | | | 7 | 8 | 9 | / | |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | | # | $ | ( | ) | ` |------| |------| / | 4 | 5 | 6 | * | |
* |-----------+------+------+------+------+------| Tab | | Shift|------+------+------+------+------+-----------|
* | | % | ^ | [ | ] | ~ | | | -Tab| \ | 1 | 2 | 3 | - | |
* `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
* | LCtrl | Meh |Hyper | LAlt | LGui | |RGui/0|RAlt/.|Hypr/=|Meh/+ |RCtrl/Ent|
* `-----------------------------------' `-------------------------------------'
* ,-------------. ,-------------.
* | Left | Right| | Home | End |
* ,------|------|------| |------+------+------.
* | | | Up | | PgUp | | |
* |Space |Enter |------| |------|BackSp| Del |
* | | | Down | | PgDn | | |
* `--------------------' `--------------------'
*/
[SYMB] = KEYMAP(
// left hand
KC_TRNS ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_ESC
,KC_TRNS ,KC_EXLM ,KC_AT ,KC_LCBR ,KC_RCBR ,KC_AMPR ,LSFT(KC_COMM)
,KC_TRNS ,KC_HASH ,KC_DLR ,KC_LPRN ,KC_RPRN ,KC_GRV
,KC_TRNS ,KC_PERC ,KC_CIRC ,KC_LBRC ,KC_RBRC ,KC_TILD ,KC_TAB
,KC_LCTL ,KC_MEH ,KC_HYPR ,KC_LALT ,KC_LGUI
,KC_LEFT ,KC_RGHT
,KC_UP
,KC_SPC ,KC_ENT ,KC_DOWN
// right hand
,KC_MINS ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_TRNS
,LSFT(KC_DOT),KC_PIPE ,KC_7 ,KC_8 ,KC_9 ,KC_SLSH ,KC_TRNS
,KC_SLSH ,KC_4 ,KC_5 ,KC_6 ,KC_ASTR ,KC_TRNS
,LSFT(KC_TAB),KC_BSLS ,KC_1 ,KC_2 ,KC_3 ,KC_MINS ,KC_TRNS
,GUI_T(KC_0),ALT_T(KC_DOT),ALL_T(KC_EQL),MEH_T(KC_PLUS),CTL_T(KC_ENT)
,KC_HOME ,KC_END
,KC_PGUP
,KC_PGDN ,KC_BSPC ,KC_DEL
),
/******* Media Layer *******************************************************************************************************
*
* ,---------------------------------------------------------------. ,---------------------------------------------------------------.
* | | F11 | F12 | F13 | F14 | F15 | Esc | | | F16 | F17 | F18 | F19 | F20 | |
* |------+---------+---------+---------+---------+----------------| |------+---------+---------+---------+---------+---------+------|
* | | |MouseUpLf|Mouse Up |MouseUpRg|Volume Up|Scroll| |Scroll|PrintScrn| Home | Up | PgUp | | |
* |------+---------+---------+---------+---------+---------| Up | | Up |---------+---------+---------+---------+---------+------|
* | | |MouseLeft|MouseDown|MouseRght|Volume Dn|------| |------| Num Lock| Left | Down | Right | | |
* |------+---------+---------+---------+---------+---------|Scroll| |Scroll|---------+---------+---------+---------+---------+------|
* | | |MouseDnLf|MouseDown|MouseDnRg| Mute | Down | | Down | | End | Down | PgDn | | |
* `------+---------+---------+---------+---------+----------------' `----------------+---------+---------+---------+---------+------'
* |LCtrl| Meh | MClick | LClick | R Click| |Cmd/Insrt|Optn/Del | Hyper | Meh |RCtrl|
* `---------------------------------------------' `---------------------------------------------'
* ,-------------. ,-------------.
* | Stop |Refrsh| | Prev | Next |
* ,------|------|------| |------+------+------.
* |Brwser|Brwser|Search| |VolUp | | |
* |Back | Fwd |------| |------| Stop | Play-|
* | | | Home | |VolDn | | Pause|
* `--------------------' `--------------------'
*/
[MDIA] = KEYMAP(
// left hand
KC_TRNS ,KC_F11 ,KC_F12 ,KC_F13 ,KC_F14 ,KC_F15 ,KC_ESC
,KC_TRNS ,KC_NO ,M(MUL) ,KC_MS_U ,M(MUR) ,KC_VOLU ,KC_WH_U
,KC_TRNS ,KC_NO ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_VOLD
,KC_TRNS ,KC_NO ,M(MDL) ,KC_MS_D ,M(MDR) ,KC_MUTE ,KC_WH_D
,KC_LCTL ,KC_MEH ,KC_BTN3 ,KC_BTN1 ,KC_BTN2
,KC_WSTP ,KC_WREF
,KC_WSCH
,KC_WBAK ,KC_NO ,KC_WHOM
// right hand
,KC_NO ,KC_F16 ,KC_F17 ,KC_F18 ,KC_F19 ,KC_F20 ,KC_TRNS
,KC_WH_U ,KC_PSCR ,KC_HOME ,KC_UP ,KC_PGUP ,KC_NO ,KC_TRNS
,KC_NLCK ,KC_LEFT ,KC_DOWN ,KC_RIGHT,KC_NO ,KC_TRNS
,KC_WH_D ,KC_NO ,KC_END ,KC_DOWN ,KC_PGDN ,KC_NO ,KC_TRNS
,GUI_T(KC_INS),ALT_T(KC_DEL),KC_HYPR ,KC_MEH ,KC_RCTL
,KC_MPRV ,KC_MNXT
,KC_VOLU
,KC_VOLD ,KC_MSTP ,KC_MPLY
),
/******* Special Layer *****************************************************************************************************
*
* ,-----------------------------------------------------. ,-----------------------------------------------------.
* | | Esc | | | | | | | | | | | | Bspc | |
* |-----------+------+------+------+------+-------------| |------+------+------+------+------+------+-----------|
* | | | | | | | | | | | | | | | |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | | | | | | |------| |------| | | | | | |
* |-----------+------+------+------+------+------| | | |------+------+------+------+------+-----------|
* | | | | | | | | | | | | | | | RShift |
* `-----------+------+------+------+------+-------------' `-------------+------+------+------+------+-----------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | | | | | |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
[SPEC] = KEYMAP(
// left hand
KC_TRNS ,KC_ESC ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS
,KC_TRNS
,KC_TRNS,KC_TRNS ,KC_TRNS
// right hand
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_BSPC ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_RSFT
,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS
,KC_TRNS ,KC_TRNS
,KC_TRNS
,KC_TRNS ,KC_TRNS ,KC_TRNS
)
};
const uint16_t PROGMEM fn_actions[] = {
// the faux shift keys are implemented as macro taps
[LCaps] = ACTION_MACRO_TAP(LCaps)
,[LSymb] = ACTION_MACRO_TAP(LSymb)
,[LMdia] = ACTION_MACRO_TAP(LMdia)
,[LSpec] = ACTION_MACRO_TAP(LSpec)
,[RCaps] = ACTION_MACRO_TAP(RCaps)
,[RSymb] = ACTION_MACRO_TAP(RSymb)
,[RMdia] = ACTION_MACRO_TAP(RMdia)
,[RSpec] = ACTION_MACRO_TAP(RSpec)
};
uint16_t caps_shift = 0;
uint16_t symb_shift = 0;
uint16_t mdia_shift = 0;
bool symb_lock = false;
bool mdia_lock = false;
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch(id) {
// There are two shift keys for each layer so we increment a layer_shift var when one
// is pressed and decrement when one is released. If both are pressed at the same time
// then the layer is locked (or unlocked). The shift counts are bound between 0 and 2
// only because sometimes rapid pressing led to irregular events; this way the states
// are self healing during use.
case LCaps: // both caps-shift keys trigger Left Shift
case RCaps: // so they don't interfere with the magic combo
if (record->event.pressed && !record->tap.count) {
if(++caps_shift > 2) caps_shift = 2;
if(caps_shift == 2) {
register_code(KC_CAPS);
unregister_code(KC_CAPS);
} else if(caps_shift == 1) {
register_code(KC_LSFT);
}
} else {
if(--caps_shift < 0) caps_shift = 0;
if(caps_shift == 0) unregister_code(KC_LSFT);
}
break;
case LSymb:
if (record->event.pressed) {
if(++symb_shift > 2) symb_shift = 2;
if(symb_shift == 2) {
symb_lock = !symb_lock;
} else if(symb_shift == 1) {
layer_on(SYMB);
}
} else {
if(--symb_shift < 0) symb_shift = 0;
if((symb_shift == 0) && (!symb_lock)) layer_off(SYMB);
}
break;
case LMdia:
if (record->event.pressed) {
if (record->tap.count && (!mdia_shift) && (!mdia_lock)) {
register_code(KC_TAB);
} else {
if(++mdia_shift > 2) mdia_shift = 2;
if(mdia_shift == 2) {
mdia_lock = !mdia_lock;
} else if(mdia_shift == 1) {
layer_on(MDIA);
}
}
} else {
if(record->tap.count && (!mdia_shift) && (!mdia_lock)) {
unregister_code(KC_TAB);
} else {
if(--mdia_shift < 0) mdia_shift = 0;
if((!mdia_shift) && (!mdia_lock)) layer_off(MDIA);
}
}
break;
case LSpec:
if (record->event.pressed) {
if (record->tap.count && !record->tap.interrupted) {
register_code(KC_EQL);
} else {
layer_on(SPEC);
}
} else {
if(record->tap.count && !record->tap.interrupted) {
unregister_code(KC_EQL);
} else {
layer_off(SPEC);
}
}
break;
case RSymb:
if (record->event.pressed) {
if (record->tap.count && (!symb_shift) && (!symb_lock)) {
register_code(KC_QUOT);
} else {
if(++symb_shift > 2) symb_shift = 2;
if(symb_shift == 2) {
symb_lock = !symb_lock;
} else if(symb_shift == 1) {
layer_on(SYMB);
}
}
} else {
if(record->tap.count && symb_shift == 0) {
unregister_code(KC_QUOT);
} else {
if(--symb_shift < 0) symb_shift = 0;
if((!symb_shift) && (!symb_lock)) layer_off(SYMB);
}
}
break;
case RMdia:
if (record->event.pressed) {
if (record->tap.count && (!mdia_shift) && (!mdia_lock)) {
register_code(KC_BSLS);
} else {
if(++mdia_shift > 2) mdia_shift = 2;
if(mdia_shift == 2) {
mdia_lock = !mdia_lock;
} else if(mdia_shift == 1) {
layer_on(MDIA);
}
}
} else {
if(record->tap.count && (!mdia_shift) && (!mdia_lock)) {
unregister_code(KC_BSLS);
} else {
if(--mdia_shift < 0) mdia_shift = 0;
if((!mdia_shift) && (!mdia_lock)) layer_off(MDIA);
}
}
break;
case RSpec:
if (record->event.pressed) {
if (record->tap.count && !record->tap.interrupted) {
register_code(KC_MINS);
} else {
layer_on(SPEC);
}
} else {
if(record->tap.count && !record->tap.interrupted) {
unregister_code(KC_MINS);
} else {
layer_off(SPEC);
}
}
break;
// mouse diagonals
case MUL: // mouse up left
if (record->event.pressed) {
mousekey_on(KC_MS_UP);
mousekey_on(KC_MS_LEFT);
mousekey_send();
} else {
mousekey_off(KC_MS_UP);
mousekey_off(KC_MS_LEFT);
mousekey_send();
}
break;
case MUR: // mouse up right
if (record->event.pressed) {
mousekey_on(KC_MS_UP);
mousekey_on(KC_MS_RIGHT);
mousekey_send();
} else {
mousekey_off(KC_MS_UP);
mousekey_off(KC_MS_RIGHT);
mousekey_send();
}
break;
case MDL: // mouse down left
if (record->event.pressed) {
mousekey_on(KC_MS_DOWN);
mousekey_on(KC_MS_LEFT);
mousekey_send();
} else {
mousekey_off(KC_MS_DOWN);
mousekey_off(KC_MS_LEFT);
mousekey_send();
}
break;
case MDR: // mouse down right
if (record->event.pressed) {
mousekey_on(KC_MS_DOWN);
mousekey_on(KC_MS_RIGHT);
mousekey_send();
} else {
mousekey_off(KC_MS_DOWN);
mousekey_off(KC_MS_RIGHT);
mousekey_send();
}
break;
default:
// none
break;
}
return MACRO_NONE;
};
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
};
// Runs constantly in the background, in a loop.
void matrix_scan_user(void) {
// shift or caps lock turns on red light
if(caps_shift || (keyboard_report->mods & MOD_BIT(KC_RSFT)) || (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK))) {
ergodox_right_led_1_on();
} else {
ergodox_right_led_1_off();
}
// Symbol layer turns on green light
if(layer_state & (1UL<<SYMB)) {
ergodox_right_led_2_on();
} else {
ergodox_right_led_2_off();
}
// Media layer turns on blue light
if(layer_state & (1UL<<MDIA)) {
ergodox_right_led_3_on();
} else {
ergodox_right_led_3_off();
}
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

@ -0,0 +1,27 @@
[{x:3.5,a:7},"",{x:10.5},""],
[{y:-0.875,x:2.5},"",{x:1},"",{x:8.5},"",{x:1},""],
[{y:-0.875,x:5.5},"",{c:"#ff4444",a:4},"Esc",{x:4.5,c:"#cccccc",a:7},"",""],
[{y:-0.875,c:"#000000",t:"#ff0000",a:4,w:1.5},"Special\n\n\n\n\n\nShift",{c:"#ff4444",t:"#000000"},"Esc",{x:14.5,c:"#54d6de"},"Back\n\n\n\n\n\nspace",{c:"#000000",t:"#ff0000",w:1.5},"\n\nSpecial\n\n\n\n\nShift"],
[{y:-0.375,x:3.5,c:"#cccccc",t:"#000000",a:7},"",{x:10.5},""],
[{y:-0.875,x:2.5},"",{x:1},"",{x:8.5},"",{x:1},""],
[{y:-0.875,x:5.5},"",{h:1.5},"",{x:4.5,h:1.5},"",""],
[{y:-0.875,w:1.5},"","",{x:14.5},"",{w:1.5},""],
[{y:-0.375,x:3.5},"",{x:10.5},""],
[{y:-0.875,x:2.5},"",{x:1},"",{x:8.5},"",{x:1},""],
[{y:-0.875,x:5.5},"",{x:6.5},""],
[{y:-0.875,w:1.5},"","",{x:14.5},"",{w:1.5},""],
[{y:-0.625,x:6.5,h:1.5},"",{x:4.5,h:1.5},""],
[{y:-0.75,x:3.5},"",{x:10.5},""],
[{y:-0.875,x:2.5},"",{x:1},"",{x:8.5},"",{x:1},""],
[{y:-0.875,x:5.5},"",{x:6.5},""],
[{y:-0.875,w:1.5},"","",{x:14.5},"",{c:"#2277ff",w:1.5},"RShift"],
[{y:-0.375,x:3.5,c:"#cccccc"},"",{x:10.5},""],
[{y:-0.875,x:2.5},"",{x:1},"",{x:8.5},"",{x:1},""],
[{y:-0.75,x:0.5},"","",{x:14.5},"",""],
[{r:30,rx:6.5,ry:4.25,y:-1,x:1},"",""],
[{h:2},"",{h:2},"",""],
[{x:2},""],
[{r:-30,rx:13,y:-1,x:-3},"",""],
[{x:-3},"",{h:2},"",{h:2},""],
[{x:-3},""]

@ -0,0 +1,45 @@
# teckinesis Layout
*A blend of TECK and Kinesis layouts, based on ["The Ordinary Layout" by Nicholas Keene](http://qmk.fm/keyboards/ergodox_ez/keymaps/ordinary/#the-ordinary-layout-a-familiar-and-powerful-layout)*
I love "The Ordinary Layout", but I still use a [TECK](https://www.trulyergonomic.com/store/index.php)
at the office, and I found the transition back and forth to be a bit more difficult than I expected.
This layout consists of only slight changes to "The Ordinary Layout" based on the layouts of the
[(original) TECK Model 209](https://www.trulyergonomic.com/store/layout-designer--configurator--reprogrammable--truly-ergonomic-mechanical-keyboard/#KTo7PD0+P0BBQkNERUw5394rNR4fICEi4yMkJSYnLS4xOBQaCBUXTBwYDBITLzDhBBYHCQorCw0ODzPl4B0bBhkFKhEQNjc05OPiSktOTSwoLFBSUU/mZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAX2BhAFZXAAAAAAAAAAAAXF1eVAAAAAAAAAAAAABZWltVAAAAAAAAAAAAYgBjAAAAAAAAAAAAWFcAAAAAAACTAQAMAiMBAAwBigEADAIhAQAMAZQBAAwBkgEADAGDAQAMALYBAAwAzQEADAC1AQAMAOIBAAwA6gEADADpAQAMALhJAEYAAAAAAEitR64AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACk6Ozw9Pj9AQUJDREVMOd/eKzUeHyAhIuMjJCUmJy0uMTgUGggVF0wcGAwSEy8w4QQWBwkKKwsNDg8z5eMdGwYZBSoREDY3NOfg4kpLTk0sKCxQUlFP5uQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF9gYQBWVwAAAAAAAAAAAFxdXlQAAAAAAAAAAAAAWVpbVQAAAAAAAAAAAGIAYwAAAAAAAAAAAFhXAAAAAAAAkwEADAIjAQAMAYoBAAwCIQEADAGUAQAMAZIBAAwBgwEADAC2AQAMAM0BAAwAtQEADADiAQAMAOoBAAwA6QEADAC4SQBGAAAAAABIrUeuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=) and
the [Kinesis Advantage](http://www.kinesis-ergo.com/wp-content/uploads/2013/06/advantage_layout_win.pdf)
## The Base Layout ##
[teckinesis (Base Layer)](http://www.keyboard-layout-editor.com/#/gists/befd4c5800d92114aa9e50d4f7c0dfb0)
![teckinesis base layout](teckinesis-base.png)
### Changes from The Ordinary Layout ###
* Moved KC_MINS from the key left of the 6 to the RSpec key.
* Moved KC_EQL from RSpec to LSpec.
* Moved KC_GRV from LSpec to the key left of the 6.
* Mdded KC_BSLS to the left Meh key.
* Added KC_SLSH to the left Hyper key.
* Added KC_LBRC to the right Hyper key.
* Added KC_RBRC to the right Meh key.
## The Symbols Layer ##
[teckinesis (Symbols Layer)](http://www.keyboard-layout-editor.com/#/gists/e6ddc4e9e0d194b3e52ac0616238ab61)
![teckinesis symbols layout](teckinesis-symbol.png)
### Changes from The Ordinary Layout ###
* None.
## The Media Layer ##
[teckinesis (Media Layer)](http://www.keyboard-layout-editor.com/#/gists/41ff65e6a7c490211fd6702fb34d9908)
![teckinesis media layout](teckinesis-media.png)
### Changes from The Ordinary Layout ###
* Removed Power, Sleep, Mail, My Computer keys.
(I kept hitting these while using the mouse/cursor. =P)

@ -0,0 +1,434 @@
[
{
"name": "teckinesis (Base Layer)",
"author": "Will Wolff-Myren",
"notes": "# teckinesis Layout # \r\n\r\n*A blend of TECK and Kinesis layouts, based on [\"The Ordinary Layout\" by Nicholas Keene](http://qmk.fm/keyboards/ergodox_ez/keymaps/ordinary/#the-ordinary-layout-a-familiar-and-powerful-layout)*\r\n\r\n## The Base Layout ##\r\n\r\n![teckinesis base layout](teckinesis-base.png)\r\n\r\n## The Symbols Layer ##\r\n\r\n![teckinesis symbols layout](teckinesis-symbol.png)\r\n\r\n## The Media Layer ##\r\n\r\n(placeholder)\r\n",
"switchMount": "cherry",
"switchBrand": "gateron",
"switchType": "KS-3-Tea"
},
[
{
"x": 3.5
},
"#\n3",
{
"x": 10.5
},
"*\n8"
],
[
{
"y": -0.875,
"x": 2.5
},
"@\n2",
{
"x": 1
},
"$\n4",
{
"x": 8.5
},
"&\n7",
{
"x": 1
},
"(\n9"
],
[
{
"y": -0.875,
"x": 5.5
},
"%\n5",
{
"c": "#ff4444"
},
"Esc",
{
"x": 4.5,
"c": "#cccccc"
},
"~\n`",
"^\n6"
],
[
{
"y": -0.875,
"c": "#2277ff",
"w": 1.5
},
"Special\n\n+\n\n\n\nShift\n=",
{
"c": "#cccccc"
},
"!\n1",
{
"x": 14.5
},
")\n0",
{
"c": "#2277ff",
"w": 1.5
},
"_\n\nSpecial\n\n\n\n-\nShift"
],
[
{
"y": -0.375,
"x": 3.5,
"c": "#cccccc"
},
"E",
{
"x": 10.5
},
"I"
],
[
{
"y": -0.875,
"x": 2.5
},
"W",
{
"x": 1
},
"R",
{
"x": 8.5
},
"U",
{
"x": 1
},
"O"
],
[
{
"y": -0.875,
"x": 5.5
},
"T",
{
"h": 1.5
},
"{\n\n\n\n\n\n[",
{
"x": 4.5,
"h": 1.5
},
"}\n\n\n\n\n\n]",
"Y"
],
[
{
"y": -0.875,
"c": "#2277ff",
"fa": [
0,
0,
4
],
"w": 1.5
},
"Media\n\n<i class='kb kb-Line-Start-End'></i>\n\n\n\nShift",
{
"c": "#cccccc"
},
"Q",
{
"x": 14.5
},
"P",
{
"c": "#2277ff",
"f": 3,
"w": 1.5
},
"|\n\\\nMedia\n\n\n\n\nShift"
],
[
{
"y": -0.375,
"x": 3.5,
"c": "#cccccc"
},
"D",
{
"x": 10.5
},
"K"
],
[
{
"y": -0.875,
"x": 2.5
},
"S",
{
"x": 1
},
"F",
{
"x": 8.5
},
"J",
{
"x": 1
},
"L"
],
[
{
"y": -0.875,
"x": 5.5
},
"G",
{
"x": 6.5
},
"H"
],
[
{
"y": -0.875,
"c": "#2277ff",
"w": 1.5
},
"Symbols\n\n\n\n\n\nShift",
{
"c": "#cccccc"
},
"A",
{
"x": 14.5
},
":\n;",
{
"c": "#2277ff",
"f": 3,
"w": 1.5
},
"\"\n'\nSymbols\n\n\n\n\nShift"
],
[
{
"y": -0.625,
"x": 6.5,
"c": "#54d6de",
"fa": [
0,
0,
4,
1
],
"h": 1.5
},
"< Tab\n\n\nShift Tab",
{
"x": 4.5,
"h": 1.5
},
"Tab >\n\n\nTab"
],
[
{
"y": -0.75,
"x": 3.5,
"c": "#cccccc"
},
"C",
{
"x": 10.5
},
"<\n,"
],
[
{
"y": -0.875,
"x": 2.5
},
"X",
{
"x": 1
},
"V",
{
"x": 8.5
},
"M",
{
"x": 1
},
">\n."
],
[
{
"y": -0.875,
"x": 5.5
},
"B",
{
"x": 6.5
},
"N"
],
[
{
"y": -0.875,
"c": "#2277ff",
"w": 1.5
},
"Capitals\n\n\n\n\n\nShift",
{
"c": "#cccccc"
},
"Z",
{
"x": 14.5
},
"?\n/",
{
"c": "#2277ff",
"f": 3,
"w": 1.5
},
"\n\nCapitals\n\n\n\n\nShift"
],
[
{
"y": -0.375,
"x": 3.5,
"c": "#77aaff",
"fa": [
5,
0,
4,
1
]
},
"<i class='mss mss-Unicode-Option-3'></i>\n\n\nLAlt",
{
"x": 10.5
},
"<i class='mss mss-Unicode-Option-3'></i>\n\n\nRAlt"
],
[
{
"y": -0.875,
"x": 2.5,
"fa": [
5,
1
]
},
"\nHyper\n?\n/",
{
"x": 1,
"fa": [
5,
1,
0,
1
]
},
"<i class='mss mss-Unicode-Command-3'></i>\n\n\nSuper",
{
"x": 8.5
},
"<i class='mss mss-Unicode-Command-3'></i>\n\n\nSuper",
{
"x": 1,
"fa": [
0,
0,
0,
1
]
},
"{\n[\n\nHyper"
],
[
{
"y": -0.75,
"x": 0.5
},
"Ctrl\n\n\nLCtrl",
{
"f2": 1
},
"\nMeh\n|\n\\",
{
"x": 14.5,
"fa": [
0,
0,
1,
1
]
},
"}\n]\n\nMeh",
"Ctrl\n\n\nRCtrl"
],
[
{
"r": 30,
"rx": 6.5,
"ry": 4.25,
"y": -1,
"x": 1,
"c": "#54d6de"
},
"Home",
"End"
],
[
{
"h": 2
},
"< Del\n\n\nBackspace",
{
"h": 2
},
"Del >\n\n\nDelete",
"Page\n\n\n\n\n\nUp"
],
[
{
"x": 2
},
"Page\n\n\n\n\n\nDown"
],
[
{
"r": -30,
"rx": 13,
"y": -1,
"x": -3
},
"Left",
"Right"
],
[
{
"x": -3
},
"Up",
{
"h": 2
},
"Enter",
{
"h": 2
},
"Space"
],
[
{
"x": -3
},
"Down"
]
]

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

@ -0,0 +1,436 @@
[
{
"name": "teckinesis (MediaLayer)",
"author": "Will Wolff-Myren",
"switchMount": "cherry",
"switchBrand": "gateron",
"switchType": "KS-3-Tea"
},
[
{
"x": 3.5,
"c": "#99de2a"
},
"F13",
{
"x": 10.5
},
"F18"
],
[
{
"y": -0.875,
"x": 2.5
},
"F12",
{
"x": 1
},
"F14",
{
"x": 8.5
},
"F17",
{
"x": 1
},
"F19"
],
[
{
"y": -0.875,
"x": 5.5
},
"F15",
{
"c": "#ff4444"
},
"Esc",
{
"x": 4.5
},
"Esc",
{
"c": "#99de2a"
},
"F16"
],
[
{
"y": -0.875,
"x": 1.5
},
"F11",
{
"x": 14.5
},
"F20"
],
[
{
"y": -0.995,
"c": "#000000",
"t": "#ff0000",
"w": 1.5
},
"Media\n\n\n\n\n\nShift",
{
"x": 16.5,
"w": 1.5
},
"\n\nMedia\n\n\n\n\nShift"
],
[
{
"y": -0.3799999999999999,
"x": 3.5,
"c": "#ff8500",
"t": "#000000"
},
"Mouse\n\n\n\n\n\nUp",
{
"x": 10.5
},
"Cursor\n\n\n\n\n\nUp"
],
[
{
"y": -0.875,
"x": 2.5
},
"Mouse\n\n\n\n\n\nUpLeft",
{
"x": 1
},
"Mouse\n\n\n\n\n\nUpRgt",
{
"x": 8.5,
"c": "#ffb063"
},
"Home",
{
"x": 1
},
"Page\n\n\n\n\n\nUp"
],
[
{
"y": -0.875,
"x": 5.5,
"c": "#e6e067"
},
"Vol\n\n\n\n\n\nUp",
{
"c": "#ffb063",
"h": 1.5
},
"Scroll\n\n\n\n\n\nUp",
{
"x": 4.5,
"h": 1.5
},
"Scroll\n\n\n\n\n\nUp",
{
"c": "#e6e067"
},
"Print\n\n\n\n\n\nScreen"
],
[
{
"y": -0.875,
"x": 1.5,
"c": "#737373",
"a": 7
},
"",
{
"x": 14.5
},
""
],
[
{
"y": -0.9950000000000001,
"c": "#2277ff",
"a": 4,
"w": 1.5
},
"Symbols\n\n\n\n\n\nShift",
{
"x": 16.5,
"w": 1.5
},
"\n\nSymbols\n\n\n\n\nShift"
],
[
{
"y": -0.3799999999999999,
"x": 3.5,
"c": "#ff8500"
},
"Mouse\n\n\n\n\n\nDown",
{
"x": 10.5
},
"Cursor\n\n\n\n\n\nDown"
],
[
{
"y": -0.875,
"x": 2.5
},
"Mouse\n\n\n\n\n\nLeft",
{
"x": 1
},
"Mouse\n\n\n\n\n\nRight",
{
"x": 8.5
},
"Cursor\n\n\n\n\n\nLeft",
{
"x": 1
},
"Cursor\n\n\n\n\n\nRight"
],
[
{
"y": -0.875,
"x": 5.5,
"c": "#e6e067"
},
"Vol\n\n\n\n\n\nDown",
{
"x": 6.5
},
"Num\n\n\n\n\n\nLock"
],
[
{
"y": -0.875,
"x": 1.5,
"c": "#737373",
"a": 7
},
"",
{
"x": 14.5
},
""
],
[
{
"y": -0.9950000000000001,
"c": "#2277ff",
"a": 4,
"w": 1.5
},
"Capitals\n\n\n\n\n\nShift",
{
"x": 16.5,
"w": 1.5
},
"\n\nCapitals\n\n\n\n\nShift"
],
[
{
"y": -0.6299999999999999,
"x": 6.5,
"c": "#ffb063",
"h": 1.5
},
"Scroll\n\n\n\n\n\nDown",
{
"x": 4.5,
"h": 1.5
},
"Scroll\n\n\n\n\n\nDown"
],
[
{
"y": -0.75,
"x": 3.5,
"c": "#ff8500"
},
"Mouse\n\n\n\n\n\nDown",
{
"x": 10.5
},
"Cursor\n\n\n\n\n\nDown"
],
[
{
"y": -0.875,
"x": 2.5
},
"Mouse\n\n\n\n\n\nDnLeft",
{
"x": 1
},
"Mouse\n\n\n\n\n\nDnRgt",
{
"x": 8.5,
"c": "#ffb063"
},
"End",
{
"x": 1
},
"Page\n\n\n\n\n\nDown"
],
[
{
"y": -0.875,
"x": 5.5,
"c": "#e6e067"
},
"Mute",
{
"x": 6.5,
"c": "#737373",
"a": 7
},
""
],
[
{
"y": -0.875,
"x": 1.5
},
"",
{
"x": 14.5
},
""
],
[
{
"y": -0.9950000000000001,
"c": "#2277ff",
"a": 4,
"w": 1.5
},
"Ctrl",
{
"x": 16.5,
"w": 1.5
},
"Ctrl"
],
[
{
"y": -0.3799999999999999,
"x": 3.5,
"c": "#ff8500"
},
"Middle\n\n\n\n\n\nClick",
{
"x": 10.5,
"c": "#ffb063",
"fa": [
0,
0,
0,
1
]
},
"Delete\n\n\nOption"
],
[
{
"y": -0.875,
"x": 2.5,
"c": "#ff8500"
},
"Left\n\n\n\n\n\nClick",
{
"x": 1
},
"Right\n\n\n\n\n\nClick",
{
"x": 8.5,
"c": "#ffb063"
},
"Insert\n\n\nCmd",
{
"x": 1,
"c": "#77aaff"
},
"Hyper"
],
[
{
"y": -0.75,
"x": 0.5
},
"Alt\n\n\nLAlt",
"Meh",
{
"x": 14.5
},
"Meh",
"Alt\n\n\nRAlt"
],
[
{
"r": 30,
"rx": 6.5,
"ry": 4.25,
"y": -1,
"x": 1,
"c": "#ccbb00"
},
"Stop\n\n\nBrowser",
"Reload\n\n\nBrowser"
],
[
{
"h": 2
},
"< Web\n\n\nBrowser",
{
"h": 2
},
"Web >\n\n\nBrowser",
"Search\n\n\nBrowser"
],
[
{
"x": 2
},
"Home\n\n\nBrowser"
],
[
{
"r": -30,
"rx": 13,
"y": -1,
"x": -3
},
"Prev\n\n\nAudio\n\n\nTrack",
"Next\n\n\nAudio\n\n\nTrack"
],
[
{
"x": -3,
"c": "#e6e067"
},
"Vol\n\n\n\n\n\nUp",
{
"c": "#ccbb00",
"h": 2
},
"Stop\n\n\nAudio",
{
"h": 2
},
"Play\n\n\nAudio\n\n\nPause"
],
[
{
"x": -3,
"c": "#e6e067"
},
"Vol\n\n\n\n\n\nDown"
]
]

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

@ -0,0 +1,422 @@
[
{
"name": "teckinesis (Symbol Layer)",
"author": "Will Wolff-Myren",
"switchMount": "cherry",
"switchBrand": "gateron",
"switchType": "KS-3-Tea"
},
[
{
"x": 3.5,
"c": "#99de2a"
},
"F3",
{
"x": 10.5
},
"F8"
],
[
{
"y": -0.875,
"x": 2.5
},
"F2",
{
"x": 1
},
"F4",
{
"x": 8.5
},
"F7",
{
"x": 1
},
"F9"
],
[
{
"y": -0.875,
"x": 5.5
},
"F5",
{
"c": "#ff4444"
},
"Esc",
{
"x": 4.5,
"c": "#bbddbb"
},
"_\n\n\n\n\n\n-",
{
"c": "#99de2a"
},
"F6"
],
[
{
"y": -0.875,
"c": "#2277ff",
"w": 1.5
},
"Special\n\n\n\n\n\nShift",
{
"c": "#99de2a"
},
"F1",
{
"x": 14.5
},
"F10",
{
"c": "#2277ff",
"w": 1.5
},
"\n\nSpecial\n\n\n\n\nShift"
],
[
{
"y": -0.375,
"x": 3.5,
"c": "#bbddbb"
},
"{",
{
"x": 10.5,
"c": "#89b087"
},
"8"
],
[
{
"y": -0.875,
"x": 2.5,
"c": "#bbddbb"
},
"@",
{
"x": 1
},
"}",
{
"x": 8.5,
"c": "#89b087"
},
"7",
{
"x": 1
},
"9"
],
[
{
"y": -0.875,
"x": 5.5,
"c": "#bbddbb"
},
"&",
{
"h": 1.5
},
"<",
{
"x": 4.5,
"h": 1.5
},
">",
"|"
],
[
{
"y": -0.875,
"c": "#2277ff",
"w": 1.5
},
"Media\n\n\n\n\n\nShift",
{
"c": "#bbddbb"
},
"!",
{
"x": 14.5,
"c": "#89b087"
},
"/",
{
"c": "#2277ff",
"w": 1.5
},
"\n\nMedia\n\n\n\n\nShift"
],
[
{
"y": -0.375,
"x": 3.5,
"c": "#bbddbb"
},
"(",
{
"x": 10.5,
"c": "#89b087"
},
"5"
],
[
{
"y": -0.875,
"x": 2.5,
"c": "#bbddbb"
},
"$",
{
"x": 1
},
")",
{
"x": 8.5,
"c": "#89b087"
},
"4",
{
"x": 1
},
"6"
],
[
{
"y": -0.875,
"x": 5.5,
"c": "#bbddbb"
},
"`",
{
"x": 6.5
},
"/"
],
[
{
"y": -0.875,
"c": "#000000",
"t": "#ff0000",
"w": 1.5
},
"Symbols\n\n\n\n\n\nShift",
{
"c": "#bbddbb",
"t": "#000000"
},
"#",
{
"x": 14.5,
"c": "#89b087"
},
"*",
{
"c": "#000000",
"t": "#ff0000",
"w": 1.5
},
"\n\nSymbols\n\n\n\n\nShift"
],
[
{
"y": -0.625,
"x": 6.5,
"c": "#54d6de",
"t": "#000000",
"fa": [
0,
0,
0,
1
],
"h": 1.5
},
"Tab >\n\n\nTab",
{
"x": 4.5,
"h": 1.5
},
"< Tab\n\n\nShift Tab"
],
[
{
"y": -0.75,
"x": 3.5,
"c": "#bbddbb"
},
"[",
{
"x": 10.5,
"c": "#89b087"
},
"2"
],
[
{
"y": -0.875,
"x": 2.5,
"c": "#bbddbb"
},
"^",
{
"x": 1
},
"]",
{
"x": 8.5,
"c": "#89b087"
},
"1",
{
"x": 1
},
"3"
],
[
{
"y": -0.875,
"x": 5.5,
"c": "#bbddbb"
},
"~",
{
"x": 6.5
},
"\\"
],
[
{
"y": -0.875,
"c": "#2277ff",
"w": 1.5
},
"Capitals\n\n\n\n\n\nShift",
{
"c": "#bbddbb"
},
"%",
{
"x": 14.5,
"c": "#89b087"
},
"-",
{
"c": "#2277ff",
"w": 1.5
},
"\n\nCapitals\n\n\n\n\nShift"
],
[
{
"y": -0.375,
"x": 3.5,
"c": "#77aaff"
},
"<i class='mss mss-Unicode-Option-3'></i>\n\n\nLAlt",
{
"x": 10.5,
"c": "#89b087"
},
".\n\n\nOption"
],
[
{
"y": -0.875,
"x": 2.5,
"c": "#77aaff"
},
"Hyper",
{
"x": 1
},
"<i class='mss mss-Unicode-Command-3'></i>\n\n\nSuper",
{
"x": 8.5,
"c": "#89b087"
},
"0\n\n\nCmd",
{
"x": 1
},
"=\n\n\nHyper"
],
[
{
"y": -0.75,
"x": 0.5,
"c": "#77aaff"
},
"Ctrl\n\n\nLCtrl",
"Meh",
{
"x": 14.5,
"c": "#89b087"
},
"+\n\n\nMeh",
"Enter\n\n\nCtrl"
],
[
{
"r": 30,
"rx": 6.5,
"ry": 4.25,
"y": -1,
"x": 1,
"c": "#54d6de"
},
"Left",
"Right"
],
[
{
"h": 2
},
"Space",
{
"h": 2
},
"Enter",
"Up"
],
[
{
"x": 2
},
"Down"
],
[
{
"r": -30,
"rx": 13,
"y": -1,
"x": -3
},
"Home",
"End"
],
[
{
"x": -3
},
"Page\n\n\n\n\n\nUp",
{
"h": 2
},
"< Del\n\n\nBackspace",
{
"h": 2
},
"Del >\n\n\nDelete"
],
[
{
"x": -3
},
"Page\n\n\n\n\n\nDown"
]
]

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

@ -0,0 +1,8 @@
#include "CMD60.h"
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
matrix_init_user();
}

@ -0,0 +1,20 @@
#ifndef CMD60_H
#define CMD60_H
#include "quantum.h"
#define KEYMAP( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
K40, K41, K42, K45, K4A, K4B, K4C, K4D \
) { \
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \
{ K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, KC_NO,K4A, K4B, K4C, K4D } \
}
#endif

@ -0,0 +1,73 @@
# MCU name
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=512
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700)
EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
CONSOLE_ENABLE ?= yes # Console for debug(+400)
COMMAND_ENABLE ?= yes # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE ?= no # USB Nkey Rollover
BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default
MIDI_ENABLE ?= no # MIDI controls
UNICODE_ENABLE ?= no # Unicode
BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE ?= no # Audio output on port C6
ifndef QUANTUM_DIR
include ../../../Makefile
endif

@ -0,0 +1,35 @@
CMD60 keyboard firmware
======================
##CMD60
This layout has been designed to optimize use of the left-hand, and it focussed specifically on programmers who work
with text editors like SublimeText and Atom. It utilizes the power of Space_fn, and features a caps lock swap for Fn2
and enter key on tap. These features allow you to keep your right hand on the mouse more and should enable you to
achieve a higher level of productivity if you take the time to learn its function layers.
## Quantum MK Firmware
For the full Quantum feature list, see [the parent readme.md](/doc/readme.md).
## Building
Download or clone the whole firmware and navigate to the keyboards/handwired/CMD60 folder.
Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use
the Teensy Loader to program your .hex file.
Depending on which keymap you would like to use, you will have to compile slightly differently.
### Default
To build with the default keymap, simply run `make`.
### Other Keymaps
To build the firmware binary hex file with a keymap just do `make` with `keymap` option like:
```
$ make keymap=[default|jack|<name>]
```
Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/`

@ -0,0 +1,162 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER cmd
#define PRODUCT CMD60
#define DESCRIPTION Advanced Programming Keeb Layout
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 14
/*
* Keyboard Matrix Assignments
*
* Change this to how you wired your keyboard
* COLS: AVR pins used for columns, left to right
* ROWS: AVR pins used for rows, top to bottom
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
#define MATRIX_ROW_PINS { F0, F4, F5, F6, F7 }
#define MATRIX_COL_PINS { B0, B1, B2, B3, B7, D0, D1, D2, D3, C6, D7, B4, B5, B6 }
#define UNUSED_PINS
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
// #define BACKLIGHT_PIN B7
// #define BACKLIGHT_BREATHING
// #define BACKLIGHT_LEVELS 3
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCING_DELAY 5
/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/*
* Force NKRO
*
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
* makefile for this to work.)
*
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
* until the next keyboard reset.
*
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
* fully operational during normal computer usage.
*
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
* power-up.
*
*/
//#define FORCE_NKRO
/*
* Magic Key Options
*
* Magic keys are hotkey commands that allow control over firmware functions of
* the keyboard. They are best used in combination with the HID Listen program,
* found here: https://www.pjrc.com/teensy/hid_listen.html
*
* The options below allow the magic key functionality to be changed. This is
* useful if your keyboard/keypad is missing keys and you want magic key support.
*
*/
/* key combination for magic key command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* control how magic key switches layers */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
/* override magic key keymap */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
//#define MAGIC_KEY_HELP1 H
//#define MAGIC_KEY_HELP2 SLASH
//#define MAGIC_KEY_DEBUG D
//#define MAGIC_KEY_DEBUG_MATRIX X
//#define MAGIC_KEY_DEBUG_KBD K
//#define MAGIC_KEY_DEBUG_MOUSE M
//#define MAGIC_KEY_VERSION V
//#define MAGIC_KEY_STATUS S
//#define MAGIC_KEY_CONSOLE C
//#define MAGIC_KEY_LAYER0_ALT1 ESC
//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
//#define MAGIC_KEY_LAYER0 0
//#define MAGIC_KEY_LAYER1 1
//#define MAGIC_KEY_LAYER2 2
//#define MAGIC_KEY_LAYER3 3
//#define MAGIC_KEY_LAYER4 4
//#define MAGIC_KEY_LAYER5 5
//#define MAGIC_KEY_LAYER6 6
//#define MAGIC_KEY_LAYER7 7
//#define MAGIC_KEY_LAYER8 8
//#define MAGIC_KEY_LAYER9 9
//#define MAGIC_KEY_BOOTLOADER PAUSE
//#define MAGIC_KEY_LOCK CAPS
//#define MAGIC_KEY_EEPROM E
//#define MAGIC_KEY_NKRO N
//#define MAGIC_KEY_SLEEP_LED Z
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

@ -0,0 +1,66 @@
#include "CMD60.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = KEYMAP( /* CMD60 - QWERTY */
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
LT(3, KC_ENT), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, KC_NO, KC_RSFT, \
KC_LCTL, KC_LGUI, KC_LALT, LT(2, KC_SPC), MO(3), MO(4), MO(5), TG(1) \
),
[1] = KEYMAP( /* CMD60 - GameMode */
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \
KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_RSFT, \
KC_TRNS, KC_NO, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \
),
[2] = KEYMAP( /* CMD60 - Arrows */
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \
KC_TRNS, KC_BSPC, KC_UP, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_UP, KC_DEL, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, \
KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \
),
[3] = KEYMAP( /* CMD60 - Functions */
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \
KC_AUDIO_MUTE, KC_BSPC, KC_PGUP, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_UP, KC_PGDN, KC_TRNS, KC_PAUSE, KC_SLCK, KC_PSCREEN, \
KC_TRNS, KC_HOME, KC_PGDN, KC_END, KC_TRNS, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_INSERT, KC_NO, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \
),
[4] = KEYMAP( /* CMD60 - Mouse */
KC_SYSTEM_SLEEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRNS, KC_NO, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_WH_UP, KC_MS_BTN3, KC_MS_WH_DOWN, KC_NO, KC_NO, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \
),
[5] = KEYMAP( /* CMD60 - Media */
KC_SYSTEM_WAKE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_AUDIO_MUTE, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK, KC_MEDIA_PLAY_PAUSE, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WWW_BACK, KC_WWW_FORWARD, KC_NO, KC_NO, KC_WWW_REFRESH, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \
),
};
const uint16_t PROGMEM fn_actions[] = {
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case 0:
if (record->event.pressed) {
register_code(KC_RSFT);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};

@ -0,0 +1,89 @@
#MCU = at90usb1287
MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
# for avr upload
USB ?= /dev/cu.usbmodem1421
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
ifdef TEENSY2
OPT_DEFS += -DATREUS_TEENSY2
ATREUS_UPLOAD_COMMAND = teensy_loader_cli -w -mmcu=$(MCU) $(TARGET).hex
else
OPT_DEFS += -DATREUS_ASTAR
OPT_DEFS += -DCATERINA_BOOTLOADER
ATREUS_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done; \
avrdude -p $(MCU) -c avr109 -U flash:w:$(TARGET).hex -P $(USB)
endif
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# MCU name
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE ?= no # Console for debug(+400)
COMMAND_ENABLE ?= no # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE ?= no # USB Nkey Rollover
BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default
MIDI_ENABLE ?= no # MIDI controls
UNICODE_ENABLE ?= no # Unicode
BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE ?= no # Audio output on port C6
RGBLIGHT_ENABLE = yes
ifndef QUANTUM_DIR
include ../../../Makefile
endif
upload: build
$(ATREUS_UPLOAD_COMMAND)

@ -0,0 +1,173 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER You
#define PRODUCT traveller
#define DESCRIPTION A custom keyboard
/* key matrix size */
#define MATRIX_ROWS 4
#define MATRIX_COLS 13
/*
* Keyboard Matrix Assignments
*
* Change this to how you wired your keyboard
* COLS: AVR pins used for columns, left to right
* ROWS: AVR pins used for rows, top to bottom
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
#define MATRIX_ROW_PINS { D0, D1, D3, D2 }
// no I can't say why this order seemed like a good idea
#define MATRIX_COL_PINS { B5, D6, B7, B6, F6, B1, B3, F7, B4, E6, D7, C6, D4 }
#define UNUSED_PINS
// LED stuff
#define RGB_DI_PIN B2
//#define RBLIGHT_TIMER
#define RGBLED_NUM 1 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
// #define BACKLIGHT_PIN B7
// #define BACKLIGHT_BREATHING
// #define BACKLIGHT_LEVELS 3
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCING_DELAY 5
/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
#define BACKLIGHT_LEVELS 3
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
//#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/*
* Force NKRO
*
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
* makefile for this to work.)
*
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
* until the next keyboard reset.
*
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
* fully operational during normal computer usage.
*
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
* power-up.
*
*/
//#define FORCE_NKRO
/*
* Magic Key Options
*
* Magic keys are hotkey commands that allow control over firmware functions of
* the keyboard. They are best used in combination with the HID Listen program,
* found here: https://www.pjrc.com/teensy/hid_listen.html
*
* The options below allow the magic key functionality to be changed. This is
* useful if your keyboard/keypad is missing keys and you want magic key support.
*
*/
/* key combination for magic key command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* control how magic key switches layers */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
/* override magic key keymap */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
//#define MAGIC_KEY_HELP1 H
//#define MAGIC_KEY_HELP2 SLASH
//#define MAGIC_KEY_DEBUG D
//#define MAGIC_KEY_DEBUG_MATRIX X
//#define MAGIC_KEY_DEBUG_KBD K
//#define MAGIC_KEY_DEBUG_MOUSE M
//#define MAGIC_KEY_VERSION V
//#define MAGIC_KEY_STATUS S
//#define MAGIC_KEY_CONSOLE C
//#define MAGIC_KEY_LAYER0_ALT1 ESC
//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
//#define MAGIC_KEY_LAYER0 0
//#define MAGIC_KEY_LAYER1 1
//#define MAGIC_KEY_LAYER2 2
//#define MAGIC_KEY_LAYER3 3
//#define MAGIC_KEY_LAYER4 4
//#define MAGIC_KEY_LAYER5 5
//#define MAGIC_KEY_LAYER6 6
//#define MAGIC_KEY_LAYER7 7
//#define MAGIC_KEY_LAYER8 8
//#define MAGIC_KEY_LAYER9 9
//#define MAGIC_KEY_BOOTLOADER PAUSE
//#define MAGIC_KEY_LOCK CAPS
//#define MAGIC_KEY_EEPROM E
//#define MAGIC_KEY_NKRO N
//#define MAGIC_KEY_SLEEP_LED Z
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

@ -0,0 +1,305 @@
#include "traveller.h"
#include "mousekey.h"
#include "action_layer.h"
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
#define _QW 0
#define _LW 1
#define _HI 2
#define _NAV 4
#define _CUR 5
#define _FKEYS 6
#define _TRNS 8
// We do the same trick for functions
#define RGBLED_TOGGLE 10
#define _HIOUT 15
#define _LWOUT 16
// Macros
#define MDL 4
#define MDR 5
#define MUR 6
#define MUL 3
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Qwerty
* ,-----------------------------------------. .-----------------------------------------.
* | NAV | ` ~ | W | E | R | T | | Y | U | I | O | - | = |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | Tab | Q | S | D | F | G | | H | J | K | L | P | \ |
* |------+------+------+------+------+------|------+------+------+------+------+------+------|
*|ctrl/esc| A | X | C | V | B |Ctrl /| N | M | , | . | ; | ' |
* |------+------+------+------+------+------+ // +------+------+------+------+------+------|
* | Shift| Z | Del | GUI | Low | Bspc |/Enter| Spc | Hi | GUI | Alt | / |Shift |
* `------------------------------------------------------------------------------------------'
*
*/
[_QW] = KEYMAP(
F(_NAV), KC_GRV, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_MINS, KC_EQL,
KC_TAB, KC_Q, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_P, KC_BSLS,
CTL_T(KC_ESC), KC_A, KC_X, KC_C, KC_V, KC_B, KC_RCTL, KC_N, KC_M, KC_COMM, KC_DOT, KC_SCLN, KC_QUOT,
KC_LSFT, KC_Z, KC_DEL, KC_LGUI, MO(_LW), KC_BSPC, KC_ENTER, KC_SPC, MO(_HI), KC_RGUI, KC_RALT, KC_SLSH, KC_RSFT
),
/* LOW - numbers, missing or awkward programming keys
Doubled 1 key allows lazy reach with ring finger.
* ,-----------------------------------------. .-----------------------------------------.
* | FKeys| 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 |Ctrl-alt-del|
* |------+------+------+------+------+------| +------+------+------+------+------+------|
* | Tab | 1 | ] | ( | ) | | | * | ( | ) | [ | | |
* |------+------+------+------+------+------|------+------+------+------+------+------+------|
* | Caps | [ | | { | } | ` | /| # | { | } | | ] | |
* |------+------+------+------+------+------+ // +------+------+------+------+------+------|
* | Shift| | | | Low | |/ | | Hi | | | |Shift |
* `------------------------------------------------------------------------------------------'
*
*/
[_LW] = KEYMAP(
F(_FKEYS), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, LCTL(LALT(KC_DEL)) ,
KC_TRNS, KC_1, KC_RBRC, KC_LPRN, KC_RPRN, KC_NO, KC_ASTR, KC_LPRN, KC_RPRN, KC_LBRC, KC_NO, KC_NO,
KC_CAPS, KC_LBRC, KC_NO, KC_LCBR, KC_RCBR, KC_TILD, KC_TRNS, KC_HASH, KC_LCBR, KC_RCBR, KC_NO, KC_RBRC, KC_NO,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
/* HI - Punctuation, shell and
url ://@.com row on bottom, && is opposite || ^$ are in regex order: ^.*$
Right hand nav keys work pretty well chorded with the Right hand Hi Key
* ,-----------------------------------------. .-----------------------------------------.
* |FKEYS | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | ! | & | "|" | $ | % | | Vol+| Mute| | | | |
* |------+------+------+------+------+------|------+------+------+------+------+------+------|
* | CAPS | ^ | : | . | * | - | /| Vol-| Play | PgUp | Home | Up | End |
* |------+------+------+------+------+------+ // +------+------+------+------+------+------|
* | | / | | | Low | |/ | | Hi | PgDn | Left| Down | Right |
* `------------------------------------------------------------------------------------------'
*
*/
[_HI] = KEYMAP(
F(_FKEYS), KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PLUS,
KC_TRNS, KC_EXLM, KC_AMPR, KC_PIPE, KC_DLR, KC_PERC, KC_VOLU, KC_MUTE, KC_NO, KC_NO, KC_NO, KC_NO,
KC_CAPS, KC_CIRC, KC_COLN, KC_DOT, KC_ASTR, KC_MINS, KC_TRNS, KC_VOLD, KC_PPLS, KC_PGUP, KC_HOME, KC_UP, KC_END,
KC_TRNS, KC_SLSH, KC_TRNS, KC_TRNS, F(_LW), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_LEFT, KC_DOWN, KC_RIGHT
),
/* NAV - mouse & navigation
//gui left and right are line home/end, or fore & back in browser
// Mouse buttons are reversed for comfort - bigger stretch is to the right button.
* ,-----------------------------------------. .-----------------------------------------.
* | NAV | | | Up | |Gui-> | | MwU | MS_UL| MS_U |MS_UR | |Ms Norm|
* |------+------+------+------+------+------| |------+------+------+------+------+--------|
* | |Gui<- | Left | Down |Right | C^E | | BTN3 | MS_L |MS Up | MS_R | |Ms Fast |
* |------+------+------+------+------+------|------|------+------+------+------+------+--------|
* | | C^A | GUI X| GUI C| GUI_V| |Enter/| MWD | M_DL |MS Dwn|MS_DR | Up |Ms Slow |
* |------+------+------+------+------+------+ // +------+------+------+------+------+------|
* | | GuiZ | | | Low | |/ButnR|ButnL | Hi | | Left | Down | Right |
* `------------------------------------------------------------------------------------------'
*/
[_NAV] = KEYMAP(
F(_NAV), KC_NO, KC_NO, KC_UP, KC_NO, RGUI(KC_RIGHT), KC_WH_U, M(MUL), KC_MS_U, M(MUR), KC_NO, KC_ACL2,
KC_TRNS, RGUI(KC_LEFT), KC_LEFT, KC_DOWN, KC_RIGHT, LCTL(KC_E), KC_BTN3, KC_MS_L, KC_MS_U, KC_MS_R, KC_NO, KC_ACL1,
KC_TRNS, LCTL(KC_A), LGUI(KC_X),RGUI(KC_C), RGUI(KC_V),KC_NO, KC_ENTER, KC_WH_D, M(MDL), KC_MS_D, M(MDR), KC_UP, KC_ACL0,
KC_TRNS, RGUI(KC_Z), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN2, KC_BTN1, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT
),
/* FKEYS - Funtion keys & mac stuff
* ,-----------------------------------------. .-----------------------------------------.
* | FKEYS| F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | Ctrl |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | | | | | | F11 | F12 | F13 | F14 | F15 | Alt |
* |------+------+------+------+------+------|------+------+------+------+------+------+------|
* |Qwerty| | | | | | /| | | | | | Del |
* |------+------+------+------+------+------+ // +------+------+------+------+------+------|
* | . |RGBTog| . | | LO | Bspc |/ | | HI | | | | |
* `------------------------------------------------------------------------------------------'
*
*/
[_FKEYS] = KEYMAP(
F(_FKEYS), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_RCTL,
KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_LALT ,
F(_QW), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_DEL,
KC_TRNS, F(RGBLED_TOGGLE), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
/* TRNS - skeleton for laters
* ,-----------------------------------------. .-----------------------------------------.
* | . | . | . | . | . | . | | ^ | & | * | ( | ) | |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | . | . | . | . | . | . | | 6 | 7 | 8 | 9 | 0 | |
* |------+------+------+------+------+------|------+------+------+------+------+------+------|
* | . | . | . | . | . | . | /| | | | . | ; | " |
* |------+------+------+------+------+------+ // +------+------+------+------+------+------|
* | . | . | . | GUI | LO | . |/ | Spc | HI | GUI | M0 | / |LSFT |
* `------------------------------------------------------------------------------------------'
*
*/
[_TRNS] = {
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS},
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS},
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS},
{KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}
}
};
const uint16_t PROGMEM fn_actions[] = {
[_QW] = ACTION_LAYER_ON(_QW,ON_RELEASE), // return to QWERTY layer
[_LW] = ACTION_LAYER_TAP_TOGGLE(_LW), // Turn on LW when holding, or tap 3 times to switch
[_HI] = ACTION_LAYER_TAP_TOGGLE(_HI), // Turn on LW when holding, or tap 3 times to switch
[_NAV] = ACTION_LAYER_TOGGLE(_NAV),
[_FKEYS] = ACTION_LAYER_TOGGLE(_FKEYS),
[_LWOUT] = ACTION_LAYER_OFF(_LW,ON_RELEASE),
[_HIOUT] = ACTION_LAYER_OFF(_HI,ON_RELEASE),
// Functions
[RGBLED_TOGGLE] = ACTION_FUNCTION(RGBLED_TOGGLE),
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case 0:
if (record->event.pressed) {
register_code(KC_RSFT);
#ifdef BACKLIGHT_ENABLE
backlight_step();
#endif
} else {
unregister_code(KC_RSFT);
}
break;
// from algernon's ErgoDox EZ layout,
case MUL:
if (record->event.pressed) {
mousekey_on(KC_MS_UP);
mousekey_on(KC_MS_LEFT);
} else {
mousekey_off(KC_MS_UP);
mousekey_off(KC_MS_LEFT);
}
mousekey_send();
break;
case MUR:
if (record->event.pressed) {
mousekey_on(KC_MS_UP);
mousekey_on(KC_MS_RIGHT);
} else {
mousekey_off(KC_MS_UP);
mousekey_off(KC_MS_RIGHT);
}
mousekey_send();
break;
case MDL:
if (record->event.pressed) {
mousekey_on(KC_MS_DOWN);
mousekey_on(KC_MS_LEFT);
} else {
mousekey_off(KC_MS_DOWN);
mousekey_off(KC_MS_LEFT);
}
mousekey_send();
break;
case MDR:
if (record->event.pressed) {
mousekey_on(KC_MS_DOWN);
mousekey_on(KC_MS_RIGHT);
} else {
mousekey_off(KC_MS_DOWN);
mousekey_off(KC_MS_RIGHT);
}
mousekey_send();
break;
}
return MACRO_NONE;
};
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
switch (id) {
case RGBLED_TOGGLE:
//led operations
if (record->event.pressed) {
rgblight_toggle();
}
break;
}
}
void LayerLEDSet(uint8_t layr) {
switch (layr) {
case _QW:
rgblight_setrgb(0,20, 0); // dim green
break;
case _LW:
// deep purple
rgblight_setrgb(20,0,35);
break;
case _HI:
// light blue
rgblight_setrgb(0,20,20);
break;
case _NAV:
// Yellowy orange
rgblight_setrgb(25,20,0); // brighter
break;
case _FKEYS:
// RED
rgblight_setrgb(20,0,0); // brighter
break;
default:
rgblight_setrgb(20,2,20);//error
break;
}
return;
}
void matrix_init_user(void) {
}
// Bleah globals need to be initialized.
uint8_t old_layer=_QW;
void matrix_scan_user(void) {
uint8_t layer = biton32(layer_state);
if (old_layer != layer) {
LayerLEDSet(layer);
old_layer=layer;
}
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return true;
}
void led_set_user(uint8_t usb_led) {
}

@ -0,0 +1,2 @@
# The default keymap for handwired/traveller
this is a kitchen sink build

@ -0,0 +1,35 @@
traveler keyboard firmware
======================
## Traveller Specific Info ##
The traveller is a varient on the atreus keyboard.
Like the Atreus, it is designed to be a good compromise between size and ergonomics.
key differences are
- an additional column for each pinky
- an RGB LED in the center to show the current layer
- more finger stagger, splay angle and contoured keycaps (F2 profile for space key).
You can make your own traveller keyboard by using the openscad tools from the atreus repository, and adding a hole for the LED to shine through.
## Quantum MK Firmware
For the full Quantum feature list, see [the parent README.md](/README.md).
## Building
Download or clone the whole firmware and navigate to the keyboard/traveler folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
Depending on which keymap you would like to use, you will have to compile slightly differently.
### Default
To build with the default keymap, simply run `make`.
### Other Keymaps
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
```
$ make KEYMAP=[default|jack|<name>]
```
Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.

@ -0,0 +1,61 @@
#include "traveller.h"
__attribute__ ((weak))
void matrix_init_user(void) {
// leave this function blank - it can be defined in a keymap file
};
__attribute__ ((weak))
void matrix_scan_user(void) {
// leave this function blank - it can be defined in a keymap file
}
__attribute__ ((weak))
void process_action_user(keyrecord_t *record) {
// leave this function blank - it can be defined in a keymap file
}
__attribute__ ((weak))
void led_set_user(uint8_t usb_led) {
// leave this function blank - it can be defined in a keymap file
}
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
#ifdef RGBLIGHT_ENABLE
rgblight_init();
rgblight_mode(1); // solid, no timer
rgblight_setrgb(0,20,0);// dim green, happens to be same as _QW
#endif
// Turn status LED on
DDRC |= (1<<7);
PORTC |= (1<<7);
matrix_init_user();
}
void matrix_scan_kb(void) {
// put your looping keyboard code here
// runs every cycle (a lot)
matrix_scan_user();
}
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
// put your per-action keyboard code here
// runs for every action, just before processing by the firmware
return process_record_user(keycode, record);
}
void led_set_kb(uint8_t usb_led) {
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
led_set_user(usb_led);
}

@ -0,0 +1,32 @@
#ifndef TRAVELLER_H
#define TRAVELLER_H
#include "quantum.h"
#include "led.h"
#ifdef RGBLIGHT_ENABLE
#include "rgblight.h"
#endif
#ifdef BACKLIGHT_ENABLE
#include "backlight.h"
#endif
// This a shortcut to help you visually see your layout.
// The first section contains all of the arguements
// The second converts the arguments into a two-dimensional array
#define KEYMAP( \
k00, k01, k02, k03, k04, k05, k07, k08, k09, k0a, k0b, k0c, \
k10, k11, k12, k13, k14, k15, k17, k18, k19, k1a, k1b, k1c, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c \
) \
{ \
{ k00, k01, k02, k03, k04, k05, KC_NO, k07, k08, k09, k0a, k0b, k0c }, \
{ k10, k11, k12, k13, k14, k15, KC_NO, k17, k18, k19, k1a, k1b, k1c }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c } \
}
#endif

@ -0,0 +1,4 @@
JD45 keyboard firmware
======================
TODO: to be updated.

@ -0,0 +1,79 @@
## Project specific files
SRC= matrix.c
# MCU name
MCU = at90usb1286
#MCU = atmega32u4
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
# automatically to create a 32-bit value in your source code.
#
# This will be an integer division of F_USB below, as it is sourced by
# F_USB after it has run through any CPU prescalers. Note that this value
# does not *change* the processor frequency - it should merely be updated to
# reflect the processor speed set externally so that the code can use accurate
# software delays.
F_CPU = 16000000
#
# LUFA specific
#
# Target architecture (see library "Board Types" documentation).
ARCH = AVR8
# Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the
# input clock frequency (before any prescaling is performed) in Hz. This value may
# differ from F_CPU if prescaling is used on the latter, and is required as the
# raw input clock is fed directly to the PLL sections of the AVR for high speed
# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
# at the end, this will be done automatically to create a 32-bit value in your
# source code.
#
# If no clock division is performed on the input clock inside the AVR (via the
# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU)
# Interrupt driven control endpoint task(+60)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
# Boot Section Size in *bytes*
# Teensy halfKay 512
# Teensy++ halfKay 1024
# Atmel DFU loader 4096
# LUFA bootloader 4096
# USBaspLoader 2048
OPT_DEFS += -DBOOTLOADER_SIZE=1024
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
CONSOLE_ENABLE ?= no # Console for debug(+400)
COMMAND_ENABLE ?= no
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE ?= no # USB Nkey Rollover
BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default
MIDI_ENABLE ?= no # MIDI controls
UNICODE_ENABLE ?= no # Unicode
BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE = no # Audio output should be port E6, current quantum library hardcodes C6, which we use for programming
CUSTOM_MATRIX=yes # need to do our own thing with the matrix
ifndef QUANTUM_DIR
include ../../Makefile
endif

@ -0,0 +1,174 @@
/*
Copyright 2012 Jun Wako <wakojun@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER You
#define PRODUCT kinesis-advantage
#define DESCRIPTION A custom keyboard
// Mouse
#define MOUSEKEY_DELAY 20
#define MOUSEKEY_INTERVAL 20
#define MOUSEKEY_MAX_SPEED 4
#define MOUSEKEY_TIME_TO_MAX 20
#define MOUSEKEY_WHEEL_MAX_SPEED 1
#define MOUSEKEY_WHEEL_DELTA 1
#define MOUSEKEY_WHEEL_TIME_TO_MAX 1
/* key matrix size */
#define MATRIX_ROWS 16
#define MATRIX_COLS 8
/*
* Keyboard Matrix Assignments
*
* Change this to how you wired your keyboard
* COLS: AVR pins used for columns, left to right
* ROWS: AVR pins used for rows, top to bottom
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
//Passed through the port multipler, so 4 pins =16
#define MATRIX_ROW_PINS { F0,F1, F2, F3 }
// May be upside down.
#define MATRIX_COL_PINS { B0,B1, B2, B3, B4, B5, B6, B7 }
#define UNUSED_PINS
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
// #define BACKLIGHT_PIN B7
// #define BACKLIGHT_BREATHING
// #define BACKLIGHT_LEVELS 3
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCING_DELAY 5
/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST
/* number of backlight levels */
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/*
* Force NKRO
*
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
* makefile for this to work.)
*
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
* until the next keyboard reset.
*
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
* fully operational during normal computer usage.
*
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
* power-up.
*
*/
//#define FORCE_NKRO
/*
* Magic Key Options
*
* Magic keys are hotkey commands that allow control over firmware functions of
* the keyboard. They are best used in combination with the HID Listen program,
* found here: https://www.pjrc.com/teensy/hid_listen.html
*
* The options below allow the magic key functionality to be changed. This is
* useful if your keyboard/keypad is missing keys and you want magic key support.
*
*/
/* key combination for magic key command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
/* control how magic key switches layers */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
/* override magic key keymap */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
//#define MAGIC_KEY_HELP1 H
//#define MAGIC_KEY_HELP2 SLASH
//#define MAGIC_KEY_DEBUG D
//#define MAGIC_KEY_DEBUG_MATRIX X
//#define MAGIC_KEY_DEBUG_KBD K
//#define MAGIC_KEY_DEBUG_MOUSE M
//#define MAGIC_KEY_VERSION V
//#define MAGIC_KEY_STATUS S
//#define MAGIC_KEY_CONSOLE C
//#define MAGIC_KEY_LAYER0_ALT1 ESC
//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
//#define MAGIC_KEY_LAYER0 0
//#define MAGIC_KEY_LAYER1 1
//#define MAGIC_KEY_LAYER2 2
//#define MAGIC_KEY_LAYER3 3
//#define MAGIC_KEY_LAYER4 4
//#define MAGIC_KEY_LAYER5 5
//#define MAGIC_KEY_LAYER6 6
//#define MAGIC_KEY_LAYER7 7
//#define MAGIC_KEY_LAYER8 8
//#define MAGIC_KEY_LAYER9 9
//#define MAGIC_KEY_BOOTLOADER PAUSE
//#define MAGIC_KEY_LOCK CAPS
//#define MAGIC_KEY_EEPROM E
//#define MAGIC_KEY_NKRO N
//#define MAGIC_KEY_SLEEP_LED Z
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

@ -0,0 +1,232 @@
EESchema-LIBRARY Version 2.3 Date: Wednesday, November 12, 2014 'pmt' 10:15:19 pm
#encoding utf-8
#
# AT90S4414-P
#
DEF AT90S4414-P IC 0 40 Y Y 1 F N
F0 "IC" -850 1880 40 H V L BNN
F1 "AT90S4414-P" 450 -1950 40 H V L BNN
F2 "DIL40" 0 0 30 H V C CIN
F3 "~" 0 0 60 H V C CNN
ALIAS AT90S8515-P
$FPLIST
40DIP-ELL600
40dip600
$ENDFPLIST
DRAW
S -850 1850 850 -1850 0 1 10 f
X (T0)PB0 1 1000 700 150 L 40 40 1 1 B
X (T1)PB1 2 1000 600 150 L 40 40 1 1 B
X (AIN0)PB2 3 1000 500 150 L 40 40 1 1 B
X (AIN1)PB3 4 1000 400 150 L 40 40 1 1 B
X (~SS~)PB4 5 1000 300 150 L 40 40 1 1 B
X (MOSI)PB5 6 1000 200 150 L 40 40 1 1 B
X (MISO)PB6 7 1000 100 150 L 40 40 1 1 B
X (SCK)PB7 8 1000 0 150 L 40 40 1 1 B
X ~RESET 9 -1000 1700 150 R 40 40 1 1 I
X (RXD)PD0 10 1000 -1000 150 L 40 40 1 1 B
X GND 20 0 -2000 150 U 40 40 1 1 W
X ALE 30 1000 850 150 L 40 40 1 1 O
X VCC 40 0 2000 150 D 40 40 1 1 W
X (TXD)PD1 11 1000 -1100 150 L 40 40 1 1 B
X (A8)PC0 21 1000 -150 150 L 40 40 1 1 B
X ICP 31 -1000 -1400 150 R 40 40 1 1 I
X (INT0)PD2 12 1000 -1200 150 L 40 40 1 1 B
X (A9)PC1 22 1000 -250 150 L 40 40 1 1 B
X (AD7)PA7 32 1000 1000 150 L 40 40 1 1 B
X (INT1)PD3 13 1000 -1300 150 L 40 40 1 1 B
X (A10)PC2 23 1000 -350 150 L 40 40 1 1 B
X (AD6)PA6 33 1000 1100 150 L 40 40 1 1 B
X PD4 14 1000 -1400 150 L 40 40 1 1 B
X (A11)PC3 24 1000 -450 150 L 40 40 1 1 B
X (AD5)PA5 34 1000 1200 150 L 40 40 1 1 B
X (OC1A)PD5 15 1000 -1500 150 L 40 40 1 1 B
X (A12)PC4 25 1000 -550 150 L 40 40 1 1 B
X (AD4)PA4 35 1000 1300 150 L 40 40 1 1 B
X (~WR~)PD6 16 1000 -1600 150 L 40 40 1 1 B
X (A13)PC5 26 1000 -650 150 L 40 40 1 1 B
X (AD3)PA3 36 1000 1400 150 L 40 40 1 1 B
X (~RD~)PD7 17 1000 -1700 150 L 40 40 1 1 B
X (A14)PC6 27 1000 -750 150 L 40 40 1 1 B
X (AD2)PA2 37 1000 1500 150 L 40 40 1 1 B
X XTAL2 18 -1000 1200 150 R 40 40 1 1 B
X (A15)PC7 28 1000 -850 150 L 40 40 1 1 B
X (AD1)PA1 38 1000 1600 150 L 40 40 1 1 B
X XTAL1 19 -1000 800 150 R 40 40 1 1 B
X OC1B 29 -1000 -1500 150 R 40 40 1 1 W
X (AD0)PA0 39 1000 1700 150 L 40 40 1 1 B
ENDDRAW
ENDDEF
#
# ATMEGA16U4-A
#
DEF ATMEGA16U4-A U 0 40 Y Y 1 F N
F0 "U" -950 1700 40 H V C CNN
F1 "ATMEGA16U4-A" 700 -1500 40 H V C CNN
F2 "TQFP44" 0 0 35 H V C CIN
F3 "~" 1100 1100 60 H V C CNN
ALIAS ATMEGA16U4RC-A ATMEGA32U4-A ATMEGA32U4RC-A
$FPLIST
TQFP44
$ENDFPLIST
DRAW
S -1000 1650 950 -1450 0 1 10 f
X (INT6/AIN0)PE6 1 1100 -650 150 L 40 40 1 1 B
X UVCC 2 -450 1800 150 D 40 40 1 1 W
X D- 3 -1150 100 150 R 40 40 1 1 B
X D+ 4 -1150 200 150 R 40 40 1 1 B
X UGND 5 -400 -1600 150 U 40 40 1 1 P
X UCAP 6 -1150 -50 150 R 40 40 1 1 P
X VBUS 7 -1150 350 150 R 40 40 1 1 P
X (SS/PCINT0)PB0 8 1100 1550 150 L 40 40 1 1 B
X (SCLK/PCINT1)PB1 9 1100 1450 150 L 40 40 1 1 B
X (PDI/MOSI/PCINT2)PB2 10 1100 1350 150 L 40 40 1 1 B
X (RXD/INT2)PD2 20 1100 150 150 L 40 40 1 1 B
X (ADC13/OC1B/OC4B/PCINT13)PB6 30 1100 950 150 L 40 40 1 1 B
X (ADC1)PF1 40 1100 -950 150 L 40 40 1 1 B
X (PDO/MISO/PCINT3)PB3 11 1100 1250 150 L 40 40 1 1 B
X (TXD/INT3)PD3 21 1100 50 150 L 40 40 1 1 B
X (OC3A/~OC4A~)PC6 31 1100 650 150 L 40 40 1 1 B
X (ADC0)PF0 41 1100 -850 150 L 40 40 1 1 B
X (OC0A/OC1C/~RTS~/PCINT7)PB7 12 1100 850 150 L 40 40 1 1 B
X (XCK1/~CTS~)PD5 22 1100 -150 150 L 40 40 1 1 B
X (ICP3/CLK0/OC4A)PC7 32 1100 550 150 L 40 40 1 1 B
X AREF 42 -1150 -850 150 R 40 40 1 1 P
X ~RESET~ 13 -1150 1550 150 R 40 40 1 1 I
X GND 23 -50 -1600 150 U 40 40 1 1 W
X (~HWB~)PE2 33 1100 -550 150 L 40 40 1 1 B
X GND 43 150 -1600 150 U 40 40 1 1 W
X VCC 14 -200 1800 150 D 40 40 1 1 W
X AVCC 24 150 1800 150 D 40 40 1 1 W
X VCC 34 -100 1800 150 D 40 40 1 1 W
X AVCC 44 250 1800 150 D 40 40 1 1 W
X GND 15 -150 -1600 150 U 40 40 1 1 W
X (ICP2/ADC8)PD4 25 1100 -50 150 L 40 40 1 1 B
X GND 35 50 -1600 150 U 40 40 1 1 W
X XTAL2 16 -1150 950 150 R 40 40 1 1 O
X (T1/~OC4D~/ADC9)PD6 26 1100 -250 150 L 40 40 1 1 B
X (ADC7/TDI)PF7 36 1100 -1350 150 L 40 40 1 1 B
X XTAL1 17 -1150 1150 150 R 40 40 1 1 I
X (T0/OC4D/ADC10)PD7 27 1100 -350 150 L 40 40 1 1 B
X (ADC6/TDO)PF6 37 1100 -1250 150 L 40 40 1 1 B
X (OC0B/SCL/INT0)PD0 18 1100 350 150 L 40 40 1 1 B
X (ADC11/PCINT4)PB4 28 1100 1150 150 L 40 40 1 1 B
X (ADC5/TMS)PF5 38 1100 -1150 150 L 40 40 1 1 B
X (SDA/INT1)PD1 19 1100 250 150 L 40 40 1 1 B
X (ADC12/OC1A/~OC4B~/PCINT12)PB5 29 1100 1050 150 L 40 40 1 1 B
X (ADC4/TCK)PF4 39 1100 -1050 150 L 40 40 1 1 B
ENDDRAW
ENDDEF
#
# C
#
DEF C C 0 10 N Y 1 F N
F0 "C" 0 100 40 H V L CNN
F1 "C" 6 -85 40 H V L CNN
F2 "~" 38 -150 30 H V C CNN
F3 "~" 0 0 60 H V C CNN
$FPLIST
SM*
C?
C1-1
$ENDFPLIST
DRAW
P 2 0 1 20 -80 -30 80 -30 N
P 2 0 1 20 -80 30 80 30 N
X ~ 1 0 200 170 D 40 40 1 1 P
X ~ 2 0 -200 170 U 40 40 1 1 P
ENDDRAW
ENDDEF
#
# CONN_7
#
DEF CONN_7 P 0 40 Y N 1 F N
F0 "P" -30 0 60 V V C CNN
F1 "CONN_7" 70 0 60 V V C CNN
F2 "~" 0 0 60 H V C CNN
F3 "~" 0 0 60 H V C CNN
DRAW
S -100 350 150 -350 0 1 0 N
X P1 1 -350 300 250 R 50 50 1 1 P I
X P2 2 -350 200 250 R 50 50 1 1 P I
X P3 3 -350 100 250 R 50 50 1 1 P I
X P4 4 -350 0 250 R 50 50 1 1 P I
X P5 5 -350 -100 250 R 50 50 1 1 P I
X P6 6 -350 -200 250 R 50 50 1 1 P I
X P7 7 -350 -300 250 R 50 50 1 1 P I
ENDDRAW
ENDDEF
#
# GND
#
DEF ~GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 0 30 H I C CNN
F1 "GND" 0 -70 30 H I C CNN
F2 "~" 0 0 60 H V C CNN
F3 "~" 0 0 60 H V C CNN
DRAW
P 4 0 1 0 -50 0 0 -50 50 0 -50 0 N
X GND 1 0 0 0 U 30 30 1 1 W N
ENDDRAW
ENDDEF
#
# R
#
DEF R R 0 0 N Y 1 F N
F0 "R" 80 0 40 V V C CNN
F1 "R" 7 1 40 V V C CNN
F2 "~" -70 0 30 V V C CNN
F3 "~" 0 0 30 H V C CNN
$FPLIST
R?
SM0603
SM0805
R?-*
SM1206
$ENDFPLIST
DRAW
S -40 150 40 -150 0 1 12 N
X ~ 1 0 250 100 D 60 60 1 1 P
X ~ 2 0 -250 100 U 60 60 1 1 P
ENDDRAW
ENDDEF
#
# USB-MINI-B
#
DEF USB-MINI-B CON 0 40 Y Y 1 F N
F0 "CON" -250 450 60 H V C CNN
F1 "USB-MINI-B" -50 -500 60 H V C CNN
F2 "~" 0 0 60 H V C CNN
F3 "~" 0 0 60 H V C CNN
$FPLIST
USB-Mini-B-Jack
$ENDFPLIST
DRAW
S -350 400 350 -400 0 1 0 N
X VBUS 1 -550 300 200 R 50 50 1 1 W
X D- 2 -550 150 200 R 50 50 1 1 B
X D+ 3 -550 0 200 R 50 50 1 1 B
X ID 4 -550 -150 200 R 50 50 1 1 B
X GND 5 -550 -300 200 R 50 50 1 1 W
X SHELL1 6 550 300 200 L 50 50 1 1 B
X SHELL2 7 550 150 200 L 50 50 1 1 B
X SHELL3 8 550 -150 200 L 50 50 1 1 B
X SHELL4 9 550 -300 200 L 50 50 1 1 B
ENDDRAW
ENDDEF
#
# VCC
#
DEF VCC #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 100 30 H I C CNN
F1 "VCC" 0 100 30 H V C CNN
F2 "~" 0 0 60 H V C CNN
F3 "~" 0 0 60 H V C CNN
DRAW
X VCC 1 0 0 0 U 20 20 0 0 W N
C 0 50 20 0 1 0 N
P 3 0 1 0 0 0 0 30 0 30 N
ENDDRAW
ENDDEF
#
#End Library

@ -0,0 +1,83 @@
update=Wednesday, November 05, 2014 'pmt' 12:08:47 pm
version=1
last_client=pcbnew
[cvpcb]
version=1
NetIExt=net
[cvpcb/libraries]
EquName1=devcms
[general]
version=1
[eeschema]
version=1
PageLayoutDescrFile=
SubpartIdSeparator=0
SubpartFirstId=65
LibDir=../../../lib/kicad/library
NetFmtName=
RptD_X=0
RptD_Y=100
RptLab=1
LabSize=60
[eeschema/libraries]
LibName1=power
LibName2=device
LibName3=transistors
LibName4=conn
LibName5=linear
LibName6=regul
LibName7=74xx
LibName8=cmos4000
LibName9=adc-dac
LibName10=memory
LibName11=xilinx
LibName12=special
LibName13=microcontrollers
LibName14=dsp
LibName15=microchip
LibName16=analog_switches
LibName17=motorola
LibName18=texas
LibName19=intel
LibName20=audio
LibName21=interface
LibName22=digital-audio
LibName23=philips
LibName24=display
LibName25=cypress
LibName26=siliconi
LibName27=opto
LibName28=atmel
LibName29=contrib
LibName30=valves
LibName31=custom
[pcbnew]
version=1
LastNetListRead=
UseCmpFile=1
PadDrill=1.016000000000
PadDrillOvalY=1.016000000000
PadSizeH=1.524000000000
PadSizeV=1.524000000000
PcbTextSizeV=1.500000000000
PcbTextSizeH=1.500000000000
PcbTextThickness=0.300000000000
ModuleTextSizeV=1.000000000000
ModuleTextSizeH=1.000000000000
ModuleTextSizeThickness=0.150000000000
SolderMaskClearance=0.000000000000
SolderMaskMinWidth=0.000000000000
DrawSegmentWidth=0.200000000000
BoardOutlineThickness=0.100000000000
ModuleOutlineThickness=0.150000000000
[pcbnew/libraries]
LibDir=../../../lib/kicad/modules
LibName1=custom
LibName2=Sockets
LibName3=Connect
LibName4=Discret
LibName5=Divers
LibName6=Display
LibName7=LEDs
LibName8=SMD_Packages
LibName9=Sockets_DIP

@ -0,0 +1,634 @@
EESchema Schematic File Version 2
LIBS:power
LIBS:device
LIBS:transistors
LIBS:conn
LIBS:linear
LIBS:regul
LIBS:74xx
LIBS:cmos4000
LIBS:adc-dac
LIBS:memory
LIBS:xilinx
LIBS:special
LIBS:microcontrollers
LIBS:dsp
LIBS:microchip
LIBS:analog_switches
LIBS:motorola
LIBS:texas
LIBS:intel
LIBS:audio
LIBS:interface
LIBS:digital-audio
LIBS:philips
LIBS:display
LIBS:cypress
LIBS:siliconi
LIBS:opto
LIBS:atmel
LIBS:contrib
LIBS:valves
LIBS:custom
LIBS:kinesis-cache
EELAYER 27 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title ""
Date "13 nov 2014"
Rev ""
Comp ""
Comment1 ""
Comment2 ""
Comment3 ""
Comment4 ""
$EndDescr
$Comp
L C C4
U 1 1 545804FB
P 2850 4250
F 0 "C4" H 2850 4350 40 0000 L CNN
F 1 "1uF" H 2856 4165 40 0000 L CNN
F 2 "~" H 2888 4100 30 0000 C CNN
F 3 "~" H 2850 4250 60 0000 C CNN
1 2850 4250
-1 0 0 1
$EndComp
$Comp
L R R3
U 1 1 545805E8
P 2500 4000
F 0 "R3" V 2580 4000 40 0000 C CNN
F 1 "22" V 2507 4001 40 0000 C CNN
F 2 "~" V 2430 4000 30 0000 C CNN
F 3 "~" H 2500 4000 30 0000 C CNN
1 2500 4000
0 -1 -1 0
$EndComp
$Comp
L R R2
U 1 1 545805FA
P 2500 3800
F 0 "R2" V 2580 3800 40 0000 C CNN
F 1 "22" V 2507 3801 40 0000 C CNN
F 2 "~" V 2430 3800 30 0000 C CNN
F 3 "~" H 2500 3800 30 0000 C CNN
1 2500 3800
0 -1 -1 0
$EndComp
Entry Wire Line
6450 2450 6550 2550
Entry Wire Line
6450 2550 6550 2650
Entry Wire Line
6450 2650 6550 2750
Entry Wire Line
6450 2750 6550 2850
Entry Wire Line
6450 2950 6550 3050
Entry Wire Line
6450 3050 6550 3150
Entry Wire Line
6450 2850 6550 2950
Entry Wire Line
6450 3150 6550 3250
Wire Wire Line
10250 1800 10750 1800
Entry Wire Line
10750 1800 10850 1900
Entry Wire Line
10750 1900 10850 2000
Entry Wire Line
10750 2000 10850 2100
Entry Wire Line
10750 2800 10850 2900
Entry Wire Line
10750 2900 10850 3000
Entry Wire Line
10750 3000 10850 3100
Entry Wire Line
10750 3100 10850 3200
Entry Wire Line
10750 3200 10850 3300
Entry Wire Line
10750 3300 10850 3400
$Comp
L AT90S8515-P IC2
U 1 1 545A62EA
P 9250 3500
F 0 "IC2" H 8400 5380 40 0000 L BNN
F 1 "AT90S8515-P" H 9700 1550 40 0000 L BNN
F 2 "DIL40" H 9250 3500 30 0000 C CIN
F 3 "" H 9250 3500 60 0000 C CNN
1 9250 3500
1 0 0 -1
$EndComp
NoConn ~ 10250 2650
Entry Wire Line
10750 3650 10850 3750
Entry Wire Line
10750 3750 10850 3850
Entry Wire Line
10750 3850 10850 3950
Entry Wire Line
10750 3950 10850 4050
Entry Wire Line
10750 4050 10850 4150
Entry Wire Line
10750 4150 10850 4250
Entry Wire Line
10750 4350 10850 4450
Entry Wire Line
10750 4250 10850 4350
NoConn ~ 8250 4900
NoConn ~ 8250 5000
NoConn ~ 8250 1800
Wire Wire Line
10250 1900 10750 1900
Wire Wire Line
10250 2000 10750 2000
Wire Wire Line
10250 2100 10750 2100
Wire Wire Line
10250 2200 10750 2200
Wire Wire Line
10250 2300 10750 2300
Wire Wire Line
10250 2400 10750 2400
Wire Wire Line
10250 2500 10750 2500
Text Label 10350 1800 0 60 ~ 0
A
Text Label 10350 1900 0 60 ~ 0
B
Text Label 10350 2000 0 60 ~ 0
C
Text Label 10350 2100 0 60 ~ 0
G
Wire Wire Line
10250 2800 10750 2800
Wire Wire Line
10250 2900 10750 2900
Wire Wire Line
10250 3000 10750 3000
Wire Wire Line
10250 3100 10750 3100
Wire Wire Line
10250 3200 10750 3200
Wire Wire Line
10250 3300 10750 3300
Wire Wire Line
10250 3400 10750 3400
Wire Wire Line
10250 3500 10750 3500
Text Label 10350 2800 0 60 ~ 0
DL2
Text Label 10350 2900 0 60 ~ 0
DR1
Text Label 10350 3000 0 60 ~ 0
DR2
Text Label 10350 3100 0 60 ~ 0
DL1
Text Label 10350 3400 0 60 ~ 0
SCL
Text Label 10350 3500 0 60 ~ 0
SDA
Wire Wire Line
10250 3650 10750 3650
Wire Wire Line
10250 3750 10750 3750
Wire Wire Line
10250 3850 10750 3850
Wire Wire Line
10250 3950 10750 3950
Wire Wire Line
10250 4050 10750 4050
Wire Wire Line
10250 4150 10750 4150
Wire Wire Line
10250 4250 10750 4250
Wire Wire Line
10250 4350 10750 4350
Text Label 10350 3650 0 60 ~ 0
R1
Text Label 10350 3750 0 60 ~ 0
R2
Text Label 10350 3850 0 60 ~ 0
R3
Text Label 10350 3950 0 60 ~ 0
R4
Text Label 10350 4050 0 60 ~ 0
R5
Text Label 10350 4150 0 60 ~ 0
R6
Text Label 10350 4250 0 60 ~ 0
R7
Text Label 10350 4350 0 60 ~ 0
R8
Wire Wire Line
10250 4500 10750 4500
Wire Wire Line
10250 4600 10750 4600
Wire Wire Line
10250 4700 10750 4700
Wire Wire Line
10250 4800 10750 4800
Wire Wire Line
10250 4900 10750 4900
Wire Wire Line
10250 5000 10750 5000
Wire Wire Line
10250 5100 10750 5100
Wire Wire Line
10250 5200 10750 5200
Text Label 10350 4600 0 60 ~ 0
FS1
Text Label 10350 5000 0 60 ~ 0
FS3
Text Label 10350 5200 0 60 ~ 0
FS2
$Comp
L GND #PWR01
U 1 1 545A7377
P 9250 5600
F 0 "#PWR01" H 9250 5600 30 0001 C CNN
F 1 "GND" H 9250 5530 30 0001 C CNN
F 2 "" H 9250 5600 60 0000 C CNN
F 3 "" H 9250 5600 60 0000 C CNN
1 9250 5600
1 0 0 -1
$EndComp
Wire Wire Line
9250 5500 9250 5600
Text Label 10350 4700 0 60 ~ 0
CLOCK
Text Label 10350 4800 0 60 ~ 0
DATA
NoConn ~ 10750 4700
NoConn ~ 10750 4800
Text Label 10350 3200 0 60 ~ 0
KP
Text Label 10350 3300 0 60 ~ 0
PGM
Text Label 10350 2500 0 60 ~ 0
BUZZ
NoConn ~ 8250 2300
NoConn ~ 8250 2700
$Comp
L GND #PWR02
U 1 1 545A7565
P 4750 5700
F 0 "#PWR02" H 4750 5700 30 0001 C CNN
F 1 "GND" H 4750 5630 30 0001 C CNN
F 2 "" H 4750 5700 60 0000 C CNN
F 3 "" H 4750 5700 60 0000 C CNN
1 4750 5700
1 0 0 -1
$EndComp
Entry Wire Line
6450 3650 6550 3750
Entry Wire Line
6450 3750 6550 3850
Entry Wire Line
6450 4150 6550 4250
Entry Wire Line
6450 4250 6550 4350
Entry Wire Line
6450 4050 6550 4150
Entry Wire Line
6450 4350 6550 4450
NoConn ~ 3750 2850
Wire Wire Line
1200 2000 6450 2000
NoConn ~ 3750 3050
Wire Wire Line
2750 3800 3750 3800
Wire Wire Line
2750 3900 3750 3900
Wire Wire Line
2750 3900 2750 4000
Wire Bus Line
6550 2100 6550 6050
Wire Bus Line
10850 1600 10850 6050
Text Label 6050 4350 0 60 ~ 0
DL1
Text Label 6050 4250 0 60 ~ 0
DR2
Text Label 6050 4150 0 60 ~ 0
DR1
Text Label 6050 4050 0 60 ~ 0
DL2
Text Label 6050 2450 0 60 ~ 0
R1
Text Label 6050 2550 0 60 ~ 0
R2
Text Label 6050 2650 0 60 ~ 0
R3
Text Label 6050 2750 0 60 ~ 0
R4
Text Label 6050 2850 0 60 ~ 0
R5
Text Label 6050 2950 0 60 ~ 0
R6
Text Label 6050 3050 0 60 ~ 0
R7
Text Label 6050 3150 0 60 ~ 0
R8
Text Label 6050 5050 0 60 ~ 0
A
Text Label 6050 5150 0 60 ~ 0
B
Text Label 6050 5250 0 60 ~ 0
C
Text Label 6050 5350 0 60 ~ 0
G
Text Label 1300 3800 0 60 ~ 0
D+
Text Label 1300 4000 0 60 ~ 0
D-
NoConn ~ 10750 2200
NoConn ~ 10750 2300
NoConn ~ 10750 2400
Text Label 10350 4500 0 60 ~ 0
GND
NoConn ~ 10750 4900
NoConn ~ 10750 5100
Text Label 6050 3450 0 60 ~ 0
KP
Text Label 6050 3350 0 60 ~ 0
PGM
$Comp
L ATMEGA32U4-A U1
U 1 1 5462E0B1
P 4900 4000
F 0 "U1" H 3950 5700 40 0000 C CNN
F 1 "ATMEGA32U4-A" H 5600 2500 40 0000 C CNN
F 2 "TQFP44" H 4900 4000 35 0000 C CIN
F 3 "" H 6000 5100 60 0000 C CNN
1 4900 4000
1 0 0 -1
$EndComp
Wire Wire Line
3750 4850 3750 5600
Wire Wire Line
4450 2200 5150 2200
Connection ~ 4700 2200
Connection ~ 4800 2200
Connection ~ 5050 2200
Connection ~ 4800 2000
Wire Wire Line
6000 2450 6450 2450
Wire Wire Line
6000 2550 6450 2550
Wire Wire Line
6000 2650 6450 2650
Wire Wire Line
6000 2750 6450 2750
Wire Wire Line
6000 2850 6450 2850
Wire Wire Line
6000 2950 6450 2950
Wire Wire Line
6000 3050 6450 3050
Wire Wire Line
6000 3150 6450 3150
Wire Wire Line
6000 5050 6450 5050
Wire Wire Line
6000 5150 6450 5150
Wire Wire Line
6000 5250 6450 5250
Wire Wire Line
6000 4050 6450 4050
Wire Wire Line
6000 4150 6450 4150
Wire Wire Line
6000 4250 6450 4250
Wire Wire Line
6000 4350 6450 4350
Wire Wire Line
6000 4550 6450 4550
Entry Wire Line
6450 3350 6550 3450
Entry Wire Line
6450 3450 6550 3550
Entry Wire Line
6450 5050 6550 5150
Entry Wire Line
6450 5150 6550 5250
Entry Wire Line
6450 5250 6550 5350
Entry Wire Line
6450 5350 6550 5450
Entry Wire Line
6450 4650 6550 4750
Wire Wire Line
6000 3350 6450 3350
Wire Wire Line
6000 3450 6450 3450
Wire Wire Line
1200 5600 6450 5600
Connection ~ 4950 5600
Connection ~ 4850 5600
Wire Wire Line
4750 5600 4750 5700
Connection ~ 4750 5600
Connection ~ 4500 5600
Text Label 6050 4550 0 60 ~ 0
HWB
Wire Wire Line
6000 5350 6450 5350
Wire Wire Line
6000 3650 6450 3650
Wire Wire Line
6000 3750 6450 3750
Text Label 6050 3650 0 60 ~ 0
SCL
Text Label 6050 3750 0 60 ~ 0
SDA
Wire Wire Line
6000 3850 6450 3850
Wire Wire Line
6000 3950 6450 3950
Wire Wire Line
6000 4650 6450 4650
Text Label 6050 4650 0 60 ~ 0
BUZZ
NoConn ~ 10750 4600
NoConn ~ 10750 5000
NoConn ~ 10750 5200
Entry Wire Line
10750 3400 10850 3500
Entry Wire Line
10750 3500 10850 3600
Entry Wire Line
10750 4500 10850 4600
Wire Wire Line
2850 4050 3750 4050
Text Label 2950 4050 0 60 ~ 0
UCAP
Wire Wire Line
6000 4850 6450 4850
Wire Wire Line
6000 4950 6450 4950
NoConn ~ 6450 4850
NoConn ~ 6450 4950
NoConn ~ 6450 4550
$Comp
L USB-MINI-B CON1
U 1 1 546431C1
P 2100 5050
F 0 "CON1" H 1850 5500 60 0000 C CNN
F 1 "USB-MINI-B" H 2050 4550 60 0000 C CNN
F 2 "" H 2100 5050 60 0000 C CNN
F 3 "" H 2100 5050 60 0000 C CNN
1 2100 5050
0 1 1 0
$EndComp
$Comp
L VCC #PWR03
U 1 1 54643698
P 2400 4400
F 0 "#PWR03" H 2400 4500 30 0001 C CNN
F 1 "VCC" H 2400 4500 30 0000 C CNN
F 2 "" H 2400 4400 60 0000 C CNN
F 3 "" H 2400 4400 60 0000 C CNN
1 2400 4400
1 0 0 -1
$EndComp
Text Notes 2600 2750 0 60 ~ 0
Teensy 2.0\n(not fully drawn)
$Comp
L CONN_7 B7K-PH-K-S1
U 1 1 54643939
P 1950 6900
F 0 "B7K-PH-K-S1" V 1920 6900 60 0000 C CNN
F 1 "CONN_7" V 2020 6900 60 0000 C CNN
F 2 "" H 1950 6900 60 0000 C CNN
F 3 "" H 1950 6900 60 0000 C CNN
1 1950 6900
1 0 0 -1
$EndComp
Connection ~ 3750 5600
Connection ~ 2400 5600
Connection ~ 2250 5600
Connection ~ 1950 5600
Wire Wire Line
2400 4400 2400 4500
Wire Wire Line
2250 4000 2250 4500
Wire Wire Line
1200 3800 2250 3800
Wire Wire Line
2100 3800 2100 4500
Wire Wire Line
2850 4450 2850 5600
Connection ~ 2850 5600
Entry Wire Line
1100 6800 1200 6900
Entry Wire Line
1100 6900 1200 7000
Entry Wire Line
1100 7000 1200 7100
Entry Wire Line
1100 6700 1200 6800
Wire Wire Line
1200 6600 1600 6600
Wire Wire Line
1200 6700 1600 6700
Wire Wire Line
1200 6800 1600 6800
Wire Wire Line
1200 6900 1600 6900
Wire Wire Line
1200 7000 1600 7000
Wire Wire Line
1200 7100 1600 7100
Wire Wire Line
1200 7200 1600 7200
Text Label 1300 6600 0 60 ~ 0
FS2
Text Label 1300 6700 0 60 ~ 0
FS1
Text Label 1300 6800 0 60 ~ 0
VCC
Text Label 1300 6900 0 60 ~ 0
D-
Text Label 1300 7000 0 60 ~ 0
D+
Text Label 1300 7100 0 60 ~ 0
GND
Text Label 1300 7200 0 60 ~ 0
FS3
NoConn ~ 3750 2450
Wire Wire Line
3600 2000 3600 3650
Wire Wire Line
3600 3650 3750 3650
NoConn ~ 1950 4500
Wire Bus Line
1100 1900 1100 7100
NoConn ~ 1200 6600
NoConn ~ 1200 6700
NoConn ~ 1200 7200
Connection ~ 2100 3800
Wire Wire Line
1200 4000 2250 4000
Entry Wire Line
1100 3700 1200 3800
Entry Wire Line
1100 3900 1200 4000
Text Label 10350 1500 0 60 ~ 0
VCC
Entry Wire Line
1100 1900 1200 2000
Text Label 1250 2000 0 60 ~ 0
VCC
Entry Wire Line
1100 5500 1200 5600
Connection ~ 1800 5600
Text Label 1300 5600 0 60 ~ 0
GND
Wire Wire Line
9250 5500 10750 5500
Entry Wire Line
10750 5500 10850 5600
Text Label 10350 5500 0 60 ~ 0
GND
Wire Wire Line
9250 1500 10750 1500
Entry Wire Line
10750 1500 10850 1600
Connection ~ 3600 2000
Wire Wire Line
4800 2000 4800 2200
Entry Wire Line
6450 2000 6550 2100
Text Label 6050 2000 0 60 ~ 0
VCC
Connection ~ 5050 5600
Entry Wire Line
6450 5600 6550 5700
Text Label 6050 5600 0 60 ~ 0
GND
NoConn ~ 6450 3850
NoConn ~ 6450 3950
Wire Wire Line
1800 4500 1500 4500
Wire Wire Line
1500 4500 1500 5600
Connection ~ 1500 5600
Entry Wire Line
10750 2500 10850 2600
Entry Wire Line
10750 2100 10850 2200
Text Notes 1000 5300 1 60 ~ 0
Sacrificial USB cable from header to Teensy
Text Notes 7850 5950 0 60 ~ 0
Ribbon cable between Teensy pins and socket
Wire Bus Line
10850 6050 6550 6050
$EndSCHEMATC

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 KiB

@ -0,0 +1,52 @@
This directory of documentation was copied from https://github.com/wjanssens/tmk_keyboard/tree/master/keyboard/kinesis
and is probably Copyright 2014 Warren Janssens <warren.janssens@gmail.com>
and probably released under GPL v2, which may be recovered at <http://www.gnu.org/licenses/>.
Row configuration
PF0 A
PF1 B
PF2 C
PF3 G 0 = U4, 1 = U5
Column configuration
4y0 4y1 4y2 4y3 4y4 4y5 4y6 4y7 5y0 5y1 5y2 5y3 5y4 5y5 5y6 5y7
r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16
PB0 21 c1 f6 f8 f7 5 4 3 2 1 =+
PB1 22 c2 f3 f5 f4 t r e w q TAB
PB2 23 c3 ESC f2 f1 g f d s a CL
PB3 24 c4 f9 f11 f10 b v c x z LS UP DN [{ ]}
PB4 25 c5 f12 SL PS RT LT §± `~ 6 7 8 9 0 -_
PB5 26 c6 PB PGM KPD y u i o p \
PB6 27 c7 LC DL BS RC EN SP h j k l ;: '"
PB7 28 c8 RA PU PD n m ,< .> /? RS
*/
40 pin connector
DL2 1 40 VCC
DR1 2 39 A
DR2 3 38 B
DL1 4 37 C
KPD 5 36 G
PGM 6 35
SCL 7 34
SDA 8 33
RST 9 32 BUZZ
WP 10 31 EA
FS1 11 30 ALE
CLOCK 12 29 PSEN
DATA 13 28 r8
14 27 r7
FS3 15 26 r6
16 25 r5
FS2 17 24 r4
XTAL1 18 23 r3
XTAL2 19 22 r2
GND 20 21 r1
references:
https://github.com/chrisandreae/keyboard-firmware

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

@ -0,0 +1,21 @@
# Build Options
# change to "no" to disable the options, or define them in the Makefile in
# the appropriate keymap folder that will get included automatically
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
ifndef QUANTUM_DIR
include ../../../../Makefile
endif

@ -0,0 +1,8 @@
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
#include "../../config.h"
// place overrides here
#endif

@ -0,0 +1,116 @@
#include "kinesis.h"
#include "action_layer.h"
#define QWERTY 0 // Base qerty
#define SYMB 1// Symbol layer
// An almost entirely blank keymap. Test layers with the upper right hand key - 1 in normal mode, reset in layer 2.
/****************************************************************************************************
*
* Keymap: Default Layer in Qwerty
*
* ,-------------------------------------------------------------------------------------------------------------------.
* | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F8 | F9 | F10 | F12 | PSCR | SLCK | PAUS | FN0 | BOOT |
* |--------+------+------+------+------+------+---------------------------+------+------+------+------+------+--------|
* | =+ | 1! | 2@ | 3# | 4$ | 5% | | 6^ | 7& | 8* | 9( | 0) | -_ |
* |--------+------+------+------+------+------| +------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | | Y | U | I | O | P | \| |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | Caps | A | S | D | F | G | | H | J | K | L | ;: | '" |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | Shift | Z | X | C | V | B | | N | M | ,. | .> | /? | Shift |
* `--------+------+------+------+------+------- `------+------+------+------+------+--------'
* | `~ | INS | Left | Right| | Up | Down | [{ | ]} |
* `---------------------------' `---------------------------'
* ,-------------. ,-------------.
* | Ctrl | Alt | | Gui | Ctrl |
* ,------|------|------| |------+------+------.
* | | | Home | | PgUp | | |
* | BkSp | Del |------| |------|Return| Space|
* | | | End | | PgDn | | |
* `--------------------' `--------------------'
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[QWERTY] = KEYMAP(
KC_ESC, KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,KC_F7 ,KC_F8,
KC_EQL, KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,
KC_TAB, KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,
KC_CAPS,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,
KC_LSFT,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,
KC_GRV ,KC_INS ,KC_LEFT,KC_RGHT,
KC_LCTL,KC_LALT,
KC_HOME,
KC_BSPC,KC_DEL ,KC_END ,
KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,KC_PSCR ,KC_SLCK ,KC_PAUS, KC_FN0, KC_1,
KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_MINS,
KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_BSLS,
KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN,KC_QUOT,
KC_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH,KC_RSFT,
KC_UP ,KC_DOWN,KC_LBRC,KC_RBRC,
KC_RGUI,KC_RCTL,
KC_PGUP,
KC_PGDN,KC_ENTER ,KC_SPC
),
[SYMB] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_FN0, RESET,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
)
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_LAYER_TAP_TOGGLE(SYMB) , // FN1 - Momentary Layer 1 (Symbols)
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case 0:
if (record->event.pressed) {
register_code(KC_RSFT);
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
void matrix_init_user(void) {
}
void matrix_scan_user(void) {
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return true;
}
void led_set_user(uint8_t usb_led) {
}

@ -0,0 +1 @@
# The default keymap for kinesis-advantage

@ -0,0 +1,21 @@
# Build Options
# change to "no" to disable the options, or define them in the Makefile in
# the appropriate keymap folder that will get included automatically
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
ifndef QUANTUM_DIR
include ../../../../Makefile
endif

@ -0,0 +1,8 @@
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
#include "../../config.h"
// place overrides here
#endif

@ -0,0 +1,245 @@
#include "kinesis.h"
#include "action_layer.h"
#include "mousekey.h"
#define QWERTY 0 // Base qerty
#define SYMB 1// Symbol layer
#define MOUSE 2//
/* Macros */
enum {
NONE = 0,
// Diagonal mouse movement
A_MUL,
A_MUR,
A_MDL,
A_MDR,
};
// Borrowing very heavily from
// https://github.com/alvicstep/tmk_keyboard
/****************************************************************************************************
*
* Keymap: Default Layer in Qwerty
*
* ,-------------------------------------------------------------------------------------------------------------------.
* | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F8 | F9 | F10 | F12 | FN0 | FN1 | FN2 | | bOOT |
* |--------+------+------+------+------+------+---------------------------+------+------+------+------+------+--------|
* | =+ | 1! | 2@ | 3# | 4$ | 5% | | 6^ | 7& | 8* | 9( | 0) | -_ |
* |--------+------+------+------+------+------| +------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | | Y | U | I | O | P | \| |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* |MouseFN1| A | S | D | F | G | | H | J | K | L | ;: | '" |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | Shift | Z | X | C | V | B | | N | M | ,. | .> | /? | Shift |
* `--------+------+------+------+------+------- `------+------+------+------+------+--------'
* | `~ | ESC |MOUSE1|MOUSE2| | [{ | ]} | ESC | GUI |
* `---------------------------' `---------------------------'
* ,-------------. ,-------------.
* | Ctrl | Alt | | Gui | Ctrl |
* ,------|------|------| |------+------+------.
* | | | Home | | PgUp | | |
* | BkSp | Del |------| |------|Return| Space|
* | | | End | | PgDn | | |
* `--------------------' `--------------------'
*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[QWERTY] = KEYMAP(
KC_ESC, KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,KC_F7 ,KC_F8,
KC_EQL, KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,
KC_TAB, KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,
KC_FN1 ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,
KC_LSFT,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,
KC_GRV ,KC_ESC, KC_BTN1,KC_BTN2,
KC_LCTL,KC_LALT,
KC_HOME,
KC_BSPC,KC_DEL ,KC_FN0 ,
KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,KC_FN0 ,KC_FN1 ,KC_FN2, KC_NO, RESET,
KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_MINS,
KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_BSLS,
KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN,KC_QUOT,
KC_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH,KC_RSFT,
KC_LBRC,KC_RBRC, KC_ESC, KC_RGUI,
KC_RGUI,KC_RCTL,
KC_PGUP,
KC_PGDN,KC_ENTER ,KC_SPC
),
[SYMB] = KEYMAP(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_FN0, KC_2,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS
),
/* Keymap: Movement and function layer
*
* ,-------------------------------------------------------------------------------------------------------------------.
* | Caps | F1 | F2 | F3 | F4 | F5 | F6 | F8 | F9 | F10 | F12 | FN0 | FN1 | FN2 | Tada | bOOT |
* |--------+------+------+------+------+------+---------------------------+------+------+------+------+------+--------|
* | =+ | ! | @ | # | $ | % | | ^ | & | * | ( | ) |MS Fast |
* |--------+------+------+------+------+------| +------+------+------+------+------+--------|
* | Tab | | | Up | |PgUp | | MwU |MS_UL | MS_U |MS_UR | | Ms Norm|
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* |MouseFN1| C^A | Left | Down |Right | C^E | | | MS_L |Mouse1| MS_R | |MS Slow |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | | GuiZ | GUI X| GUI C| GUI_V|PgDown| | MWD | MDown|MS Dwn|MS_DR | ? | |
* `--------+------+------+------+------+------- `------+------+------+------+------+--------'
* | `~ | ESC | < | > | | { | } | ESC | |
* `---------------------------' `---------------------------'
* ,-------------. ,-------------.
* | Ctrl | Alt | | Gui | Ctrl |
* ,------|------|------| |------+------+------.
* | | | Home | | PgUp | | |
* | BkSp | Del |------| |------|Mouse1|Mouse2|
* | | | End | | PgDn |LClick|Rclick|
* `--------------------' `--------------------'
*/
[MOUSE] = KEYMAP(
KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_EXLM ,KC_AT, KC_HASH, KC_DLR ,KC_PERC ,
KC_TRNS, KC_NO, KC_NO, KC_UP, KC_NO, KC_PGUP,
KC_FN1, LCTL(KC_A),KC_LEFT, KC_DOWN, KC_RIGHT, LCTL(KC_E),
KC_TRNS, LGUI(KC_Z),LGUI(KC_X),LGUI(KC_C),LGUI(KC_V),KC_PGDN,
KC_TRNS, KC_TRNS, KC_LABK, KC_RABK,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_FN0,RESET,
KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_ACL2,
KC_WH_U, M(A_MUL), KC_MS_U, M(A_MUR), KC_NO, KC_ACL1,
KC_NO, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO, KC_ACL0,
KC_WH_D, M(A_MDL), KC_MS_D, M(A_MDR), KC_TRNS, KC_TRNS,
KC_LCBR, KC_RCBR, KC_ESC, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
KC_TRNS, KC_BTN1, KC_BTN2
),
};
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_LAYER_TAP_TOGGLE(MOUSE) , // FN1 - Momentary Layer 1 (Symbols)
[1] = ACTION_LAYER_TOGGLE(MOUSE) , // FN1 - Momentary Layer 1 (Symbols)
[2] = ACTION_LAYER_TAP_TOGGLE(SYMB) , // FN1 - Momentary Layer 1 (Symbols)
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
switch(id) {
case 0:
if (record->event.pressed) {
register_code(KC_RSFT);
} else {
unregister_code(KC_RSFT);
}
break;
// from algernon's ErgoDox EZ layout,
case A_MUL:
if (record->event.pressed) {
mousekey_on(KC_MS_UP);
mousekey_on(KC_MS_LEFT);
} else {
mousekey_off(KC_MS_UP);
mousekey_off(KC_MS_LEFT);
}
mousekey_send();
break;
case A_MUR:
if (record->event.pressed) {
mousekey_on(KC_MS_UP);
mousekey_on(KC_MS_RIGHT);
} else {
mousekey_off(KC_MS_UP);
mousekey_off(KC_MS_RIGHT);
}
mousekey_send();
break;
case A_MDL:
if (record->event.pressed) {
mousekey_on(KC_MS_DOWN);
mousekey_on(KC_MS_LEFT);
} else {
mousekey_off(KC_MS_DOWN);
mousekey_off(KC_MS_LEFT);
}
mousekey_send();
break;
case A_MDR:
if (record->event.pressed) {
mousekey_on(KC_MS_DOWN);
mousekey_on(KC_MS_RIGHT);
} else {
mousekey_off(KC_MS_DOWN);
mousekey_off(KC_MS_RIGHT);
}
mousekey_send();
break;
}
return MACRO_NONE;
};
void matrix_init_user(void) {
}
void matrix_scan_user(void) {
int8_t layer = biton32(layer_state);
switch (layer) {
case 1:
all_led_off();
break;
case 2:
if (!(host_keyboard_leds() & (1 << USB_LED_CAPS_LOCK))) {
all_led_off();
caps_lock_led_on();
}
break;
case 0:
all_led_off();
num_lock_led_on();
break;
default:
break;
}
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return true;
}
void led_set_user(uint8_t usb_led) {
}

@ -0,0 +1,2 @@
# a programmer friendly keymap for the kinesis-advantage
# not really baked yet.

@ -0,0 +1,106 @@
#include "kinesis.h"
// begin section origin https://github.com/alvicstep/tmk_keyboard
void all_led_off(void)
{
PORTD = 0b11111111;
}
void all_led_on(void)
{
PORTD = 0b00000000;
}
void num_lock_led_on(void)
{
PORTD = 0b11101111;
}
void caps_lock_led_on(void)
{
PORTD = 0b01111111;
}
void scroll_lock_led_on(void)
{
PORTD = 0b11011111;
}
void keypad_led_on(void)
{
PORTD = 0b10111111;
}
void blink_all_leds(void)
{
all_led_on();
_delay_ms(500);
all_led_off();
_delay_ms(100);
caps_lock_led_on();
_delay_ms(100);
num_lock_led_on();
_delay_ms(100);
scroll_lock_led_on();
_delay_ms(100);
keypad_led_on();
_delay_ms(100);
//back
scroll_lock_led_on();
_delay_ms(100);
num_lock_led_on();
_delay_ms(100);
caps_lock_led_on();
_delay_ms(100);
all_led_off();
}
// End section origin https://github.com/alvicstep/tmk_keyboard
void matrix_init_kb(void) {
blink_all_leds();
matrix_init_user();
}
void matrix_scan_kb(void) {
// put your looping keyboard code here
// runs every cycle (a lot)
matrix_scan_user();
}
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
// put your per-action keyboard code here
// runs for every action, just before processing by the firmware
return process_record_user(keycode, record);
}
void led_set_kb(uint8_t usb_led) {
// put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
//Copyright 2014 Warren Janssens <warren.janssens@gmail.com>
uint8_t leds = 0xF0;
if (usb_led & 1 << USB_LED_NUM_LOCK)
leds &= ~0x10;
if (usb_led & 1 << USB_LED_CAPS_LOCK)
leds &= ~0x80;
if (usb_led & 1 << USB_LED_SCROLL_LOCK)
leds &= ~0x20;
PORTD = (PORTD & 0x0F) | leds;
led_set_user(usb_led);
}

@ -0,0 +1,67 @@
#ifndef KINESIS_H
#define KINESIS_H
#include "quantum.h"
// The first section contains all of the arguements
// The second converts the arguments into a two-dimensional array
#define KEYMAP( \
k02,k22,k12,k01,k21,k11,k00,k20,k10, \
k80,k70,k60,k50,k40,k30, \
k81,k71,k61,k51,k41,k31, \
k82,k72,k62,k52,k42,k32, \
k83,k73,k63,k53,k43,k33, \
k74,k64,k54,k34, \
k36,k35, \
k55, \
k56,k46,k75, \
k03,k23,k13,k04,k24,k14,k05,k85,k84, \
k94,kA4,kB4,kD4,kE4,kF4, \
k95,kA5,kB5,kD5,kE5,kF5, \
k96,kA6,kB6,kD6,kE6,kF6, \
k97,kA7,kB7,kD7,kE7,kF7, \
k93,kB3,kD3,kE3, \
k47,k66, \
k67, \
k87,k76,k86 \
) { \
{ k00, k01, k02, k03, k04, k05, KC_NO, KC_NO }, \
{ k10, k11, k12, k13, k14, KC_NO, KC_NO, KC_NO }, \
{ k20, k21, k22, k23, k24, KC_NO, KC_NO, KC_NO }, \
{ k30, k31, k32, k33, k34, k35, k36, KC_NO }, \
{ k40, k41, k42, k43, KC_NO, KC_NO, k46, k47 }, \
{ k50, k51, k52, k53, k54, k55, k56, KC_NO }, \
{ k60, k61, k62, k63, k64, KC_NO, k66, k67 }, \
{ k70, k71, k72, k73, k74, k75, k76, KC_NO }, \
{ k80, k81, k82, k83, KC_NO ,KC_NO, k86, k87}, \
{ KC_NO, KC_NO ,KC_NO ,k93, k94, k95, k96, k97}, \
{ KC_NO, KC_NO ,KC_NO ,KC_NO, kA4, kA5, kA6, kA7}, \
{ KC_NO, KC_NO ,KC_NO ,kB3, kB4, kB5, kB6, kB7}, \
{ KC_NO, KC_NO ,KC_NO ,KC_NO, KC_NO, KC_NO, k84, k85}, \
{ KC_NO, KC_NO ,KC_NO ,kD3, kD4, kD5, kD6, kD7}, \
{ KC_NO, KC_NO ,KC_NO ,kE3, kE4, kE5, kE6, kE7}, \
{ KC_NO, KC_NO ,KC_NO ,KC_NO, kF4, kF5, kF6, kF7} \
}
/* 4y0 A 4y1 B 4y2 4y3 D 4y4 E 4y5 F 4y6 G 4y7 H 5y0 I 5y1 J 5y2 K 5y3 L 5y4 M 5y5 N 5y6 O 5y7 P */
/*
0 1 2 3 4 5 6 7 8 9 A B C D E F
A B C D E F G H I J K L M N O P
4y0 4y1 4y2 4y3 4y4 4y5 4y6 4y7 5y0 5y1 5y2 5y3 5y4 5y5 5y6 5y7
r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15
0 PB0 21 c0 f6 f8 f7 5 4 3 2 1 =+
1 PB1 22 c1 f3 f5 f4 t r e w q TAB
2 PB2 23 c2 ESC f2 f1 g f d s a CL
3 PB3 24 c3 f9 f11 f10 b v c x z LS UP DN [{ ]}
4 PB4 25 c4 f12 SL PS RT LT §± `~ 6 7 8 9 0 -_
5 PB5 26 c5 PB PGM KPD LA HM END y u i o p \
6 PB6 27 c6 LC DEL BS RC ENT SP h j k l ;: '"
7 PB7 28 c7 RA PU PD n m ,< .> /? RS
*/
#endif

@ -0,0 +1,228 @@
/*
Copyright 2014 Warren Janssens <warren.janssens@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* scan matrix
*/
#include <stdint.h>
#include <stdbool.h>
#include <avr/io.h>
#include <util/delay.h>
#include "action_layer.h"
#include "print.h"
#include "debug.h"
#include "util.h"
#include "matrix.h"
#include "led.h"
#include "config.h"
#ifndef DEBOUNCE
# define DEBOUNCE 5
#endif
static uint8_t debouncing = DEBOUNCE;
/* matrix state(1:on, 0:off) */
static uint8_t matrix[MATRIX_ROWS];
static uint8_t matrix_debouncing[MATRIX_ROWS];
static matrix_row_t read_row(uint8_t row);
static void unselect_rows(void);
static void select_rows(uint8_t row);
__attribute__ ((weak))
void matrix_init_quantum(void) {
matrix_init_kb();
}
__attribute__ ((weak))
void matrix_scan_quantum(void) {
matrix_scan_kb();
}
__attribute__ ((weak))
void matrix_init_kb(void) {
matrix_init_user();
}
__attribute__ ((weak))
void matrix_scan_kb(void) {
matrix_scan_user();
}
__attribute__ ((weak))
void matrix_init_user(void) {
}
__attribute__ ((weak))
void matrix_scan_user(void) {
}
inline
uint8_t matrix_rows(void)
{
return MATRIX_ROWS;
}
inline
uint8_t matrix_cols(void)
{
return MATRIX_COLS;
}
void matrix_init(void)
{
//debug_enable = true;
//dprint("matrix_init"); dprintln();
// output high (leds)
DDRD = 0xFF;
PORTD = 0xFF;
// output low (multiplexers)
DDRF = 0xFF;
PORTF = 0x00;
// input with pullup (matrix)
DDRB = 0x00;
PORTB = 0xFF;
// input with pullup (program and keypad buttons)
DDRC = 0x00;
PORTC = 0xFF;
// initialize row and col
unselect_rows();
// initialize matrix state: all keys off
for (uint8_t i=0; i < MATRIX_ROWS; i++) {
matrix[i] = 0;
matrix_debouncing[i] = 0;
}
}
uint8_t matrix_scan(void)
{
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
select_rows(i);
uint8_t row = read_row(i);
if (matrix_debouncing[i] != row) {
matrix_debouncing[i] = row;
if (debouncing) {
debug("bounce!: "); debug_hex(debouncing); debug("\n");
}
debouncing = DEBOUNCE;
}
unselect_rows();
}
if (debouncing) {
if (--debouncing) {
_delay_ms(1);
} else {
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
matrix[i] = matrix_debouncing[i];
}
}
}
matrix_scan_quantum();
return 1;
}
bool matrix_is_modified(void)
{
if (debouncing) return false;
return true;
}
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
return (matrix[row] & ((matrix_row_t)1<<col));
}
inline
matrix_row_t matrix_get_row(uint8_t row)
{
return matrix[row];
}
void matrix_print(void)
{
print("\nr/c 01234567\n");
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
phex(row); print(": ");
pbin_reverse(matrix_get_row(row));
print("\n");
}
}
uint8_t matrix_key_count(void)
{
uint8_t count = 0;
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
count += bitpop16(matrix[i]);
}
return count;
}
static matrix_row_t read_row(uint8_t row)
{
_delay_us(30); // without this wait read unstable value.
//keypad and program buttons
if (row == 12)
{
return ~(PINC | 0b00111111);
}
return ~PINB;
}
static void unselect_rows(void)
{
// set A,B,C,G to 0 (F4 - F7)
PORTF &= 0x0F;
}
static void select_rows(uint8_t row)
{
// set A,B,C,G to row value
PORTF |= row << 4;
}
/* Row pin configuration
PF0 A
PF1 B
PF2 C
PF3 G 0 = U4, 1 = U5
4y0 4y1 4y2 4y3 4y4 4y5 4y6 4y7 5y0 5y1 5y2 5y3 5y4 5y5 5y6 5y7
r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16
PB0 21 c1 f6 f8 f7 5 4 3 2 1 =+
PB1 22 c2 f3 f5 f4 t r e w q TAB
PB2 23 c3 ESC f2 f1 g f d s a CL
PB3 24 c4 f9 f11 f10 b v c x z LS UP DN [{ ]}
PB4 25 c5 f12 SL PS RT LT §± `~ 6 7 8 9 0 -_
PB5 26 c6 PB PGM KPD y u i o p \
PB6 27 c7 LC DL BS RC EN SP h j k l ;: '"
PB7 28 c8 RA PU PD n m ,< .> /? RS
*/

@ -0,0 +1,42 @@
kinesis-advantage keyboard firmware
======================
## Kinesis specific information
This is a port of https://github.com/alvicstep/tmk_keyboard,
which is a fork of https://github.com/wjanssens/tmk_keyboard,
which is based on work from https://github.com/chrisandreae/keyboard-firmware
If you replace the kinesis CPU as described in the doc folder, then this code should allow you to use QMK.
I've tested with a Teensy 2++, remember to change the CPU if you use a 32u4 instead.
Not yet implemented:
- Kinesis EEProm reading or writing
- Audio - this should be simple if we remove hardcoded pins from audio.h and switch to E7
## Quantum MK Firmware
For the full Quantum feature list, see [the parent readme.md](/doc/readme.md).
## Building
Download or clone the whole firmware and navigate to the keyboards/kinesis-advantage folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
Depending on which keymap you would like to use, you will have to compile slightly differently.
### Default
To build with the default keymap, simply run `make`.
### Other Keymaps
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files.
To build the firmware binary hex file with a keymap just do `make` with `keymap` option like:
```
$ make keymap=[default|jack|<name>]
```
Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/`

@ -69,9 +69,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
) )
/* ws2812 RGB LED */ /* ws2812 RGB LED */
#define RGB_DI_PIN D2 #define RGB_DI_PIN D4
#define RGBLIGHT_TIMER #define RGBLIGHT_TIMER
#define RGBLED_NUM 28 // Number of LEDs #define RGBLED_NUM 8 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17 #define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17 #define RGBLIGHT_VAL_STEP 17

@ -0,0 +1,4 @@
Phantom keyboard firmware
======================
TODO: to be updated.

@ -3,10 +3,13 @@
#ifdef BACKLIGHT_ENABLE #ifdef BACKLIGHT_ENABLE
#include "backlight.h" #include "backlight.h"
#endif #endif
#include "keymap_german.h" #include "..\..\..\..\quantum\keymap_extras\keymap_german.h"
#include "..\..\..\..\quantum\keymap_common.h"
#include "..\..\..\..\tmk_core\common\keycode.h"
#define _______ = KC_TRNS;
/* This Layout tries to emulate the Bone2 Variant of Neo2, and is intended to be used with a German QWERTZ Softwarelayout. /* This Layout tries to emulate the Bone2 Variant of Neo2, and is intended to be used with a German QWERTZ Softwarelayout.
It has Umlauts and "ß" as it is optimized for a mix of German & English. It has "üäöß" as it is optimized for a mix of German & English.
My favourite features are the placement of the special characters often used for programming right on the home row My favourite features are the placement of the special characters often used for programming right on the home row
and the number & navigation block combo, so you never have to move your hands from their home position. and the number & navigation block combo, so you never have to move your hands from their home position.
@ -19,57 +22,81 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* ,-----------------------------------------------------------------------------------. * ,-----------------------------------------------------------------------------------.
* | Q | J | D | U | A | X | P | H | L | M | W | | * | Q | J | D | U | A | X | P | H | L | M | W | |
* |------+------+------+------+------+-------------+------+------+------+------+------| * |------+------+------+------+------+-------------+------+------+------+------+------|
* | M1 | C | T | I | E | O | B | N | R | S | G | M1 | * |M1/Tab| C | T | I | E | O | B | N | R | S | G |M1/Ent| //hold for M1, tap for Tab/Enter
* |------+------+------+------+------+------|------+------+------+------+------+------| * |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| F | V | Ü | Ä | Ö | Y | Z | , | . | K |Shift | * | Shift| F | V | Ü | Ä | Ö | Y | Z | , | . | K |Shift |
* |------+------+------+------+------+------+------+------+------+------+------+------| * |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | GUI | Alt | M3 | M2 | Space | M2 | M3 | Esc | Tab |Enter | * | GUI | Ctrl | Alt | M4 | M2 | Space | M2 | M4 | | Ctrl | Esc |
* `-----------------------------------------------------------------------------------' * `-----------------------------------------------------------------------------------'
*/ */
[0] = { [0] = {
{ DE_Q, DE_J, DE_D, DE_U, DE_A, DE_X, DE_P, DE_H, DE_L, DE_M, DE_W, DE_SS }, { DE_Q, DE_J, DE_D, DE_U, DE_A, DE_X, DE_P, DE_H, DE_L, DE_M, DE_W, DE_SS },
{ MO(1), DE_C, DE_T, DE_I, DE_E, DE_O, DE_B, DE_N, DE_R, DE_S, DE_G, MO(1) }, { LT(1,KC_TAB), DE_C, DE_T, DE_I, DE_E, DE_O, DE_B, DE_N, DE_R, DE_S, DE_G, LT(1,KC_ENT) },
{ DE_S, DE_F, DE_V, DE_UE, DE_AE, DE_OE, DE_Y, DE_Z, DE_COMM, DE_DOT, DE_K, DE_S }, { KC_LSFT, DE_F, DE_V, DE_UE, DE_AE, DE_OE, DE_Y, DE_Z, DE_COMM, DE_DOT, DE_K, KC_LSFT },
{ KC_LCTL, KC_LGUI, KC_LALT, MO(3), MO(2), KC_SPC, KC_SPC, MO(2), MO(3), KC_ESC, KC_TAB, KC_ENT } { KC_LGUI, KC_LCTL, KC_LALT, MO(4), MO(2), KC_SPC, KC_SPC, MO(2), MO(4), KC_NO, KC_RCTL, KC_ESC }
}, },
/* M1 Special Characters /* M1 Special Characters
very ergonomic placement for coding
* ,-----------------------------------------------------------------------------------. * ,-----------------------------------------------------------------------------------.
* | ° | @ | _ | [ | ] | ^ | ! | < | > | = | & | | * | ° | @ | _ | [ | ] | ^ | ! | < | > | = | & | ´ |
* |------+------+------+------+------+-------------+------+------+------+------+------| * |------+------+------+------+------+-------------+------+------+------+------+------|
* | M1 | \ | / | { | } | * | ? | ( | ) | - | : | M1 | * |M1/Tab| \ | / | { | } | * | ? | ( | ) | - | : |M1/Ent| //hold for M1, tap for Tab/Enter
* |------+------+------+------+------+------|------+------+------+------+------+------| * |------+------+------+------+------+------|------+------+------+------+------+------|
* | | # | $ | | | ~ | | + | % | " | ' | ; | | * | Shift| # | $ | | | ~ | | + | % | " | ' | ; |Shift |
* |------+------+------+------+------+------+------+------+------+------+------+------| * |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | GUI | Alt | M3 | M2 | Space | M2 | M3 | Esc | Tab |Enter | * | GUI | Ctrl | Alt | M4 | M2 | Space | M2 | M4 | | Ctrl | Esc |
* `-----------------------------------------------------------------------------------' * `-----------------------------------------------------------------------------------'
*/ */
[1] = { [1] = {
{ DE_RING, DE_AT, DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LESS, DE_MORE, DE_EQL, DE_AMPR, KC_NO }, { DE_RING, DE_AT, DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LESS, DE_MORE, DE_EQL, DE_AMPR, DE_ACUT },
{ KC_TRNS, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QST, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, KC_TRNS }, { _______, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QST, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, _______ },
{ KC_NO , DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_EURO, DE_PLUS, DE_PERC, DE_DQOT, DE_QUOT, DE_SCLN, KC_NO }, { _______, DE_HASH, DE_DLR, DE_PIPE, DE_TILD, DE_EURO, DE_PLUS, DE_PERC, DE_DQOT, DE_QUOT, DE_SCLN, _______ },
{ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS } { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }
}, },
/* Navigation & Number Blocks /* Navigation & Number Blocks
very easy to get used to & intuituve placement
* ,-----------------------------------------------------------------------------------. * ,-----------------------------------------------------------------------------------.
* | | PgUp | Bksp | Up | DEL | PgDn | | 7 | 8 | 9 | | | * | | PgUp | Bksp | Up | DEL | PgDn | | 7 | 8 | 9 | | |
* |------+------+------+------+------+-------------+------+------+------+------+------| * |------+------+------+------+------+-------------+------+------+------+------+------|
* | | Home | Lft | Down | Right| End | . | 4 | 5 | 6 | , | | * | Tab | Home | Lft | Down | Right| End | . | 4 | 5 | 6 | , | Enter|
* |------+------+------+------+------+------|------+------+------+------+------+------| * |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| | Tab | Ins | Enter| | 0 | 1 | 2 | 3 | ; |Shift | * | Shift| | Tab | Ins | Enter| | 0 | 1 | 2 | 3 | ; |Shift |
* |------+------+------+------+------+------+------+------+------+------+------+------| * |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | GUI | Alt | M3 | M2 | Space | M2 | M3 | Esc | Tab |Enter | * | GUI | Ctrl | Alt | M3 | M2 | Space | M2 | M3 | | Ctrl | Esc |
* `-----------------------------------------------------------------------------------' * `-----------------------------------------------------------------------------------'
*/ */
[2] = { [2] = {
{ KC_NO, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, KC_NO, DE_7, DE_8, DE_9, KC_NO, KC_NO }, { KC_NO, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, KC_NO, DE_7, DE_8, DE_9, KC_NO, KC_NO },
{ KC_NO, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, DE_DOT, DE_4, DE_5, DE_6, DE_COMM, KC_NO }, { KC_TAB, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, DE_DOT, DE_4, DE_5, DE_6, DE_COMM, KC_ENT },
{ DE_S, KC_NO, KC_TAB, KC_INS, KC_ENT, KC_NO, KC_0, DE_1, DE_2, DE_3, DE_SCLN, DE_S }, { _______, KC_NO, KC_TAB, KC_INS, KC_ENT, KC_NO, DE_0, DE_1, DE_2, DE_3, DE_SCLN, _______ },
{ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS } { _______, _______, _______, MO(3), _______, _______, _______, _______, MO(3), _______, _______, _______ }
}, },
/* Flipped Navigation & Number Blocks for one handed use
accessed by sliding from M2 to M3 with thumb
* ,-----------------------------------------------------------------------------------.
* | | | 7 | 8 | 9 | | PgUp | Bksp | Up | DEL | PgDn | |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Tab | . | 4 | 5 | 6 | , | Home | Left | Down | Right| End | Enter|
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| 0 | 1 | 2 | 3 | ; | | Tab | Ins | Enter| |Shift |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | GUI | Ctrl | Alt | M3 | | Space | | M3 | | Ctrl | Esc |
* `-----------------------------------------------------------------------------------'
*/
[3] = {
{ KC_NO, KC_NO, DE_7, DE_8 DE_9, KC_NO, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, KC_NO },
{ _______, DE_DOT, DE_4, DE_5, DE_6, DE_COMM, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, _______ },
{ _______, DE_0, DE_1, DE_2, DE_3, DE_SCLN, KC_NO, KC_TAB, KC_INS, KC_ENT, KC_NO, _______ },
{ _______, _______, _______, _______, KC_NO, _______, _______, KC_NO, _______, _______, _______, _______ }
},
/* Function & Media Keys /* Function & Media Keys
slide from m4 to m5 to access flipped version
* ,-----------------------------------------------------------------------------------. * ,-----------------------------------------------------------------------------------.
* | | | Print|Scroll|Pause | | | F7 | F8 | F9 | F12 | | * | | | Print|Scroll|Pause | | | F7 | F8 | F9 | F12 | |
* |------+------+------+------+------+-------------+------+------+------+------+------| * |------+------+------+------+------+-------------+------+------+------+------+------|
@ -77,14 +104,33 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+------|------+------+------+------+------+------| * |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| | Prev | Play | Next | | ² | F1 | F2 | F3 | F10 |Shift | * | Shift| | Prev | Play | Next | | ² | F1 | F2 | F3 | F10 |Shift |
* |------+------+------+------+------+------+------+------+------+------+------+------| * |------+------+------+------+------+------+------+------+------+------+------+------|
* | Ctrl | GUI | Alt | M3 | | Space | | M3 | Esc | Tab |Enter | * | GUI | Ctrl | Alt | M4 | M5 | Space | M5 | M4 | | Ctrl | Esc |
* `-----------------------------------------------------------------------------------' * `-----------------------------------------------------------------------------------'
*/ */
[3] = { [4] = {
{ KC_NO, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_NO, KC_NO, KC_F7, KC_F8, KC_F9, KC_F12, KC_NO }, { KC_NO, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_NO, KC_NO, KC_F7, KC_F8, KC_F9, KC_F12, KC_NO },
{ KC_NO, KC_NO, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, DE_SQ3, KC_F4, KC_F5, KC_F6, KC_F11, KC_NO }, { KC_NO, KC_NO, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, DE_SQ3, KC_F4, KC_F5, KC_F6, KC_F11, KC_NO },
{ KC_TRNS, KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, DE_SQ2, KC_F1, KC_F2, KC_F3, KC_F10, KC_TRNS}, { _______, KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, DE_SQ2, KC_F1, KC_F2, KC_F3, KC_F10, _______ },
{ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} { _______, _______, _______, _______, MO(5), _______, _______, MO(5), _______, _______, _______, _______ }
}
/* flipped Function & Media Keys
* ,-----------------------------------------------------------------------------------.
* | | | F7 | F8 | F9 | | | Print|Scroll| Pause| | |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | ³ | F4 | F5 | F6 | | | Mute | Vol- | Vol+ | | |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| ² | F1 | F2 | F3 | | | Prev | Play | Next | |Shift |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | GUI | Ctrl | Alt | | M5 | Space | M5 | | | Ctrl | Esc |
* `-----------------------------------------------------------------------------------'
*/
[5] = {
{ KC_NO, KC_NO, KC_F7, KC_F8, KC_F9, KC_NO, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_NO, KC_NO },
{ KC_NO, KC_SQ3, KC_F4, KC_F5, KC_F6, KC_NO, KC_NO, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO },
{ _______, KC_SQ2, KC_F1, KC_F2, KC_F3, KC_NO, KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, _______ },
{ _______, _______, _______, KC_NO, _______, _______, _______, _______, KC_NO, _______, _______, _______ }
} }
}; };

@ -11,7 +11,7 @@ CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls MIDI_ENABLE = yes # MIDI controls
AUDIO_ENABLE = yes # Audio output on port C6 AUDIO_ENABLE = yes # 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

@ -0,0 +1,77 @@
CMD-Preonic
===================
The CMD project seeks to improve productivity by optimizing usage of the left hand via clever use of the function layers.
>Note: This project is currently optimized for grid layout, and has not been confirmed to work 100% on MIT layout, although it is expected to work correctly.
----------
Modes
-------------
#### QWERTY
>CMD-Qwerty is very similar to the default Preonic with a few key differences:
- Dual-role Raise/Enter Key at Caps Lock position. -Don't need to take your hand off the mouse to submit URLs
- Space_Function under left space (Grid layout) -Don't need to take your thumb off of the spacebar to use lower.
- Dedicated arrow keys replaced with ( - , = , [ , and ] ) - big improvement for programmers who are used to fn layer.
----------
#### Game
> Disables extra features to facilitate easier usage of the Preonic while gaming. this mode is toggled in the adjust layer.
- Dual Role Function key becomes Caps Lock.
- Space_Function disabled and replaced with normal spacebar.
- Windows Key disabled.
----------
#### Numpad
> Enables left-hand numpad
- Left-side numpad
- Can be toggled on in Adjust layer (under . key)
----------
#### Arrow - (Lower)
> Makes arrow keys easily accessible to Left Hand, and much more.
- Arrow keys at WASD, Backspace at Q, Delete at E.
- Media Keys near arrow cluster, mute at A.
- Web Nav keys.
- Mouse cluster at YGHJ.
- Numpad in right side of board.
- Can be toggled on in Adjust layer (Under , key)
----------
#### Function- (Raise)
> Basic Functions. Open Keys for customization.
- Turns WASD into Navigation cluster (Home, End, Page up and Page Down)
- Pok3r style right hand arrow cluster for accessibility (familiar for many users.)
- Doubles as shift key for top row numbers.
- Print Screen, Insert, etc.
----------
#### Adjust- (Raise + Lower)
> Switch Modes
- Default modes moved to the left and new layer toggle modes located to the right.
- Sleep and Wake keys added.
- Reset button moved under Spacebar(s).
Notes:
-------------
Please feel free to reach out to Commandlinedesign@gmail.com with suggestions.
Special Thanks to Jack for QMK firmware and the Preonic!

@ -0,0 +1,332 @@
#include "preonic.h"
#include "action_layer.h"
#include "eeconfig.h"
#ifdef AUDIO_ENABLE
#include "audio.h"
#endif
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
#define _QWERTY 0
#define _COLEMAK 1
#define _DVORAK 2
#define _GAME 3
#define _ARROW 12
#define _NUMPAD 13
#define _LOWER 14
#define _RAISE 15
#define _ADJUST 16
// Macro name shortcuts
#define QWERTY M(_QWERTY)
#define COLEMAK M(_COLEMAK)
#define DVORAK M(_DVORAK)
#define GAME M(_GAME)
#define ARROW M(_ARROW)
#define NUMPAD M(_NUMPAD)
#define LOWER M(_LOWER)
#define RAISE M(_RAISE)
#define M_BL 5
// Fillers to make layering more clear
#define _______ KC_TRNS
#define XXXXXXX KC_NO
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Qwerty
* ,-----------------------------------------------------------------------------------.
* | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Tab | Q | W | E | R | T | Y | U | I | O | P | \ |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Esc | A | S | D | F | G | H | J | K | L | ; | " |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Lower | Space | Raise| - | = | [ | ] |
* `-----------------------------------------------------------------------------------'
*/
[_QWERTY] = {
{KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
{KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH},
{LT(_RAISE, KC_ENT), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
{M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER, LT(_LOWER, KC_SPC), KC_SPC, RAISE, KC_MINUS, KC_EQUAL, KC_LBRC, KC_RBRC}
},
/* Colemak
* ,-----------------------------------------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | A | R | S | T | D | H | N | E | I | O | " |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Lower | Space | Raise| - | = | [ | ] |
* `-----------------------------------------------------------------------------------'
*/
[_COLEMAK] = {
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
{_______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, _______},
{_______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
{_______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
},
/* Dvorak
* ,-----------------------------------------------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Tab | " | , | . | P | Y | F | G | C | R | L | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Esc | A | O | E | U | I | D | H | T | N | S | / |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | GUI |Lower | Space | Raise| - | = | [ | ] |
* `-----------------------------------------------------------------------------------'
*/
[_DVORAK] = {
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
{_______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, _______},
{_______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, _______},
{_______, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
},
/* GAME
* ,-----------------------------------------------------------------------------------.
* | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Tab | Q | W | E | R | T | Y | U | I | O | P | \ |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | CAPS | A | S | D | F | G | H | J | K | L | ; | " |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Brite| Ctrl | Alt | XXX | Lower | Space | Raise| - | = | [ | ] |
* `-----------------------------------------------------------------------------------'
*/
[_GAME] = {
{KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
{KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH},
{KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
{KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT },
{_______, _______, _______, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______}
},
/* NUMPAD
* ,-----------------------------------------------------------------------------------.
* | Esc | / | * | - | 4 | 5 | 6 | 7 | 8 | 9 | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | 7 | 8 | 9 | + | R | T | Y | U | I | O | P | \ |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | 4 | 5 | 6 | + | F | G | H | J | K | L | ; | " |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | 1 | 2 | 3 | Enter| V | B | N | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | 0 | 0 | . | Enter| Lower| Space | Raise| - | = | [ | ] |
* `-----------------------------------------------------------------------------------'
*/
[_NUMPAD] = {
{KC_ESC, KC_PSLS, KC_PAST, KC_PMNS, _______, _______, _______, _______, _______, _______, _______, _______},
{KC_P7, KC_P8, KC_P9, KC_PPLS, _______, _______, _______, _______, _______, _______, _______, _______},
{KC_P4, KC_P5, KC_P6, KC_PPLS, _______, _______, _______, _______, _______, _______, _______, _______},
{KC_P1, KC_P2, KC_P3, KC_PENT, _______, _______, _______, _______, _______, _______, _______, _______},
{KC_P0, KC_P0, KC_PDOT, KC_PENT, _______, _______, _______, _______, _______, _______, _______, _______},
},
/* Lower
* ,-----------------------------------------------------------------------------------.
* | ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | Del |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Mute | BkSpc| Up | Del | Forwd| MBtn1| MUp| MBtn2| / | 7 | 8 | 9 |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | Left | Down | Right| Refr MLeft| MDn |MRight| * | 4 | 5 | 6 |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Vol+| Prev | Play | Next | Back | MWDn| MBtn3| MWUp | - | 1 | 2 | 3 |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | Vol- | | | | | | | + | Enter| 0 | . |
* `-----------------------------------------------------------------------------------'
*/
[_LOWER] = {
{KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL},
{KC_MUTE, KC_BSPC, KC_UP, KC_DEL, KC_WWW_FORWARD, KC_BTN1, KC_MS_U, KC_BTN2, KC_PSLS, KC_P7, KC_P8, KC_P9},
{_______, KC_LEFT, KC_DOWN, KC_RIGHT, KC_WWW_REFRESH, KC_MS_L, KC_MS_D, KC_MS_R, KC_PAST, KC_P4, KC_P5, KC_P6},
{KC_VOLU, KC_MPRV, KC_MPLY, KC_MNXT, KC_WWW_BACK, KC_WH_D, KC_BTN3, KC_WH_U, KC_PMNS, KC_P1, KC_P2, KC_P3},
{KC_VOLD, _______, _______, _______, _______, _______, _______, _______, KC_PPLS, KC_PENT, KC_P0, KC_PDOT}
},
/* Raise
* ,-----------------------------------------------------------------------------------.
* | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | Bksp | PgUp | Del | | | | PgUp | Up | PgDn | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | Home | PgDn | End | | | Home | Left | Down | Right| ] | \ |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | Pause| Ins | | | Print|Screen| End | | | |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
[_RAISE] = {
{KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
{_______, KC_BSPC, KC_PGUP, KC_DEL, _______, _______, _______, KC_PGUP, KC_UP, _______, _______, _______},
{_______, KC_HOME, KC_PGDN, KC_END, _______, _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______},
{_______, KC_PAUSE, KC_INS, _______, KC_PSCR, KC_PSCR, _______, KC_END, _______, _______, _______, _______},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
},
/* Adjust (Lower + Raise)
* ,-----------------------------------------------------------------------------------.
* | | |qwerty|ColMak|Dvorak| | | | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | |AGNorm|AGSwap| | | | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | |Aud On|AudOff|MidiOn|MdiOff| | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | |Voice-|Voice+|Mus On|MusOff| Sleep| Wake | Arrow| Game |NUMPAD| | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | Reset | | | | | |
* `-----------------------------------------------------------------------------------'
*/
[_ADJUST] = {
{_______, _______, QWERTY, COLEMAK, DVORAK, _______, _______, _______, _______, _______, _______, _______},
{_______, RESET, _______, AG_NORM, AG_SWAP, _______, _______, _______, _______, _______, _______, KC_DEL},
{_______, _______, _______, AU_ON, AU_OFF, MI_ON, MI_OFF, QWERTY, COLEMAK, DVORAK, _______, _______},
{_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, KC_SYSTEM_SLEEP, KC_SYSTEM_WAKE, ARROW, GAME, NUMPAD, _______, _______},
{_______, _______, _______, _______, _______, RESET, RESET, _______, _______, _______, _______, _______}
}
};
const uint16_t PROGMEM fn_actions[] = {
};
#ifdef AUDIO_ENABLE
float start_up[][2] = {
{440.0*pow(2.0,(14)/12.0), 20},
{440.0*pow(2.0,(26)/12.0), 8},
{440.0*pow(2.0,(18)/12.0), 20},
{440.0*pow(2.0,(26)/12.0), 8}
};
float tone_qwerty[][2] = SONG(QWERTY_SOUND);
float tone_dvorak[][2] = SONG(DVORAK_SOUND);
float tone_colemak[][2] = SONG(COLEMAK_SOUND);
float goodbye[][2] = SONG(GOODBYE_SOUND);
#endif
void persistant_default_layer_set(uint16_t default_layer) {
eeconfig_update_default_layer(default_layer);
default_layer_set(default_layer);
}
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch(id) {
case _QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
#endif
persistant_default_layer_set(1UL<<_QWERTY);
}
break;
case _COLEMAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_colemak, false, 0);
#endif
persistant_default_layer_set(1UL<<_COLEMAK);
}
break;
case _DVORAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
#endif
persistant_default_layer_set(1UL<<_DVORAK);
}
break;
case _GAME:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_colemak, false, 0);
#endif
persistant_default_layer_set(1UL<<_GAME);
}
break;
case _NUMPAD:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
#endif
persistant_default_layer_set(1UL<<_NUMPAD);
}
break;
case _ARROW:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
PLAY_NOTE_ARRAY(tone_colemak, false, 0);
#endif
persistant_default_layer_set(1UL<<_LOWER);
}
break;
case _LOWER:
if (record->event.pressed) {
layer_on(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_LOWER);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
break;
case _RAISE:
if (record->event.pressed) {
layer_on(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else {
layer_off(_RAISE);
update_tri_layer(_LOWER, _RAISE, _ADJUST);
}
break;
case M_BL:
if (record->event.pressed) {
register_code(KC_RSFT);
#ifdef BACKLIGHT_ENABLE
backlight_step();
#endif
} else {
unregister_code(KC_RSFT);
}
break;
}
return MACRO_NONE;
};
void matrix_init_user(void) {
#ifdef AUDIO_ENABLE
_delay_ms(20); // gets rid of tick
PLAY_NOTE_ARRAY(start_up, false, 0);
#endif
}
#ifdef AUDIO_ENABLE
void play_goodbye_tone()
{
PLAY_NOTE_ARRAY(goodbye, false, 0);
_delay_ms(150);
}
#endif

@ -0,0 +1,23 @@
# Build Options
# change to "no" to disable the options, or define them in the Makefile in
# the appropriate keymap folder that will get included automatically
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = yes # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
ifndef QUANTUM_DIR
include ../../../../Makefile
endif

@ -102,7 +102,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+-------------+------+------+------+------+------| * |------+------+------+------+------+-------------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
* |------+------+------+------+------+------|------+------+------+------+------+------| * |------+------+------+------+------+------|------+------+------+------+------+------|
* | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------| * |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | Next | Vol- | Vol+ | Play | * | | | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------' * `-----------------------------------------------------------------------------------'
@ -123,7 +123,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+-------------+------+------+------+------+------| * |------+------+------+------+------+-------------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
* |------+------+------+------+------+------|------+------+------+------+------+------| * |------+------+------+------+------+------|------+------+------+------+------+------|
* | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------| * |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | Next | Vol- | Vol+ | Play | * | | | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------' * `-----------------------------------------------------------------------------------'
@ -142,9 +142,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+------+------+------+------+------+------+------| * |------+------+------+------+------+------+------+------+------+------+------+------|
* | | Reset| | | | | | | | | | Del | * | | Reset| | | | | | | | | | Del |
* |------+------+------+------+------+-------------+------+------+------+------+------| * |------+------+------+------+------+-------------+------+------+------+------+------|
* | | | |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | * | | | |Aud on|AudOff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | |
* |------+------+------+------+------+------|------+------+------+------+------+------| * |------+------+------+------+------+------|------+------+------+------+------+------|
* | |Voice-|Voice+|Musoff|Mus on| | | | | | | | * | |Voice-|Voice+|Mus on|MusOff|MidiOn|MidOff| | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------| * |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | | | | | * | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------' * `-----------------------------------------------------------------------------------'

@ -52,7 +52,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096
# Build Options # Build Options
# comment out to disable the options. # comment out to disable the options.
# #
BOOTMAGIC_ENABLE ?= yes # Virtual DIP switch configuration(+1000) BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE ?= no # Mouse keys(+4700) MOUSEKEY_ENABLE ?= no # Mouse keys(+4700)
EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450)
CONSOLE_ENABLE ?= yes # Console for debug(+400) CONSOLE_ENABLE ?= yes # Console for debug(+400)

@ -0,0 +1,21 @@
# Build Options
# change to "no" to disable the options, or define them in the Makefile in
# the appropriate keymap folder that will get included automatically
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
ifndef QUANTUM_DIR
include ../../../../Makefile
endif

@ -11,6 +11,8 @@
#define _BL 0 #define _BL 0
#define _FL 1 #define _FL 1
#define _______ KC_TRNS
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap _BL: (Base Layer) Default Layer /* Keymap _BL: (Base Layer) Default Layer
* ,-----------------------------------------------------------. * ,-----------------------------------------------------------.
@ -47,17 +49,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/ */
[_FL] = KEYMAP( [_FL] = KEYMAP(
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
KC_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, \ KC_GRV, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET, \
KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_INC, BL_TOGG, \ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, BL_DEC,BL_INC, BL_TOGG, \
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, \
KC_TRNS,RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, \ _______,RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,_______,_______,_______, \
KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), _______,_______,_______, _______, _______,_______,_______, _______),
#else #else
KC_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, \ KC_GRV, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET, \
KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_INC, BL_TOGG, \ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, BL_DEC, BL_INC,BL_TOGG, \
KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \
KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), _______,_______,_______, _______, _______,_______,_______,_______),
#endif #endif
}; };

@ -0,0 +1 @@
# default Satan GH60 layout

@ -0,0 +1,21 @@
# Build Options
# change to "no" to disable the options, or define them in the Makefile in
# the appropriate keymap folder that will get included automatically
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = yes # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
ifndef QUANTUM_DIR
include ../../../../Makefile
endif

@ -10,6 +10,9 @@
#define _BL 0 #define _BL 0
#define _FL 1 #define _FL 1
// Fillers to make layering more clear
#define _______ KC_TRNS
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap _BL: (Base Layer) Default Layer /* Keymap _BL: (Base Layer) Default Layer
* ,-----------------------------------------------------------. * ,-----------------------------------------------------------.
@ -33,17 +36,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_FL] = KEYMAP_HHKB( [_FL] = KEYMAP_HHKB(
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, RESET, \ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, RESET, \
KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_BSPC, \ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, _______, KC_DEL, \
KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \ _______, _______, _______, _______, _______, _______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, _______, _______, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), _______, _______, _______, _______, _______, _______, _______, _______),
#else #else
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, RESET, \ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, RESET, \
KC_CAPS, KC_TRNS, RGB_TOG,RGB_MOD,RGB_HUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_BSPC, \ KC_CAPS, _______, RGB_TOG,RGB_MOD,RGB_HUI, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, _______, KC_DEL, \
KC_TRNS, KC_VOLD, RGB_HUD,RGB_SAI,RGB_SAD, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \ _______, KC_VOLD, RGB_HUD,RGB_SAI,RGB_SAD, _______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT, \
KC_TRNS, RGB_VAI,RGB_VAD,KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \ _______, RGB_VAI,RGB_VAD,_______, _______, _______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, _______, _______, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), _______, _______, _______, _______, _______, _______, _______, _______),
#endif #endif
}; };

@ -0,0 +1,3 @@
# sethbc's Satan GH60 layout
HHKB style split right shift and split backspace. Largely based on the HHKB layout.

@ -0,0 +1,4 @@
Satan GH60 keyboard firmware
======================
TODO: to be updated.

@ -3,7 +3,7 @@
#include "quantum.h" #include "quantum.h"
/* Clueboard matrix layout /* Satan GH60 matrix layout
* ,-----------------------------------------------------------. * ,-----------------------------------------------------------.
* | 00 |01| 02| 03| 04| 05| 06| 07| 08| 09| 0a| 0b| 0c| 0d | * | 00 |01| 02| 03| 04| 05| 06| 07| 08| 09| 0a| 0b| 0c| 0d |
* |-----------------------------------------------------------| * |-----------------------------------------------------------|

@ -30,7 +30,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "quantum.h" #include "quantum.h"
#ifdef MIDI_ENABLE #ifdef MIDI_ENABLE
#include "keymap_midi.h" #include "process_midi.h"
#endif #endif
extern keymap_config_t keymap_config; extern keymap_config_t keymap_config;

@ -118,7 +118,7 @@
// Fourth row // Fourth row
#define BP_COLON LSFT(BP_DOT) // : #define BP_COLON LSFT(BP_DOT) // :
#define BP_COLN BP_COLON #define BP_COLN BP_COLON
#define BP_QUESTION LSFT(BP_QUOTE) // ? #define BP_QUESTION LSFT(BP_APOS) // ?
#define BP_QEST BP_QUESTION #define BP_QEST BP_QUESTION
// Space bar // Space bar
@ -183,7 +183,7 @@
// Third row // Third row
#define BP_AE_LIGATURE ALTGR(BP_A) // æ #define BP_AE_LIGATURE ALTGR(BP_A) // æ
#define BP_AE BP_AE_LIGATURE #define BP_AE BP_AE_LIGATURE
#define BP_U_GRAVE AGR(BP_U) // ù #define BP_U_GRAVE ALTGR(BP_U) // ù
#define BP_UGRV BP_U_GRAVE #define BP_UGRV BP_U_GRAVE
#define BP_DEAD_TREMA ALTGR(BP_I) // dead ¨ (trema/umlaut/diaresis) #define BP_DEAD_TREMA ALTGR(BP_I) // dead ¨ (trema/umlaut/diaresis)
#define BP_DTRM BP_DEAD_TREMA #define BP_DTRM BP_DEAD_TREMA

@ -30,6 +30,7 @@
#define DV_L KC_P #define DV_L KC_P
#define DV_SLSH KC_LBRC #define DV_SLSH KC_LBRC
#define DV_EQL KC_RBRC #define DV_EQL KC_RBRC
#define DV_BSLS KC_BSLS
#define DV_A KC_A #define DV_A KC_A
#define DV_O KC_S #define DV_O KC_S
@ -68,7 +69,13 @@
#define DV_RPRN LSFT(DV_0) #define DV_RPRN LSFT(DV_0)
#define DV_LCBR LSFT(DV_LBRC) #define DV_LCBR LSFT(DV_LBRC)
#define DV_RCBR LSFT(DV_RBRC) #define DV_RCBR LSFT(DV_RBRC)
#define DV_UNDS LSFT(DV_MINS)
#define DV_QUES LSFT(DV_SLSH)
#define DV_PLUS LSFT(DV_EQL) #define DV_PLUS LSFT(DV_EQL)
#define DV_PIPE LSFT(DV_BSLS)
#define DV_UNDS LSFT(DV_MINS)
#define DV_COLN LSFT(DV_SCLN)
#endif #endif

@ -4,7 +4,7 @@
#include "keymap.h" #include "keymap.h"
// Alt gr // Alt gr
#define ALGR(kc) kc | 0x1400 #define ALGR(kc) RALT(kc)
#define FR_CH_ALGR KC_RALT #define FR_CH_ALGR KC_RALT
// normal characters // normal characters

@ -4,7 +4,7 @@
#include "keymap.h" #include "keymap.h"
// Alt gr // Alt gr
#define ALGR(kc) kc | 0x1400 #define ALGR(kc) RALT(kc)
#define NO_ALGR KC_RALT #define NO_ALGR KC_RALT
// Normal characters // Normal characters

@ -4,7 +4,7 @@
#include "keymap.h" #include "keymap.h"
// Alt gr // Alt gr
#define ALGR(kc) kc | 0x1400 #define ALGR(kc) RALT(kc)
#define DE_ALGR KC_RALT #define DE_ALGR KC_RALT
// normal characters // normal characters

@ -4,7 +4,7 @@
#include "keymap.h" #include "keymap.h"
// Alt gr // Alt gr
#define ALGR(kc) kc | 0x1400 #define ALGR(kc) RALT(kc)
#define CH_ALGR KC_RALT #define CH_ALGR KC_RALT
// normal characters // normal characters

@ -4,7 +4,7 @@
#include "keymap.h" #include "keymap.h"
// Alt gr // Alt gr
#define ALGR(kc) kc | 0x1400 #define ALGR(kc) RALT(kc)
#define NO_ALGR KC_RALT #define NO_ALGR KC_RALT
// Normal characters // Normal characters

@ -4,7 +4,7 @@
#include "keymap.h" #include "keymap.h"
// Alt gr // Alt gr
#define ALGR(kc) kc | 0x1400 #define ALGR(kc) RALT(kc)
#define NO_ALGR KC_RALT #define NO_ALGR KC_RALT
// Normal characters // Normal characters

@ -4,7 +4,7 @@
#include "keymap.h" #include "keymap.h"
// Alt gr // Alt gr
#define ALGR(kc) kc | 0x1400 #define ALGR(kc) RALT(kc)
#define NO_ALGR KC_RALT #define NO_ALGR KC_RALT
// Normal characters // Normal characters

@ -1,8 +1,8 @@
#include "process_midi.h" #include "process_midi.h"
bool midi_activated = false; bool midi_activated = false;
uint8_t starting_note = 0x0C; uint8_t midi_starting_note = 0x0C;
int offset = 7; int midi_offset = 7;
bool process_midi(uint16_t keycode, keyrecord_t *record) { bool process_midi(uint16_t keycode, keyrecord_t *record) {
if (keycode == MI_ON && record->event.pressed) { if (keycode == MI_ON && record->event.pressed) {
@ -20,42 +20,42 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) {
if (midi_activated) { if (midi_activated) {
if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) { if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) {
if (record->event.pressed) { if (record->event.pressed) {
starting_note++; // Change key midi_starting_note++; // Change key
midi_send_cc(&midi_device, 0, 0x7B, 0); midi_send_cc(&midi_device, 0, 0x7B, 0);
} }
return false; return false;
} }
if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) { if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) {
if (record->event.pressed) { if (record->event.pressed) {
starting_note--; // Change key midi_starting_note--; // Change key
midi_send_cc(&midi_device, 0, 0x7B, 0); midi_send_cc(&midi_device, 0, 0x7B, 0);
} }
return false; return false;
} }
if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
offset++; // Change scale midi_offset++; // Change scale
midi_send_cc(&midi_device, 0, 0x7B, 0); midi_send_cc(&midi_device, 0, 0x7B, 0);
return false; return false;
} }
if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
offset--; // Change scale midi_offset--; // Change scale
midi_send_cc(&midi_device, 0, 0x7B, 0); midi_send_cc(&midi_device, 0, 0x7B, 0);
return false; return false;
} }
// basic // basic
// uint8_t note = (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row); // uint8_t note = (midi_starting_note + SCALE[record->event.key.col + midi_offset])+12*(MATRIX_ROWS - record->event.key.row);
// advanced // advanced
// uint8_t note = (starting_note + record->event.key.col + offset)+12*(MATRIX_ROWS - record->event.key.row); // uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+12*(MATRIX_ROWS - record->event.key.row);
// guitar // guitar
uint8_t note = (starting_note + record->event.key.col + offset)+5*(MATRIX_ROWS - record->event.key.row); uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+5*(MATRIX_ROWS - record->event.key.row);
// violin // violin
// uint8_t note = (starting_note + record->event.key.col + offset)+7*(MATRIX_ROWS - record->event.key.row); // uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+7*(MATRIX_ROWS - record->event.key.row);
if (record->event.pressed) { if (record->event.pressed) {
// midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127); // midi_send_noteon(&midi_device, record->event.key.row, midi_starting_note + SCALE[record->event.key.col], 127);
midi_send_noteon(&midi_device, 0, note, 127); midi_send_noteon(&midi_device, 0, note, 127);
} else { } else {
// midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127); // midi_send_noteoff(&midi_device, record->event.key.row, midi_starting_note + SCALE[record->event.key.col], 127);
midi_send_noteoff(&midi_device, 0, note, 127); midi_send_noteoff(&midi_device, 0, note, 127);
} }

@ -6,6 +6,7 @@ int offset = 7;
// music sequencer // music sequencer
static bool music_sequence_recording = false; static bool music_sequence_recording = false;
static bool music_sequence_recorded = false;
static bool music_sequence_playing = false; static bool music_sequence_playing = false;
static float music_sequence[16] = {0}; static float music_sequence[16] = {0};
static uint8_t music_sequence_count = 0; static uint8_t music_sequence_count = 0;
@ -77,6 +78,7 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
if (keycode == KC_LCTL && record->event.pressed) { // Start recording if (keycode == KC_LCTL && record->event.pressed) { // Start recording
stop_all_notes(); stop_all_notes();
music_sequence_recording = true; music_sequence_recording = true;
music_sequence_recorded = false;
music_sequence_playing = false; music_sequence_playing = false;
music_sequence_count = 0; music_sequence_count = 0;
return false; return false;
@ -84,12 +86,15 @@ bool process_music(uint16_t keycode, keyrecord_t *record) {
if (keycode == KC_LALT && record->event.pressed) { // Stop recording/playing if (keycode == KC_LALT && record->event.pressed) { // Stop recording/playing
stop_all_notes(); stop_all_notes();
if (music_sequence_recording) { // was recording
music_sequence_recorded = true;
}
music_sequence_recording = false; music_sequence_recording = false;
music_sequence_playing = false; music_sequence_playing = false;
return false; return false;
} }
if (keycode == KC_LGUI && record->event.pressed) { // Start playing if (keycode == KC_LGUI && record->event.pressed && music_sequence_recorded) { // Start playing
stop_all_notes(); stop_all_notes();
music_sequence_recording = false; music_sequence_recording = false;
music_sequence_playing = true; music_sequence_playing = true;

@ -2,61 +2,70 @@
static qk_tap_dance_state_t qk_tap_dance_state; static qk_tap_dance_state_t qk_tap_dance_state;
static void _process_tap_dance_action_pair (qk_tap_dance_state_t *state, void qk_tap_dance_pair_finished (qk_tap_dance_state_t *state, void *user_data) {
uint16_t kc1, uint16_t kc2) { qk_tap_dance_pair_t *pair = (qk_tap_dance_pair_t *)user_data;
uint16_t kc;
if (state->count == 0) if (state->count == 1) {
return; register_code (pair->kc1);
} else if (state->count == 2) {
kc = (state->count == 1) ? kc1 : kc2; register_code (pair->kc2);
}
}
register_code (kc); void qk_tap_dance_pair_reset (qk_tap_dance_state_t *state, void *user_data) {
unregister_code (kc); qk_tap_dance_pair_t *pair = (qk_tap_dance_pair_t *)user_data;
if (state->count >= 2) { if (state->count == 1) {
reset_tap_dance (state); unregister_code (pair->kc1);
} else if (state->count == 2) {
unregister_code (pair->kc2);
} }
} }
static void _process_tap_dance_action_fn (qk_tap_dance_state_t *state, static inline void _process_tap_dance_action_fn (qk_tap_dance_state_t *state,
void *user_data,
qk_tap_dance_user_fn_t fn) qk_tap_dance_user_fn_t fn)
{ {
fn(state); if (fn) {
fn(state, user_data);
}
} }
void process_tap_dance_action (uint16_t keycode) static inline void process_tap_dance_action_on_each_tap (qk_tap_dance_action_t action)
{ {
uint16_t idx = keycode - QK_TAP_DANCE; _process_tap_dance_action_fn (&qk_tap_dance_state, action.user_data, action.fn.on_each_tap);
qk_tap_dance_action_t action; }
action = tap_dance_actions[idx];
switch (action.type) {
case QK_TAP_DANCE_TYPE_PAIR:
_process_tap_dance_action_pair (&qk_tap_dance_state,
action.pair.kc1, action.pair.kc2);
break;
case QK_TAP_DANCE_TYPE_FN:
_process_tap_dance_action_fn (&qk_tap_dance_state, action.fn);
break;
default: static inline void process_tap_dance_action_on_dance_finished (qk_tap_dance_action_t action)
break; {
_process_tap_dance_action_fn (&qk_tap_dance_state, action.user_data, action.fn.on_dance_finished);
} }
static inline void process_tap_dance_action_on_reset (qk_tap_dance_action_t action)
{
_process_tap_dance_action_fn (&qk_tap_dance_state, action.user_data, action.fn.on_reset);
} }
bool process_tap_dance(uint16_t keycode, keyrecord_t *record) { bool process_tap_dance(uint16_t keycode, keyrecord_t *record) {
bool r = true; bool r = true;
uint16_t idx = keycode - QK_TAP_DANCE;
qk_tap_dance_action_t action;
switch(keycode) { switch(keycode) {
case QK_TAP_DANCE ... QK_TAP_DANCE_MAX: case QK_TAP_DANCE ... QK_TAP_DANCE_MAX:
action = tap_dance_actions[idx];
process_tap_dance_action_on_each_tap (action);
if (qk_tap_dance_state.keycode && qk_tap_dance_state.keycode != keycode) { if (qk_tap_dance_state.keycode && qk_tap_dance_state.keycode != keycode) {
process_tap_dance_action (qk_tap_dance_state.keycode); process_tap_dance_action_on_dance_finished (action);
} else if (qk_tap_dance_state.active && qk_tap_dance_state.pressed) {
reset_tap_dance (&qk_tap_dance_state);
} else { } else {
r = false; r = false;
} }
qk_tap_dance_state.active = true;
qk_tap_dance_state.pressed = record->event.pressed;
if (record->event.pressed) { if (record->event.pressed) {
qk_tap_dance_state.keycode = keycode; qk_tap_dance_state.keycode = keycode;
qk_tap_dance_state.timer = timer_read (); qk_tap_dance_state.timer = timer_read ();
@ -66,9 +75,14 @@ bool process_tap_dance(uint16_t keycode, keyrecord_t *record) {
default: default:
if (qk_tap_dance_state.keycode) { if (qk_tap_dance_state.keycode) {
process_tap_dance_action (qk_tap_dance_state.keycode); // if we are here, the tap dance was interrupted by a different key
idx = qk_tap_dance_state.keycode - QK_TAP_DANCE;
action = tap_dance_actions[idx];
process_tap_dance_action_on_each_tap (action);
process_tap_dance_action_on_dance_finished (action);
reset_tap_dance (&qk_tap_dance_state); reset_tap_dance (&qk_tap_dance_state);
qk_tap_dance_state.active = false;
} }
break; break;
} }
@ -77,14 +91,27 @@ bool process_tap_dance(uint16_t keycode, keyrecord_t *record) {
} }
void matrix_scan_tap_dance () { void matrix_scan_tap_dance () {
if (qk_tap_dance_state.keycode && timer_elapsed (qk_tap_dance_state.timer) > TAPPING_TERM) { if (qk_tap_dance_state.active && timer_elapsed (qk_tap_dance_state.timer) > TAPPING_TERM) {
process_tap_dance_action (qk_tap_dance_state.keycode); // if we are here, the tap dance was timed out
uint16_t idx = qk_tap_dance_state.keycode - QK_TAP_DANCE;
qk_tap_dance_action_t action = tap_dance_actions[idx];
process_tap_dance_action_on_dance_finished (action);
reset_tap_dance (&qk_tap_dance_state); reset_tap_dance (&qk_tap_dance_state);
} }
} }
void reset_tap_dance (qk_tap_dance_state_t *state) { void reset_tap_dance (qk_tap_dance_state_t *state) {
uint16_t idx = state->keycode - QK_TAP_DANCE;
qk_tap_dance_action_t action;
if (state->pressed)
return;
action = tap_dance_actions[idx];
process_tap_dance_action_on_reset (action);
state->keycode = 0; state->keycode = 0;
state->count = 0; state->count = 0;
state->active = false;
} }

@ -11,38 +11,41 @@ typedef struct
uint8_t count; uint8_t count;
uint16_t keycode; uint16_t keycode;
uint16_t timer; uint16_t timer;
bool active:1;
bool pressed:1;
} qk_tap_dance_state_t; } qk_tap_dance_state_t;
#define TD(n) (QK_TAP_DANCE + n) #define TD(n) (QK_TAP_DANCE + n)
typedef enum typedef void (*qk_tap_dance_user_fn_t) (qk_tap_dance_state_t *state, void *user_data);
{
QK_TAP_DANCE_TYPE_PAIR,
QK_TAP_DANCE_TYPE_FN,
} qk_tap_dance_type_t;
typedef void (*qk_tap_dance_user_fn_t) (qk_tap_dance_state_t *state);
typedef struct typedef struct
{ {
qk_tap_dance_type_t type;
union {
struct { struct {
qk_tap_dance_user_fn_t on_each_tap;
qk_tap_dance_user_fn_t on_dance_finished;
qk_tap_dance_user_fn_t on_reset;
} fn;
void *user_data;
} qk_tap_dance_action_t;
typedef struct
{
uint16_t kc1; uint16_t kc1;
uint16_t kc2; uint16_t kc2;
} pair; } qk_tap_dance_pair_t;
qk_tap_dance_user_fn_t fn;
};
} qk_tap_dance_action_t;
#define ACTION_TAP_DANCE_DOUBLE(kc1, kc2) { \ #define ACTION_TAP_DANCE_DOUBLE(kc1, kc2) { \
.type = QK_TAP_DANCE_TYPE_PAIR, \ .fn = { NULL, qk_tap_dance_pair_finished, qk_tap_dance_pair_reset }, \
.pair = { kc1, kc2 } \ .user_data = (void *)&((qk_tap_dance_pair_t) { kc1, kc2 }) \
} }
#define ACTION_TAP_DANCE_FN(user_fn) { \ #define ACTION_TAP_DANCE_FN(user_fn) { \
.type = QK_TAP_DANCE_TYPE_FN, \ .fn = { NULL, user_fn, NULL } \
.fn = user_fn \ }
#define ACTION_TAP_DANCE_FN_ADVANCED(user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_reset) { \
.fn = { user_fn_on_each_tap, user_fn_on_dance_finished, user_fn_on_reset } \
} }
extern const qk_tap_dance_action_t tap_dance_actions[]; extern const qk_tap_dance_action_t tap_dance_actions[];
@ -53,6 +56,9 @@ bool process_tap_dance(uint16_t keycode, keyrecord_t *record);
void matrix_scan_tap_dance (void); void matrix_scan_tap_dance (void);
void reset_tap_dance (qk_tap_dance_state_t *state); void reset_tap_dance (qk_tap_dance_state_t *state);
void qk_tap_dance_pair_finished (qk_tap_dance_state_t *state, void *user_data);
void qk_tap_dance_pair_reset (qk_tap_dance_state_t *state, void *user_data);
#else #else
#define TD(n) KC_NO #define TD(n) KC_NO

@ -35,7 +35,7 @@ This is not a tiny project. While this is the main readme, there are many other
* The list of possible keycodes you can use in your keymap is actually spread out in a few different places: * The list of possible keycodes you can use in your keymap is actually spread out in a few different places:
* [doc/keycode.txt](doc/keycode.txt) - an explanation of those same keycodes. * [doc/keycode.txt](doc/keycode.txt) - an explanation of those same keycodes.
* [quantum/keymap.h](quantum/keymap.h) - this is where the QMK-specific aliases are all set up. Things like the Hyper and Meh key, the Leader key, and all of the other QMK innovations. These are also explained and documented below, but `keymap.h` is where they're actually defined. * [quantum/keymap.h](quantum/keymap.h) - this is where the QMK-specific aliases are all set up. Things like the Hyper and Meh key, the Leader key, and all of the other QMK innovations. These are also explained and documented below, but `keymap.h` is where they're actually defined.
* The [TMK documentation](doc/TMK_readme.md). QMK is based on TMK, and this explains how it works internally. * The [TMK documentation](doc/TMK_README.md). QMK is based on TMK, and this explains how it works internally.
# Getting started # Getting started
@ -75,8 +75,23 @@ Debian/Ubuntu example:
sudo apt-get update sudo apt-get update
sudo apt-get install gcc-avr avr-libc dfu-programmer sudo apt-get install gcc-avr avr-libc dfu-programmer
### Docker
If this is a bit complex for you, Docker might be the turn-key solution you need. After installing [Docker](https://www.docker.com/products/docker), run the following command at the root of the QMK folder to build a keyboard/keymap:
```bash
# You'll run this every time you want to build a keymap
# modify the keymap and keyboard assigment to compile what you want
# defaults are ergodox_ez/default
docker run -e keymap=gwen -e keyboard=ergodox_ez --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware
```
This will compile the targetted keyboard/keymap and leave it in your QMK directory for you to flash.
### Vagrant ### Vagrant
If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [VAGRANT_GUIDE file](VAGRANT_GUIDE.md). If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [VAGRANT_GUIDE file](doc/VAGRANT_GUIDE.md).
## Verify Your Installation ## Verify Your Installation
1. If you haven't already, obtain this repository ([https://github.com/jackhumbert/qmk_firmware](https://github.com/jackhumbert/qmk_firmware)). You can either download it as a zip file and extract it, or clone it using the command line tool git or the Github Desktop application. 1. If you haven't already, obtain this repository ([https://github.com/jackhumbert/qmk_firmware](https://github.com/jackhumbert/qmk_firmware)). You can either download it as a zip file and extract it, or clone it using the command line tool git or the Github Desktop application.
@ -97,7 +112,7 @@ In every keymap folder, the following files are recommended:
The `make` command is how you compile the firmware into a .hex file, which can be loaded by a dfu programmer (like dfu-progammer via `make dfu`) or the [Teensy loader](https://www.pjrc.com/teensy/loader.html) (only used with Teensys). You can run `make` from the root (`/`), your keyboard folder (`/keyboards/<keyboard>/`), or your keymap folder (`/keyboards/<keyboard>/keymaps/<keymap>/`) if you have a `Makefile` there (see the example [here](/doc/keymap_makefile_example.mk)). The `make` command is how you compile the firmware into a .hex file, which can be loaded by a dfu programmer (like dfu-progammer via `make dfu`) or the [Teensy loader](https://www.pjrc.com/teensy/loader.html) (only used with Teensys). You can run `make` from the root (`/`), your keyboard folder (`/keyboards/<keyboard>/`), or your keymap folder (`/keyboards/<keyboard>/keymaps/<keymap>/`) if you have a `Makefile` there (see the example [here](/doc/keymap_makefile_example.mk)).
By default, this will generate a `<keyboard>_<keymap>.hex` file in whichever folder you run `make` from. These files are ignored by git, so don't worry about deleting them when committing/creating pull requests. Your .hex file will also be available on qmk.fm/keyboards/<keyboard>/keymaps/<keymap>/. By default, this will generate a `<keyboard>_<keymap>.hex` file in whichever folder you run `make` from. These files are ignored by git, so don't worry about deleting them when committing/creating pull requests.
Below are some definitions that will be useful: Below are some definitions that will be useful:
@ -152,7 +167,7 @@ This allows you to use the system and audio control key codes.
`CONSOLE_ENABLE` `CONSOLE_ENABLE`
TODO This allows you to print messages that can be read using [`hid_listen`](https://www.pjrc.com/teensy/hid_listen.html). Add this to your `Makefile`, and set it to `yes`. Then put `println`, `printf`, etc. in your keymap or anywhere in the `qmk` source. Finally, open `hid_listen` and enjoy looking at your printed messages.
`COMMAND_ENABLE` `COMMAND_ENABLE`
@ -331,6 +346,8 @@ That's what `KC_LEAD` does. Here's an example:
3. Within your `matrix_scan_user` function, do something like this: 3. Within your `matrix_scan_user` function, do something like this:
``` ```
LEADER_EXTERNS();
void matrix_scan_user(void) { void matrix_scan_user(void) {
LEADER_DICTIONARY() { LEADER_DICTIONARY() {
leading = false; leading = false;
@ -358,7 +375,7 @@ As you can see, you have three function. you can use - `SEQ_ONE_KEY` for single-
### Tap Dance: A single key can do 3, 5, or 100 different things ### Tap Dance: A single key can do 3, 5, or 100 different things
Hit the semicolon key once, send a semicolon. Hit it twice, rapidly -- send a colon. Hit it three times, and your keyboard's LEDs do a wild dance. That's just one example of what Tap Dance can do. It's one of the nicest community-contributed features in the firmware, conceived and created by [algernon](https://github.com/algernon) in [#451](https://github.com/jackhumbert/qmk_firmware/pull/451). Here's how Algernon describes the feature: Hit the semicolon key once, send a semicolon. Hit it twice, rapidly -- send a colon. Hit it three times, and your keyboard's LEDs do a wild dance. That's just one example of what Tap Dance can do. It's one of the nicest community-contributed features in the firmware, conceived and created by [algernon](https://github.com/algernon) in [#451](https://github.com/jackhumbert/qmk_firmware/pull/451). Here's how algernon describes the feature:
With this feature one can specify keys that behave differently, based on the amount of times they have been tapped, and when interrupted, they get handled before the interrupter. With this feature one can specify keys that behave differently, based on the amount of times they have been tapped, and when interrupted, they get handled before the interrupter.
@ -372,17 +389,16 @@ But lets start with how to use it, first!
First, you will need `TAP_DANCE_ENABLE=yes` in your `Makefile`, because the feature is disabled by default. This adds a little less than 1k to the firmware size. Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro, that - similar to `F()`, takes a number, which will later be used as an index into the `tap_dance_actions` array. First, you will need `TAP_DANCE_ENABLE=yes` in your `Makefile`, because the feature is disabled by default. This adds a little less than 1k to the firmware size. Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro, that - similar to `F()`, takes a number, which will later be used as an index into the `tap_dance_actions` array.
This array specifies what actions shall be taken when a tap-dance key is in action. Currently, there are two possible options: This array specifies what actions shall be taken when a tap-dance key is in action. Currently, there are three possible options:
* `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. * `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held.
* `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the current state of the tap-dance action. * `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action.
* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function on when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise. The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise.
And that's the bulk of it! And that's the bulk of it!
Do note, however, that this implementation does have some consequences: keys do not register until either they reach the tapping ceiling, or they time out. This means that if you hold the key, nothing happens, no repeat, no nothing. It is possible to detect held state, and register an action then too, but that's not implemented yet. Keys also unregister immediately after being registered, so you can't even hold the second tap. This is intentional, to be consistent.
And now, on to the explanation of how it works! And now, on to the explanation of how it works!
The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and the timer. The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and the timer.
@ -399,35 +415,81 @@ In the end, let's see a full example!
enum { enum {
CT_SE = 0, CT_SE = 0,
CT_CLN, CT_CLN,
CT_EGG CT_EGG,
CT_FLSH,
}; };
/* Have the above three on the keymap, TD(CT_SE), etc... */ /* Have the above three on the keymap, TD(CT_SE), etc... */
void dance_cln (qk_tap_dance_state_t *state) { void dance_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) { if (state->count == 1) {
register_code (KC_RSFT); register_code (KC_RSFT);
register_code (KC_SCLN); register_code (KC_SCLN);
unregister_code (KC_SCLN);
unregister_code (KC_RSFT);
} else { } else {
register_code (KC_SCLN); register_code (KC_SCLN);
}
}
void dance_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
unregister_code (KC_RSFT);
unregister_code (KC_SCLN);
} else {
unregister_code (KC_SCLN); unregister_code (KC_SCLN);
reset_tap_dance (state);
} }
} }
void dance_egg (qk_tap_dance_state_t *state) { void dance_egg (qk_tap_dance_state_t *state, void *user_data) {
if (state->count >= 100) { if (state->count >= 100) {
SEND_STRING ("Safety dance!"); SEND_STRING ("Safety dance!");
reset_tap_dance (state); reset_tap_dance (state);
} }
} }
// on each tap, light up one led, from right to left
// on the forth tap, turn them off from right to left
void dance_flsh_each(qk_tap_dance_state_t *state, void *user_data) {
switch (state->count) {
case 1:
ergodox_right_led_3_on();
break;
case 2:
ergodox_right_led_2_on();
break;
case 3:
ergodox_right_led_1_on();
break;
case 4:
ergodox_right_led_3_off();
_delay_ms(50);
ergodox_right_led_2_off();
_delay_ms(50);
ergodox_right_led_1_off();
}
}
// on the fourth tap, set the keyboard on flash state
void dance_flsh_finished(qk_tap_dance_state_t *state, void *user_data) {
if (state->count >= 4) {
reset_keyboard();
reset_tap_dance(state);
}
}
// if the flash state didnt happen, then turn off leds, left to right
void dance_flsh_reset(qk_tap_dance_state_t *state, void *user_data) {
ergodox_right_led_1_off();
_delay_ms(50);
ergodox_right_led_2_off();
_delay_ms(50);
ergodox_right_led_3_off();
}
const qk_tap_dance_action_t tap_dance_actions[] = { const qk_tap_dance_action_t tap_dance_actions[] = {
[CT_SE] = ACTION_TAP_DANCE_DOUBLE (KC_SPC, KC_ENT) [CT_SE] = ACTION_TAP_DANCE_DOUBLE (KC_SPC, KC_ENT)
,[CT_CLN] = ACTION_TAP_DANCE_FN (dance_cln) ,[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_cln_finished, dance_cln_reset)
,[CT_EGG] = ACTION_TAP_DANCE_FN (dance_egg) ,[CT_EGG] = ACTION_TAP_DANCE_FN (dance_egg)
,[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED (dance_flsh_each, dance_flsh_finished, dance_flsh_reset)
}; };
``` ```
@ -732,7 +794,7 @@ float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
float goodbye[][2] = SONG(GOODBYE_SOUND); float goodbye[][2] = SONG(GOODBYE_SOUND);
``` ```
Wherein we bind predefined songs (from [audio/song_list.h](/audio/song_list.h)) into named variables. This is one optimization that helps save on memory: These songs only take up memory when you reference them in your keymap, because they're essentially all preprocessor directives. Wherein we bind predefined songs (from [quantum/audio/song_list.h](/quantum/audio/song_list.h)) into named variables. This is one optimization that helps save on memory: These songs only take up memory when you reference them in your keymap, because they're essentially all preprocessor directives.
So now you have something called `tone_plover` for example. How do you make it play the Plover tune, then? If you look further down the keymap, you'll see this: So now you have something called `tone_plover` for example. How do you make it play the Plover tune, then? If you look further down the keymap, you'll see this:
@ -744,6 +806,17 @@ This is inside one of the macros. So when that macro executes, your keyboard pla
"Rest style" in the method signature above (the last parameter) specifies if there's a rest (a moment of silence) between the notes. "Rest style" in the method signature above (the last parameter) specifies if there's a rest (a moment of silence) between the notes.
## Recording And Playing back Music
* ```Music On``` - Turn music mode on. The default mapping is ```Lower+Upper+C```
* ```LCTL``` - start a recording
* play some tones
* ```LALT``` - stop recording, stop playing
* ```LGUI``` - play recording
* ```LALT``` - stop playing
* ```Music Off``` - Turn music mode off. The default mapping is ```Lower+Upper+V```
## MIDI functionalty ## MIDI functionalty
This is still a WIP, but check out `quantum/keymap_midi.c` to see what's happening. Enable from the Makefile. This is still a WIP, but check out `quantum/keymap_midi.c` to see what's happening. Enable from the Makefile.
@ -774,7 +847,7 @@ AutoHotkey inserts the Text right of `Send, ` when this combination is pressed.
## RGB Under Glow Mod ## RGB Under Glow Mod
![Planck with RGB Underglow](https://raw.githubusercontent.com/yangliu/qmk_firmware/planck-rgb/keyboards/planck/keymaps/yang/planck-with-rgb-underglow.jpg) ![Planck with RGB Underglow](https://raw.githubusercontent.com/jackhumbert/qmk_firmware/master/keyboards/planck/keymaps/yang/planck-with-rgb-underglow.jpg)
Here is a quick demo on Youtube (with NPKC KC60) (https://www.youtube.com/watch?v=VKrpPAHlisY). Here is a quick demo on Youtube (with NPKC KC60) (https://www.youtube.com/watch?v=VKrpPAHlisY).
@ -799,7 +872,7 @@ The firmware supports 5 different light effects, and the color (hue, saturation,
### WS2812 Wiring ### WS2812 Wiring
![WS2812 Wiring](https://raw.githubusercontent.com/yangliu/qmk_firmware/planck-rgb/keyboards/planck/keymaps/yang/WS2812-wiring.jpg) ![WS2812 Wiring](https://raw.githubusercontent.com/jackhumbert/qmk_firmware/master/keyboards/planck/keymaps/yang/WS2812-wiring.jpg)
Please note the USB port can only supply a limited amount of power to the keyboard (500mA by standard, however, modern computer and most usb hubs can provide 700+mA.). According to the data of NeoPixel from Adafruit, 30 WS2812 LEDs require a 5V 1A power supply, LEDs used in this mod should not more than 20. Please note the USB port can only supply a limited amount of power to the keyboard (500mA by standard, however, modern computer and most usb hubs can provide 700+mA.). According to the data of NeoPixel from Adafruit, 30 WS2812 LEDs require a 5V 1A power supply, LEDs used in this mod should not more than 20.

@ -107,6 +107,10 @@ flip: $(BUILD_DIR)/$(TARGET).hex
batchisp -hardware usb -device $(MCU) -operation start reset 0 batchisp -hardware usb -device $(MCU) -operation start reset 0
dfu: $(BUILD_DIR)/$(TARGET).hex sizeafter dfu: $(BUILD_DIR)/$(TARGET).hex sizeafter
until dfu-programmer $(MCU) get bootloader-version; do\
echo "Error: Bootloader not found. Trying again in 5s." ;\
sleep 5 ;\
done
ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1))) ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1)))
dfu-programmer $(MCU) erase --force dfu-programmer $(MCU) erase --force
else else

@ -140,9 +140,9 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] =
HID_RI_USAGE(8, 0x80), /* System Control */ HID_RI_USAGE(8, 0x80), /* System Control */
HID_RI_COLLECTION(8, 0x01), /* Application */ HID_RI_COLLECTION(8, 0x01), /* Application */
HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM), HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM),
HID_RI_LOGICAL_MINIMUM(16, 0x0001), HID_RI_LOGICAL_MINIMUM(16, 0x0081),
HID_RI_LOGICAL_MAXIMUM(16, 0x00B7), HID_RI_LOGICAL_MAXIMUM(16, 0x00B7),
HID_RI_USAGE_MINIMUM(16, 0x0001), /* System Power Down */ HID_RI_USAGE_MINIMUM(16, 0x0081), /* System Power Down */
HID_RI_USAGE_MAXIMUM(16, 0x00B7), /* System Display LCD Autoscale */ HID_RI_USAGE_MAXIMUM(16, 0x00B7), /* System Display LCD Autoscale */
HID_RI_REPORT_SIZE(8, 16), HID_RI_REPORT_SIZE(8, 16),
HID_RI_REPORT_COUNT(8, 1), HID_RI_REPORT_COUNT(8, 1),

Loading…
Cancel
Save