From 00c3ecc23849efe525fb52fc82c938ce1b521c21 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Tue, 29 Dec 2015 21:36:17 +0100 Subject: [PATCH 01/52] Initial TypeMatrix keymap: Layer 0 --- .../ergodox_ez/keymaps/keymap_typematrix.c | 188 ++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 keyboard/ergodox_ez/keymaps/keymap_typematrix.c diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c new file mode 100644 index 0000000000..5b848fb1a6 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -0,0 +1,188 @@ +/* TypeMatrix-2030-like keymap */ +#include "ergodox_ez.h" +#include "debug.h" +#include "action_layer.h" + +#define BASE 0 // default layer +#define SYMB 1 // symbols +#define MDIA 2 // media keys + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | ] | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T |Backsp| |Backsp| Y | U | I | O | P | [ | + * |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| + * | LShift | A | S | D | F | G |------| |------| H | J | K | L |; / L2| '/Shift| + * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| + * | LShift | Z | X | C | V | B |/Hyper| |/ Meh | N | M | , | . | / | \/Shift| + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |LCtrl | ~L1 | LGui | Play | App | | Left |Right | - | = |RCtrl | + * `----------------------------------' `----------------------------------' + * ,--------------. ,---------------. + * |Esc/Alt| L1 | | Home |Ctrl/End| + * ,------+-------+------| |------+--------+------. + * |Space | Space | PgUp | | Up | | | + * | / | / |------| |------| RAlt |Space | + * | Alt | Alt | PgDn | | Down | | | + * `---------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[BASE] = KEYMAP( // layer 0 : default + // left hand + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSPC, + KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_ENT), + KC_LCTL, KC_FN1, KC_LGUI,KC_MPLY,KC_APP, + + ALT_T(KC_ESC), TG(1), + KC_PGUP, + ALT_T(KC_SPC), ALT_T(KC_SPC), KC_PGDN, + + // right hand + KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RBRC, + KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, + KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),SFT_T(KC_QUOT), + MEH_T(KC_ENT),KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_T(KC_BSLS), + KC_LEFT,KC_RGHT,KC_MINS,KC_EQL, KC_RCTL, + + KC_HOME, CTL_T(KC_END), + KC_UP, + KC_DOWN, KC_RALT, KC_SPC + ), +/* Keymap 1: Symbol Layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | . | 0 | = | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = KEYMAP( + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, + 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_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_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, + KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, + KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, + KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | MsUp | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | Prev | Next | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | |Brwser| + * | | |------| |------| |Back | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + 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_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = 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; +}; + +// 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) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } + +}; From 900c1f991df6b30a45a25094c61bcf5ed54119cf Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Tue, 29 Dec 2015 21:36:17 +0100 Subject: [PATCH 02/52] Initial TypeMatrix keymap: Layer 0 --- keyboard/ergodox_ez/keymaps/keymap_typematrix.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 5b848fb1a6..38b8da6352 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| * | LShift | A | S | D | F | G |------| |------| H | J | K | L |; / L2| '/Shift| * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| - * | LShift | Z | X | C | V | B |/Hyper| |/ Meh | N | M | , | . | / | \/Shift| + * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | \/Shift| * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * |LCtrl | ~L1 | LGui | Play | App | | Left |Right | - | = |RCtrl | * `----------------------------------' `----------------------------------' @@ -36,7 +36,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSPC, KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_ENT), + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, KC_LCTL, KC_FN1, KC_LGUI,KC_MPLY,KC_APP, ALT_T(KC_ESC), TG(1), @@ -47,7 +47,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RBRC, KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),SFT_T(KC_QUOT), - MEH_T(KC_ENT),KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_T(KC_BSLS), + KC_ENT, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_T(KC_BSLS), KC_LEFT,KC_RGHT,KC_MINS,KC_EQL, KC_RCTL, KC_HOME, CTL_T(KC_END), From ac94577cbe03b771820a17e94ced640d78c06dfc Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Wed, 30 Dec 2015 00:51:12 +0100 Subject: [PATCH 03/52] TypeMatrix keymap: Layer 1 (Fn Layer) --- .../ergodox_ez/keymaps/keymap_typematrix.c | 47 +++++++++++-------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 38b8da6352..01ae6bbcae 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -57,42 +57,44 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 1: Symbol Layer * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * | | F1 | F2 | F3 | F4 | F5 |Insert| |Insert| F6 | F7 | Tab | / | * | - | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * | | F8 | F9 | F10 | F11 | F12 |VolUp | | Home | Up | End | 7 | 8 | 9 | + | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | + * | | | | | | |------| |------| Down | Right| 4 | 5 | 6 | + | + * |--------+------+------+------+------+------|VolDn | | Left |------+------+------+------+------+--------| + * | | | cut | copy |paste | Mute | | | | | Prev | 1 | 2 | 3 |KpEnter | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | . | 0 | = | | - * `----------------------------------' `----------------------------------' + * | | | | | | | Next | 0 | 00 | . |KpEnter| + * `----------------------------------' `-----------------------------------' * ,-------------. ,-------------. - * | | | | | | + * | | | |n.lock|c.lock| * ,------|------|------| |------+------+------. * | | | | | | | | - * | | |------| |------| | | + * | Mute | |------| |------| | | * | | | | | | | | * `--------------------' `--------------------' */ // SYMBOLS [SYMB] = KEYMAP( // left hand - KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, - KC_TRNS,KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, - 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_TRNS, + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_INS, + KC_TRNS,KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLU, + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS,KC_TRNS,LSFT(KC_DELT),LCTL(KC_INS),LSFT(KC_INS),KC_MUTE,KC_VOLD, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, KC_TRNS, - KC_TRNS,KC_TRNS,KC_TRNS, + KC_MUTE,KC_TRNS,KC_TRNS, // right hand - KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, - KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, - KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, - KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS, - KC_TRNS, KC_TRNS, + KC_INS, KC_F6, KC_F7, KC_TAB, KC_PSLS, KC_PAST, KC_PMNS, + KC_HOME, KC_UP, KC_END, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_DOWN, KC_RGHT, KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_LEFT, KC_TRNS, KC_MPRV, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_MNXT, KC_P0, M(1), KC_PDOT, KC_PENT, + + KC_NLCK, KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), @@ -154,6 +156,11 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) unregister_code(KC_RSFT); } break; + case 1: + if (record->event.pressed) { + return MACRO( I(25), T(P0), T(P0), END ); + } + break; } return MACRO_NONE; }; From 8677ec0c9fbf0d0bb639ad082e27d6650b3c1dd0 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Wed, 30 Dec 2015 00:56:02 +0100 Subject: [PATCH 04/52] Use 3rd led as caps-lock indicator --- keyboard/ergodox_ez/keymaps/keymap_typematrix.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 01ae6bbcae..1b201c2237 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -2,6 +2,7 @@ #include "ergodox_ez.h" #include "debug.h" #include "action_layer.h" +#include "led.h" #define BASE 0 // default layer #define SYMB 1 // symbols @@ -191,5 +192,7 @@ void * matrix_scan_user(void) { // none break; } - + if (host_keyboard_leds() & (1< Date: Wed, 30 Dec 2015 12:59:33 +0100 Subject: [PATCH 05/52] Make bottom row more similar to the TM - keep home/end at the same location - RAlt as first key on the bottom right row - left/right arrows moved on the thumb, near the other arrows - added Alt on App - added Alt on Mute in Layer 1 - removed ALT from left spaces to avoid issues when pressing too slowly --- .../ergodox_ez/keymaps/keymap_typematrix.c | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 1b201c2237..fd7c020bfe 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -20,15 +20,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | \/Shift| * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * |LCtrl | ~L1 | LGui | Play | App | | Left |Right | - | = |RCtrl | - * `----------------------------------' `----------------------------------' - * ,--------------. ,---------------. - * |Esc/Alt| L1 | | Home |Ctrl/End| - * ,------+-------+------| |------+--------+------. - * |Space | Space | PgUp | | Up | | | - * | / | / |------| |------| RAlt |Space | - * | Alt | Alt | PgDn | | Down | | | - * `---------------------' `----------------------' + * |LCtrl | ~L1 | LGui | Play |App/Alt| | RAlt | - | Home | = |End/Ctl| + * `-----------------------------------' `-----------------------------------' + * ,--------------. ,-------------. + * |Esc/Alt| L1 | | Left |Right | + * ,------+-------+------| |------+------+------. + * | | | PgUp | | Up | | | + * |Space | Space |------| |------|Space |Space | + * | | | PgDn | | Down | | | + * `---------------------' `--------------------' */ // If it accepts an argument (i.e, is a function), it doesn't need KC_. // Otherwise, it needs KC_* @@ -38,22 +38,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSPC, KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, - KC_LCTL, KC_FN1, KC_LGUI,KC_MPLY,KC_APP, + KC_LCTL, KC_FN1, KC_LGUI,KC_MPLY,ALT_T(KC_APP), ALT_T(KC_ESC), TG(1), KC_PGUP, - ALT_T(KC_SPC), ALT_T(KC_SPC), KC_PGDN, + KC_SPC, KC_SPC, KC_PGDN, // right hand KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RBRC, KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),SFT_T(KC_QUOT), KC_ENT, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_T(KC_BSLS), - KC_LEFT,KC_RGHT,KC_MINS,KC_EQL, KC_RCTL, + KC_RALT,KC_MINS,KC_HOME,KC_EQL, CTL_T(KC_END), - KC_HOME, CTL_T(KC_END), + KC_LEFT, KC_RGHT, KC_UP, - KC_DOWN, KC_RALT, KC_SPC + KC_DOWN, KC_SPC, KC_SPC ), /* Keymap 1: Symbol Layer * @@ -71,9 +71,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-------------. ,-------------. * | | | |n.lock|c.lock| * ,------|------|------| |------+------+------. - * | | | | | | | | - * | Mute | |------| |------| | | - * | | | | | | | | + * | Mute | | | | | | | + * | / | |------| |------| | | + * | Alt | | | | | | | * `--------------------' `--------------------' */ // SYMBOLS @@ -87,7 +87,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS,KC_TRNS, KC_TRNS, - KC_MUTE,KC_TRNS,KC_TRNS, + ALT_T(KC_MUTE),KC_TRNS,KC_TRNS, // right hand KC_INS, KC_F6, KC_F7, KC_TAB, KC_PSLS, KC_PAST, KC_PMNS, KC_HOME, KC_UP, KC_END, KC_P7, KC_P8, KC_P9, KC_PPLS, From 56070d424b9dd90f8153b2fa1cb03c896bf5ee68 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Wed, 30 Dec 2015 13:26:31 +0100 Subject: [PATCH 06/52] Added description of the layout and main differences with real TM --- .../ergodox_ez/keymaps/keymap_typematrix.c | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index fd7c020bfe..de864ddfef 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -1,4 +1,24 @@ -/* TypeMatrix-2030-like keymap */ +/* TypeMatrix-2030-like keymap + * --------------------------- + * Currently supported features: + * Layer 0: default layer close to the TM with the following differences: + * - top row and rightmost column are removed, corresponding keys are displaced, except app-keys which are removed + * - bottom-left keys are reorganized on a single roz as: Ctrl, "Fn", Gui, Play, App/Alt + * - "shuffle" and "desktop" are not supported + * - right-shift is moved on ' and \ + * - right-ctrl is moved on End + * - ] is moved in place of the dash (-) + * - dash (-) and = are moved on bottom right row + * - arrows and PgUp/PgDn are moved on the thumbs + * Layer 1: "Fn"-layer close to the TM with the following differences: + * - provides access to F1-F12 + * - VolUp & VolDn are only on left hand + * - arrows & numpad are displaced by 1 to the top left + * Layer 2: TODO -- currently kept as in the default ErgoDox EZ layout + * Leds: + * - left (1st) & middle (2nd) leds are used to indicate layers 1 & 2 respectively + * - right (3rd) led is used to indicate caps-lock + */ #include "ergodox_ez.h" #include "debug.h" #include "action_layer.h" From 38a0e62a10fcbb4b96f8f69d4fc69872d2d3a7ed Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 9 Jan 2016 00:55:54 +0100 Subject: [PATCH 07/52] Layer 1: restore backspace, ralt and ctl on right hand - home replaced by KC_TRNS to make backspace available - prev/next moved left to space to restore ralt - arrows moved down to have reversed T-shape - added ctl on bottom right KpEnter, to match layer 0 - removed alt from mute, as it was already no more in layer 0 --- .../ergodox_ez/keymaps/keymap_typematrix.c | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index de864ddfef..8e442e3cc2 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -80,20 +80,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,--------------------------------------------------. ,--------------------------------------------------. * | | F1 | F2 | F3 | F4 | F5 |Insert| |Insert| F6 | F7 | Tab | / | * | - | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | F8 | F9 | F10 | F11 | F12 |VolUp | | Home | Up | End | 7 | 8 | 9 | + | + * | | F8 | F9 | F10 | F11 | F12 |VolUp | | | | Home | 7 | 8 | 9 | + | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | |------| |------| Down | Right| 4 | 5 | 6 | + | - * |--------+------+------+------+------+------|VolDn | | Left |------+------+------+------+------+--------| - * | | | cut | copy |paste | Mute | | | | | Prev | 1 | 2 | 3 |KpEnter | + * | | | | | | |------| |------| Up | End | 4 | 5 | 6 | + | + * |--------+------+------+------+------+------|VolDn | | |------+------+------+------+------+--------| + * | | | cut | copy |paste | Mute | | | Left | Down | Right| 1 | 2 | 3 |KpEnter | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | Next | 0 | 00 | . |KpEnter| + * | | | | | | | | 0 | 00 | . |Etr/Ctl| * `----------------------------------' `-----------------------------------' * ,-------------. ,-------------. * | | | |n.lock|c.lock| * ,------|------|------| |------+------+------. - * | Mute | | | | | | | - * | / | |------| |------| | | - * | Alt | | | | | | | + * | | | | | Next | | | + * | Mute | |------| |------| | | + * | | | | | Prev | | | * `--------------------' `--------------------' */ // SYMBOLS @@ -107,17 +107,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS,KC_TRNS, KC_TRNS, - ALT_T(KC_MUTE),KC_TRNS,KC_TRNS, + KC_MUTE, KC_TRNS,KC_TRNS, // right hand KC_INS, KC_F6, KC_F7, KC_TAB, KC_PSLS, KC_PAST, KC_PMNS, - KC_HOME, KC_UP, KC_END, KC_P7, KC_P8, KC_P9, KC_PPLS, - KC_DOWN, KC_RGHT, KC_P4, KC_P5, KC_P6, KC_PPLS, - KC_LEFT, KC_TRNS, KC_MPRV, KC_P1, KC_P2, KC_P3, KC_PENT, - KC_MNXT, KC_P0, M(1), KC_PDOT, KC_PENT, + KC_TRNS, KC_TRNS, KC_HOME, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_UP, KC_END, KC_P4, KC_P5, KC_P6, KC_PPLS, + KC_LEFT, KC_DOWN, KC_RGHT, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_TRNS, KC_P0, M(1), KC_PDOT, CTL_T(KC_PENT), KC_NLCK, KC_CAPS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS + KC_MPRV, + KC_MNXT, KC_TRNS, KC_TRNS ), /* Keymap 2: Media and mouse keys * From bfda6ee41773355c413904b128b317ee7eb45569 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 9 Jan 2016 17:47:26 +0100 Subject: [PATCH 08/52] Split fn layer from numbers layer to better match the TM behaviour - removed access to layer 2 from ";" key - "fn" key toggles both layers 1 & 2 - replaced media and mouse layer by fn layer - renamed symbol layer to numbers layer - moved all F-keys together on left hand --- .../ergodox_ez/keymaps/keymap_typematrix.c | 156 +++++++++--------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 8e442e3cc2..5bd2f9d725 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -10,11 +10,12 @@ * - ] is moved in place of the dash (-) * - dash (-) and = are moved on bottom right row * - arrows and PgUp/PgDn are moved on the thumbs - * Layer 1: "Fn"-layer close to the TM with the following differences: - * - provides access to F1-F12 - * - VolUp & VolDn are only on left hand - * - arrows & numpad are displaced by 1 to the top left - * Layer 2: TODO -- currently kept as in the default ErgoDox EZ layout + * Layer 1: numbers layer close to the TM when toggling "num" with the following differences: + * - numpad is displaced by 1 to the top left + * - arrows are displaced by 1 to the left + * - provides access to F1-F12, caps lock and num lock + * Layer 2: "fn" layer ("fn" key toggles both layers 1 & 2) with the following differences: + * - VolUp & VolDn are only on left hand to keep access to arrows on right hand * Leds: * - left (1st) & middle (2nd) leds are used to indicate layers 1 & 2 respectively * - right (3rd) led is used to indicate caps-lock @@ -25,8 +26,8 @@ #include "led.h" #define BASE 0 // default layer -#define SYMB 1 // symbols -#define MDIA 2 // media keys +#define NMBR 1 // numbers layer +#define FNLR 2 // fn layer const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 0: Basic layer @@ -36,11 +37,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | Tab | Q | W | E | R | T |Backsp| |Backsp| Y | U | I | O | P | [ | * |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| - * | LShift | A | S | D | F | G |------| |------| H | J | K | L |; / L2| '/Shift| + * | LShift | A | S | D | F | G |------| |------| H | J | K | L | ; | '/Shift| * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | \/Shift| * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * |LCtrl | ~L1 | LGui | Play |App/Alt| | RAlt | - | Home | = |End/Ctl| + * |LCtrl | fn | LGui | Play |App/Alt| | RAlt | - | Home | = |End/Ctl| * `-----------------------------------' `-----------------------------------' * ,--------------. ,-------------. * |Esc/Alt| L1 | | Left |Right | @@ -58,56 +59,56 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSPC, KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, - KC_LCTL, KC_FN1, KC_LGUI,KC_MPLY,ALT_T(KC_APP), + KC_LCTL, M(2), KC_LGUI,KC_MPLY,ALT_T(KC_APP), ALT_T(KC_ESC), TG(1), KC_PGUP, KC_SPC, KC_SPC, KC_PGDN, // right hand - KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RBRC, - KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, - KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),SFT_T(KC_QUOT), - KC_ENT, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_T(KC_BSLS), - KC_RALT,KC_MINS,KC_HOME,KC_EQL, CTL_T(KC_END), + KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RBRC, + KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, + KC_H, KC_J, KC_K, KC_L, KC_SCLN, SFT_T(KC_QUOT), + KC_ENT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_BSLS), + KC_RALT, KC_MINS, KC_HOME, KC_EQL, CTL_T(KC_END), KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, KC_SPC, KC_SPC ), -/* Keymap 1: Symbol Layer +/* Keymap 1: Numbers Layer * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 |Insert| |Insert| F6 | F7 | Tab | / | * | - | + * | | F1 | F2 | F3 | F4 | F5 | | | | | | Tab | / | * | - | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | F8 | F9 | F10 | F11 | F12 |VolUp | | | | Home | 7 | 8 | 9 | + | + * | | F6 | F7 | F8 | F9 | F10 | | | | | Home | 7 | 8 | 9 | + | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | |------| |------| Up | End | 4 | 5 | 6 | + | - * |--------+------+------+------+------+------|VolDn | | |------+------+------+------+------+--------| - * | | | cut | copy |paste | Mute | | | Left | Down | Right| 1 | 2 | 3 |KpEnter | + * | | F11 | F12 | | | |------| |------| Up | End | 4 | 5 | 6 | + | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | Left | Down | Right| 1 | 2 | 3 |KpEnter | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * | | | | | | | | 0 | 00 | . |Etr/Ctl| * `----------------------------------' `-----------------------------------' * ,-------------. ,-------------. * | | | |n.lock|c.lock| * ,------|------|------| |------+------+------. - * | | | | | Next | | | - * | Mute | |------| |------| | | - * | | | | | Prev | | | + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | * `--------------------' `--------------------' */ // SYMBOLS -[SYMB] = KEYMAP( +[NMBR] = KEYMAP( // left hand - KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_INS, - KC_TRNS,KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLU, - KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS,KC_TRNS,LSFT(KC_DELT),LCTL(KC_INS),LSFT(KC_INS),KC_MUTE,KC_VOLD, - KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_TRNS, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, - KC_MUTE, KC_TRNS,KC_TRNS, + KC_TRNS, KC_TRNS,KC_TRNS, // right hand KC_INS, KC_F6, KC_F7, KC_TAB, KC_PSLS, KC_PAST, KC_PMNS, KC_TRNS, KC_TRNS, KC_HOME, KC_P7, KC_P8, KC_P9, KC_PPLS, @@ -116,73 +117,77 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_P0, M(1), KC_PDOT, CTL_T(KC_PENT), KC_NLCK, KC_CAPS, - KC_MPRV, - KC_MNXT, KC_TRNS, KC_TRNS + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS ), -/* Keymap 2: Media and mouse keys +/* Keymap 2: fn layer * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | | | | | | | | | + * | | | | | | |Insert| |Insert| | | | | | | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | MsUp | | | | | | | | | | | | + * | | | | | | |VolUp | | | | | | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | + * | | | | | | |------| |------| | | | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | | | | | | | Prev | Next | | | + * | | | cut | copy |paste | Mute |VolDn | | | | | | | | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | + * | | | | | | | | | | | | * `----------------------------------' `----------------------------------' * ,-------------. ,-------------. * | | | | | | * ,------|------|------| |------+------+------. - * | | | | | | |Brwser| - * | | |------| |------| |Back | - * | | | | | | | | + * | | | | | Next | | | + * | Mute | |------| |------| | | + * | | | | | Prev | | | * `--------------------' `--------------------' */ // MEDIA AND MOUSE -KEYMAP( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, +[FNLR] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, LSFT(KC_DELT),LCTL(KC_INS),LSFT(KC_INS), KC_MUTE, KC_VOLD, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, + KC_MUTE, KC_TRNS, KC_TRNS, // right hand + KC_INS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, - KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_WBAK + KC_MPRV, + KC_MNXT, KC_TRNS, KC_TRNS ), }; const uint16_t PROGMEM fn_actions[] = { - [1] = 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) { + switch(id) { case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); - } + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } break; case 1: - if (record->event.pressed) { - return MACRO( I(25), T(P0), T(P0), END ); - } + if (record->event.pressed) { + return MACRO( I(25), T(P0), T(P0), END ); + } break; - } + case 2: + layer_state ^= (1 << NMBR) | (1 << FNLR); + break; + } return MACRO_NONE; }; @@ -194,24 +199,19 @@ void * matrix_init_user(void) { // Runs constantly in the background, in a loop. void * matrix_scan_user(void) { - uint8_t layer = biton32(layer_state); - ergodox_board_led_off(); ergodox_right_led_1_off(); ergodox_right_led_2_off(); ergodox_right_led_3_off(); - switch (layer) { - // TODO: Make this relevant to the ErgoDox EZ. - case 1: - ergodox_right_led_1_on(); - break; - case 2: - ergodox_right_led_2_on(); - break; - default: - // none - break; + // led 1: numbers layer + if (layer_state & (1 << NMBR)) { + ergodox_right_led_1_on(); } + // led 2: fn layer + if (layer_state & (1 << FNLR)) { + ergodox_right_led_2_on(); + } + // led 3: caps lock if (host_keyboard_leds() & (1< Date: Sun, 10 Jan 2016 19:15:33 +0100 Subject: [PATCH 09/52] Added fn-eject, fn-power .. fn-pause keys Eject does not work though, see jackhumbert/qmk_firmware#82 and tmk/tmk_keyboard#250 --- keyboard/ergodox_ez/keymaps/keymap_typematrix.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 5bd2f9d725..6151b3628d 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -123,9 +123,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 2: fn layer * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | |Insert| |Insert| | | | | | | + * | | | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk| * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | | | |VolUp | | | | | | | | | + * | | | | | | |VolUp | | | | | | | | Pause | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | | | | | | |------| |------| | | | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| @@ -153,8 +153,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, // right hand - KC_INS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_INS, KC_EJCT, KC_PWR, KC_SLEP, KC_WAKE, KC_PSCR, KC_SLCK, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, From d3e4cc9af66630906f023cf83f1df46b065435a5 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sun, 10 Jan 2016 19:49:08 +0100 Subject: [PATCH 10/52] Implement cut/copy/paste as macros Workaround for jackhumbert/qmk_firmware#81 + added macro names + removed unused macro 0 --- .../ergodox_ez/keymaps/keymap_typematrix.c | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 6151b3628d..7161a638a8 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -29,6 +29,12 @@ #define NMBR 1 // numbers layer #define FNLR 2 // fn layer +#define MDBL0 1 +#define MFNLR 2 +#define MCUT 3 +#define MCOPY 4 +#define MPSTE 5 + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 0: Basic layer * @@ -59,7 +65,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSPC, KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, - KC_LCTL, M(2), KC_LGUI,KC_MPLY,ALT_T(KC_APP), + KC_LCTL, M(MFNLR), KC_LGUI,KC_MPLY,ALT_T(KC_APP), ALT_T(KC_ESC), TG(1), KC_PGUP, @@ -114,7 +120,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_HOME, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_UP, KC_END, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_LEFT, KC_DOWN, KC_RGHT, KC_P1, KC_P2, KC_P3, KC_PENT, - KC_TRNS, KC_P0, M(1), KC_PDOT, CTL_T(KC_PENT), + KC_TRNS, KC_P0, M(MDBL0),KC_PDOT, CTL_T(KC_PENT), KC_NLCK, KC_CAPS, KC_TRNS, @@ -146,7 +152,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, LSFT(KC_DELT),LCTL(KC_INS),LSFT(KC_INS), KC_MUTE, KC_VOLD, + KC_TRNS, KC_TRNS, M(MCUT), M(MCOPY), M(MPSTE), KC_MUTE, KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, @@ -172,21 +178,29 @@ 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; - case 1: + case MDBL0: if (record->event.pressed) { return MACRO( I(25), T(P0), T(P0), END ); } break; - case 2: + case MFNLR: layer_state ^= (1 << NMBR) | (1 << FNLR); break; + case MCUT: + if (record->event.pressed) { + return MACRO(D(LSFT), T(DELT), U(LSFT), END); + } + break; + case MCOPY: + if (record->event.pressed) { + return MACRO(D(LCTL), T(INS), U(LCTL), END); + } + break; + case MPSTE: + if (record->event.pressed) { + return MACRO(D(LSFT), T(INS), U(LSFT), END); + } + break; } return MACRO_NONE; }; From 29de37d5c0ea9fc6b5539ce4493c7b10a2a7f33f Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Mon, 11 Jan 2016 16:53:33 -0500 Subject: [PATCH 11/52] pwm audio --- .../ergodox_ez/keymaps/keymap_generated.c | 78 ++++++ keyboard/ergodox_ez/keymaps/keymap_jack.c | 69 +---- keyboard/planck/Makefile | 4 +- keyboard/planck/keymaps/keymap_eric.c | 42 +++ keyboard/planck/keymaps/keymap_lock.c | 10 +- keyboard/planck/planck.c | 29 ++ keyboard/planck/planck.h | 5 +- quantum/beeps.c | 245 ++++++++++------ quantum/beeps.h | 2 +- quantum/keymap_midi.c | 21 +- quantum/keymap_midi.h | 2 + quantum/wave.h | 265 ++++++++++++++++++ tmk_core/common/avr/timer.c | 18 +- 13 files changed, 600 insertions(+), 190 deletions(-) create mode 100644 keyboard/ergodox_ez/keymaps/keymap_generated.c create mode 100644 keyboard/planck/keymaps/keymap_eric.c create mode 100644 quantum/wave.h diff --git a/keyboard/ergodox_ez/keymaps/keymap_generated.c b/keyboard/ergodox_ez/keymaps/keymap_generated.c new file mode 100644 index 0000000000..54fd3059f2 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/keymap_generated.c @@ -0,0 +1,78 @@ +#include "ergodox_ez.h" +#include "debug.h" +#include "action_layer.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* + +#define SYMB 0 + +[0] = KEYMAP( \ +\ +KC_KP_EQUAL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_DELETE, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(1), KC_BSPACE, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TAB, KC_LEFT, KC_RIGHT, KC_TRANSPARENT, KC_LGUI, KC_HOME, KC_SPACE, KC_BSPACE, KC_END, KC_RIGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, TG(1), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOTE, KC_TRANSPARENT, KC_N, KC_M, KC_COMMA, KC_DOT, KC_LCTRL, KC_LSHIFT, KC_UP, KC_DOWN, KC_LBRACKET, KC_RBRACKET, KC_TRANSPARENT, KC_LALT, KC_ESCAPE, KC_PGUP, KC_PGDOWN, KC_TAB, KC_ENTER \ +\ +), + +[1] = KEYMAP( \ +\ +KC_TRANSPARENT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_TRANSPARENT, KC_UP, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_ASTERISK, KC_F12, KC_DOWN, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, KC_TRANSPARENT, KC_TRANSPARENT, , KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_SLASH, KC_TRANSPARENT, KC_TRANSPARENT, KC_KP_DOT, KC_KP_0, KC_KP_EQUAL, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT \ +\ +), + +[2] = KEYMAP( \ +\ +KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_UP, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_BTN3, KC_MS_BTN2, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MEDIA_PLAY_PAUSE, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK, KC_TRANSPARENT, KC_TRANSPARENT, KC_AUDIO_VOL_UP, KC_AUDIO_VOL_DOWN, KC_AUDIO_MUTE, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT \ +\ +), + +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = 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; +}; + +// 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) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } + +}; diff --git a/keyboard/ergodox_ez/keymaps/keymap_jack.c b/keyboard/ergodox_ez/keymaps/keymap_jack.c index 2677a3d8fa..f8f73a1afd 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_jack.c +++ b/keyboard/ergodox_ez/keymaps/keymap_jack.c @@ -8,29 +8,6 @@ #define MDIA 2 // media keys const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Keymap 0: Basic layer - * - * ,--------------------------------------------------. ,--------------------------------------------------. - * | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | Del | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | BkSp | A | S | D | F | G |------| |------| H | J | K | L |; / L2| ' | - * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| - * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 | - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | App | LGui | | Alt |Ctrl/Esc| - * ,------|------|------| |------+--------+------. - * | | | Home | | PgUp | | | - * | Space|Backsp|------| |------| Tab |Enter | - * | |ace | End | | PgDn | | | - * `--------------------' `----------------------' - */ -// If it accepts an argument (i.e, is a function), it doesn't need KC_. -// Otherwise, it needs KC_* [BASE] = KEYMAP( // layer 0 : default // left hand KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_NO, @@ -51,28 +28,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_PGUP, KC_PGDN, KC_SPC,KC_SPC ), -/* Keymap 1: Symbol Layer - * - * ,--------------------------------------------------. ,--------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | . | 0 | = | | - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | | | | | | - * ,------|------|------| |------+------+------. - * | | | | | | | | - * | | |------| |------| | | - * | | | | | | | | - * `--------------------' `--------------------' - */ -// SYMBOLS [SYMB] = KEYMAP( // left hand KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, @@ -93,29 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), -/* Keymap 2: Media and mouse keys - * - * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | MsUp | | | | | | | | | | | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | | | | | | | Prev | Next | | | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | | | | | | - * ,------|------|------| |------+------+------. - * | | | | | | |Brwser| - * | | |------| |------| |Back | - * | | | | | | | | - * `--------------------' `--------------------' - */ -// MEDIA AND MOUSE -KEYMAP( +[MDIA] = KEYMAP( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_TRNS, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index 485c5f77f6..fdf8c16400 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -122,8 +122,8 @@ 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 = yes # Breathing sleep LED during USB suspend # NKRO_ENABLE = yes # USB 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 = YES # MIDI controls +# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = YES # MIDI controls # UNICODE_ENABLE = YES # Unicode # BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID diff --git a/keyboard/planck/keymaps/keymap_eric.c b/keyboard/planck/keymaps/keymap_eric.c new file mode 100644 index 0000000000..ffeec5f805 --- /dev/null +++ b/keyboard/planck/keymaps/keymap_eric.c @@ -0,0 +1,42 @@ +#include "planck.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = { + {KC_BSLS, S(KC_SLSH), KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH}, + {TG(1), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS}, + {KC_LGUI, KC_QUOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RGUI}, + {KC_LCBR, KC_LCTL, KC_LALT, LT(1, TG(2)), KC_SPC, KC_TAB, KC_ENT, KC_BSPC, LT(1, TG(3)), KC_RALT, KC_RCTL, KC_RCBR} + }, + + [1] = { + {KC_PIPE, KC_COLN, KC_LBRC, KC_RBRC, S(KC_P), S(KC_Y), S(KC_F), S(KC_G), S(KC_C), S(KC_R), S(KC_L), KC_AMPR}, + {KC_TRNS, S(KC_A), S(KC_O), S(KC_E), S(KC_U), S(KC_I), S(KC_D), S(KC_H), S(KC_T), S(KC_N), S(KC_S), KC_GRV}, + {KC_TRNS, KC_SCLN, S(KC_Q), S(KC_J), S(KC_K), S(KC_X), S(KC_B), S(KC_M), S(KC_W), S(KC_V), S(KC_Z), KC_TRNS}, + {S(KC_COMM), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_DOT)} + }, + + [2] = { + {KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NO}, + {KC_NO, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_NO}, + {KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, 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_NO} + }, + + [3] = { + {KC_EXLM, KC_7, KC_5, KC_3, KC_1, KC_9, KC_0, KC_2, KC_4, KC_6, KC_8, KC_EQL}, + {TG(4), KC_NO, KC_PGUP, KC_HOME, KC_INSERT, KC_NO, KC_NO, BL_DEC, KC_UP, BL_INC, KC_NO, KC_NO}, + {KC_TRNS, KC_NO, KC_PGDN, KC_END, KC_DELETE, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, 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_NO} + }, + + [4] = { + {KC_TILD, KC_HASH, KC_LPRN, KC_RPRN, S(KC_QUOT), KC_PERC, KC_UNDS, KC_CIRC, KC_DLR, KC_AT, KC_ASTR, KC_PLUS}, + {KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, + {KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, 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_NO} + } +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; \ No newline at end of file diff --git a/keyboard/planck/keymaps/keymap_lock.c b/keyboard/planck/keymaps/keymap_lock.c index cc9be55f64..c2bf0b7d81 100644 --- a/keyboard/planck/keymaps/keymap_lock.c +++ b/keyboard/planck/keymaps/keymap_lock.c @@ -1,5 +1,5 @@ #include "keymap_common.h" -#include "backlight.h" +// #include "backlight.h" #include "action_layer.h" #include "keymap_midi.h" #include @@ -71,7 +71,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.pressed) { // play_note(440, 20); // register_code(KC_RSFT); - backlight_set(BACKLIGHT_LEVELS); + // backlight_set(BACKLIGHT_LEVELS); default_layer_and(0); default_layer_or((1<<5)); @@ -106,9 +106,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // note(0+12, 20); // note(0+24, 20); } else { - // unregister_code(KC_RSFT); - // stop_note(); - backlight_set(0); + unregister_code(KC_RSFT); + // stop_all_notes(); + // backlight_set(0); default_layer_and(0); default_layer_or(0); // note(0+24, 20); diff --git a/keyboard/planck/planck.c b/keyboard/planck/planck.c index b62862af04..a986bd8812 100644 --- a/keyboard/planck/planck.c +++ b/keyboard/planck/planck.c @@ -19,6 +19,35 @@ void * matrix_init_kb(void) { DDRE |= (1<<6); PORTE |= (1<<6); + init_notes(); + + // play_note(((double)261.6*32)*pow(2.0,(36)/12.0), 0xF); + // _delay_ms(50); + + // play_note(((double)261.6*32)*pow(2.0,(48)/12.0), 0xF); + // _delay_ms(25); + // stop_note(((double)261.6*32)*pow(2.0,(48)/12.0)); + + // play_note(((double)261.6*32)*pow(2.0,(48)/12.0), 0xF); + // _delay_ms(25); + // stop_note(((double)261.6*32)*pow(2.0,(48)/12.0)); + + + // stop_note(((double)261.6*32)*pow(2.0,(36)/12.0)); + + + // play_note(((double)261.6*32)*pow(2.0,(62)/12.0), 0xF); + // _delay_ms(50); + // stop_note(((double)261.6*32)*pow(2.0,(62)/12.0)); + + + // play_note(((double)261.6*32)*pow(2.0,(64)/12.0), 0xF); + // _delay_ms(50); + // stop_note(((double)261.6*32)*pow(2.0,(64)/12.0)); + + + + if (matrix_init_user) { (*matrix_init_user)(); } diff --git a/keyboard/planck/planck.h b/keyboard/planck/planck.h index 4e59aef566..32c08f3b0b 100644 --- a/keyboard/planck/planck.h +++ b/keyboard/planck/planck.h @@ -3,8 +3,11 @@ #include "matrix.h" #include "keymap_common.h" -#include "backlight.h" +// #include "backlight.h" #include +#ifdef MIDI_ENABLE + #include +#endif #define PLANCK_MIT( \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ diff --git a/quantum/beeps.c b/quantum/beeps.c index 8d1f81f210..edcc84aca4 100644 --- a/quantum/beeps.c +++ b/quantum/beeps.c @@ -1,11 +1,20 @@ -#include "beeps.h" +#include +#include #include #include #include #include +#include "beeps.h" +#include "keymap_common.h" +#include "wave.h" + #define PI 3.14159265 +#define SAMPLE_DIVIDER 70 +#define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/256) +// Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap + void delay_us(int count) { while(count--) { _delay_us(1); @@ -15,7 +24,7 @@ void delay_us(int count) { int voices = 0; double frequency = 0; int volume = 0; -int position = 0; +long position = 0; double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; @@ -23,6 +32,19 @@ bool sliding = false; #define RANGE 1000 volatile int i=0; //elements of the wave +// uint8_t sine[128]; +// uint8_t tri[128]; +// uint8_t squ[128]; +// uint8_t* sine_start; +// uint8_t* sine_end; +// uint8_t* tri_start; +// uint8_t* tri_end; + +// uint8_t* s_start; +// uint8_t* s_end; +// uint8_t* s_ptr; + + void beeps() { play_notes(); @@ -36,8 +58,7 @@ void send_freq(double freq, int vol) { void stop_all_notes() { voices = 0; - TCCR3A = 0; - TCCR3B = 0; + TIMSK0 &= ~_BV(OCIE0A); frequency = 0; volume = 0; @@ -48,6 +69,7 @@ void stop_all_notes() { } void stop_note(double freq) { + freq = freq / SAMPLE_RATE; for (int i = 7; i >= 0; i--) { if (frequencies[i] == freq) { frequencies[i] = 0; @@ -64,151 +86,176 @@ void stop_note(double freq) { if (voices < 0) voices = 0; if (voices == 0) { - TCCR3A = 0; - TCCR3B = 0; + TIMSK0 &= ~_BV(OCIE0A); frequency = 0; volume = 0; } else { double freq = frequencies[voices - 1]; int vol = volumes[voices - 1]; + double starting_f = frequency; if (frequency < freq) { sliding = true; - for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) { - send_freq(f, vol); + for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 500.0)) { + frequency = f; } sliding = false; } else if (frequency > freq) { sliding = true; - for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) { - send_freq(f, vol); + for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 500.0)) { + frequency = f; } sliding = false; } - send_freq(freq, vol); + // send_freq(freq, vol); frequency = freq; volume = vol; } } void init_notes() { - // TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (1 << WGM10); - // TCCR1B = (1 << COM1B1) | (0 << COM1A0) | (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10); - // DDRC |= (1<<6); + // for(int i = 0; i < 128; i++) { + // sine[i] = sin(i * PI / 64) * 128 + 128; + // tri[i] = 256 - abs((i - 64) * 4); + // } + // sine_start = &sine; + // sine_end = &sine + 128; + // tri_start = &tri; + // tri_end = &tri + 128; - // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); - // TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30); - - // ICR3 = 0xFFFF; - // OCR3A = (int)((float)wave[i]*ICR3/RANGE); //go to next array element + // new - // cli(); + PLLFRQ = _BV(PDIV2); + PLLCSR = _BV(PLLE); + while(!(PLLCSR & _BV(PLOCK))); + PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */ + + /* Init a fast PWM on Timer4 */ + TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */ + TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */ + OCR4A = 0; - // /* Enable interrupt on timer2 == 127, with clk/8 prescaler. At 16MHz, - // this gives a timer interrupt at 15625Hz. */ - // TIMSK3 = (1 << OCIE3A); - - // /* clear/reset timer on match */ - // // TCCR3A = 1<> 8) & 0x00FF) -// #define lowByte(c) (c & 0x00FF) +int max = 0xFF; +float sum = 0; +int value = 128; +float place = 0; -ISR(TIMER3_COMPA_vect) { - - if (ICR3 > 0 && !sliding) { - switch (position) { - case 0: { - int duty = (((double)F_CPU) / (frequency)); - ICR3 = duty; // Set max to the period - OCR3A = duty >> 1; // Set compare to half the period - break; - } - case 1: { - int duty = (((double)F_CPU) / (frequency*2)); - ICR3 = duty; // Set max to the period - OCR3A = duty >> 1; // Set compare to half the period - break; - } - case 2: { - int duty = (((double)F_CPU) / (frequency*3)); - ICR3 = duty; // Set max to the period - OCR3A = duty >> 1; // Set compare to half the period - break; - } - } - position = (position + 1) % 3; - } -// /* OCR2A has been cleared, per TCCR2A above */ -// // OCR3A = 127; - -// // pos1 += incr1; -// // pos2 += incr2; -// // pos3 += incr3; - -// // sample = sinewave[highByte(pos1)] + sinewave[highByte(pos2)] + sinewave[highByte(pos3)]; - -// // OCR3A = sample; +ISR(TIMER0_COMPA_vect) { -// OCR3A=pgm_read_byte(&sinewave[pos1]); -// pos1++; -// // PORTC &= ~(1<<6); -// /* buffered, 1x gain, active mode */ -// // SPDR = highByte(sample) | 0x70; -// // while (!(SPSR & (1<= sine_end) { + // sine_start = &sine[(sine_start - sine_end) % 128]; + // } -// // SPDR = lowByte(sample); -// // while (!(SPSR & (1<= sine_end) { + // sine_start = &sine[(sine_start - sine_end) % 128]; + // } + + // OCR4A = pgm_read_byte(s_ptr); + // s_ptr = s_start + (uint8_t)place; + // OCR4A = pgm_read_byte(s_ptr); + + + // SINE + OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]); + + // SQUARE + // if (((int)place) >= 1024){ + // OCR4A = 0xFF; + // } else { + // OCR4A = 0x00; + // } + + // SAWTOOTH + // OCR4A = (int)place / 4; + + // TRIANGLE + // if (((int)place) >= 1024) { + // OCR4A = (int)place / 2; + // } else { + // OCR4A = 2048 - (int)place / 2; + // } + + place += frequency; + if (place >= SINE_LENGTH) + place -= SINE_LENGTH; + +} + + +ISR(TIMER0_COMPB_vect) +{ + + /* Disable the interrupt */ + TIMSK0 &= ~_BV(OCIE0B); + } void play_note(double freq, int vol) { + freq = freq / SAMPLE_RATE; if (freq > 0) { - DDRC |= (1<<6); - TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); - TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); + // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (1 << WGM30); + // TCCR3B = (0 << WGM33) | (1 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30); + // TIMSK3 = 0x0; if (frequency != 0) { + double starting_f = frequency; if (frequency < freq) { - for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) { - send_freq(f, vol); + for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 500.0)) { + frequency = f; } } else if (frequency > freq) { - for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) { - send_freq(f, vol); + for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 500.0)) { + frequency = f; } } } - send_freq(freq, vol); + // send_freq(freq, vol); frequency = freq; volume = vol; frequencies[voices] = frequency; volumes[voices] = volume; voices++; + // position = 0; + // TCNT0 = 0; } // ICR3 = 0xFFFF; // for (int i = 0; i < 10000; i++) { @@ -218,6 +265,18 @@ void play_note(double freq, int vol) { // TCCR3A = 0; // TCCR3B = 0; + + + TIMSK0 &= ~_BV(OCIE0A) | ~_BV(OCIE0B); + + TCCR0A = _BV(WGM01); + TCCR0B = _BV(CS01); + OCR0A = SAMPLE_DIVIDER - 1; + OCR0B = 1; + + TIMSK0 |= _BV(OCIE0A); + // sei(); + } // void note(int x, float length) { diff --git a/quantum/beeps.h b/quantum/beeps.h index 378983c605..a7fcf6c23c 100644 --- a/quantum/beeps.h +++ b/quantum/beeps.h @@ -9,4 +9,4 @@ void true_note(float x, float y, float length); void play_note(double freq, int vol); void stop_note(double freq); void stop_all_notes(); -void init_notes(); \ No newline at end of file +void init_notes(); diff --git a/quantum/keymap_midi.c b/quantum/keymap_midi.c index b7eba3ab76..3a1408e220 100644 --- a/quantum/keymap_midi.c +++ b/quantum/keymap_midi.c @@ -17,7 +17,6 @@ along with this program. If not, see . #include "keymap_common.h" #include "keymap_midi.h" -#include uint8_t starting_note = 0x0C; int offset = 7; @@ -35,7 +34,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) { if (record->event.pressed) { starting_note++; - play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); + play_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); midi_send_cc(&midi_device, 0, 0x7B, 0); midi_send_cc(&midi_device, 1, 0x7B, 0); midi_send_cc(&midi_device, 2, 0x7B, 0); @@ -43,7 +42,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) midi_send_cc(&midi_device, 4, 0x7B, 0); return; } else { - stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1))); + stop_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1))); stop_all_notes(); return; } @@ -51,7 +50,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) { if (record->event.pressed) { starting_note--; - play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); + play_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); midi_send_cc(&midi_device, 0, 0x7B, 0); midi_send_cc(&midi_device, 1, 0x7B, 0); midi_send_cc(&midi_device, 2, 0x7B, 0); @@ -59,7 +58,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) midi_send_cc(&midi_device, 4, 0x7B, 0); return; } else { - stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1))); + stop_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1))); stop_all_notes(); return; } @@ -74,9 +73,9 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) midi_send_cc(&midi_device, 4, 0x7B, 0); stop_all_notes(); for (int i = 0; i <= 7; i++) { - play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); + play_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); _delay_us(80000); - stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1))); + stop_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1))); _delay_us(8000); } return; @@ -90,9 +89,9 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) midi_send_cc(&midi_device, 4, 0x7B, 0); stop_all_notes(); for (int i = 0; i <= 7; i++) { - play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); + play_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC); _delay_us(80000); - stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1))); + stop_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1))); _delay_us(8000); } return; @@ -101,10 +100,10 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) 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, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127); - play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); + play_note(((double)261.626)*pow(2.0, 0.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); } else { // midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127); midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127); - stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); + stop_note(((double)261.626)*pow(2.0, 0.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); } } \ No newline at end of file diff --git a/quantum/keymap_midi.h b/quantum/keymap_midi.h index c5917f884e..a89420ce2a 100644 --- a/quantum/keymap_midi.h +++ b/quantum/keymap_midi.h @@ -18,6 +18,8 @@ along with this program. If not, see . #ifndef KEYMAP_MIDI_H #define KEYMAP_MIDI_H +#include + #define MIDI 0x6000 #define MIDI12 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000 diff --git a/quantum/wave.h b/quantum/wave.h new file mode 100644 index 0000000000..6ebc348519 --- /dev/null +++ b/quantum/wave.h @@ -0,0 +1,265 @@ +#include +#include +#include + +#define SINE_LENGTH 2048 + +const uint8_t sinewave[] PROGMEM= //2048 values +{ +0x80,0x80,0x80,0x81,0x81,0x81,0x82,0x82, +0x83,0x83,0x83,0x84,0x84,0x85,0x85,0x85, +0x86,0x86,0x87,0x87,0x87,0x88,0x88,0x88, +0x89,0x89,0x8a,0x8a,0x8a,0x8b,0x8b,0x8c, +0x8c,0x8c,0x8d,0x8d,0x8e,0x8e,0x8e,0x8f, +0x8f,0x8f,0x90,0x90,0x91,0x91,0x91,0x92, +0x92,0x93,0x93,0x93,0x94,0x94,0x95,0x95, +0x95,0x96,0x96,0x96,0x97,0x97,0x98,0x98, +0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9b,0x9b, +0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x9e,0x9e, +0x9e,0x9f,0x9f,0xa0,0xa0,0xa0,0xa1,0xa1, +0xa2,0xa2,0xa2,0xa3,0xa3,0xa3,0xa4,0xa4, +0xa5,0xa5,0xa5,0xa6,0xa6,0xa6,0xa7,0xa7, +0xa7,0xa8,0xa8,0xa9,0xa9,0xa9,0xaa,0xaa, +0xaa,0xab,0xab,0xac,0xac,0xac,0xad,0xad, +0xad,0xae,0xae,0xae,0xaf,0xaf,0xb0,0xb0, +0xb0,0xb1,0xb1,0xb1,0xb2,0xb2,0xb2,0xb3, +0xb3,0xb4,0xb4,0xb4,0xb5,0xb5,0xb5,0xb6, +0xb6,0xb6,0xb7,0xb7,0xb7,0xb8,0xb8,0xb8, +0xb9,0xb9,0xba,0xba,0xba,0xbb,0xbb,0xbb, +0xbc,0xbc,0xbc,0xbd,0xbd,0xbd,0xbe,0xbe, +0xbe,0xbf,0xbf,0xbf,0xc0,0xc0,0xc0,0xc1, +0xc1,0xc1,0xc2,0xc2,0xc2,0xc3,0xc3,0xc3, +0xc4,0xc4,0xc4,0xc5,0xc5,0xc5,0xc6,0xc6, +0xc6,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc9, +0xc9,0xc9,0xca,0xca,0xca,0xcb,0xcb,0xcb, +0xcb,0xcc,0xcc,0xcc,0xcd,0xcd,0xcd,0xce, +0xce,0xce,0xcf,0xcf,0xcf,0xcf,0xd0,0xd0, +0xd0,0xd1,0xd1,0xd1,0xd2,0xd2,0xd2,0xd2, +0xd3,0xd3,0xd3,0xd4,0xd4,0xd4,0xd5,0xd5, +0xd5,0xd5,0xd6,0xd6,0xd6,0xd7,0xd7,0xd7, +0xd7,0xd8,0xd8,0xd8,0xd9,0xd9,0xd9,0xd9, +0xda,0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdc, +0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xde, +0xde,0xde,0xde,0xdf,0xdf,0xdf,0xe0,0xe0, +0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2, +0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4, +0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe6, +0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe8, +0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9, +0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb, +0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0xed, +0xed,0xed,0xed,0xed,0xee,0xee,0xee,0xee, +0xee,0xef,0xef,0xef,0xef,0xef,0xf0,0xf0, +0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1, +0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3, +0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4, +0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5, +0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6, +0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, +0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8, +0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, +0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa, +0xfa,0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb, +0xfb,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,0xfc, +0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, +0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd, +0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfe,0xfe, +0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, +0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, +0xfe,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe, +0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, +0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe, +0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfd,0xfd, +0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd, +0xfd,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc, +0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfb,0xfb, +0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfa, +0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa, +0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9, +0xf9,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8, +0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7, +0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5, +0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4, +0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3, +0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2, +0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0, +0xf0,0xf0,0xf0,0xef,0xef,0xef,0xef,0xef, +0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xed, +0xed,0xed,0xec,0xec,0xec,0xec,0xec,0xeb, +0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea, +0xea,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8, +0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6, +0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4, +0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe2, +0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe0, +0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xde,0xde, +0xde,0xde,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc, +0xdc,0xdc,0xdb,0xdb,0xdb,0xda,0xda,0xda, +0xda,0xd9,0xd9,0xd9,0xd9,0xd8,0xd8,0xd8, +0xd7,0xd7,0xd7,0xd7,0xd6,0xd6,0xd6,0xd5, +0xd5,0xd5,0xd5,0xd4,0xd4,0xd4,0xd3,0xd3, +0xd3,0xd2,0xd2,0xd2,0xd2,0xd1,0xd1,0xd1, +0xd0,0xd0,0xd0,0xcf,0xcf,0xcf,0xcf,0xce, +0xce,0xce,0xcd,0xcd,0xcd,0xcc,0xcc,0xcc, +0xcb,0xcb,0xcb,0xcb,0xca,0xca,0xca,0xc9, +0xc9,0xc9,0xc8,0xc8,0xc8,0xc7,0xc7,0xc7, +0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc4,0xc4, +0xc4,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc1, +0xc1,0xc1,0xc0,0xc0,0xc0,0xbf,0xbf,0xbf, +0xbe,0xbe,0xbe,0xbd,0xbd,0xbd,0xbc,0xbc, +0xbc,0xbb,0xbb,0xbb,0xba,0xba,0xba,0xb9, +0xb9,0xb8,0xb8,0xb8,0xb7,0xb7,0xb7,0xb6, +0xb6,0xb6,0xb5,0xb5,0xb5,0xb4,0xb4,0xb4, +0xb3,0xb3,0xb2,0xb2,0xb2,0xb1,0xb1,0xb1, +0xb0,0xb0,0xb0,0xaf,0xaf,0xae,0xae,0xae, +0xad,0xad,0xad,0xac,0xac,0xac,0xab,0xab, +0xaa,0xaa,0xaa,0xa9,0xa9,0xa9,0xa8,0xa8, +0xa7,0xa7,0xa7,0xa6,0xa6,0xa6,0xa5,0xa5, +0xa5,0xa4,0xa4,0xa3,0xa3,0xa3,0xa2,0xa2, +0xa2,0xa1,0xa1,0xa0,0xa0,0xa0,0x9f,0x9f, +0x9e,0x9e,0x9e,0x9d,0x9d,0x9d,0x9c,0x9c, +0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x99,0x99, +0x98,0x98,0x98,0x97,0x97,0x96,0x96,0x96, +0x95,0x95,0x95,0x94,0x94,0x93,0x93,0x93, +0x92,0x92,0x91,0x91,0x91,0x90,0x90,0x8f, +0x8f,0x8f,0x8e,0x8e,0x8e,0x8d,0x8d,0x8c, +0x8c,0x8c,0x8b,0x8b,0x8a,0x8a,0x8a,0x89, +0x89,0x88,0x88,0x88,0x87,0x87,0x87,0x86, +0x86,0x85,0x85,0x85,0x84,0x84,0x83,0x83, +0x83,0x82,0x82,0x81,0x81,0x81,0x80,0x80, +0x80,0x7f,0x7f,0x7e,0x7e,0x7e,0x7d,0x7d, +0x7c,0x7c,0x7c,0x7b,0x7b,0x7a,0x7a,0x7a, +0x79,0x79,0x78,0x78,0x78,0x77,0x77,0x77, +0x76,0x76,0x75,0x75,0x75,0x74,0x74,0x73, +0x73,0x73,0x72,0x72,0x71,0x71,0x71,0x70, +0x70,0x70,0x6f,0x6f,0x6e,0x6e,0x6e,0x6d, +0x6d,0x6c,0x6c,0x6c,0x6b,0x6b,0x6a,0x6a, +0x6a,0x69,0x69,0x69,0x68,0x68,0x67,0x67, +0x67,0x66,0x66,0x65,0x65,0x65,0x64,0x64, +0x64,0x63,0x63,0x62,0x62,0x62,0x61,0x61, +0x61,0x60,0x60,0x5f,0x5f,0x5f,0x5e,0x5e, +0x5d,0x5d,0x5d,0x5c,0x5c,0x5c,0x5b,0x5b, +0x5a,0x5a,0x5a,0x59,0x59,0x59,0x58,0x58, +0x58,0x57,0x57,0x56,0x56,0x56,0x55,0x55, +0x55,0x54,0x54,0x53,0x53,0x53,0x52,0x52, +0x52,0x51,0x51,0x51,0x50,0x50,0x4f,0x4f, +0x4f,0x4e,0x4e,0x4e,0x4d,0x4d,0x4d,0x4c, +0x4c,0x4b,0x4b,0x4b,0x4a,0x4a,0x4a,0x49, +0x49,0x49,0x48,0x48,0x48,0x47,0x47,0x47, +0x46,0x46,0x45,0x45,0x45,0x44,0x44,0x44, +0x43,0x43,0x43,0x42,0x42,0x42,0x41,0x41, +0x41,0x40,0x40,0x40,0x3f,0x3f,0x3f,0x3e, +0x3e,0x3e,0x3d,0x3d,0x3d,0x3c,0x3c,0x3c, +0x3b,0x3b,0x3b,0x3a,0x3a,0x3a,0x39,0x39, +0x39,0x38,0x38,0x38,0x37,0x37,0x37,0x36, +0x36,0x36,0x35,0x35,0x35,0x34,0x34,0x34, +0x34,0x33,0x33,0x33,0x32,0x32,0x32,0x31, +0x31,0x31,0x30,0x30,0x30,0x30,0x2f,0x2f, +0x2f,0x2e,0x2e,0x2e,0x2d,0x2d,0x2d,0x2d, +0x2c,0x2c,0x2c,0x2b,0x2b,0x2b,0x2a,0x2a, +0x2a,0x2a,0x29,0x29,0x29,0x28,0x28,0x28, +0x28,0x27,0x27,0x27,0x26,0x26,0x26,0x26, +0x25,0x25,0x25,0x25,0x24,0x24,0x24,0x23, +0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x21, +0x21,0x21,0x21,0x20,0x20,0x20,0x1f,0x1f, +0x1f,0x1f,0x1e,0x1e,0x1e,0x1e,0x1d,0x1d, +0x1d,0x1d,0x1c,0x1c,0x1c,0x1c,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x19, +0x19,0x19,0x19,0x18,0x18,0x18,0x18,0x17, +0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x16, +0x15,0x15,0x15,0x15,0x15,0x14,0x14,0x14, +0x14,0x14,0x13,0x13,0x13,0x13,0x13,0x12, +0x12,0x12,0x12,0x12,0x11,0x11,0x11,0x11, +0x11,0x10,0x10,0x10,0x10,0x10,0xf,0xf, +0xf,0xf,0xf,0xf,0xe,0xe,0xe,0xe, +0xe,0xd,0xd,0xd,0xd,0xd,0xd,0xc, +0xc,0xc,0xc,0xc,0xc,0xb,0xb,0xb, +0xb,0xb,0xb,0xa,0xa,0xa,0xa,0xa, +0xa,0xa,0x9,0x9,0x9,0x9,0x9,0x9, +0x9,0x8,0x8,0x8,0x8,0x8,0x8,0x8, +0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7, +0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6, +0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5, +0x5,0x5,0x4,0x4,0x4,0x4,0x4,0x4, +0x4,0x4,0x4,0x4,0x3,0x3,0x3,0x3, +0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3, +0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2, +0x2,0x2,0x2,0x2,0x2,0x2,0x1,0x1, +0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, +0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, +0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, +0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x1, +0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, +0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1, +0x1,0x1,0x1,0x2,0x2,0x2,0x2,0x2, +0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2, +0x2,0x3,0x3,0x3,0x3,0x3,0x3,0x3, +0x3,0x3,0x3,0x3,0x3,0x4,0x4,0x4, +0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x5, +0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5, +0x5,0x6,0x6,0x6,0x6,0x6,0x6,0x6, +0x6,0x7,0x7,0x7,0x7,0x7,0x7,0x7, +0x7,0x8,0x8,0x8,0x8,0x8,0x8,0x8, +0x9,0x9,0x9,0x9,0x9,0x9,0x9,0xa, +0xa,0xa,0xa,0xa,0xa,0xa,0xb,0xb, +0xb,0xb,0xb,0xb,0xc,0xc,0xc,0xc, +0xc,0xc,0xd,0xd,0xd,0xd,0xd,0xd, +0xe,0xe,0xe,0xe,0xe,0xf,0xf,0xf, +0xf,0xf,0xf,0x10,0x10,0x10,0x10,0x10, +0x11,0x11,0x11,0x11,0x11,0x12,0x12,0x12, +0x12,0x12,0x13,0x13,0x13,0x13,0x13,0x14, +0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15, +0x15,0x16,0x16,0x16,0x16,0x17,0x17,0x17, +0x17,0x17,0x18,0x18,0x18,0x18,0x19,0x19, +0x19,0x19,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b, +0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1c,0x1d, +0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1e,0x1f, +0x1f,0x1f,0x1f,0x20,0x20,0x20,0x21,0x21, +0x21,0x21,0x22,0x22,0x22,0x22,0x23,0x23, +0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25, +0x25,0x26,0x26,0x26,0x26,0x27,0x27,0x27, +0x28,0x28,0x28,0x28,0x29,0x29,0x29,0x2a, +0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2c,0x2c, +0x2c,0x2d,0x2d,0x2d,0x2d,0x2e,0x2e,0x2e, +0x2f,0x2f,0x2f,0x30,0x30,0x30,0x30,0x31, +0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33, +0x34,0x34,0x34,0x34,0x35,0x35,0x35,0x36, +0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38, +0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3b,0x3b, +0x3b,0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e, +0x3e,0x3e,0x3f,0x3f,0x3f,0x40,0x40,0x40, +0x41,0x41,0x41,0x42,0x42,0x42,0x43,0x43, +0x43,0x44,0x44,0x44,0x45,0x45,0x45,0x46, +0x46,0x47,0x47,0x47,0x48,0x48,0x48,0x49, +0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b, +0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e,0x4e, +0x4f,0x4f,0x4f,0x50,0x50,0x51,0x51,0x51, +0x52,0x52,0x52,0x53,0x53,0x53,0x54,0x54, +0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57, +0x58,0x58,0x58,0x59,0x59,0x59,0x5a,0x5a, +0x5a,0x5b,0x5b,0x5c,0x5c,0x5c,0x5d,0x5d, +0x5d,0x5e,0x5e,0x5f,0x5f,0x5f,0x60,0x60, +0x61,0x61,0x61,0x62,0x62,0x62,0x63,0x63, +0x64,0x64,0x64,0x65,0x65,0x65,0x66,0x66, +0x67,0x67,0x67,0x68,0x68,0x69,0x69,0x69, +0x6a,0x6a,0x6a,0x6b,0x6b,0x6c,0x6c,0x6c, +0x6d,0x6d,0x6e,0x6e,0x6e,0x6f,0x6f,0x70, +0x70,0x70,0x71,0x71,0x71,0x72,0x72,0x73, +0x73,0x73,0x74,0x74,0x75,0x75,0x75,0x76, +0x76,0x77,0x77,0x77,0x78,0x78,0x78,0x79, +0x79,0x7a,0x7a,0x7a,0x7b,0x7b,0x7c,0x7c, +0x7c,0x7d,0x7d,0x7e,0x7e,0x7e,0x7f,0x7f +}; \ No newline at end of file diff --git a/tmk_core/common/avr/timer.c b/tmk_core/common/avr/timer.c index 292b41c3a6..1a695a9aae 100644 --- a/tmk_core/common/avr/timer.c +++ b/tmk_core/common/avr/timer.c @@ -29,24 +29,24 @@ volatile uint32_t timer_count = 0; void timer_init(void) { // Timer0 CTC mode - TCCR0A = 0x02; + TCCR1A = 0x02; #if TIMER_PRESCALER == 1 - TCCR0B = 0x01; + TCCR1B = 0x01; #elif TIMER_PRESCALER == 8 - TCCR0B = 0x02; + TCCR1B = 0x02; #elif TIMER_PRESCALER == 64 - TCCR0B = 0x03; + TCCR1B = 0x03; #elif TIMER_PRESCALER == 256 - TCCR0B = 0x04; + TCCR1B = 0x04; #elif TIMER_PRESCALER == 1024 - TCCR0B = 0x05; + TCCR1B = 0x05; #else # error "Timer prescaler value is NOT vaild." #endif - OCR0A = TIMER_RAW_TOP; - TIMSK0 = (1< Date: Mon, 11 Jan 2016 17:52:35 -0500 Subject: [PATCH 12/52] timer 3 --- quantum/beeps.c | 151 +++--------------------------------- tmk_core/common/avr/timer.c | 18 ++--- 2 files changed, 18 insertions(+), 151 deletions(-) diff --git a/quantum/beeps.c b/quantum/beeps.c index edcc84aca4..08b35abbd8 100644 --- a/quantum/beeps.c +++ b/quantum/beeps.c @@ -32,33 +32,9 @@ bool sliding = false; #define RANGE 1000 volatile int i=0; //elements of the wave -// uint8_t sine[128]; -// uint8_t tri[128]; -// uint8_t squ[128]; -// uint8_t* sine_start; -// uint8_t* sine_end; -// uint8_t* tri_start; -// uint8_t* tri_end; - -// uint8_t* s_start; -// uint8_t* s_end; -// uint8_t* s_ptr; - - - -void beeps() { - play_notes(); -} - -void send_freq(double freq, int vol) { - int duty = (((double)F_CPU) / freq); - ICR3 = duty; // Set max to the period - OCR3A = duty >> (0x10 - vol); // Set compare to half the period -} - void stop_all_notes() { voices = 0; - TIMSK0 &= ~_BV(OCIE0A); + TIMSK3 &= ~_BV(OCIE3A); frequency = 0; volume = 0; @@ -86,7 +62,7 @@ void stop_note(double freq) { if (voices < 0) voices = 0; if (voices == 0) { - TIMSK0 &= ~_BV(OCIE0A); + TIMSK3 &= ~_BV(OCIE3A); frequency = 0; volume = 0; } else { @@ -106,7 +82,6 @@ void stop_note(double freq) { } sliding = false; } - // send_freq(freq, vol); frequency = freq; volume = vol; } @@ -114,18 +89,6 @@ void stop_note(double freq) { void init_notes() { - // for(int i = 0; i < 128; i++) { - // sine[i] = sin(i * PI / 64) * 128 + 128; - // tri[i] = 256 - abs((i - 64) * 4); - // } - // sine_start = &sine; - // sine_end = &sine + 128; - // tri_start = &tri; - // tri_end = &tri + 128; - - // new - - PLLFRQ = _BV(PDIV2); PLLCSR = _BV(PLLE); while(!(PLLCSR & _BV(PLOCK))); @@ -139,28 +102,6 @@ void init_notes() { /* Enable the OC4A output */ DDRC |= _BV(PORTC6); - - - /* First disable the timer overflow interrupt while we're configuring */ - // TIMSK0 &= ~(1<= sine_end) { - // sine_start = &sine[(sine_start - sine_end) % 128]; - // } - - - // OCR4A = pgm_read_byte(sine_start); - // // sine_start = &sine[(sine_start - &sine[0] + (int)frequencies[0]) % 128]; - // sine_start += (int)frequencies[0]; - // if (sine_start >= sine_end) { - // sine_start = &sine[(sine_start - sine_end) % 128]; - // } - - // OCR4A = pgm_read_byte(s_ptr); - // s_ptr = s_start + (uint8_t)place; - // OCR4A = pgm_read_byte(s_ptr); - +ISR(TIMER3_COMPA_vect) { // SINE OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]); @@ -217,24 +137,10 @@ ISR(TIMER0_COMPA_vect) { } - -ISR(TIMER0_COMPB_vect) -{ - - /* Disable the interrupt */ - TIMSK0 &= ~_BV(OCIE0B); - -} - void play_note(double freq, int vol) { freq = freq / SAMPLE_RATE; if (freq > 0) { - - // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (1 << WGM30); - // TCCR3B = (0 << WGM33) | (1 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30); - - // TIMSK3 = 0x0; if (frequency != 0) { double starting_f = frequency; if (frequency < freq) { @@ -247,59 +153,20 @@ void play_note(double freq, int vol) { } } } - // send_freq(freq, vol); frequency = freq; volume = vol; frequencies[voices] = frequency; volumes[voices] = volume; voices++; - // position = 0; - // TCNT0 = 0; } - // ICR3 = 0xFFFF; - // for (int i = 0; i < 10000; i++) { - // OCR3A = round((sin(i*freq)*.5)+.5)*0xFFFF; - // // _delay_us(50); - // } - // TCCR3A = 0; - // TCCR3B = 0; + TIMSK3 &= ~_BV(OCIE3A); + TCCR3A = 0x0; + TCCR3B = _BV(CS31) | _BV(WGM32); + OCR3A = SAMPLE_DIVIDER - 1; - TIMSK0 &= ~_BV(OCIE0A) | ~_BV(OCIE0B); + TIMSK3 |= _BV(OCIE3A); - TCCR0A = _BV(WGM01); - TCCR0B = _BV(CS01); - OCR0A = SAMPLE_DIVIDER - 1; - OCR0B = 1; - - TIMSK0 |= _BV(OCIE0A); - // sei(); - -} - -// void note(int x, float length) { -// DDRC |= (1<<6); -// int t = (int)(440*pow(2,-x/12.0)); // starting note -// for (int y = 0; y < length*1000/t; y++) { // note length -// PORTC |= (1<<6); -// delay_us(t); -// PORTC &= ~(1<<6); -// delay_us(t); -// } -// PORTC &= ~(1<<6); -// } - -// void true_note(float x, float y, float length) { -// for (uint32_t i = 0; i < length * 50; i++) { -// uint32_t v = (uint32_t) (round(sin(PI*2*i*640000*pow(2, x/12.0))*.5+1 + sin(PI*2*i*640000*pow(2, y/12.0))*.5+1) / 2 * pow(2, 8)); -// for (int u = 0; u < 8; u++) { -// if (v & (1 << u) && !(PORTC&(1<<6))) -// PORTC |= (1<<6); -// else if (PORTC&(1<<6)) -// PORTC &= ~(1<<6); -// } -// } -// PORTC &= ~(1<<6); -// } \ No newline at end of file +} \ No newline at end of file diff --git a/tmk_core/common/avr/timer.c b/tmk_core/common/avr/timer.c index 1a695a9aae..292b41c3a6 100644 --- a/tmk_core/common/avr/timer.c +++ b/tmk_core/common/avr/timer.c @@ -29,24 +29,24 @@ volatile uint32_t timer_count = 0; void timer_init(void) { // Timer0 CTC mode - TCCR1A = 0x02; + TCCR0A = 0x02; #if TIMER_PRESCALER == 1 - TCCR1B = 0x01; + TCCR0B = 0x01; #elif TIMER_PRESCALER == 8 - TCCR1B = 0x02; + TCCR0B = 0x02; #elif TIMER_PRESCALER == 64 - TCCR1B = 0x03; + TCCR0B = 0x03; #elif TIMER_PRESCALER == 256 - TCCR1B = 0x04; + TCCR0B = 0x04; #elif TIMER_PRESCALER == 1024 - TCCR1B = 0x05; + TCCR0B = 0x05; #else # error "Timer prescaler value is NOT vaild." #endif - OCR1A = TIMER_RAW_TOP; - TIMSK1 = (1< Date: Mon, 11 Jan 2016 18:00:07 -0500 Subject: [PATCH 13/52] beeps on lock keymap --- keyboard/planck/keymaps/keymap_lock.c | 32 ++++++++++++++++++++++++++- keyboard/planck/planck.c | 29 ------------------------ 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/keyboard/planck/keymaps/keymap_lock.c b/keyboard/planck/keymaps/keymap_lock.c index c2bf0b7d81..c8e1b8fa86 100644 --- a/keyboard/planck/keymaps/keymap_lock.c +++ b/keyboard/planck/keymaps/keymap_lock.c @@ -107,7 +107,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // note(0+24, 20); } else { unregister_code(KC_RSFT); - // stop_all_notes(); + stop_all_notes(); // backlight_set(0); default_layer_and(0); default_layer_or(0); @@ -119,3 +119,33 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } return MACRO_NONE; }; + + +void * matrix_init_user(void) { + init_notes(); + + play_note(((double)261.6*3)*pow(2.0,(36)/12.0), 0xF); + _delay_ms(50); + + play_note(((double)261.6*3)*pow(2.0,(48)/12.0), 0xF); + _delay_ms(25); + stop_note(((double)261.6*3)*pow(2.0,(48)/12.0)); + + play_note(((double)261.6*3)*pow(2.0,(48)/12.0), 0xF); + _delay_ms(25); + stop_note(((double)261.6*3)*pow(2.0,(48)/12.0)); + + + stop_note(((double)261.6*3)*pow(2.0,(36)/12.0)); + + + play_note(((double)261.6*3)*pow(2.0,(62)/12.0), 0xF); + _delay_ms(50); + stop_note(((double)261.6*3)*pow(2.0,(62)/12.0)); + + + play_note(((double)261.6*3)*pow(2.0,(64)/12.0), 0xF); + _delay_ms(50); + stop_note(((double)261.6*3)*pow(2.0,(64)/12.0)); + +} diff --git a/keyboard/planck/planck.c b/keyboard/planck/planck.c index a986bd8812..b62862af04 100644 --- a/keyboard/planck/planck.c +++ b/keyboard/planck/planck.c @@ -19,35 +19,6 @@ void * matrix_init_kb(void) { DDRE |= (1<<6); PORTE |= (1<<6); - init_notes(); - - // play_note(((double)261.6*32)*pow(2.0,(36)/12.0), 0xF); - // _delay_ms(50); - - // play_note(((double)261.6*32)*pow(2.0,(48)/12.0), 0xF); - // _delay_ms(25); - // stop_note(((double)261.6*32)*pow(2.0,(48)/12.0)); - - // play_note(((double)261.6*32)*pow(2.0,(48)/12.0), 0xF); - // _delay_ms(25); - // stop_note(((double)261.6*32)*pow(2.0,(48)/12.0)); - - - // stop_note(((double)261.6*32)*pow(2.0,(36)/12.0)); - - - // play_note(((double)261.6*32)*pow(2.0,(62)/12.0), 0xF); - // _delay_ms(50); - // stop_note(((double)261.6*32)*pow(2.0,(62)/12.0)); - - - // play_note(((double)261.6*32)*pow(2.0,(64)/12.0), 0xF); - // _delay_ms(50); - // stop_note(((double)261.6*32)*pow(2.0,(64)/12.0)); - - - - if (matrix_init_user) { (*matrix_init_user)(); } From 4c100dbbef5b97290cbe6d4846575a940649c958 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 13 Jan 2016 00:25:31 -0500 Subject: [PATCH 14/52] note seq, start-up beeps, function beeps --- keyboard/planck/keymaps/keymap_lock.c | 73 ++++++++++--- quantum/beeps.c | 147 +++++++++++++++++++++----- quantum/beeps.h | 9 +- 3 files changed, 183 insertions(+), 46 deletions(-) diff --git a/keyboard/planck/keymaps/keymap_lock.c b/keyboard/planck/keymaps/keymap_lock.c index c8e1b8fa86..5e5390b036 100644 --- a/keyboard/planck/keymaps/keymap_lock.c +++ b/keyboard/planck/keymaps/keymap_lock.c @@ -2,6 +2,7 @@ // #include "backlight.h" #include "action_layer.h" #include "keymap_midi.h" +#include "beeps.h" #include const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -63,12 +64,26 @@ uint16_t hextokeycode(int hex) { } } +float walk_up[][2] = { + {440.0*pow(2.0,(60)/12.0), 400}, + {0, 50}, + {440.0*pow(2.0,(67)/12.0), 400}, +}; + +float walk_dn[][2] = { + {440.0*pow(2.0,(67)/12.0), 400}, + {0, 50}, + {440.0*pow(2.0,(60)/12.0), 400}, +}; + 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) { + + play_notes(&walk_up, 3, false); // play_note(440, 20); // register_code(KC_RSFT); // backlight_set(BACKLIGHT_LEVELS); @@ -107,7 +122,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // note(0+24, 20); } else { unregister_code(KC_RSFT); - stop_all_notes(); + play_notes(&walk_dn, 3, false); // backlight_set(0); default_layer_and(0); default_layer_or(0); @@ -120,32 +135,58 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) return MACRO_NONE; }; +float start_up[][2] = { + {440.0*pow(2.0,(67)/12.0), 600}, + {0, 50}, + {440.0*pow(2.0,(64)/12.0), 400}, + {0, 50}, + {440.0*pow(2.0,(55)/12.0), 400}, + {0, 50}, + {440.0*pow(2.0,(60)/12.0), 400}, + {0, 50}, + {440.0*pow(2.0,(64)/12.0), 1000}, +}; void * matrix_init_user(void) { init_notes(); - play_note(((double)261.6*3)*pow(2.0,(36)/12.0), 0xF); - _delay_ms(50); + play_notes(&start_up, 9, false); + // play_note(((double)261.6*3)*pow(2.0,(36)/12.0), 0xF); + // _delay_ms(50); - play_note(((double)261.6*3)*pow(2.0,(48)/12.0), 0xF); - _delay_ms(25); - stop_note(((double)261.6*3)*pow(2.0,(48)/12.0)); + // play_note(((double)261.6*3)*pow(2.0,(48)/12.0), 0xF); + // _delay_ms(25); + // stop_note(((double)261.6*3)*pow(2.0,(48)/12.0)); - play_note(((double)261.6*3)*pow(2.0,(48)/12.0), 0xF); - _delay_ms(25); - stop_note(((double)261.6*3)*pow(2.0,(48)/12.0)); + // play_note(((double)261.6*3)*pow(2.0,(48)/12.0), 0xF); + // _delay_ms(25); + // stop_note(((double)261.6*3)*pow(2.0,(48)/12.0)); - stop_note(((double)261.6*3)*pow(2.0,(36)/12.0)); + // stop_note(((double)261.6*3)*pow(2.0,(36)/12.0)); - play_note(((double)261.6*3)*pow(2.0,(62)/12.0), 0xF); - _delay_ms(50); - stop_note(((double)261.6*3)*pow(2.0,(62)/12.0)); + // play_note(((double)261.6*3)*pow(2.0,(62)/12.0), 0xF); + // _delay_ms(50); + // stop_note(((double)261.6*3)*pow(2.0,(62)/12.0)); - play_note(((double)261.6*3)*pow(2.0,(64)/12.0), 0xF); - _delay_ms(50); - stop_note(((double)261.6*3)*pow(2.0,(64)/12.0)); + // play_note(((double)261.6*3)*pow(2.0,(64)/12.0), 0xF); + // _delay_ms(50); + // stop_note(((double)261.6*3)*pow(2.0,(64)/12.0)); } + + +// void * matrix_scan_user(void) { +// if (layer_state & (1<<2)) { +// if (!playing_notes) +// play_notes(&start_up, 9, true); +// } else if (layer_state & (1<<3)) { +// if (!playing_notes) +// play_notes(&start_up, 9, true); +// } else { +// if (playing_notes) +// stop_all_notes(); +// } +// } \ No newline at end of file diff --git a/quantum/beeps.c b/quantum/beeps.c index 08b35abbd8..7586ebc522 100644 --- a/quantum/beeps.c +++ b/quantum/beeps.c @@ -11,8 +11,8 @@ #define PI 3.14159265 -#define SAMPLE_DIVIDER 70 -#define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/256) +#define SAMPLE_DIVIDER 39 +#define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048) // Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap void delay_us(int count) { @@ -32,9 +32,31 @@ bool sliding = false; #define RANGE 1000 volatile int i=0; //elements of the wave +int max = 0xFF; +float sum = 0; +int value = 128; +float place = 0; + +uint16_t place_int = 0; +bool repeat = true; +uint8_t * sample; +uint16_t sample_length = 0; + + +bool notes = false; +float note_frequency = 0; +float note_length = 0; +uint16_t note_position = 0; +float (* notes_pointer)[][2]; +uint8_t notes_length; +bool notes_repeat; +uint8_t current_note = 0; + void stop_all_notes() { voices = 0; TIMSK3 &= ~_BV(OCIE3A); + notes = false; + playing_notes = false; frequency = 0; volume = 0; @@ -89,30 +111,35 @@ void stop_note(double freq) { void init_notes() { - PLLFRQ = _BV(PDIV2); - PLLCSR = _BV(PLLE); - while(!(PLLCSR & _BV(PLOCK))); - PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */ - - /* Init a fast PWM on Timer4 */ - TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */ - TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */ - OCR4A = 0; + PLLFRQ = _BV(PDIV2); + PLLCSR = _BV(PLLE); + while(!(PLLCSR & _BV(PLOCK))); + PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */ - /* Enable the OC4A output */ - DDRC |= _BV(PORTC6); + /* Init a fast PWM on Timer4 */ + TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */ + TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */ + OCR4A = 0; + + /* Enable the OC4A output */ + DDRC |= _BV(PORTC6); + + TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs + + TCCR3A = 0x0; // Options not needed + TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC + OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback + + playing_notes = false; } -int max = 0xFF; -float sum = 0; -int value = 128; -float place = 0; ISR(TIMER3_COMPA_vect) { + // SINE - OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]); + // OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]); // SQUARE // if (((int)place) >= 1024){ @@ -131,10 +158,82 @@ ISR(TIMER3_COMPA_vect) { // OCR4A = 2048 - (int)place / 2; // } - place += frequency; - if (place >= SINE_LENGTH) - place -= SINE_LENGTH; + // place += frequency; + // if (place >= SINE_LENGTH) + // if (repeat) + // place -= SINE_LENGTH; + // else + // TIMSK3 &= ~_BV(OCIE3A); + + // SAMPLE + // OCR4A = pgm_read_byte(&sample[(uint16_t)place_int]); + + // place_int++; + + // if (place_int >= sample_length) + // if (repeat) + // place_int -= sample_length; + // else + // TIMSK3 &= ~_BV(OCIE3A); + + + if (notes) { + OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0; + + place += note_frequency; + if (place >= SINE_LENGTH) + place -= SINE_LENGTH; + note_position++; + if (note_position >= note_length) { + current_note++; + if (current_note >= notes_length) { + if (notes_repeat) { + current_note = 0; + } else { + TIMSK3 &= ~_BV(OCIE3A); + notes = false; + playing_notes = false; + return; + } + } + note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; + note_length = (*notes_pointer)[current_note][1]; + note_position = 0; + } + + } + +} + +void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) { + notes = true; + + notes_pointer = np; + notes_length = n_length; + notes_repeat = n_repeat; + + place = 0; + current_note = 0; + note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; + note_length = (*notes_pointer)[current_note][1]; + // note_frequency = 880.0 / SAMPLE_RATE; + // note_length = 1000; + note_position = 0; + + + TIMSK3 |= _BV(OCIE3A); + playing_notes = true; +} + +void play_sample(uint8_t * s, uint16_t l, bool r) { + place_int = 0; + sample = s; + sample_length = l; + repeat = r; + + TIMSK3 |= _BV(OCIE3A); + playing_notes = true; } void play_note(double freq, int vol) { @@ -161,12 +260,6 @@ void play_note(double freq, int vol) { voices++; } - TIMSK3 &= ~_BV(OCIE3A); - - TCCR3A = 0x0; - TCCR3B = _BV(CS31) | _BV(WGM32); - OCR3A = SAMPLE_DIVIDER - 1; - TIMSK3 |= _BV(OCIE3A); } \ No newline at end of file diff --git a/quantum/beeps.h b/quantum/beeps.h index a7fcf6c23c..4ccc344973 100644 --- a/quantum/beeps.h +++ b/quantum/beeps.h @@ -3,10 +3,13 @@ #include #include -void note(int x, float length); -void beeps(); -void true_note(float x, float y, float length); +bool playing_notes; + +void play_sample(uint8_t * s, uint16_t l, bool r); void play_note(double freq, int vol); void stop_note(double freq); void stop_all_notes(); void init_notes(); + + +void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat); \ No newline at end of file From 93e350caa1f5ce704741a18e6e3106787b574406 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 16 Jan 2016 00:38:13 +0100 Subject: [PATCH 15/52] Added shifts on the thumbs --- keyboard/ergodox_ez/keymaps/keymap_typematrix.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 7161a638a8..04d91b45bf 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -53,7 +53,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |Esc/Alt| L1 | | Left |Right | * ,------+-------+------| |------+------+------. * | | | PgUp | | Up | | | - * |Space | Space |------| |------|Space |Space | + * |Space |LShift |------| |------|RShift|Space | * | | | PgDn | | Down | | | * `---------------------' `--------------------' */ @@ -69,7 +69,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ALT_T(KC_ESC), TG(1), KC_PGUP, - KC_SPC, KC_SPC, KC_PGDN, + KC_SPC, KC_LSFT, KC_PGDN, // right hand KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RBRC, @@ -80,7 +80,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LEFT, KC_RGHT, KC_UP, - KC_DOWN, KC_SPC, KC_SPC + KC_DOWN, KC_RSFT, KC_SPC ), /* Keymap 1: Numbers Layer * From 6e3c36360ed291b9ca2bd014571236308a933d0c Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 15 Jan 2016 23:10:30 -0500 Subject: [PATCH 16/52] sounds --- keyboard/planck/keymaps/keymap_lock.c | 4 ++-- quantum/keymap_unicode.c | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/keyboard/planck/keymaps/keymap_lock.c b/keyboard/planck/keymaps/keymap_lock.c index 5e5390b036..7a99b57c9d 100644 --- a/keyboard/planck/keymaps/keymap_lock.c +++ b/keyboard/planck/keymaps/keymap_lock.c @@ -67,13 +67,13 @@ uint16_t hextokeycode(int hex) { float walk_up[][2] = { {440.0*pow(2.0,(60)/12.0), 400}, {0, 50}, - {440.0*pow(2.0,(67)/12.0), 400}, + {440.0*pow(2.0,(67)/12.0), 600}, }; float walk_dn[][2] = { {440.0*pow(2.0,(67)/12.0), 400}, {0, 50}, - {440.0*pow(2.0,(60)/12.0), 400}, + {440.0*pow(2.0,(60)/12.0), 600}, }; const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) diff --git a/quantum/keymap_unicode.c b/quantum/keymap_unicode.c index a9357edec7..a44965e611 100644 --- a/quantum/keymap_unicode.c +++ b/quantum/keymap_unicode.c @@ -30,6 +30,8 @@ uint16_t hextokeycode(int hex) { void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + // For more info on how this works per OS, see here: https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_code_input + if (record->event.pressed) { uint16_t unicode = (opt << 8) | id; register_code(KC_LALT); From 4faddd3449ca553e0d8b02ba91f9a34b534eebe7 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Jan 2016 00:06:51 -0500 Subject: [PATCH 17/52] working --- keyboard/planck/keymaps/keymap_lock.c | 2 ++ quantum/quantum.mk | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/keyboard/planck/keymaps/keymap_lock.c b/keyboard/planck/keymaps/keymap_lock.c index cc9be55f64..bc81adcf97 100644 --- a/keyboard/planck/keymaps/keymap_lock.c +++ b/keyboard/planck/keymaps/keymap_lock.c @@ -1,3 +1,5 @@ +// USING_MIDI +// USING_BACKLIGHT #include "keymap_common.h" #include "backlight.h" #include "action_layer.h" diff --git a/quantum/quantum.mk b/quantum/quantum.mk index c82e478725..62d67be9f1 100644 --- a/quantum/quantum.mk +++ b/quantum/quantum.mk @@ -4,6 +4,21 @@ QUANTUM_DIR = quantum SRC += $(QUANTUM_DIR)/keymap_common.c \ $(QUANTUM_DIR)/led.c +ifdef KEYMAP +ifneq (,$(shell grep USING_MIDI 'keymaps/keymap_$(KEYMAP).c')) +MIDI_ENABLE=yes +$(info * Overriding MIDI_ENABLE setting - keymap_$(KEYMAP).c requires it) +endif +ifneq (,$(shell grep USING_UNICODE 'keymaps/keymap_$(KEYMAP).c')) +UNICODE_ENABLE=yes +$(info * Overriding UNICODE_ENABLE setting - keymap_$(KEYMAP).c requires it) +endif +ifneq (,$(shell grep USING_BACKLIGHT 'keymaps/keymap_$(KEYMAP).c')) +BACKLIGHT_ENABLE=yes +$(info * Overriding BACKLIGHT_ENABLE setting - keymap_$(KEYMAP).c requires it) +endif +endif + ifndef CUSTOM_MATRIX SRC += $(QUANTUM_DIR)/matrix.c endif From dfe7004bc545ff7247a0dbef4788b9e1952f9c5d Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Jan 2016 00:51:24 -0500 Subject: [PATCH 18/52] new keymap folder structure and makefile magic --- keyboard/planck/Makefile | 13 +- keyboard/planck/README.md | 126 ++++++++++++------ .../keymaps/{keymap_alexey.c => alexey.c} | 0 ...ymap_angerthosenear.c => angerthosenear.c} | 0 .../keymaps/{keymap_austin.c => austin.c} | 0 .../keymaps/{keymap_charlie.c => charlie.c} | 0 .../keymaps/{keymap_daniel.c => daniel.c} | 0 .../keymaps/{keymap_david.c => david.c} | 0 .../keymaps/{keymap_default.c => default.c} | 0 .../keymaps/{keymap_dzobert.c => dzobert.c} | 0 .../keymaps/{keymap_gabriel.c => gabriel.c} | 0 .../planck/keymaps/{keymap_jack.c => jack.c} | 0 .../planck/keymaps/{keymap_joe.c => joe.c} | 0 .../planck/keymaps/{keymap_kyle.c => kyle.c} | 0 .../planck/keymaps/{keymap_leo.c => leo.c} | 0 .../planck/keymaps/{keymap_lock.c => lock.c} | 0 .../planck/keymaps/{keymap_max.c => max.c} | 0 .../keymaps/{keymap_monkey.c => monkey.c} | 0 .../keymaps/{keymap_numpad.c => numpad.c} | 0 keyboard/planck/keymaps/test/default.c | 123 +++++++++++++++++ quantum/quantum.mk | 14 +- 21 files changed, 228 insertions(+), 48 deletions(-) rename keyboard/planck/keymaps/{keymap_alexey.c => alexey.c} (100%) rename keyboard/planck/keymaps/{keymap_angerthosenear.c => angerthosenear.c} (100%) rename keyboard/planck/keymaps/{keymap_austin.c => austin.c} (100%) rename keyboard/planck/keymaps/{keymap_charlie.c => charlie.c} (100%) rename keyboard/planck/keymaps/{keymap_daniel.c => daniel.c} (100%) rename keyboard/planck/keymaps/{keymap_david.c => david.c} (100%) rename keyboard/planck/keymaps/{keymap_default.c => default.c} (100%) rename keyboard/planck/keymaps/{keymap_dzobert.c => dzobert.c} (100%) rename keyboard/planck/keymaps/{keymap_gabriel.c => gabriel.c} (100%) rename keyboard/planck/keymaps/{keymap_jack.c => jack.c} (100%) rename keyboard/planck/keymaps/{keymap_joe.c => joe.c} (100%) rename keyboard/planck/keymaps/{keymap_kyle.c => kyle.c} (100%) rename keyboard/planck/keymaps/{keymap_leo.c => leo.c} (100%) rename keyboard/planck/keymaps/{keymap_lock.c => lock.c} (100%) rename keyboard/planck/keymaps/{keymap_max.c => max.c} (100%) rename keyboard/planck/keymaps/{keymap_monkey.c => monkey.c} (100%) rename keyboard/planck/keymaps/{keymap_numpad.c => numpad.c} (100%) create mode 100644 keyboard/planck/keymaps/test/default.c diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index 485c5f77f6..f3537b2c7a 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -54,10 +54,19 @@ SRC = planck.c \ backlight.c ifdef KEYMAP - SRC := keymaps/keymap_$(KEYMAP).c $(SRC) +ifneq ("$(wildcard keymaps/$(KEYMAP).c)","") + KEYMAP_FILE = keymaps/$(KEYMAP).c else - SRC := keymaps/keymap_default.c $(SRC) + KEYMAP_FILE = keymaps/$(KEYMAP)/default.c endif +else +ifneq ("$(wildcard keymaps/default.c)","") + KEYMAP_FILE = keymaps/default.c +else + KEYMAP_FILE = keymaps/default/default.c +endif +endif +SRC := $(KEYMAP_FILE) $(SRC) CONFIG_H = config.h diff --git a/keyboard/planck/README.md b/keyboard/planck/README.md index 0003e765d4..5c3a52498a 100644 --- a/keyboard/planck/README.md +++ b/keyboard/planck/README.md @@ -3,29 +3,42 @@ Planck keyboard firmware DIY/Assembled compact ortholinear 40% keyboard by [Ortholinear Keyboards](http://ortholinearkeyboards.com). ## Quantum MK Firmware + You have access to a bunch of goodies! Check out the Makefile to enable/disable some of the features. Uncomment the `#` to enable them. Setting them to `no` does nothing and will only confuse future you. BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality MIDI_ENABLE = yes # MIDI controls - # UNICODE_ENABLE = yes # Unicode support + # UNICODE_ENABLE = yes # Unicode support - this is commented out, just as an example. You have to use #, not // BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID -### Mod shortcuts +## Quick aliases to common actions -* `LSFT(kc)` - applies left shift to *kc* - `S(kc)` is an alias -* `RSFT(kc)` - applies right shift to *kc* -* `LCTL(kc)` - applies left control to *kc* -* `RCTL(kc)` - applies right control to *kc* -* `LALT(kc)` - applies left alt to *kc* -* `RALT(kc)` - applies right alt to *kc* -* `LGUI(kc)` - applies left gui (command/win) to *kc* -* `RGUI(kc)` - applies right gui (command/win) to *kc* +Your keymap can include shortcuts to common operations (called "function actions" in tmk). -You can also use more than one, like this: +### Switching and toggling layers - LALT(LGUI(KC_ESC)) +`MO(layer)` - momentary switch to *layer*. As soon as you let go of the key, the layer is deactivated and you pop back out to the previous layer. When you apply this to a key, that same key must be set as `KC_TRNS` on the destination layer. Otherwise, you won't make it back to the original layer when you release the key (and you'll get a keycode sent). You can only switch to layers *above* your current layer. If you're on layer 0 and you use `MO(1)`, that will switch to layer 1 just fine. But if you include `MO(3)` on layer 5, that won't do anything for you -- because layer 3 is lower than layer 5 on the stack. -The following shortcuts automatically add `LSFT()` to keycodes to get commonly used symbols. Their long names (see `quantum/keymap_common.h`) are also availble. +`LT(layer, kc)` - momentary switch to *layer* when held, and *kc* when tapped. Like `MO()`, this only works upwards in the layer stack (`layer` must be higher than the current layer). + +`TG(layer)` - toggles a layer on or off. As with `MO()`, you should set this key as `KC_TRNS` in the destination layer so that tapping it again actually toggles back to the original layer. Only works upwards in the layer stack. + +### Fun with modifier keys + +* `LSFT(kc)` - applies left Shift to *kc* (keycode) - `S(kc)` is an alias +* `RSFT(kc)` - applies right Shift to *kc* +* `LCTL(kc)` - applies left Control to *kc* +* `RCTL(kc)` - applies right Control to *kc* +* `LALT(kc)` - applies left Alt to *kc* +* `RALT(kc)` - applies right Alt to *kc* +* `LGUI(kc)` - applies left GUI (command/win) to *kc* +* `RGUI(kc)` - applies right GUI (command/win) to *kc* + +You can also chain these, like this: + + LALT(LCTL(KC_DEL)) -- this makes a key that sends Alt, Control, and Delete in a single keypress. + +The following shortcuts automatically add `LSFT()` to keycodes to get commonly used symbols. Their long names are also available and documented in `/quantum/keymap_common.h`. KC_TILD ~ KC_EXLM ! @@ -45,31 +58,71 @@ The following shortcuts automatically add `LSFT()` to keycodes to get commonly u KC_PIPE | KC_COLN : -### Function shortcuts +`MT(mod, kc)` - is *mod* (modifier key - MOD_LCTL, MOD_LSFT) when held, and *kc* when tapped. In other words, you can have a key that sends Esc (or the letter O or whatever) when you tap it, but works as a Control key or a Shift key when you hold it down. -Instead of using `FNx`, you can use `F(x)` - the benefit here is being able to use more than 32 function layers (up to 4096), if you happen to need them. +These are the values you can use for the `mod` in `MT()` (right-hand modifiers are not available): -There are also keycode shortcuts for common actions: + * MOD_LCTL + * MOD_LSFT + * MOD_LALT + * MOD_LGUI + +These can also be combined like `MOD_LCTL | MOD_LSFT` e.g. `MT(MOD_LCTL | MOD_LSFT, KC_ESC)` which would activate Control and Shift when held, and send Escape when tapped. + +We've added shortcuts to make common modifier/tap (mod-tap) mappings more compact: -* `MO(layer)` - momentary switch to *layer* -* `DF(layer)` - sets default layer to *layer* -* `TG(layer)` - toggle between the current layer and *layer* -* `MT(mod, kc)` - is *mod* when held, and *kc* when tapped * `CTL_T(kc)` - is LCTL when held and *kc* when tapped * `SFT_T(kc)` - is LSFT when held and *kc* when tapped * `ALT_T(kc)` - is LALT when held and *kc* when tapped * `GUI_T(kc)` - is LGUI when held and *kc* when tapped - * `ALL_T(kc)` - is Hyper (all mods) when held and *kc* when tapped -* `LT(layer, kc)` - momentary switch to *layer* when held, and *kc* when tapped + * `ALL_T(kc)` - is Hyper (all mods) when held and *kc* when tapped. To read more about what you can do with a Hyper key, see [this blog post by Brett Terpstra](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/) -These functions work the same way that their `ACTION_*` functions do, and will require KC_TRNS on the layer being switched to - check out the default keymap for an example. +### Temporarily setting the default layer -### Additional keycodes for software-implemented layouts (Colemak, Dvorak, etc) +`DF(layer)` - sets default layer to *layer*. The default layer is the one at the "bottom" of the layer stack - the ultimate fallback layer. This currently does not persist over power loss. When you plug the keyboard back in, layer 0 will always be the default. It is theoretically possible to work around that, but that's not what `DF` does. + +### Remember: These are just aliases + +These functions work the same way that their `ACTION_*` functions do - they're just quick aliases. To dig into all of the tmk ACTION_* functions, please see the [TMK documentation](https://github.com/jackhumbert/qmk_firmware/blob/master/tmk_core/doc/keymap.md#2-action). + +Instead of using `FNx` when defining `ACTION_*` functions, you can use `F(x)` - the benefit here is being able to use more than 32 function actions (up to 4096), if you happen to need them. + +## Macro shortcuts: Send a whole string when pressing just one key + +Instead of using the `ACTION_MACRO` function, you can simply use `M(n)` to access macro *n* - *n* will get passed into the `action_get_macro` as the `id`, and you can use a switch statement to trigger it. This gets called on the keydown and keyup, so you'll need to use an if statement testing `record->event.pressed` (see keymaps/default.c). + +```c +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // this is the function signature -- just copy/paste it into your keymap file as it is. +{ + switch(id) { + case 0: // this would trigger when you hit a key mapped as M(0) + if (record->event.pressed) { + return MACRO( I(255), T(H), T(E), T(L), T(L), W(255), T(O), END ); // this sends the string 'hello' when the macro executes + } + break; + } + return MACRO_NONE; +}; +``` +A macro can include the following commands: + +* I() change interval of stroke in milliseconds. +* D() press key. +* U() release key. +* T() type key(press and release). +* W() wait (milliseconds). +* END end mark. + +So above you can see the stroke interval changed to 255ms between each keystroke, then a bunch of keys being typed, waits a while, then the macro ends. + +Note: Using macros to have your keyboard send passwords for you is a bad idea. + +### Additional keycode aliases for software-implemented layouts (Colemak, Dvorak, etc) Everything is assuming you're in Qwerty (in software) by default, but there is built-in support for using a Colemak or Dvorak layout by including this at the top of your keymap: - #include "keymap_.h" - + #include "keymap_.h" + Where is "colemak" or "dvorak". After including this line, you will get access to: * `CM_*` for all of the Colemak-equivalent characters @@ -79,19 +132,15 @@ These implementations assume you're using Colemak or Dvorak on your OS, not on y To give an example, if you're using software-implemented Colemak, and want to get an `F`, you would use `CM_F` - `KC_F` under these same circumstances would result in `T`. -### Additional language support +## Additional language support -In `quantum/keymap_extras/`, you'll see various language files - these work the same way as the alternative layout ones do. Most are defined by their two letter country/language code followed by an underscore and a 4-letter abbrivation of its name. `FR_UGRV` which will result in a `ù` when using a software-implemented AZERTY layout. It's currently difficult to send such characters in just the firmware (but it's being worked on - see Unicode support). +In `quantum/keymap_extras/`, you'll see various language files - these work the same way as the alternative layout ones do. Most are defined by their two letter country/language code followed by an underscore and a 4-letter abbreviation of its name. `FR_UGRV` which will result in a `ù` when using a software-implemented AZERTY layout. It's currently difficult to send such characters in just the firmware (but it's being worked on - see Unicode support). -### Unicode support +## Unicode support You can currently send 4 hex digits with your OS-specific modifier key (RALT for OSX with the "Unicode Hex Input" layout) - this is currently limited to supporting one OS at a time, and requires a recompile for switching. 8 digit hex codes are being worked on. The keycode function is `UC(n)`, where *n* is a 4 digit hexidecimal. Enable from the Makefile. -### Macro shortcuts - -Instead of using the `ACTION_MACRO` function, you can simply use `M(n)` to access macro *n* - *n* will get passed into the `action_get_macro` as the `id`, and you can use a switch statement to filter them. This gets called on the keydown and keyup, so you'll need to use an if statement testing `record->event.pressed` (see keymap_default.c). - -### Other keyboard shortcut keycodes +## Other firmware shortcut keycodes * `RESET` - puts the MCU in DFU mode for flashing new firmware (with `make dfu`) * `DEBUG` - the firmware into debug mode - you'll need hid_listen to see things @@ -105,12 +154,11 @@ Instead of using the `ACTION_MACRO` function, you can simply use `M(n)` to acces Enable the backlight from the Makefile. - -### 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. -### Bluetooth functionality +## Bluetooth functionality This requires [some hardware changes](https://www.reddit.com/r/MechanicalKeyboards/comments/3psx0q/the_planck_keyboard_with_bluetooth_guide_and/?ref=search_posts), but can be enabled via the Makefile. The firmware will still output characters via USB, so be aware of this when charging via a computer. It would make sense to have a switch on the Bluefruit to turn it off at will. @@ -124,13 +172,13 @@ Depending on which keymap you would like to use, you will have to compile slight 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 `keymap_.c` and see keymap document (you can find in top README.md) and existent keymap files. +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 `.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|] ``` -Keymaps follow the format **__keymap\_\.c__** and are stored in the `keymaps` folder. +Keymaps follow the format **__.c__** and are stored in the `keymaps` folder. ### Notable forks (which some of the keymap files are from) - [Shane's Fork](https://github.com/shanecelis/tmk_keyboard/tree/master/keyboard/planck) diff --git a/keyboard/planck/keymaps/keymap_alexey.c b/keyboard/planck/keymaps/alexey.c similarity index 100% rename from keyboard/planck/keymaps/keymap_alexey.c rename to keyboard/planck/keymaps/alexey.c diff --git a/keyboard/planck/keymaps/keymap_angerthosenear.c b/keyboard/planck/keymaps/angerthosenear.c similarity index 100% rename from keyboard/planck/keymaps/keymap_angerthosenear.c rename to keyboard/planck/keymaps/angerthosenear.c diff --git a/keyboard/planck/keymaps/keymap_austin.c b/keyboard/planck/keymaps/austin.c similarity index 100% rename from keyboard/planck/keymaps/keymap_austin.c rename to keyboard/planck/keymaps/austin.c diff --git a/keyboard/planck/keymaps/keymap_charlie.c b/keyboard/planck/keymaps/charlie.c similarity index 100% rename from keyboard/planck/keymaps/keymap_charlie.c rename to keyboard/planck/keymaps/charlie.c diff --git a/keyboard/planck/keymaps/keymap_daniel.c b/keyboard/planck/keymaps/daniel.c similarity index 100% rename from keyboard/planck/keymaps/keymap_daniel.c rename to keyboard/planck/keymaps/daniel.c diff --git a/keyboard/planck/keymaps/keymap_david.c b/keyboard/planck/keymaps/david.c similarity index 100% rename from keyboard/planck/keymaps/keymap_david.c rename to keyboard/planck/keymaps/david.c diff --git a/keyboard/planck/keymaps/keymap_default.c b/keyboard/planck/keymaps/default.c similarity index 100% rename from keyboard/planck/keymaps/keymap_default.c rename to keyboard/planck/keymaps/default.c diff --git a/keyboard/planck/keymaps/keymap_dzobert.c b/keyboard/planck/keymaps/dzobert.c similarity index 100% rename from keyboard/planck/keymaps/keymap_dzobert.c rename to keyboard/planck/keymaps/dzobert.c diff --git a/keyboard/planck/keymaps/keymap_gabriel.c b/keyboard/planck/keymaps/gabriel.c similarity index 100% rename from keyboard/planck/keymaps/keymap_gabriel.c rename to keyboard/planck/keymaps/gabriel.c diff --git a/keyboard/planck/keymaps/keymap_jack.c b/keyboard/planck/keymaps/jack.c similarity index 100% rename from keyboard/planck/keymaps/keymap_jack.c rename to keyboard/planck/keymaps/jack.c diff --git a/keyboard/planck/keymaps/keymap_joe.c b/keyboard/planck/keymaps/joe.c similarity index 100% rename from keyboard/planck/keymaps/keymap_joe.c rename to keyboard/planck/keymaps/joe.c diff --git a/keyboard/planck/keymaps/keymap_kyle.c b/keyboard/planck/keymaps/kyle.c similarity index 100% rename from keyboard/planck/keymaps/keymap_kyle.c rename to keyboard/planck/keymaps/kyle.c diff --git a/keyboard/planck/keymaps/keymap_leo.c b/keyboard/planck/keymaps/leo.c similarity index 100% rename from keyboard/planck/keymaps/keymap_leo.c rename to keyboard/planck/keymaps/leo.c diff --git a/keyboard/planck/keymaps/keymap_lock.c b/keyboard/planck/keymaps/lock.c similarity index 100% rename from keyboard/planck/keymaps/keymap_lock.c rename to keyboard/planck/keymaps/lock.c diff --git a/keyboard/planck/keymaps/keymap_max.c b/keyboard/planck/keymaps/max.c similarity index 100% rename from keyboard/planck/keymaps/keymap_max.c rename to keyboard/planck/keymaps/max.c diff --git a/keyboard/planck/keymaps/keymap_monkey.c b/keyboard/planck/keymaps/monkey.c similarity index 100% rename from keyboard/planck/keymaps/keymap_monkey.c rename to keyboard/planck/keymaps/monkey.c diff --git a/keyboard/planck/keymaps/keymap_numpad.c b/keyboard/planck/keymaps/numpad.c similarity index 100% rename from keyboard/planck/keymaps/keymap_numpad.c rename to keyboard/planck/keymaps/numpad.c diff --git a/keyboard/planck/keymaps/test/default.c b/keyboard/planck/keymaps/test/default.c new file mode 100644 index 0000000000..bc81adcf97 --- /dev/null +++ b/keyboard/planck/keymaps/test/default.c @@ -0,0 +1,123 @@ +// USING_MIDI +// USING_BACKLIGHT +#include "keymap_common.h" +#include "backlight.h" +#include "action_layer.h" +#include "keymap_midi.h" +#include + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = { /* Qwerty */ + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_ESC, 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(0), KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + // Space is repeated to accommadate for both spacebar wiring positions +}, +[1] = { /* Colemak */ + {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, + {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +[2] = { /* RAISE */ + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_TRNS, FUNC(3), FUNC(4), RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {KC_TRNS, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(1), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, +[3] = { /* LOWER */ + {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, + {KC_TRNS, FUNC(3), FUNC(4), RESET, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, + {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, +[4] = { /* TENKEY */ + {KC_TAB, N_C5, N_D5, N_E5, N_F5, N_G5, N_A5, KC_KP_7, KC_KP_8, KC_KP_9, KC_P, KC_BSPC}, + {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_KP_4, KC_KP_5, KC_KP_6, KC_SCLN, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_KP_1, KC_KP_2, KC_KP_3, KC_SLSH, KC_ENT}, + {KC_TRNS, KC_LCTL, KC_LALT, KC_LGUI, KC_TRNS, KC_SPC, KC_SPC, KC_KP_0, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +[5] = { + { MIDI12 }, + { MIDI12 }, + { MIDI12 }, + {M(0), KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_SPC, KC_SPC, FUNC(1), MIDI, MIDI, MIDI, MIDI} +} +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE + [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER + + [3] = ACTION_DEFAULT_LAYER_SET(0), + [4] = ACTION_DEFAULT_LAYER_SET(1), + +}; + +uint16_t hextokeycode(int hex) { + if (hex == 0x0) { + return KC_0; + } else if (hex < 0xA) { + return KC_1 + (hex - 0x1); + } else { + return KC_A + (hex - 0xA); + } +} + +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) { + // play_note(440, 20); + // register_code(KC_RSFT); + backlight_set(BACKLIGHT_LEVELS); + default_layer_and(0); + default_layer_or((1<<5)); + + // uint8_t low = boot_lock_fuse_bits_get(0x0000); + // uint8_t high = boot_lock_fuse_bits_get(0x0003); + // uint8_t ext = boot_lock_fuse_bits_get(0x0002); + // uint8_t lock = boot_lock_fuse_bits_get(0x0001); + + // register_code(hextokeycode((low & 0xF0) >> 4)); + // unregister_code(hextokeycode((low & 0xF0) >> 4)); + // register_code(hextokeycode((low & 0x0F))); + // unregister_code(hextokeycode((low & 0x0F))); + + + // register_code(hextokeycode((high & 0xF0) >> 4)); + // unregister_code(hextokeycode((high & 0xF0) >> 4)); + // register_code(hextokeycode((high & 0x0F))); + // unregister_code(hextokeycode((high & 0x0F))); + + + // register_code(hextokeycode((ext & 0xF0) >> 4)); + // unregister_code(hextokeycode((ext & 0xF0) >> 4)); + // register_code(hextokeycode((ext & 0x0F))); + // unregister_code(hextokeycode((ext & 0x0F))); + + + // register_code(hextokeycode((lock & 0xF0) >> 4)); + // unregister_code(hextokeycode((lock & 0xF0) >> 4)); + // register_code(hextokeycode((lock & 0x0F))); + // unregister_code(hextokeycode((lock & 0x0F))); + + // note(0+12, 20); + // note(0+24, 20); + } else { + // unregister_code(KC_RSFT); + // stop_note(); + backlight_set(0); + default_layer_and(0); + default_layer_or(0); + // note(0+24, 20); + // note(0, 20); + // play_note(4, 20); + } + break; + } + return MACRO_NONE; +}; diff --git a/quantum/quantum.mk b/quantum/quantum.mk index 62d67be9f1..3a968a1459 100644 --- a/quantum/quantum.mk +++ b/quantum/quantum.mk @@ -4,18 +4,18 @@ QUANTUM_DIR = quantum SRC += $(QUANTUM_DIR)/keymap_common.c \ $(QUANTUM_DIR)/led.c -ifdef KEYMAP -ifneq (,$(shell grep USING_MIDI 'keymaps/keymap_$(KEYMAP).c')) +ifdef KEYMAP_FILE +ifneq (,$(shell grep USING_MIDI '$(KEYMAP_FILE)')) MIDI_ENABLE=yes -$(info * Overriding MIDI_ENABLE setting - keymap_$(KEYMAP).c requires it) +$(info * Overriding MIDI_ENABLE setting - $(KEYMAP_FILE) requires it) endif -ifneq (,$(shell grep USING_UNICODE 'keymaps/keymap_$(KEYMAP).c')) +ifneq (,$(shell grep USING_UNICODE '$(KEYMAP_FILE)')) UNICODE_ENABLE=yes -$(info * Overriding UNICODE_ENABLE setting - keymap_$(KEYMAP).c requires it) +$(info * Overriding UNICODE_ENABLE setting - $(KEYMAP_FILE) requires it) endif -ifneq (,$(shell grep USING_BACKLIGHT 'keymaps/keymap_$(KEYMAP).c')) +ifneq (,$(shell grep USING_BACKLIGHT '$(KEYMAP_FILE)')) BACKLIGHT_ENABLE=yes -$(info * Overriding BACKLIGHT_ENABLE setting - keymap_$(KEYMAP).c requires it) +$(info * Overriding BACKLIGHT_ENABLE setting - $(KEYMAP_FILE) requires it) endif endif From c9a096dc99a2af45d288f9915d70fa339c0e5a6e Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Jan 2016 00:57:35 -0500 Subject: [PATCH 19/52] added error for keymap file not existing --- keyboard/planck/Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index f3537b2c7a..ff68ea0fb3 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -57,7 +57,11 @@ ifdef KEYMAP ifneq ("$(wildcard keymaps/$(KEYMAP).c)","") KEYMAP_FILE = keymaps/$(KEYMAP).c else +ifneq ("$(wildcard keymaps/$(KEYMAP)/default.c)","") KEYMAP_FILE = keymaps/$(KEYMAP)/default.c +else +$(error Keymap file does not exist) +endif endif else ifneq ("$(wildcard keymaps/default.c)","") From 547fa6e461ceacd04e7daa0b25b58f7d64d29239 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Jan 2016 01:01:32 -0500 Subject: [PATCH 20/52] I guess I can reference #90 in the commit message --- keyboard/planck/keymaps/test/default.c | 38 -------------------------- 1 file changed, 38 deletions(-) diff --git a/keyboard/planck/keymaps/test/default.c b/keyboard/planck/keymaps/test/default.c index bc81adcf97..71bd6c91e5 100644 --- a/keyboard/planck/keymaps/test/default.c +++ b/keyboard/planck/keymaps/test/default.c @@ -71,51 +71,13 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) switch(id) { case 0: if (record->event.pressed) { - // play_note(440, 20); - // register_code(KC_RSFT); backlight_set(BACKLIGHT_LEVELS); default_layer_and(0); default_layer_or((1<<5)); - - // uint8_t low = boot_lock_fuse_bits_get(0x0000); - // uint8_t high = boot_lock_fuse_bits_get(0x0003); - // uint8_t ext = boot_lock_fuse_bits_get(0x0002); - // uint8_t lock = boot_lock_fuse_bits_get(0x0001); - - // register_code(hextokeycode((low & 0xF0) >> 4)); - // unregister_code(hextokeycode((low & 0xF0) >> 4)); - // register_code(hextokeycode((low & 0x0F))); - // unregister_code(hextokeycode((low & 0x0F))); - - - // register_code(hextokeycode((high & 0xF0) >> 4)); - // unregister_code(hextokeycode((high & 0xF0) >> 4)); - // register_code(hextokeycode((high & 0x0F))); - // unregister_code(hextokeycode((high & 0x0F))); - - - // register_code(hextokeycode((ext & 0xF0) >> 4)); - // unregister_code(hextokeycode((ext & 0xF0) >> 4)); - // register_code(hextokeycode((ext & 0x0F))); - // unregister_code(hextokeycode((ext & 0x0F))); - - - // register_code(hextokeycode((lock & 0xF0) >> 4)); - // unregister_code(hextokeycode((lock & 0xF0) >> 4)); - // register_code(hextokeycode((lock & 0x0F))); - // unregister_code(hextokeycode((lock & 0x0F))); - - // note(0+12, 20); - // note(0+24, 20); } else { - // unregister_code(KC_RSFT); - // stop_note(); backlight_set(0); default_layer_and(0); default_layer_or(0); - // note(0+24, 20); - // note(0, 20); - // play_note(4, 20); } break; } From f66a251e5d9d741ccd3eda5a87de5a71c14843e9 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Jan 2016 01:01:32 -0500 Subject: [PATCH 21/52] I guess I can reference #90 in the commit message --- keyboard/planck/keymaps/test/README.md | 3 ++ keyboard/planck/keymaps/test/default.c | 38 -------------------------- 2 files changed, 3 insertions(+), 38 deletions(-) create mode 100644 keyboard/planck/keymaps/test/README.md diff --git a/keyboard/planck/keymaps/test/README.md b/keyboard/planck/keymaps/test/README.md new file mode 100644 index 0000000000..c555d2ddc9 --- /dev/null +++ b/keyboard/planck/keymaps/test/README.md @@ -0,0 +1,3 @@ +# Testing out this! + +This folder will probably get deleted before merging. \ No newline at end of file diff --git a/keyboard/planck/keymaps/test/default.c b/keyboard/planck/keymaps/test/default.c index bc81adcf97..71bd6c91e5 100644 --- a/keyboard/planck/keymaps/test/default.c +++ b/keyboard/planck/keymaps/test/default.c @@ -71,51 +71,13 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) switch(id) { case 0: if (record->event.pressed) { - // play_note(440, 20); - // register_code(KC_RSFT); backlight_set(BACKLIGHT_LEVELS); default_layer_and(0); default_layer_or((1<<5)); - - // uint8_t low = boot_lock_fuse_bits_get(0x0000); - // uint8_t high = boot_lock_fuse_bits_get(0x0003); - // uint8_t ext = boot_lock_fuse_bits_get(0x0002); - // uint8_t lock = boot_lock_fuse_bits_get(0x0001); - - // register_code(hextokeycode((low & 0xF0) >> 4)); - // unregister_code(hextokeycode((low & 0xF0) >> 4)); - // register_code(hextokeycode((low & 0x0F))); - // unregister_code(hextokeycode((low & 0x0F))); - - - // register_code(hextokeycode((high & 0xF0) >> 4)); - // unregister_code(hextokeycode((high & 0xF0) >> 4)); - // register_code(hextokeycode((high & 0x0F))); - // unregister_code(hextokeycode((high & 0x0F))); - - - // register_code(hextokeycode((ext & 0xF0) >> 4)); - // unregister_code(hextokeycode((ext & 0xF0) >> 4)); - // register_code(hextokeycode((ext & 0x0F))); - // unregister_code(hextokeycode((ext & 0x0F))); - - - // register_code(hextokeycode((lock & 0xF0) >> 4)); - // unregister_code(hextokeycode((lock & 0xF0) >> 4)); - // register_code(hextokeycode((lock & 0x0F))); - // unregister_code(hextokeycode((lock & 0x0F))); - - // note(0+12, 20); - // note(0+24, 20); } else { - // unregister_code(KC_RSFT); - // stop_note(); backlight_set(0); default_layer_and(0); default_layer_or(0); - // note(0+24, 20); - // note(0, 20); - // play_note(4, 20); } break; } From fb181304083b884c60a30f64a634b592479aed6d Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 16 Jan 2016 01:35:28 +0100 Subject: [PATCH 22/52] Implemented Dvorak layer --- .../ergodox_ez/keymaps/keymap_typematrix.c | 76 +++++++++++++++---- 1 file changed, 63 insertions(+), 13 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c index 04d91b45bf..931170c387 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c @@ -10,14 +10,17 @@ * - ] is moved in place of the dash (-) * - dash (-) and = are moved on bottom right row * - arrows and PgUp/PgDn are moved on the thumbs - * Layer 1: numbers layer close to the TM when toggling "num" with the following differences: + * Layer 1: same as Layer 0 but with Dvorak layout, to use with QWERTY OS layout. + * Enable Dvorak layout with Magic-1 (LShift-RShift-1), disable with Magic-0. + * Layer 8: numbers layer close to the TM when toggling "num" with the following differences: * - numpad is displaced by 1 to the top left * - arrows are displaced by 1 to the left * - provides access to F1-F12, caps lock and num lock - * Layer 2: "fn" layer ("fn" key toggles both layers 1 & 2) with the following differences: + * Layer 9: "fn" layer ("fn" key toggles both layers 1 & 2) with the following differences: * - VolUp & VolDn are only on left hand to keep access to arrows on right hand - * Leds: - * - left (1st) & middle (2nd) leds are used to indicate layers 1 & 2 respectively + * LEDs: + * - left (1st) led is used to indicate the numbers layer + * - middle (2nd) led is used to indicate Dvorak layout * - right (3rd) led is used to indicate caps-lock */ #include "ergodox_ez.h" @@ -26,8 +29,9 @@ #include "led.h" #define BASE 0 // default layer -#define NMBR 1 // numbers layer -#define FNLR 2 // fn layer +#define DVRK 1 // Dvorak layer +#define NMBR 8 // numbers layer +#define FNLR 9 // fn layer #define MDBL0 1 #define MFNLR 2 @@ -36,7 +40,7 @@ #define MPSTE 5 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Keymap 0: Basic layer +/* Basic layer * * ,--------------------------------------------------. ,--------------------------------------------------. * | ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | ] | @@ -50,7 +54,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |LCtrl | fn | LGui | Play |App/Alt| | RAlt | - | Home | = |End/Ctl| * `-----------------------------------' `-----------------------------------' * ,--------------. ,-------------. - * |Esc/Alt| L1 | | Left |Right | + * |Esc/Alt| num | | Left |Right | * ,------+-------+------| |------+------+------. * | | | PgUp | | Up | | | * |Space |LShift |------| |------|RShift|Space | @@ -67,7 +71,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, KC_LCTL, M(MFNLR), KC_LGUI,KC_MPLY,ALT_T(KC_APP), - ALT_T(KC_ESC), TG(1), + ALT_T(KC_ESC), TG(NMBR), KC_PGUP, KC_SPC, KC_LSFT, KC_PGDN, @@ -82,7 +86,53 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_UP, KC_DOWN, KC_RSFT, KC_SPC ), -/* Keymap 1: Numbers Layer +/* Dvorak layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | = | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | ' | , | . | P | Y |Backsp| |Backsp| F | G | C | R | L | / | + * |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| + * | LShift | A | O | E | U | I |------| |------| D | H | T | N | S | -/Shift| + * |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| + * | LShift | ; | Q | J | K | X | | | | B | M | W | V | Z | \/Shift| + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |LCtrl | fn | LGui | Play |App/Alt| | RAlt | [ | Home | ] |End/Ctl| + * `-----------------------------------' `-----------------------------------' + * ,--------------. ,-------------. + * |Esc/Alt| num | | Left |Right | + * ,------+-------+------| |------+------+------. + * | | | PgUp | | Up | | | + * |Space |LShift |------| |------|RShift|Space | + * | | | PgDn | | Down | | | + * `---------------------' `--------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[DVRK] = KEYMAP( // layer 0 : default + // left hand + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELT, + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_BSPC, + KC_LSFT, KC_A, KC_O, KC_E, KC_U, KC_I, + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_ENT, + KC_LCTL, M(MFNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP), + + ALT_T(KC_ESC), TG(NMBR), + KC_PGUP, + KC_SPC, KC_LSFT, KC_PGDN, + + // right hand + KC_DELT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL, + KC_BSPC, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, + KC_D, KC_H, KC_T, KC_N, KC_S, SFT_T(KC_MINS), + KC_ENT, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_T(KC_BSLS), + KC_RALT, KC_LBRC, KC_HOME, KC_RBRC, CTL_T(KC_END), + + KC_LEFT, KC_RGHT, + KC_UP, + KC_DOWN, KC_RSFT, KC_SPC + ), +/* Numbers Layer * * ,--------------------------------------------------. ,--------------------------------------------------. * | | F1 | F2 | F3 | F4 | F5 | | | | | | Tab | / | * | - | @@ -126,7 +176,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), -/* Keymap 2: fn layer +/* fn layer * * ,--------------------------------------------------. ,--------------------------------------------------. * | | | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk| @@ -221,8 +271,8 @@ void * matrix_scan_user(void) { if (layer_state & (1 << NMBR)) { ergodox_right_led_1_on(); } - // led 2: fn layer - if (layer_state & (1 << FNLR)) { + // led 2: Dvorak layer + if (default_layer_state == 1 << DVRK) { ergodox_right_led_2_on(); } // led 3: caps lock From eb61700912f1713ba27d34c23d7f07be66ee6513 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 20 Jan 2016 00:06:52 -0500 Subject: [PATCH 23/52] better integrations --- keyboard/planck/Makefile | 7 +- keyboard/planck/keymaps/keymap_default.c | 8 +- keyboard/planck/keymaps/keymap_lock.c | 60 +--- keyboard/planck/planck.h | 4 +- quantum/audio.c | 362 +++++++++++++++++++++++ quantum/{beeps.h => audio.h} | 4 - quantum/beeps.c | 265 ----------------- quantum/keymap_midi.c | 4 +- quantum/quantum.mk | 7 +- tmk_core/common.mk | 3 + tmk_core/protocol/lufa/lufa.c | 7 +- 11 files changed, 402 insertions(+), 329 deletions(-) create mode 100644 quantum/audio.c rename quantum/{beeps.h => audio.h} (93%) delete mode 100644 quantum/beeps.c diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index fdf8c16400..7b06446d74 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -50,8 +50,7 @@ TMK_DIR = ../../tmk_core TARGET_DIR = . # # project specific files -SRC = planck.c \ - backlight.c +SRC = planck.c ifdef KEYMAP SRC := keymaps/keymap_$(KEYMAP).c $(SRC) @@ -124,9 +123,13 @@ COMMAND_ENABLE = yes # Commands for debug and configuration # NKRO_ENABLE = yes # USB 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 = YES # MIDI controls +AUDIO_ENABLE = YES # Audio output on port C6 # UNICODE_ENABLE = YES # Unicode # BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID +ifdef BACKLIGHT_ENABLE + SRC += backlight.c +endif # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax diff --git a/keyboard/planck/keymaps/keymap_default.c b/keyboard/planck/keymaps/keymap_default.c index 49670dafd3..a9c2a06813 100644 --- a/keyboard/planck/keymaps/keymap_default.c +++ b/keyboard/planck/keymaps/keymap_default.c @@ -2,7 +2,9 @@ // this is the style you want to emulate. #include "planck.h" -#include "backlight.h" +#ifdef BACKLIGHT_ENABLE + #include "backlight.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. @@ -58,7 +60,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) case 0: if (record->event.pressed) { register_code(KC_RSFT); - backlight_step(); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif } else { unregister_code(KC_RSFT); } diff --git a/keyboard/planck/keymaps/keymap_lock.c b/keyboard/planck/keymaps/keymap_lock.c index 7a99b57c9d..0deb212cc7 100644 --- a/keyboard/planck/keymaps/keymap_lock.c +++ b/keyboard/planck/keymaps/keymap_lock.c @@ -1,8 +1,10 @@ #include "keymap_common.h" -// #include "backlight.h" +#ifdef BACKLIGHT_ENABLE + #include "backlight.h" +#endif #include "action_layer.h" #include "keymap_midi.h" -#include "beeps.h" +#include "audio.h" #include const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -86,7 +88,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) play_notes(&walk_up, 3, false); // play_note(440, 20); // register_code(KC_RSFT); - // backlight_set(BACKLIGHT_LEVELS); + #ifdef BACKLIGHT_ENABLE + backlight_set(BACKLIGHT_LEVELS); + #endif default_layer_and(0); default_layer_or((1<<5)); @@ -118,17 +122,14 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // register_code(hextokeycode((lock & 0x0F))); // unregister_code(hextokeycode((lock & 0x0F))); - // note(0+12, 20); - // note(0+24, 20); } else { unregister_code(KC_RSFT); play_notes(&walk_dn, 3, false); - // backlight_set(0); + #ifdef BACKLIGHT_ENABLE + backlight_set(0); + #endif default_layer_and(0); default_layer_or(0); - // note(0+24, 20); - // note(0, 20); - // play_note(4, 20); } break; } @@ -149,44 +150,5 @@ float start_up[][2] = { void * matrix_init_user(void) { init_notes(); - play_notes(&start_up, 9, false); - // play_note(((double)261.6*3)*pow(2.0,(36)/12.0), 0xF); - // _delay_ms(50); - - // play_note(((double)261.6*3)*pow(2.0,(48)/12.0), 0xF); - // _delay_ms(25); - // stop_note(((double)261.6*3)*pow(2.0,(48)/12.0)); - - // play_note(((double)261.6*3)*pow(2.0,(48)/12.0), 0xF); - // _delay_ms(25); - // stop_note(((double)261.6*3)*pow(2.0,(48)/12.0)); - - - // stop_note(((double)261.6*3)*pow(2.0,(36)/12.0)); - - - // play_note(((double)261.6*3)*pow(2.0,(62)/12.0), 0xF); - // _delay_ms(50); - // stop_note(((double)261.6*3)*pow(2.0,(62)/12.0)); - - - // play_note(((double)261.6*3)*pow(2.0,(64)/12.0), 0xF); - // _delay_ms(50); - // stop_note(((double)261.6*3)*pow(2.0,(64)/12.0)); - -} - - -// void * matrix_scan_user(void) { -// if (layer_state & (1<<2)) { -// if (!playing_notes) -// play_notes(&start_up, 9, true); -// } else if (layer_state & (1<<3)) { -// if (!playing_notes) -// play_notes(&start_up, 9, true); -// } else { -// if (playing_notes) -// stop_all_notes(); -// } -// } \ No newline at end of file +} \ No newline at end of file diff --git a/keyboard/planck/planck.h b/keyboard/planck/planck.h index 32c08f3b0b..e775ea7c62 100644 --- a/keyboard/planck/planck.h +++ b/keyboard/planck/planck.h @@ -3,7 +3,9 @@ #include "matrix.h" #include "keymap_common.h" -// #include "backlight.h" +#ifdef BACKLIGHT_ENABLE + #include "backlight.h" +#endif #include #ifdef MIDI_ENABLE #include diff --git a/quantum/audio.c b/quantum/audio.c new file mode 100644 index 0000000000..3a3a1a4910 --- /dev/null +++ b/quantum/audio.c @@ -0,0 +1,362 @@ +#include +#include +#include +#include +#include +#include + +#include "audio.h" +#include "keymap_common.h" + +#define PI 3.14159265 + +// #define PWM_AUDIO + +#ifdef PWM_AUDIO + #include "wave.h" + #define SAMPLE_DIVIDER 39 + #define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048) + // Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap +#endif + +void delay_us(int count) { + while(count--) { + _delay_us(1); + } +} + +int voices = 0; +int voice_place = 0; +double frequency = 0; +int volume = 0; +long position = 0; + +double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; +int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; +bool sliding = false; + +int max = 0xFF; +float sum = 0; +int value = 128; +float place = 0; +float places[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + +uint16_t place_int = 0; +bool repeat = true; +uint8_t * sample; +uint16_t sample_length = 0; + + +bool notes = false; +bool note = false; +float note_frequency = 0; +float note_length = 0; +uint16_t note_position = 0; +float (* notes_pointer)[][2]; +uint8_t notes_length; +bool notes_repeat; +uint8_t current_note = 0; + +void stop_all_notes() { + voices = 0; + #ifdef PWM_AUDIO + TIMSK3 &= ~_BV(OCIE3A); + #else + TIMSK3 &= ~_BV(OCIE3A); + TCCR3A &= ~_BV(COM3A1); + #endif + notes = false; + note = false; + frequency = 0; + volume = 0; + + for (int i = 0; i < 8; i++) { + frequencies[i] = 0; + volumes[i] = 0; + } +} + +void stop_note(double freq) { + #ifdef PWM_AUDIO + freq = freq / SAMPLE_RATE; + #endif + for (int i = 7; i >= 0; i--) { + if (frequencies[i] == freq) { + frequencies[i] = 0; + volumes[i] = 0; + for (int j = i; (j < 7); j++) { + frequencies[j] = frequencies[j+1]; + frequencies[j+1] = 0; + volumes[j] = volumes[j+1]; + volumes[j+1] = 0; + } + } + } + voices--; + if (voices < 0) + voices = 0; + if (voices == 0) { + #ifdef PWM_AUDIO + TIMSK3 &= ~_BV(OCIE3A); + #else + TIMSK3 &= ~_BV(OCIE3A); + TCCR3A &= ~_BV(COM3A1); + #endif + frequency = 0; + volume = 0; + note = false; + } else { + double freq = frequencies[voices - 1]; + int vol = volumes[voices - 1]; + double starting_f = frequency; + if (frequency < freq) { + sliding = true; + for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) { + frequency = f; + } + sliding = false; + } else if (frequency > freq) { + sliding = true; + for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) { + frequency = f; + } + sliding = false; + } + frequency = freq; + volume = vol; + } +} + +void init_notes() { + + #ifdef PWM_AUDIO + PLLFRQ = _BV(PDIV2); + PLLCSR = _BV(PLLE); + while(!(PLLCSR & _BV(PLOCK))); + PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */ + + /* Init a fast PWM on Timer4 */ + TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */ + TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */ + OCR4A = 0; + + /* Enable the OC4A output */ + DDRC |= _BV(PORTC6); + + TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs + + TCCR3A = 0x0; // Options not needed + TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC + OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback + #else + DDRC |= _BV(PORTC6); + + TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs + + TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); + TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); + #endif +} + + +ISR(TIMER3_COMPA_vect) { + + if (note) { + #ifdef PWM_AUDIO + if (voices == 1) { + // SINE + OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2; + + // SQUARE + // if (((int)place) >= 1024){ + // OCR4A = 0xFF >> 2; + // } else { + // OCR4A = 0x00; + // } + + // SAWTOOTH + // OCR4A = (int)place / 4; + + // TRIANGLE + // if (((int)place) >= 1024) { + // OCR4A = (int)place / 2; + // } else { + // OCR4A = 2048 - (int)place / 2; + // } + + place += frequency; + + if (place >= SINE_LENGTH) + place -= SINE_LENGTH; + + } else { + int sum = 0; + for (int i = 0; i < voices; i++) { + // SINE + sum += pgm_read_byte(&sinewave[(uint16_t)places[i]]) >> 2; + + // SQUARE + // if (((int)places[i]) >= 1024){ + // sum += 0xFF >> 2; + // } else { + // sum += 0x00; + // } + + places[i] += frequencies[i]; + + if (places[i] >= SINE_LENGTH) + places[i] -= SINE_LENGTH; + } + OCR4A = sum; + } + #else + if (frequency > 0) { + // ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period + // OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period + if (place > 10) { + voice_place = (voice_place + 1) % voices; + place = 0.0; + } + ICR3 = (int)(((double)F_CPU) / frequencies[voice_place]); // Set max to the period + OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1; // Set compare to half the period + place++; + } + #endif + } + + // SAMPLE + // OCR4A = pgm_read_byte(&sample[(uint16_t)place_int]); + + // place_int++; + + // if (place_int >= sample_length) + // if (repeat) + // place_int -= sample_length; + // else + // TIMSK3 &= ~_BV(OCIE3A); + + + if (notes) { + #ifdef PWM_AUDIO + OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0; + + place += note_frequency; + if (place >= SINE_LENGTH) + place -= SINE_LENGTH; + #else + if (note_frequency > 0) { + ICR3 = (int)(((double)F_CPU) / note_frequency); // Set max to the period + OCR3A = (int)(((double)F_CPU) / note_frequency) >> 1; // Set compare to half the period + } + #endif + + + note_position++; + if (note_position >= note_length) { + current_note++; + if (current_note >= notes_length) { + if (notes_repeat) { + current_note = 0; + } else { + #ifdef PWM_AUDIO + TIMSK3 &= ~_BV(OCIE3A); + #else + TIMSK3 &= ~_BV(OCIE3A); + TCCR3A &= ~_BV(COM3A1); + #endif + notes = false; + return; + } + } + #ifdef PWM_AUDIO + note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; + note_length = (*notes_pointer)[current_note][1]; + #else + note_frequency = (*notes_pointer)[current_note][0]; + note_length = (*notes_pointer)[current_note][1] / 4; + #endif + note_position = 0; + } + + } + +} + +void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) { + if (note) + stop_all_notes(); + notes = true; + + notes_pointer = np; + notes_length = n_length; + notes_repeat = n_repeat; + + place = 0; + current_note = 0; + #ifdef PWM_AUDIO + note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; + note_length = (*notes_pointer)[current_note][1]; + #else + note_frequency = (*notes_pointer)[current_note][0]; + note_length = (*notes_pointer)[current_note][1] / 4; + #endif + note_position = 0; + + + #ifdef PWM_AUDIO + TIMSK3 |= _BV(OCIE3A); + #else + TIMSK3 |= _BV(OCIE3A); + TCCR3A |= _BV(COM3A1); + #endif +} + +void play_sample(uint8_t * s, uint16_t l, bool r) { + stop_all_notes(); + place_int = 0; + sample = s; + sample_length = l; + repeat = r; + + #ifdef PWM_AUDIO + TIMSK3 |= _BV(OCIE3A); + #else + #endif +} + +void play_note(double freq, int vol) { + if (notes) + stop_all_notes(); + note = true; + #ifdef PWM_AUDIO + freq = freq / SAMPLE_RATE; + #endif + if (freq > 0) { + if (frequency != 0) { + double starting_f = frequency; + if (frequency < freq) { + for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) { + frequency = f; + } + } else if (frequency > freq) { + for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) { + frequency = f; + } + } + } + frequency = freq; + volume = vol; + + frequencies[voices] = frequency; + volumes[voices] = volume; + voices++; + } + + #ifdef PWM_AUDIO + TIMSK3 |= _BV(OCIE3A); + #else + TIMSK3 |= _BV(OCIE3A); + TCCR3A |= _BV(COM3A1); + #endif + +} \ No newline at end of file diff --git a/quantum/beeps.h b/quantum/audio.h similarity index 93% rename from quantum/beeps.h rename to quantum/audio.h index 4ccc344973..99203cea7a 100644 --- a/quantum/beeps.h +++ b/quantum/audio.h @@ -3,13 +3,9 @@ #include #include -bool playing_notes; - void play_sample(uint8_t * s, uint16_t l, bool r); void play_note(double freq, int vol); void stop_note(double freq); void stop_all_notes(); void init_notes(); - - void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat); \ No newline at end of file diff --git a/quantum/beeps.c b/quantum/beeps.c deleted file mode 100644 index 7586ebc522..0000000000 --- a/quantum/beeps.c +++ /dev/null @@ -1,265 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "beeps.h" -#include "keymap_common.h" -#include "wave.h" - -#define PI 3.14159265 - -#define SAMPLE_DIVIDER 39 -#define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048) -// Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap - -void delay_us(int count) { - while(count--) { - _delay_us(1); - } -} - -int voices = 0; -double frequency = 0; -int volume = 0; -long position = 0; - -double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0}; -int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0}; -bool sliding = false; -#define RANGE 1000 -volatile int i=0; //elements of the wave - -int max = 0xFF; -float sum = 0; -int value = 128; -float place = 0; - -uint16_t place_int = 0; -bool repeat = true; -uint8_t * sample; -uint16_t sample_length = 0; - - -bool notes = false; -float note_frequency = 0; -float note_length = 0; -uint16_t note_position = 0; -float (* notes_pointer)[][2]; -uint8_t notes_length; -bool notes_repeat; -uint8_t current_note = 0; - -void stop_all_notes() { - voices = 0; - TIMSK3 &= ~_BV(OCIE3A); - notes = false; - playing_notes = false; - frequency = 0; - volume = 0; - - for (int i = 0; i < 8; i++) { - frequencies[i] = 0; - volumes[i] = 0; - } -} - -void stop_note(double freq) { - freq = freq / SAMPLE_RATE; - for (int i = 7; i >= 0; i--) { - if (frequencies[i] == freq) { - frequencies[i] = 0; - volumes[i] = 0; - for (int j = i; (j < 7); j++) { - frequencies[j] = frequencies[j+1]; - frequencies[j+1] = 0; - volumes[j] = volumes[j+1]; - volumes[j+1] = 0; - } - } - } - voices--; - if (voices < 0) - voices = 0; - if (voices == 0) { - TIMSK3 &= ~_BV(OCIE3A); - frequency = 0; - volume = 0; - } else { - double freq = frequencies[voices - 1]; - int vol = volumes[voices - 1]; - double starting_f = frequency; - if (frequency < freq) { - sliding = true; - for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 500.0)) { - frequency = f; - } - sliding = false; - } else if (frequency > freq) { - sliding = true; - for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 500.0)) { - frequency = f; - } - sliding = false; - } - frequency = freq; - volume = vol; - } -} - -void init_notes() { - - PLLFRQ = _BV(PDIV2); - PLLCSR = _BV(PLLE); - while(!(PLLCSR & _BV(PLOCK))); - PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */ - - /* Init a fast PWM on Timer4 */ - TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */ - TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */ - OCR4A = 0; - - /* Enable the OC4A output */ - DDRC |= _BV(PORTC6); - - TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs - - TCCR3A = 0x0; // Options not needed - TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC - OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback - - playing_notes = false; - -} - - -ISR(TIMER3_COMPA_vect) { - - - // SINE - // OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]); - - // SQUARE - // if (((int)place) >= 1024){ - // OCR4A = 0xFF; - // } else { - // OCR4A = 0x00; - // } - - // SAWTOOTH - // OCR4A = (int)place / 4; - - // TRIANGLE - // if (((int)place) >= 1024) { - // OCR4A = (int)place / 2; - // } else { - // OCR4A = 2048 - (int)place / 2; - // } - - // place += frequency; - - // if (place >= SINE_LENGTH) - // if (repeat) - // place -= SINE_LENGTH; - // else - // TIMSK3 &= ~_BV(OCIE3A); - - // SAMPLE - // OCR4A = pgm_read_byte(&sample[(uint16_t)place_int]); - - // place_int++; - - // if (place_int >= sample_length) - // if (repeat) - // place_int -= sample_length; - // else - // TIMSK3 &= ~_BV(OCIE3A); - - - if (notes) { - OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0; - - place += note_frequency; - if (place >= SINE_LENGTH) - place -= SINE_LENGTH; - note_position++; - if (note_position >= note_length) { - current_note++; - if (current_note >= notes_length) { - if (notes_repeat) { - current_note = 0; - } else { - TIMSK3 &= ~_BV(OCIE3A); - notes = false; - playing_notes = false; - return; - } - } - note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; - note_length = (*notes_pointer)[current_note][1]; - note_position = 0; - } - - } - -} - -void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) { - notes = true; - - notes_pointer = np; - notes_length = n_length; - notes_repeat = n_repeat; - - place = 0; - current_note = 0; - note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE; - note_length = (*notes_pointer)[current_note][1]; - // note_frequency = 880.0 / SAMPLE_RATE; - // note_length = 1000; - note_position = 0; - - - TIMSK3 |= _BV(OCIE3A); - playing_notes = true; -} - -void play_sample(uint8_t * s, uint16_t l, bool r) { - place_int = 0; - sample = s; - sample_length = l; - repeat = r; - - TIMSK3 |= _BV(OCIE3A); - playing_notes = true; -} - -void play_note(double freq, int vol) { - - freq = freq / SAMPLE_RATE; - if (freq > 0) { - if (frequency != 0) { - double starting_f = frequency; - if (frequency < freq) { - for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 500.0)) { - frequency = f; - } - } else if (frequency > freq) { - for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 500.0)) { - frequency = f; - } - } - } - frequency = freq; - volume = vol; - - frequencies[voices] = frequency; - volumes[voices] = volume; - voices++; - } - - TIMSK3 |= _BV(OCIE3A); - -} \ No newline at end of file diff --git a/quantum/keymap_midi.c b/quantum/keymap_midi.c index 3a1408e220..e37ea31039 100644 --- a/quantum/keymap_midi.c +++ b/quantum/keymap_midi.c @@ -100,10 +100,10 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) 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, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127); - play_note(((double)261.626)*pow(2.0, 0.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); + play_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF); } else { // midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127); midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127); - stop_note(((double)261.626)*pow(2.0, 0.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); + stop_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row))); } } \ No newline at end of file diff --git a/quantum/quantum.mk b/quantum/quantum.mk index c82e478725..81a53f2035 100644 --- a/quantum/quantum.mk +++ b/quantum/quantum.mk @@ -9,8 +9,11 @@ ifndef CUSTOM_MATRIX endif ifdef MIDI_ENABLE - SRC += $(QUANTUM_DIR)/keymap_midi.c \ - $(QUANTUM_DIR)/beeps.c + SRC += $(QUANTUM_DIR)/keymap_midi.c +endif + +ifdef AUDIO_ENABLE + SRC += $(QUANTUM_DIR)/audio.c endif ifdef UNICODE_ENABLE diff --git a/tmk_core/common.mk b/tmk_core/common.mk index edbcc282a5..89c366f554 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -53,6 +53,9 @@ ifdef MIDI_ENABLE OPT_DEFS += -DMIDI_ENABLE endif +ifdef AUDIO_ENABLE + OPT_DEFS += -DAUDIO_ENABLE +endif ifdef USB_6KRO_ENABLE OPT_DEFS += -DUSB_6KRO_ENABLE diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index f04790f4e8..5d40dcf7b2 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -52,8 +52,8 @@ #include "descriptor.h" #include "lufa.h" -#ifdef MIDI_ENABLE - #include +#ifdef AUDIO_ENABLE + #include #endif #ifdef BLUETOOTH_ENABLE @@ -946,6 +946,8 @@ int main(void) #ifdef MIDI_ENABLE void fallthrough_callback(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2){ + +#ifdef AUDIO_ENABLE if (cnt == 3) { switch (byte0 & 0xF0) { case MIDI_NOTEON: @@ -959,6 +961,7 @@ void fallthrough_callback(MidiDevice * device, if (byte0 == MIDI_STOP) { stop_all_notes(); } +#endif } void cc_callback(MidiDevice * device, From a820533ab770e1919f190c102a091c1060f6302e Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 20 Jan 2016 00:15:29 -0500 Subject: [PATCH 24/52] keymap.c changes, disable grep stuff --- keyboard/planck/Makefile | 10 ++- keyboard/planck/keymaps/default/README.md | 34 ++++++++ .../keymaps/{default.c => default/keymap.c} | 0 keyboard/planck/keymaps/jack.c | 50 ----------- keyboard/planck/keymaps/lock/README.md | 3 + .../planck/keymaps/{lock.c => lock/keymap.c} | 0 keyboard/planck/keymaps/test/README.md | 3 - keyboard/planck/keymaps/test/default.c | 85 ------------------- quantum/quantum.mk | 28 +++--- 9 files changed, 58 insertions(+), 155 deletions(-) create mode 100644 keyboard/planck/keymaps/default/README.md rename keyboard/planck/keymaps/{default.c => default/keymap.c} (100%) delete mode 100644 keyboard/planck/keymaps/jack.c create mode 100644 keyboard/planck/keymaps/lock/README.md rename keyboard/planck/keymaps/{lock.c => lock/keymap.c} (100%) delete mode 100644 keyboard/planck/keymaps/test/README.md delete mode 100644 keyboard/planck/keymaps/test/default.c diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index ff68ea0fb3..16d462b699 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -53,12 +53,16 @@ TARGET_DIR = . SRC = planck.c \ backlight.c +ifdef keymap + KEYMAP = $(keymap) +endif + ifdef KEYMAP ifneq ("$(wildcard keymaps/$(KEYMAP).c)","") KEYMAP_FILE = keymaps/$(KEYMAP).c else -ifneq ("$(wildcard keymaps/$(KEYMAP)/default.c)","") - KEYMAP_FILE = keymaps/$(KEYMAP)/default.c +ifneq ("$(wildcard keymaps/$(KEYMAP)/keymap.c)","") + KEYMAP_FILE = keymaps/$(KEYMAP)/keymap.c else $(error Keymap file does not exist) endif @@ -67,7 +71,7 @@ else ifneq ("$(wildcard keymaps/default.c)","") KEYMAP_FILE = keymaps/default.c else - KEYMAP_FILE = keymaps/default/default.c + KEYMAP_FILE = keymaps/default/keymap.c endif endif SRC := $(KEYMAP_FILE) $(SRC) diff --git a/keyboard/planck/keymaps/default/README.md b/keyboard/planck/keymaps/default/README.md new file mode 100644 index 0000000000..d2f43bbdb8 --- /dev/null +++ b/keyboard/planck/keymaps/default/README.md @@ -0,0 +1,34 @@ +# The Default Planck Layout + + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QW] = { /* Qwerty */ + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_ESC, 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(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + }, + [_CM] = { /* Colemak */ + {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, + {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + }, + [_DV] = { /* Dvorak */ + {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, + {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, + {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, + {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + }, + [_RS] = { /* RAISE */ + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} + }, + [_LW] = { /* LOWER */ + {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, + {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, + {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} + } + }; \ No newline at end of file diff --git a/keyboard/planck/keymaps/default.c b/keyboard/planck/keymaps/default/keymap.c similarity index 100% rename from keyboard/planck/keymaps/default.c rename to keyboard/planck/keymaps/default/keymap.c diff --git a/keyboard/planck/keymaps/jack.c b/keyboard/planck/keymaps/jack.c deleted file mode 100644 index 0b93bba33f..0000000000 --- a/keyboard/planck/keymaps/jack.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "keymap_common.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = { /* Jack soft-coded colemak */ - {KC_TAB, CM_Q, CM_W, CM_F, CM_P, CM_G, CM_J, CM_L, CM_U, CM_Y, CM_SCLN, KC_BSPC}, - {KC_ESC, CM_A, CM_R, CM_S, CM_T, CM_D, CM_H, CM_N, CM_E, CM_I, CM_O, KC_QUOT}, - {KC_LSFT, CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, CM_COMM, CM_DOT, CM_SLSH, KC_ENT}, - {BL_STEP, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} - // Space is repeated to accommadate for both spacebar wiring positions -}, -[1] = { /* Jack hard-coded colemak */ - {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, - {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, - {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -[2] = { /* Jack RAISE */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {KC_TRNS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(1), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -}, -[3] = { /* Jack LOWER */ - {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, - {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, - {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -} -}; - - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_MOMENTARY(2), // to Fn overlay - [2] = ACTION_LAYER_MOMENTARY(3), // to Fn overlay - - [3] = ACTION_DEFAULT_LAYER_SET(0), - [4] = ACTION_DEFAULT_LAYER_SET(1), - -}; - -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: - return MACRODOWN(T(CM_T), END); - break; - } - return MACRO_NONE; -}; diff --git a/keyboard/planck/keymaps/lock/README.md b/keyboard/planck/keymaps/lock/README.md new file mode 100644 index 0000000000..d21cb990b0 --- /dev/null +++ b/keyboard/planck/keymaps/lock/README.md @@ -0,0 +1,3 @@ +# Lock layout + +This layout is designed for having a lock switch in the lower-left-hand corner, and for experimenting with MIDI/audio features. It's constantly in development, so don't expect anything to work/be documented correctly! \ No newline at end of file diff --git a/keyboard/planck/keymaps/lock.c b/keyboard/planck/keymaps/lock/keymap.c similarity index 100% rename from keyboard/planck/keymaps/lock.c rename to keyboard/planck/keymaps/lock/keymap.c diff --git a/keyboard/planck/keymaps/test/README.md b/keyboard/planck/keymaps/test/README.md deleted file mode 100644 index c555d2ddc9..0000000000 --- a/keyboard/planck/keymaps/test/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Testing out this! - -This folder will probably get deleted before merging. \ No newline at end of file diff --git a/keyboard/planck/keymaps/test/default.c b/keyboard/planck/keymaps/test/default.c deleted file mode 100644 index 71bd6c91e5..0000000000 --- a/keyboard/planck/keymaps/test/default.c +++ /dev/null @@ -1,85 +0,0 @@ -// USING_MIDI -// USING_BACKLIGHT -#include "keymap_common.h" -#include "backlight.h" -#include "action_layer.h" -#include "keymap_midi.h" -#include - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = { /* Qwerty */ - {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {KC_ESC, 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(0), KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} - // Space is repeated to accommadate for both spacebar wiring positions -}, -[1] = { /* Colemak */ - {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, - {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, - {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -[2] = { /* RAISE */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TRNS, FUNC(3), FUNC(4), RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {KC_TRNS, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(1), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -}, -[3] = { /* LOWER */ - {S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC}, - {KC_TRNS, FUNC(3), FUNC(4), RESET, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)}, - {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -}, -[4] = { /* TENKEY */ - {KC_TAB, N_C5, N_D5, N_E5, N_F5, N_G5, N_A5, KC_KP_7, KC_KP_8, KC_KP_9, KC_P, KC_BSPC}, - {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_KP_4, KC_KP_5, KC_KP_6, KC_SCLN, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_KP_1, KC_KP_2, KC_KP_3, KC_SLSH, KC_ENT}, - {KC_TRNS, KC_LCTL, KC_LALT, KC_LGUI, KC_TRNS, KC_SPC, KC_SPC, KC_KP_0, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -[5] = { - { MIDI12 }, - { MIDI12 }, - { MIDI12 }, - {M(0), KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_SPC, KC_SPC, FUNC(1), MIDI, MIDI, MIDI, MIDI} -} -}; - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE - [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER - - [3] = ACTION_DEFAULT_LAYER_SET(0), - [4] = ACTION_DEFAULT_LAYER_SET(1), - -}; - -uint16_t hextokeycode(int hex) { - if (hex == 0x0) { - return KC_0; - } else if (hex < 0xA) { - return KC_1 + (hex - 0x1); - } else { - return KC_A + (hex - 0xA); - } -} - -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) { - backlight_set(BACKLIGHT_LEVELS); - default_layer_and(0); - default_layer_or((1<<5)); - } else { - backlight_set(0); - default_layer_and(0); - default_layer_or(0); - } - break; - } - return MACRO_NONE; -}; diff --git a/quantum/quantum.mk b/quantum/quantum.mk index 3a968a1459..a2b7d8db56 100644 --- a/quantum/quantum.mk +++ b/quantum/quantum.mk @@ -4,20 +4,20 @@ QUANTUM_DIR = quantum SRC += $(QUANTUM_DIR)/keymap_common.c \ $(QUANTUM_DIR)/led.c -ifdef KEYMAP_FILE -ifneq (,$(shell grep USING_MIDI '$(KEYMAP_FILE)')) -MIDI_ENABLE=yes -$(info * Overriding MIDI_ENABLE setting - $(KEYMAP_FILE) requires it) -endif -ifneq (,$(shell grep USING_UNICODE '$(KEYMAP_FILE)')) -UNICODE_ENABLE=yes -$(info * Overriding UNICODE_ENABLE setting - $(KEYMAP_FILE) requires it) -endif -ifneq (,$(shell grep USING_BACKLIGHT '$(KEYMAP_FILE)')) -BACKLIGHT_ENABLE=yes -$(info * Overriding BACKLIGHT_ENABLE setting - $(KEYMAP_FILE) requires it) -endif -endif +# ifdef KEYMAP_FILE +# ifneq (,$(shell grep USING_MIDI '$(KEYMAP_FILE)')) +# MIDI_ENABLE=yes +# $(info * Overriding MIDI_ENABLE setting - $(KEYMAP_FILE) requires it) +# endif +# ifneq (,$(shell grep USING_UNICODE '$(KEYMAP_FILE)')) +# UNICODE_ENABLE=yes +# $(info * Overriding UNICODE_ENABLE setting - $(KEYMAP_FILE) requires it) +# endif +# ifneq (,$(shell grep USING_BACKLIGHT '$(KEYMAP_FILE)')) +# BACKLIGHT_ENABLE=yes +# $(info * Overriding BACKLIGHT_ENABLE setting - $(KEYMAP_FILE) requires it) +# endif +# endif ifndef CUSTOM_MATRIX SRC += $(QUANTUM_DIR)/matrix.c From fa53ad5136cce6416a15d7b325ff2adc24d7a788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Bo=CC=88sebeck?= Date: Thu, 21 Jan 2016 09:13:44 +0100 Subject: [PATCH 25/52] swapping modeswitch and Acut-Chars on thumb block --- keyboard/ergodox_ez/keymaps/keymap_osx_de.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_osx_de.c b/keyboard/ergodox_ez/keymaps/keymap_osx_de.c index cc9076eec8..0b3276d5c3 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_osx_de.c +++ b/keyboard/ergodox_ez/keymaps/keymap_osx_de.c @@ -44,7 +44,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TG(3), DE_A, DE_S, DE_D, DE_F, DE_G, KC_LSFT, CTL_T(DE_Y), DE_X, DE_C, DE_V, DE_B, KC_LALT, LT(SYMB,KC_GRV), DE_LESS, LALT(KC_LSFT), KC_LEFT,KC_RGHT, - TG(2), M(M_MEH_SH_ACUT), //MEH_T(LSFT(DE_ACUT)), //need to create macro for that + M(M_MEH_SH_ACUT), TG(2), KC_HOME, KC_BSPC,KC_DEL, KC_END, // right hand @@ -53,7 +53,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { DE_H, DE_J, DE_K, DE_L, DE_OE,LT(MDIA,DE_AE), KC_RALT, DE_N, DE_M, DE_COMM,DE_DOT, CTL_T(DE_MINS), KC_RSFT, KC_UP, KC_DOWN,LGUI(KC_LSFT),DE_PLUS, LT(SYMB,DE_HASH), - ALL_T(DE_ACUT), TG(4), + TG(4), ALL_T(DE_ACUT), KC_PGUP, KC_PGDN,KC_ENT, KC_SPC ), From ce9086c5077861ead7229ed326ed1c93d842e90a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Bo=CC=88sebeck?= Date: Thu, 21 Jan 2016 09:37:58 +0100 Subject: [PATCH 26/52] replaced qwertz with adnw-koy as default --- .../keymaps/keymap_osx_de_adnw_koy.c | 124 +++++++++--------- 1 file changed, 63 insertions(+), 61 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_osx_de_adnw_koy.c b/keyboard/ergodox_ez/keymaps/keymap_osx_de_adnw_koy.c index 7e9defafa7..f3484a17aa 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_osx_de_adnw_koy.c +++ b/keyboard/ergodox_ez/keymaps/keymap_osx_de_adnw_koy.c @@ -38,26 +38,48 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ // If it accepts an argument (i.e, is a function), it doesn't need KC_. // Otherwise, it needs KC_* -[BASE] = KEYMAP( // layer 0 : default - // left hand - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, LGUI(KC_V), - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LGUI, - TG(3), KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_LALT, - LT(SYMB,KC_GRV), DE_LESS, LALT(KC_LSFT), KC_LEFT,KC_RGHT, - TG(2), MEH_T(LSFT(DE_ACUT)), - KC_HOME, - KC_BSPC,KC_DEL,KC_END, - // right hand - LGUI(KC_C), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, - KC_RGUI, KC_Y, KC_U, KC_I, KC_O, KC_P, DE_UE, - KC_H, KC_J, KC_K, KC_L, KC_SCLN,LT(MDIA,DE_AE), - KC_RALT,KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT, - KC_UP, KC_DOWN,LGUI(KC_LSFT),KC_RBRC, LT(SYMB,KC_BSLS), - ALL_T(DE_ACUT), TG(4), - KC_PGUP, - KC_PGDN,KC_ENT, KC_SPC - ), + +/* Keymap 0: ADNW-Koy layer + * ADNW-Koy is a special layout designed to be ergonomic. Was created using software to determine the most ergonomic way to type German and English texts. + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 |Lctrl | |Rctrl | 6 | 7 | 8 | 9 | 0 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | TAB | K | . | O | , | Y | CMD | | CMD | V | G | C | L | ß | Z | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | ADNW | H | A | E | I | U |------| |------| D | T | R | N | S | F/L2 | + * |--------+------+------+------+------+------| LALT | | RALT |------+------+------+------+------+--------| + * | LShift |X/Ctrl| Q | Ä | Ü | Ö | | | | B | P | W | M |J/Ctrl| RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | Date: Thu, 21 Jan 2016 09:50:06 +0100 Subject: [PATCH 27/52] added koy layer to default, but disabled it --- keyboard/ergodox_ez/keymaps/keymap_osx_de.c | 88 ++++++++++++------- .../keymaps/keymap_osx_de_adnw_koy.c | 42 ++++----- 2 files changed, 76 insertions(+), 54 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_osx_de.c b/keyboard/ergodox_ez/keymaps/keymap_osx_de.c index 0b3276d5c3..137406bf7e 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_osx_de.c +++ b/keyboard/ergodox_ez/keymaps/keymap_osx_de.c @@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // left hand KC_ESC, DE_1, DE_2, DE_3, DE_4, DE_5, M(M_CTRL_CMDV), KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, KC_LGUI, - TG(3), DE_A, DE_S, DE_D, DE_F, DE_G, + KC_LALT, DE_A, DE_S, DE_D, DE_F, DE_G, KC_LSFT, CTL_T(DE_Y), DE_X, DE_C, DE_V, DE_B, KC_LALT, LT(SYMB,KC_GRV), DE_LESS, LALT(KC_LSFT), KC_LEFT,KC_RGHT, M(M_MEH_SH_ACUT), TG(2), @@ -102,15 +102,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 2: Media and mouse keys * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | | | | | | | | | | Play | + * | | | | | | | | | Mute | | | | | | Play | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | MsUp | | | | | | | | | | | | + * | | | Lclk | MsUp | Rclk | WlUp | | | | | | | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | | + * | | |MsLeft|MsDown|MsRght| WlDw |------| |------|VolUp | | | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | | | | | | | Prev | Next | | | + * | | | | | | MClk | | | |VolDn | | Prev | Next | Up | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | + * | | | | | | | | | Left | Down | Right | * `----------------------------------' `----------------------------------' * ,-------------. ,-------------. * | | | | | | @@ -123,39 +123,61 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // MEDIA AND MOUSE KEYMAP( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, - KC_TRNS, KC_WH_L, KC_WH_U, KC_WH_D, KC_WH_R, KC_BTN3, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, - 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_TRNS, KC_MPLY, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_MUTE, KC_MPRV, KC_MNXT, KC_UP, KC_TRNS, - KC_VOLU, KC_VOLD, KC_LEFT, KC_DOWN, KC_RIGHT, - KC_TRNS, KC_TRNS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_WBAK -), -// Cursor layer -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_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, + KC_TRNS, KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R, KC_BTN3, 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_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, - KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, + KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_VOLD, KC_TRNS, KC_MPRV, KC_MNXT, KC_UP, KC_TRNS, + KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK +), +// ADNW-KOY layer +/* Keymap 3: ADNW-Koy layer + * ADNW-Koy is a special layout designed to be ergonomic. Was created using software to determine the most ergonomic way to type German and English texts. + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | K | . | O | , | Y | | | | V | G | C | L | ß | Z | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | H | A | E | I | U |------| |------| D | T | R | N | S | F/L2 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | |X/Ctrl| Q | Ä | Ü | Ö | | | | B | P | W | M |J/Ctrl| RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | Date: Fri, 22 Jan 2016 08:18:13 +0100 Subject: [PATCH 28/52] changed some places, disabled layer3, in file it's ADNW now --- keyboard/ergodox_ez/keymaps/keymap_osx_de.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/keymap_osx_de.c b/keyboard/ergodox_ez/keymaps/keymap_osx_de.c index 137406bf7e..69acd9b951 100644 --- a/keyboard/ergodox_ez/keymaps/keymap_osx_de.c +++ b/keyboard/ergodox_ez/keymaps/keymap_osx_de.c @@ -21,7 +21,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | TAB | Q | W | E | R | T | CMD | | CMD | Z | U | I | O | P | ü | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | L3 | A | S | D | F | G |------| |------| H | J | K | L | ö | ä/L2 | + * | LALT | A | S | D | F | G |------| |------| H | J | K | L | ö | ä/RALT| * |--------+------+------+------+------+------| LALT | | RALT |------+------+------+------+------+--------| * | LShift |Y/Ctrl| X | C | V | B | | | | N | M | , | . |-/Ctrl| RShift | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' @@ -48,11 +48,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_HOME, KC_BSPC,KC_DEL, KC_END, // right hand - M(M_CTRL_CMDC), DE_6, DE_7, DE_8, DE_9, DE_0, DE_SS, - KC_RGUI, DE_Z, DE_U, DE_I, DE_O, DE_P, DE_UE, - DE_H, DE_J, DE_K, DE_L, DE_OE,LT(MDIA,DE_AE), - KC_RALT, DE_N, DE_M, DE_COMM,DE_DOT, CTL_T(DE_MINS), KC_RSFT, - KC_UP, KC_DOWN,LGUI(KC_LSFT),DE_PLUS, LT(SYMB,DE_HASH), + M(M_CTRL_CMDC), DE_6, DE_7, DE_8, DE_9, DE_0, DE_SS, + KC_RGUI, DE_Z, DE_U, DE_I, DE_O, DE_P, DE_UE, + DE_H, DE_J, DE_K, DE_L, DE_OE, ALT_T(DE_AE), + KC_RALT, DE_N, DE_M, DE_COMM,DE_DOT, CTL_T(DE_MINS), KC_RSFT, + KC_UP, KC_DOWN,LGUI(KC_LSFT),DE_PLUS, LT(SYMB,DE_HASH), TG(4), ALL_T(DE_ACUT), KC_PGUP, KC_PGDN,KC_ENT, KC_SPC From 9d03f48643f28e7da92aa476b6878af7bb343d74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Bo=CC=88sebeck?= Date: Fri, 22 Jan 2016 08:22:23 +0100 Subject: [PATCH 29/52] reinstalled lost file, updated with some tweaks --- keyboard/ergodox_ez/keymaps/osx_de/keymap.c | 299 ++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 keyboard/ergodox_ez/keymaps/osx_de/keymap.c diff --git a/keyboard/ergodox_ez/keymaps/osx_de/keymap.c b/keyboard/ergodox_ez/keymaps/osx_de/keymap.c new file mode 100644 index 0000000000..69acd9b951 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/osx_de/keymap.c @@ -0,0 +1,299 @@ +#include "ergodox_ez.h" +#include "debug.h" +#include "action_layer.h" +#include "keymap_extras/keymap_german_osx.h" + +#define BASE 0 // default layer +#define SYMB 1 // symbols +#define MDIA 2 // media keys +#define CRSR 3 // media keys +#define NUMB 4 // number keys + +#define M_CTRL_CMDV 1 +#define M_CTRL_CMDC 2 +#define M_MEH_SH_ACUT 3 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 |CMD-V | |CMD-C | 6 | 7 | 8 | 9 | 0 | ß | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | TAB | Q | W | E | R | T | CMD | | CMD | Z | U | I | O | P | ü | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | LALT | A | S | D | F | G |------| |------| H | J | K | L | ö | ä/RALT| + * |--------+------+------+------+------+------| LALT | | RALT |------+------+------+------+------+--------| + * | LShift |Y/Ctrl| X | C | V | B | | | | N | M | , | . |-/Ctrl| RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | ! | ? | | | | | \ | [ | ] | | | # | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | \ | / | . |------| |------| / | ( | ) | { | } | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | ^ | % | | | ~ | | | | & | < | > | " | ' | ? | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | . | ! | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = KEYMAP( + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS,DE_LESS,DE_MORE,DE_EXLM,DE_QST, KC_TRNS,KC_TRNS, + KC_TRNS,DE_HASH,DE_DLR, DE_BSLS,DE_SLSH,KC_DOT, + KC_TRNS,KC_TRNS,DE_LESS,DE_PERC,DE_PIPE,DE_TILD,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_DEL,KC_TRNS, + // right hand + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, LALT(LSFT(KC_7)), LALT(KC_5), LALT(KC_6), LALT(KC_7), DE_HASH, KC_F12, + DE_SLSH, DE_LPRN, DE_RPRN, LALT(KC_8), LALT(KC_9), KC_TRNS, + KC_TRNS, DE_AMPR, KC_GRV, LSFT(KC_GRV), DE_DQOT, DE_QUOT, DE_QST, + KC_TRNS,KC_DOT, KC_EXLM, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | Mute | | | | | | Play | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | Lclk | MsUp | Rclk | WlUp | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |MsLeft|MsDown|MsRght| WlDw |------| |------|VolUp | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | MClk | | | |VolDn | | Prev | Next | Up | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | Left | Down | Right | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | |Brwser| + * | | |------| |------| |Back | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, + KC_TRNS, KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R, KC_BTN3, 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_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_VOLD, KC_TRNS, KC_MPRV, KC_MNXT, KC_UP, KC_TRNS, + KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK +), +// ADNW-KOY layer +/* Keymap 3: ADNW-Koy layer + * ADNW-Koy is a special layout designed to be ergonomic. Was created using software to determine the most ergonomic way to type German and English texts. + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | K | . | O | , | Y | | | | V | G | C | L | ß | Z | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | H | A | E | I | U |------| |------| D | T | R | N | S | F/L2 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | |X/Ctrl| Q | Ä | Ü | Ö | | | | B | P | W | M |J/Ctrl| RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + case 1: + if (record->event.pressed) { + start = timer_read(); + return MACRO(D(LCTRL), END); + } else { + if (timer_elapsed(start) > 150) { + return MACRO(U(LCTRL), END); + } else { + return MACRO(U(LCTRL), D(LGUI), T(V), U(LGUI), END); + } + } + break; + case 2: + if (record->event.pressed) { + start = timer_read(); + return MACRO(D(LCTRL),END); + } else { + if (timer_elapsed(start) > 150){ + return MACRO(U(LCTRL),END); + } else { + return MACRO(U(LCTRL),D(LGUI),T(C),U(LGUI),END); + } + } + break; + case 3: + if (record->event.pressed) { + start = timer_read(); + return MACRO(D(LCTRL),D(LSFT),D(LALT),END); + } else { + if (timer_elapsed(start) > 150){ + return MACRO(U(LCTRL),U(LSFT),U(LALT),END); + } else { + return MACRO(U(LCTRL),U(LALT),T(EQL),U(LSFT),END); //cannot use DE_ACUT here, as macro needs KC_ prefix + } + } + 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) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + case 3: + ergodox_right_led_3_on(); + break; + case 4: + ergodox_right_led_1_on(); + ergodox_right_led_3_on(); + //ergodox_board_led_on(); + break; + default: + // none + break; + } + +}; From f95e3e701cac9e40531b2af5b2efaf59a84fb312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20Bo=CC=88sebeck?= Date: Fri, 22 Jan 2016 08:22:59 +0100 Subject: [PATCH 30/52] new hex file --- keyboard/ergodox_ez/keymaps/osx_de/osx_de.hex | Bin 66352 -> 66352 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/osx_de/osx_de.hex b/keyboard/ergodox_ez/keymaps/osx_de/osx_de.hex index eb82384d54378b5f83872badcc543407e14909e0..2c83055b0df76a71d39e4cfb8b6896f2275cb563 100644 GIT binary patch delta 730 zcmZ8fJ5B>J5EaQvNk|HcNCXrLBsv;{n_!Gc{9)6J{DVim%~LMrGi$8&^& zgm(8;d>o|L@zE?ICZg`xc%P=Di>62GGW3L0OA=&=4gvS`@ooT)lW_Qk|=gG+i{qh6A!@$JDIH@4t9{a$kL84ik%+jw>XRL_EFM*H$ jVu%ajio33oynIP}Wt3VNRM|hJ%F|Dv3f1oJ@cr`}*cX|L delta 585 zcmZ8dOG?B*5XDSp(n;L7(NRWWz@3}wU()SDO)_aWibwDY&IJ@VZWU@RUSVJ^;tj+L z2!abi1gp~#KOxm!_3BmC>ss8z3;Op4V~|?49OyE10`Qhh)driv{gu!PxP(^v3_vTS z%JzxI%K-ROQc@77huR{fM9W>^8Ujj36yOcHHQn7L@|9LXQEY$*t_{UA!pOt(_%bpA zpW>}()-FHdx0Q*b`Y!1Sy*UBktdW=}yS1Z+)Uoawii!ds2XiFCkqD=MFyMs_T;JK_ zI8U~788ELH*YYu*=8Op&K)lX2@FGi(Je!vRq`mo%CROy}%D?27#13zu30&7vs|u%V z5?P0bY>tn^A$}&SX;X9@De)zl=D_QqPO3hx`dCxELn?-mE$}!!!CN*O`JrWr59ub} qvCyyR`&nOq09^O=e>dY7@?WnO-?PGIG{@IuovBW}HOsT?`TYxo^n#ZF From caf82bcacef6dc5eacfd8c7fccff304bdb38595b Mon Sep 17 00:00:00 2001 From: Evan Pitstick Date: Fri, 22 Jan 2016 07:33:56 -0500 Subject: [PATCH 31/52] Single tap enable ACTION_LAYER_TAP_TOGGLE layer --- keyboard/ergodox_ez/config.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keyboard/ergodox_ez/config.h b/keyboard/ergodox_ez/config.h index 825997ba05..6a391ffb54 100644 --- a/keyboard/ergodox_ez/config.h +++ b/keyboard/ergodox_ez/config.h @@ -38,6 +38,8 @@ along with this program. If not, see . #define MOUSEKEY_MAX_SPEED 3 #define MOUSEKEY_TIME_TO_MAX 10 +#define TAPPING_TOGGLE 1 + #define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 } #define ROWS (int []){ D0, D5, B5, B6 } From 51fec6647a288862244a50b616255d84564db02d Mon Sep 17 00:00:00 2001 From: Olivier Lechevalier Date: Sat, 23 Jan 2016 14:07:13 +0900 Subject: [PATCH 32/52] Add colemak keymap to Ergodox EZ. --- .../ergodox_ez/keymaps/colemak/colemak.hex | Bin 0 -> 66143 bytes keyboard/ergodox_ez/keymaps/colemak/keymap.c | 184 ++++++++++++++++++ keyboard/ergodox_ez/keymaps/colemak/readme.md | 4 + 3 files changed, 188 insertions(+) create mode 100644 keyboard/ergodox_ez/keymaps/colemak/colemak.hex create mode 100644 keyboard/ergodox_ez/keymaps/colemak/keymap.c create mode 100644 keyboard/ergodox_ez/keymaps/colemak/readme.md diff --git a/keyboard/ergodox_ez/keymaps/colemak/colemak.hex b/keyboard/ergodox_ez/keymaps/colemak/colemak.hex new file mode 100644 index 0000000000000000000000000000000000000000..cd3bf781afa83825f8d1714f819f213197fc831e GIT binary patch literal 66143 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.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + 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) { + + uint8_t layer = biton32(layer_state); + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (layer) { + // TODO: Make this relevant to the ErgoDox EZ. + case 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + // none + break; + } + +}; diff --git a/keyboard/ergodox_ez/keymaps/colemak/readme.md b/keyboard/ergodox_ez/keymaps/colemak/readme.md new file mode 100644 index 0000000000..e28b2f0856 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/colemak/readme.md @@ -0,0 +1,4 @@ +# ErgoDox EZ Colemak Configuration + +Colemak layout with same layers as default ergodox ez keymap. + From e5f84058bb6884e0c2d024a1f2e64436395cbd60 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 23 Jan 2016 16:59:33 +0100 Subject: [PATCH 33/52] Implemented new folders structure. moved keymap_typematrix.c to tm2030/keymap.c --- .../ergodox_ez/keymaps/{keymap_typematrix.c => tm2030/keymap.c} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename keyboard/ergodox_ez/keymaps/{keymap_typematrix.c => tm2030/keymap.c} (100%) diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/tm2030/keymap.c similarity index 100% rename from keyboard/ergodox_ez/keymaps/keymap_typematrix.c rename to keyboard/ergodox_ez/keymaps/tm2030/keymap.c From 67583b2f4aeceb5cdbfd32055a6c4fc4436effe7 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 23 Jan 2016 18:04:45 +0100 Subject: [PATCH 34/52] Renamed "Numbers Layer" to "Numeric Layer" --- keyboard/ergodox_ez/keymaps/tm2030/keymap.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/tm2030/keymap.c b/keyboard/ergodox_ez/keymaps/tm2030/keymap.c index 931170c387..31005b64d0 100644 --- a/keyboard/ergodox_ez/keymaps/tm2030/keymap.c +++ b/keyboard/ergodox_ez/keymaps/tm2030/keymap.c @@ -12,14 +12,14 @@ * - arrows and PgUp/PgDn are moved on the thumbs * Layer 1: same as Layer 0 but with Dvorak layout, to use with QWERTY OS layout. * Enable Dvorak layout with Magic-1 (LShift-RShift-1), disable with Magic-0. - * Layer 8: numbers layer close to the TM when toggling "num" with the following differences: + * Layer 8: numeric layer close to the TM when toggling "num" with the following differences: * - numpad is displaced by 1 to the top left * - arrows are displaced by 1 to the left * - provides access to F1-F12, caps lock and num lock * Layer 9: "fn" layer ("fn" key toggles both layers 1 & 2) with the following differences: * - VolUp & VolDn are only on left hand to keep access to arrows on right hand * LEDs: - * - left (1st) led is used to indicate the numbers layer + * - left (1st) led is used to indicate the numeric layer * - middle (2nd) led is used to indicate Dvorak layout * - right (3rd) led is used to indicate caps-lock */ @@ -30,7 +30,7 @@ #define BASE 0 // default layer #define DVRK 1 // Dvorak layer -#define NMBR 8 // numbers layer +#define NUMR 8 // numeric layer #define FNLR 9 // fn layer #define MDBL0 1 @@ -71,7 +71,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, KC_LCTL, M(MFNLR), KC_LGUI,KC_MPLY,ALT_T(KC_APP), - ALT_T(KC_ESC), TG(NMBR), + ALT_T(KC_ESC), TG(NUMR), KC_PGUP, KC_SPC, KC_LSFT, KC_PGDN, @@ -117,7 +117,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_ENT, KC_LCTL, M(MFNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP), - ALT_T(KC_ESC), TG(NMBR), + ALT_T(KC_ESC), TG(NUMR), KC_PGUP, KC_SPC, KC_LSFT, KC_PGDN, @@ -132,7 +132,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_UP, KC_DOWN, KC_RSFT, KC_SPC ), -/* Numbers Layer +/* Numeric Layer * * ,--------------------------------------------------. ,--------------------------------------------------. * | | F1 | F2 | F3 | F4 | F5 | | | | | | Tab | / | * | - | @@ -154,7 +154,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `--------------------' `--------------------' */ // SYMBOLS -[NMBR] = KEYMAP( +[NUMR] = KEYMAP( // left hand KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, @@ -234,7 +234,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } break; case MFNLR: - layer_state ^= (1 << NMBR) | (1 << FNLR); + layer_state ^= (1 << NUMR) | (1 << FNLR); break; case MCUT: if (record->event.pressed) { @@ -267,8 +267,8 @@ void * matrix_scan_user(void) { ergodox_right_led_1_off(); ergodox_right_led_2_off(); ergodox_right_led_3_off(); - // led 1: numbers layer - if (layer_state & (1 << NMBR)) { + // led 1: numeric layer + if (layer_state & (1 << NUMR)) { ergodox_right_led_1_on(); } // led 2: Dvorak layer From 96b9089d9f4237c2d4e4760181628fc96c4f93b6 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 23 Jan 2016 18:15:21 +0100 Subject: [PATCH 35/52] Added Calculator, Mail and Browser Home application keys. --- keyboard/ergodox_ez/keymaps/tm2030/keymap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/tm2030/keymap.c b/keyboard/ergodox_ez/keymaps/tm2030/keymap.c index 31005b64d0..00d6a4bfa4 100644 --- a/keyboard/ergodox_ez/keymaps/tm2030/keymap.c +++ b/keyboard/ergodox_ez/keymaps/tm2030/keymap.c @@ -2,7 +2,7 @@ * --------------------------- * Currently supported features: * Layer 0: default layer close to the TM with the following differences: - * - top row and rightmost column are removed, corresponding keys are displaced, except app-keys which are removed + * - top row and rightmost column are removed, corresponding keys are displaced * - bottom-left keys are reorganized on a single roz as: Ctrl, "Fn", Gui, Play, App/Alt * - "shuffle" and "desktop" are not supported * - right-shift is moved on ' and \ @@ -183,7 +183,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | | | | | | |VolUp | | | | | | | | Pause | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | |------| |------| | | | | | | + * | | | | Calc | Mail |Browsr|------| |------| | | | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | | | cut | copy |paste | Mute |VolDn | | | | | | | | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' @@ -201,7 +201,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [FNLR] = KEYMAP( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_CALC, KC_MAIL, KC_WHOM, KC_TRNS, KC_TRNS, M(MCUT), M(MCOPY), M(MPSTE), KC_MUTE, KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, From 294bd256150e381d3eac619a6eab1877eb95728f Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 23 Jan 2016 18:52:16 +0100 Subject: [PATCH 36/52] Moved layout description to README.md and added more details --- keyboard/ergodox_ez/keymaps/tm2030/README.md | 133 +++++++++++++++++++ keyboard/ergodox_ez/keymaps/tm2030/keymap.c | 26 +--- 2 files changed, 134 insertions(+), 25 deletions(-) create mode 100644 keyboard/ergodox_ez/keymaps/tm2030/README.md diff --git a/keyboard/ergodox_ez/keymaps/tm2030/README.md b/keyboard/ergodox_ez/keymaps/tm2030/README.md new file mode 100644 index 0000000000..55942709be --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/tm2030/README.md @@ -0,0 +1,133 @@ +# TypeMatrix™ 2030 inspired layout + +This is a [TypeMatrix™ 2030](http://typematrix.com/2030/features.php) inspired layout for the ErgoDox EZ. The _TypeMatrix_ is a nice small ergonomic keyboard with a matrix layout, and it provides several nice features like `enter`, `backspace` and `delete` at the center, bigger `shift` keys and international `cut`, `copy` and `paste` keys. + +The idea in this ErgoDox layout is to make it is as close as possible to the TM2030, such that it would be easy to switch between the TM and the ErgoDox. No _fancy_ features have been implemented, as this is intended to be a base for further customization if desired. Some keys have been duplicated in order to accomodate for most people. + +Most of the TM2030 features are supported except +* automatic window switching (alt-tab key, at the left of the space key) +* show desktop key (at the right of the space key) +* 102/106 modes + +Dvorak mode is even supported by pressing [`Magic`](/TMK_README.md#magic-commands)+`1` (`Magic` is by default `LShift`+`RShift`) + +Some keys had to be moved around to fit into the ErgoDox, especially the `F1`-`F12` keys and the arrow keys. + +## Base Layer +This is the default layer, close to the TM with the following differences: +- Top row (with the `F`-keys) and rightmost column (with application shortcuts) are removed, the corresponding keys are displaced elsewhere. +- Bottom-left keys are reorganized on a single row as: `Ctrl`, `fn`, `Gui`, `Play`, `App`/`Alt`. +- `shuffle` and `desktop` are not supported. +- `right-shift` is moved on `'`, `\` and on the right thumb (the latter is actually the only _true_ `right-shift`, and must be used in the `Magic` key combination). +- `right-ctrl` is moved on `End`. +- `]` is moved in place of the dash (`-`). +- Dash (`-`) and `=` are moved on bottom right row. +- Arrows and `PgUp`/`PgDn` are moved on the thumbs. + + ,--------------------------------------------------. ,--------------------------------------------------. + | ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | ] | + |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + | Tab | Q | W | E | R | T |Backsp| |Backsp| Y | U | I | O | P | [ | + |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| + | LShift | A | S | D | F | G |------| |------| H | J | K | L | ; | '/Shift| + |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| + | LShift | Z | X | C | V | B | | | | N | M | , | . | / | \/Shift| + `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + |LCtrl | fn | LGui | Play |App/Alt| | RAlt | - | Home | = |End/Ctl| + `-----------------------------------' `-----------------------------------' + ,--------------. ,-------------. + |Esc/Alt| num | | Left |Right | + ,------+-------+------| |------+------+------. + | | | PgUp | | Up | | | + |Space |LShift |------| |------|RShift|Space | + | | | PgDn | | Down | | | + `---------------------' `--------------------' + + +### Layer Switching +- Use `num` to toggle the Numeric Layer. +- Hold `fn` to temporarily activate the Numeric & Fn Layers +As on the original TM 2030, when `num` layer is activated, holding `fn` disables it but enables the other `fn` keys. + +## Dvorak Layer +Same as Layer 0 but with _Dvorak_ layout, to use with QWERTY OS layout. + +Enable Dvorak layout with [`Magic`](/TMK_README.md#magic-commands+`1` (`LShift`+`RShift`+`1`), disable with `Magic`-`0`. + +The middle (green) led indicates when the Dvorak layer is activated. + + ,--------------------------------------------------. ,--------------------------------------------------. + | ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | = | + |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + | Tab | ' | , | . | P | Y |Backsp| |Backsp| F | G | C | R | L | / | + |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| + | LShift | A | O | E | U | I |------| |------| D | H | T | N | S | -/Shift| + |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| + | LShift | ; | Q | J | K | X | | | | B | M | W | V | Z | \/Shift| + `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + |LCtrl | fn | LGui | Play |App/Alt| | RAlt | [ | Home | ] |End/Ctl| + `-----------------------------------' `-----------------------------------' + ,--------------. ,-------------. + |Esc/Alt| num | | Left |Right | + ,------+-------+------| |------+------+------. + | | | PgUp | | Up | | | + |Space |LShift |------| |------|RShift|Space | + | | | PgDn | | Down | | | + `---------------------' `--------------------' + +## Numeric Layer +Numeric layer close to the TM when toggling `num`, with the following differences: + +- Numpad is displaced by 1 to the top left. +- Arrows are displaced by 1 to the left. +- Provides access to `F1`-`F12`, `caps-lock` and `num-lock`. + +The numeric layer is indicated with the left (red) led. Caps-lock is indicated with the right (blue) led. + + ,--------------------------------------------------. ,--------------------------------------------------. + | | F1 | F2 | F3 | F4 | F5 | | | | | | Tab | / | * | - | + |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + | | F6 | F7 | F8 | F9 | F10 | | | | | Home | 7 | 8 | 9 | + | + |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + | | F11 | F12 | | | |------| |------| Up | End | 4 | 5 | 6 | + | + |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + | | | | | | | | | Left | Down | Right| 1 | 2 | 3 |KpEnter | + `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + | | | | | | | | 0 | 00 | . |Etr/Ctl| + `----------------------------------' `-----------------------------------' + ,-------------. ,-------------. + | | | |n.lock|c.lock| + ,------|------|------| |------+------+------. + | | | | | | | | + | | |------| |------| | | + | | | | | | | | + `--------------------' `--------------------' + +## Fn Layer +Activated simultaneously with the Numeric layer when holding the `fn` key. As on the TM, it provides access to the following features: +- `cut`, `copy` and `paste` +- `volume up`, `volume down` and `mute` — as opposed to the TM, these are only on left hand +- `previous track` and `next track` +- `calculator`, `mail` and `browser home` +- `insert`, `power`, `sleep`, `wake`, `print screen`, `scroll-lock` and `pause` + +Note: the `eject` key does not work due to jackhumbert/qmk_firmware#82 + + ,--------------------------------------------------. ,--------------------------------------------------. + | | | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk| + |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + | | | | | | |VolUp | | | | | | | | Pause | + |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + | | | | | | |------| |------| | | | | | | + |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + | | | cut | copy |paste | Mute |VolDn | | | | | | | | | + `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + | | | | | | | | | | | | + `----------------------------------' `----------------------------------' + ,-------------. ,-------------. + | | | | | | + ,------|------|------| |------+------+------. + | | | | | Next | | | + | Mute | |------| |------| | | + | | | | | Prev | | | + `--------------------' `--------------------' diff --git a/keyboard/ergodox_ez/keymaps/tm2030/keymap.c b/keyboard/ergodox_ez/keymaps/tm2030/keymap.c index 00d6a4bfa4..cbdf0ae00e 100644 --- a/keyboard/ergodox_ez/keymaps/tm2030/keymap.c +++ b/keyboard/ergodox_ez/keymaps/tm2030/keymap.c @@ -1,28 +1,4 @@ -/* TypeMatrix-2030-like keymap - * --------------------------- - * Currently supported features: - * Layer 0: default layer close to the TM with the following differences: - * - top row and rightmost column are removed, corresponding keys are displaced - * - bottom-left keys are reorganized on a single roz as: Ctrl, "Fn", Gui, Play, App/Alt - * - "shuffle" and "desktop" are not supported - * - right-shift is moved on ' and \ - * - right-ctrl is moved on End - * - ] is moved in place of the dash (-) - * - dash (-) and = are moved on bottom right row - * - arrows and PgUp/PgDn are moved on the thumbs - * Layer 1: same as Layer 0 but with Dvorak layout, to use with QWERTY OS layout. - * Enable Dvorak layout with Magic-1 (LShift-RShift-1), disable with Magic-0. - * Layer 8: numeric layer close to the TM when toggling "num" with the following differences: - * - numpad is displaced by 1 to the top left - * - arrows are displaced by 1 to the left - * - provides access to F1-F12, caps lock and num lock - * Layer 9: "fn" layer ("fn" key toggles both layers 1 & 2) with the following differences: - * - VolUp & VolDn are only on left hand to keep access to arrows on right hand - * LEDs: - * - left (1st) led is used to indicate the numeric layer - * - middle (2nd) led is used to indicate Dvorak layout - * - right (3rd) led is used to indicate caps-lock - */ +/* TypeMatrix-2030-like keymap */ #include "ergodox_ez.h" #include "debug.h" #include "action_layer.h" From b0d7d9d922ea5b432fcbb499df0881a2e80d5092 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 23 Jan 2016 18:59:06 +0100 Subject: [PATCH 37/52] Added keymap.hex --- keyboard/ergodox_ez/keymaps/tm2030/keymap.hex | Bin 0 -> 69424 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 keyboard/ergodox_ez/keymaps/tm2030/keymap.hex diff --git a/keyboard/ergodox_ez/keymaps/tm2030/keymap.hex b/keyboard/ergodox_ez/keymaps/tm2030/keymap.hex new file mode 100644 index 0000000000000000000000000000000000000000..7e1118e3b216e8c02ed6698c1b2818e98e5811e3 GIT binary patch literal 69424 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 literal 0 HcmV?d00001 From 606d63e602bf5a01912a4c5b9c8536c705bcc777 Mon Sep 17 00:00:00 2001 From: DidierLoiseau Date: Sat, 23 Jan 2016 19:18:37 +0100 Subject: [PATCH 38/52] Fixed small issues in README.md - fixed rendering of the basic layer on GitHub - fixed missing Calculator, Mail & Browser Home keys in Fn Layer --- keyboard/ergodox_ez/keymaps/tm2030/README.md | 56 ++++++++++---------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/tm2030/README.md b/keyboard/ergodox_ez/keymaps/tm2030/README.md index 55942709be..7ea175b443 100644 --- a/keyboard/ergodox_ez/keymaps/tm2030/README.md +++ b/keyboard/ergodox_ez/keymaps/tm2030/README.md @@ -15,34 +15,36 @@ Some keys had to be moved around to fit into the ErgoDox, especially the `F1`-`F ## Base Layer This is the default layer, close to the TM with the following differences: -- Top row (with the `F`-keys) and rightmost column (with application shortcuts) are removed, the corresponding keys are displaced elsewhere. -- Bottom-left keys are reorganized on a single row as: `Ctrl`, `fn`, `Gui`, `Play`, `App`/`Alt`. -- `shuffle` and `desktop` are not supported. -- `right-shift` is moved on `'`, `\` and on the right thumb (the latter is actually the only _true_ `right-shift`, and must be used in the `Magic` key combination). -- `right-ctrl` is moved on `End`. -- `]` is moved in place of the dash (`-`). -- Dash (`-`) and `=` are moved on bottom right row. -- Arrows and `PgUp`/`PgDn` are moved on the thumbs. - ,--------------------------------------------------. ,--------------------------------------------------. - | ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | ] | - |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - | Tab | Q | W | E | R | T |Backsp| |Backsp| Y | U | I | O | P | [ | - |--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| - | LShift | A | S | D | F | G |------| |------| H | J | K | L | ; | '/Shift| - |--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| - | LShift | Z | X | C | V | B | | | | N | M | , | . | / | \/Shift| - `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - |LCtrl | fn | LGui | Play |App/Alt| | RAlt | - | Home | = |End/Ctl| - `-----------------------------------' `-----------------------------------' - ,--------------. ,-------------. - |Esc/Alt| num | | Left |Right | - ,------+-------+------| |------+------+------. - | | | PgUp | | Up | | | - |Space |LShift |------| |------|RShift|Space | - | | | PgDn | | Down | | | - `---------------------' `--------------------' + - Top row (with the `F`-keys) and rightmost column (with application shortcuts) are removed, the corresponding keys are displaced elsewhere. + - Bottom-left keys are reorganized on a single row as: `Ctrl`, `fn`, `Gui`, `Play`, `App`/`Alt`. + - `shuffle` and `desktop` are not supported. + - `right-shift` is moved on `'`, `\` and on the right thumb (the latter is actually the only _true_ `right-shift`, and must be used in the `Magic` key combination). + - `right-ctrl` is moved on `End`. + - `]` is moved in place of the dash (`-`). + - Dash (`-`) and `=` are moved on bottom right row. + - Arrows and `PgUp`/`PgDn` are moved on the thumbs. +``` +,--------------------------------------------------. ,--------------------------------------------------. +| ` | 1 | 2 | 3 | 4 | 5 | Del | | Del | 6 | 7 | 8 | 9 | 0 | ] | +|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| +| Tab | Q | W | E | R | T |Backsp| |Backsp| Y | U | I | O | P | [ | +|--------+------+------+------+------+------|ace | |ace |------+------+------+------+------+--------| +| LShift | A | S | D | F | G |------| |------| H | J | K | L | ; | '/Shift| +|--------+------+------+------+------+------|Enter | |Enter |------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | | | | N | M | , | . | / | \/Shift| +`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + |LCtrl | fn | LGui | Play |App/Alt| | RAlt | - | Home | = |End/Ctl| + `-----------------------------------' `-----------------------------------' + ,--------------. ,-------------. + |Esc/Alt| num | | Left |Right | + ,------+-------+------| |------+------+------. + | | | PgUp | | Up | | | + |Space |LShift |------| |------|RShift|Space | + | | | PgDn | | Down | | | + `---------------------' `--------------------' +``` ### Layer Switching - Use `num` to toggle the Numeric Layer. @@ -118,7 +120,7 @@ Note: the `eject` key does not work due to jackhumbert/qmk_firmware#82 |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| | | | | | | |VolUp | | | | | | | | Pause | |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - | | | | | | |------| |------| | | | | | | + | | | | Calc | Mail |Browsr|------| |------| | | | | | | |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| | | | cut | copy |paste | Mute |VolDn | | | | | | | | | `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' From 3e31fa4c50562b0d441262963ac6489351e7035d Mon Sep 17 00:00:00 2001 From: DidierLoiseau Date: Sat, 23 Jan 2016 19:29:14 +0100 Subject: [PATCH 39/52] Fixed rendering of the Layer Switching section --- keyboard/ergodox_ez/keymaps/tm2030/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/keyboard/ergodox_ez/keymaps/tm2030/README.md b/keyboard/ergodox_ez/keymaps/tm2030/README.md index 7ea175b443..096939dc28 100644 --- a/keyboard/ergodox_ez/keymaps/tm2030/README.md +++ b/keyboard/ergodox_ez/keymaps/tm2030/README.md @@ -48,7 +48,8 @@ This is the default layer, close to the TM with the following differences: ### Layer Switching - Use `num` to toggle the Numeric Layer. -- Hold `fn` to temporarily activate the Numeric & Fn Layers +- Hold `fn` to temporarily activate the Numeric & Fn Layers. + As on the original TM 2030, when `num` layer is activated, holding `fn` disables it but enables the other `fn` keys. ## Dvorak Layer From e5aee62e54d0b6f02ff170f4e9bf1e738d36fb4c Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 23 Jan 2016 20:29:54 -0500 Subject: [PATCH 40/52] starting the hand-wiring guide --- HAND-WIRE.md | 323 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 323 insertions(+) create mode 100644 HAND-WIRE.md diff --git a/HAND-WIRE.md b/HAND-WIRE.md new file mode 100644 index 0000000000..3f4d75b272 --- /dev/null +++ b/HAND-WIRE.md @@ -0,0 +1,323 @@ +# Quantum Hand-wiring Guide + +Parts list: +* *x* keyswitches (MX, Matias, Gateron, etc) +* *x* diodes +* Keyboard plate (metal, plastic, cardboard, etc) +* Wire (strained for wiring to the Teensy, anything for the rows/columns) +* Soldering iron set at 600ºF or 315ºC (if temperature-controlled) +* Resin-cored solder (leaded or lead-free) +* Adequate ventilation/a fan +* Tweezers (optional) +* Wire cutters/snippers + +## How the matrix works (why we need diodes) + +The microcontroller (in this case, the Teensy 2.0) will be setup up via the firmware to send a logical 1 to the columns, one at a time, and read from the rows, all at once - this process is called matrix scanning. The matrix is a bunch of open switches that, by default, don't allow any current to pass through - the firmware will read this as no keys being pressed. As soon as you press one key down, the logical 1 that was coming from the column the keyswitch is attached to gets passed through the switch and to the corresponding row - check out the following 2x2 example: + + Column 0 being scanned Column 1 being scanned + x x + col0 col1 col0 col1 + | | | | + row0 ---(key0)---(key1) row0 ---(key0)---(key1) + | | | | + row1 ---(key2)---(key3) row1 ---(key2)---(key3) + +The `x` represents that the column/row associated has a value of 1, or is HIGH. Here, we see that no keys are being pressed, so no rows get an `x`. For one keyswitch, keep in mind that one side of the contacts is connected to its row, and the other, its column. + +When we press `key0`, `col0` gets connected to `row0`, so the values that the firmware receives for that row is `0b01` (the `0b` here means that this is a bit value, meaning all of the following digits are bits - 0 or 1 - and represent the keys in that column). We'll use this notation to show when a keyswitch has been pressed, to show that the column and row are being connected: + + Column 0 being scanned Column 1 being scanned + x x + col0 col1 col0 col1 + | | | | + x row0 ---(-+-0)---(key1) row0 ---(-+-0)---(key1) + | | | | + row1 ---(key2)---(key3) row1 ---(key2)---(key3) + +We can now see that `row0` has an `x`, so has the value of 1. As a whole, the data the firmware receives when `key0` is pressed is + + col0: 0b01 + col1: 0b00 + │└row0 + └row1 + +A problem arises when you start pressing more than one key at a time. Looking at our matrix again, it should become pretty obvious: + + Column 0 being scanned Column 1 being scanned + x x + col0 col1 col0 col1 + | | | | + x row0 ---(-+-0)---(-+-1) x row0 ---(-+-0)---(-+-1) + | | | | + x row1 ---(key2)---(-+-3) x row1 ---(key2)---(-+-3) + + Remember that this ^ is still connected to row1 + +The data we get from that is: + + col0: 0b11 + col1: 0b11 + │└row0 + └row1 + +Which isn't accurate, since we only have 3 keys pressed down, not all 4. This behavior is called ghosting, and only happens in odd scenarios like this, but can be much more common on a bigger keyboard. The way we can get around this is by placing a diode after the keyswitch, but before it connects to its row. A diode only allows current to pass through one way, which will protect our other columns/rows from being activated in the previous example. We'll represent a dioded matrix like this; + + Column 0 being scanned Column 1 being scanned + x x + col0 col1 col0 col1 + │ │ | │ + (key0) (key1) (key0) (key1) + ! │ ! │ ! | ! │ + row0 ─────┴────────┘ │ row0 ─────┴────────┘ │ + │ │ | │ + (key2) (key3) (key2) (key3) + ! ! ! ! + row1 ─────┴────────┘ row1 ─────┴────────┘ + +In practical applications, the black line of the diode will be placed facing the row, and away from the keyswitch - the `!` in this case is the diode, where the gap represents the black line. A good way to remember this is to think of this symbol: `>|` + +Now when we press the three keys, invoking what would be a ghosting scenario: + + Column 0 being scanned Column 1 being scanned + x x + col0 col1 col0 col1 + │ │ │ │ + (┌─┤0) (┌─┤1) (┌─┤0) (┌─┤1) + ! │ ! │ ! │ ! │ + x row0 ─────┴────────┘ │ x row0 ─────┴────────┘ │ + │ │ │ │ + (key2) (┌─┘3) (key2) (┌─┘3) + ! ! ! ! + row1 ─────┴────────┘ x row1 ─────┴────────┘ + +Things act as they should! Which will get us the following data: + + col0: 0b01 + col1: 0b11 + │└row0 + └row1 + +The firmware can then use this correct data to detect what it should do, and eventually, what signals it needs to send to the OS. + +## The actual hand-wiring + +### Getting things in place + +When starting this, you should have all of your stabilisers and keyswitches already installed (and optionally keycaps). If you're using a Cherry-type stabiliser (plate-mounted only, obviously), you'll need to install that before your keyswitches. If you're using Costar ones, you can installed them afterwards. + +To make things easier on yourself, make sure all of the keyswitches are oriented the same way (if they can be - not all layouts support this). Despite this, it's important to remember that the contacts on the keyswitches are completely symmetrical. We'll be using the keyswitch's left side contact for wiring the rows, and the right side one for wiring the columns. + +Get your soldering iron heated-up and collect the rest of the materials from the part list at the beginning of the guide. Place your keyboard so that the bottoms of the keyswitches are accessible - it may be a good idea to place it on a cloth to protect your keyswitches/keycaps. + +Before continuing, plan out where you're going to place your Teensy. If you're working with a board that has a large (6.25u) spacebar, it may be a good idea to place it in-between switches against the plate. Otherwise, you may want to trim some of the leads on the keyswitches where you plan on putting it - this will make it a little harder to solder the wire/diodes, but give you more room to place the Teensy. + +### Preparing the diodes + +It's a little easier to solder the diodes in place if you bend them at a 90º angle immediately after the black line - this will help to make sure you put them on the right way (direction matters), and in the correct position. The diodes will look like this when bent (with longer leads): + + ┌─────┬─┐ + ───┤ │ ├─┐ + └─────┴─┘ │ + │ + +We'll be using the long lead at the bent end to connect it to the elbow (bent part) of the next diode, creating the row. + +### Soldering the diodes + +Starting at the top-left switch, place the diode (with tweezers if you have them) on the switch so that the diode itself is vertically aligned, and the black line is facing toward you. The straight end of the diode should be touching the left contact on the switch, and the bent end should be facing to the right and resting on the switch there, like this: + + │o + ┌┴┐ o + │ │ O + ├─┤ + └┬┘ + └───────────── + +Letting the diode rest, grab your solder, and touch both it and the soldering iron to the left contact at the same time - the rosin in the solder should make it easy for the solder to flow over both the diode and the keyswitch contact. The diode may move a little, and if it does, carefully position it back it place by grabbing the bent end of the diode - the other end will become hot very quickly. If you find that it's moving too much, using needle-nose pliers of some sort may help to keep the diode still when soldering. + +The smoke that the rosin releases is harmful, so be careful not to breath it or get it in your eyes/face. + +After soldering things in place, it may be helpful to blow on the joint to push the smoke away from your face, and cool the solder quicker. You should see the solder develop a matte (not shiney) surface as it solidifies. Keep in mind that it will still be very hot afterwards, and will take a couple minutes to be cool to touch. Blow on it will accelerate this process. + +When the first diode is complete, the next one will need to be soldered to both the keyswitch, and the previous diode at the new elbow. That will look something like this: + + │o │o + ┌┴┐ o ┌┴┐ o + │ │ O │ │ O + ├─┤ ├─┤ + └┬┘ └┬┘ + └────────────────┴───────────── + +After completing a row, use the wire cutters to trim the excess wire from the tops of the diodes, and from the right side on the final switch. This process will need to completed for each row you have. + +When all of the diodes are completely soldered, it's a good idea to quickly inspect each one to ensure that your solder joints are solid and sturdy - repairing things after this is possible, but more difficult. + +### Soldering the columns + +You'll have some options in the next process - it's a good idea to insulate the column wires (since the diodes aren't), but if you're careful enough, you can use exposed wires for the columns - it's not recommended, though. If you're using single-cored wire, stripping the plastic off of the whole wire and feeding it back on is probably the best option, but can be difficult depending on the size and materials. You'll want to leave parts of the wire exposed where you're going to be solder it onto the keyswitch. + +If you're using stranded wire, it's probably easiest to just use a lot of small wires to connect each keyswitch along the column. It's possible to use one and melt through the insulation, but this isn't recommended, will produce even more harmful fumes, and can ruin your soldering iron. + +Before beginning to solder, it helps to have your wire pre-bent (if using single-cored), or at least have an idea of how you're going to route the column (especially if you're making a staggered board). Where you go in particular doesn't matter too much, as we'll be basing our keymap definitions on how it was wired - just make sure every key in a particular row is in a unique column, and that they're in order from left to right. + +If you're not using any insulation, you can try to keep the column wires elevated, and solder them near the tips of the keyswitch contacts - if the wires are sturdy enough, they won't short out to the row wiring an diodes. + +### Wiring things to the Teensy + +Now that the matrix itself is complete, it's time to connect what you've done to the Teensy. You'll be needing the number of pins equal to your number of columns + your number of rows. There are some pins on the Teensy that are special, like D6 (the LED on the chip), or some of the UART, SPI, I2C, or PWM channels, but only avoid those if you're planning something in addition to a keyboard. If you're unsure about wanting to add something later, you should have enough pins in total to avoid a couple. + +The pins you'll absolutely have to avoid are: GND, VCC, AREF, and RST - all the others are usable and accessible in the firmware. + +Place the Teensy where you plan to put it - you'll have to cut wires to length in the next step, and you'll want to make sure they reach. + +Starting with the first column on the right side, measure out how much wire you'll need to connect it to the first pin on the Teensy - it helps to pick a side that you'll be able to work down, to keep the wires from overlapping too much. It may help to leave a little bit of slack so things aren't too tight. Cut the piece of wire, and solder it to the Teensy, and then the column - you can solder it anywhere along the column, but it may be easiest at the keyswitch. Just be sure the wire doesn't separate from the keyswitch when soldering. + +As you move from column to column, it'll be helpful to write the locations of the pins down. We'll use this data to setup the matrix in the future. + +When you're done with the columns, start with the rows in the same process, from top to bottom, and write them all down. Again, you can solder anywhere along the row, as long as it's after the diode - soldering before the diode (on the keyswitch side) will cause that row not to work. + +As you move along, be sure that the Teensy is staying in place - recutting and soldering the wires is a pain! + +### Getting some basic firmware set-up + +From here, you should have a working keyboard with the correct firmware. Before we attach the Teensy permanently to the keyboard, let's quickly get some firmware loaded onto the Teensy so we can test each keyswitch. + +To start out, download [the firmware](https://github.com/jackhumbert/qmk_firmware/) - we'll be using my (Jack's) fork of TMK called QMK/Quantum. We'll be doing a lot from the Terminal/command prompt, so get that open, along with a decent text editor like [Sublime Text](http://www.sublimetext.com/). + +The first thing we're going to do is create a new project using the script in the root directory of the firmware. In your terminal, run this command with `` replaced by the name of your project - it'll need to be different from any other project in the `keyboard/` folder: + + ./new_project.sh + +You'll want to navigate to the `keyboard//` folder by typing, like the print-out from the script specifies: + + cd keyboard/ + +#### config.h + +The first thing we're going to want to modify is the `config.h` file. On line 32 and 33, you'll see `MATRIX_ROWS` and `MATRIX_COLS` - set both these variables to however many rows and columns you have on your keyboard. + +On line 38 and 39 you'll see the `COLS` and `ROWS` definitions - this is where you'll enter the pins you used, in order (left-to-right when looking at the top of the keyboard, but right-to-left when looking at the bottom). + +There are some other variables that you'll be able to modify (lines 23-29), but it's not necessary to do that now (or ever, really). + +#### \.h + +The next file you'll want to look at is `.h`. You're going to want to rewrite the `KEYMAP` definition - the format and syntax here is extremely important, so pay attention to how things are setup. The first half of the definition are considered the arguments - this is the format that you'll be following in your keymap later on, so you'll want to have as many k*xy* variables here as you do keys. The second half is the part that the firmware actually looks at, and will contain gaps depending on how you wired your matrix. + +We'll dive into how this will work with the following example. Say we have a keyboard like this: + + ┌───┬───┬───┐ + │ │ │ │ + ├───┴─┬─┴───┤ + │ │ │ + └─────┴─────┘ + +This can be described by saying the top row is 3 1u keys, and the bottom row is 2 1.5u keys. The difference between the two rows is important, because the bottom row has an unused column spot (3 v 2). Let's say that this is how we wired the columns: + + ┌───┬───┬───┐ + │ ┋ │ ┋ │ ┋ │ + ├─┋─┴─┬─┴─┋─┤ + │ ┋ │ ┋ │ + └─────┴─────┘ + +The middle column is unused on the bottom row in this example. Our `KEYMAP` definition would look like this: + + #define KEYMAP( \ + k00, k01, k02, \ + k10, k11, \ + ) \ + { \ + { k00, k01, k02 }, \ + { k10, KC_NO, k11 }, \ + } + +Notice how the top half is spaced to resemble our physical layout - this helps us understand which keys are associated with which columns. The bottom half uses the keycode `KC_NO` where there is no keyswitch wired in. It's easiest to keep the bottom half aligned in a grid to help us make sense of how the firmware actually sees the wiring. + +Let's say that instead, we wired our keyboard like this (a fair thing to do): + + ┌───┬───┬───┐ + │ ┋ │ ┋│ ┋ │ + ├─┋─┴─┬┋┴───┤ + │ ┋ │┋ │ + └─────┴─────┘ + +This would require our `KEYMAP` definition to look like this: + + #define KEYMAP( \ + k00, k01, k02, \ + k10, k11, \ + ) \ + { \ + { k00, k01, k02 }, \ + { k10, k11, KC_NO }, \ + } + +Notice how the `k11` and `KC_NO` switched places to represent the wiring, and the unused final column on the bottom row. Sometimes it'll make more sense to put a keyswitch on a particular column, but in the end, it won't matter, as long as all of them are accounted for. You can use this process to write out the `KEYMAP` for your entire keyboard - be sure to remember that your keyboard is actually backwards when looking at the underside of it. + +#### keymaps/default.c + +This is the actual keymap for your keyboard, and the main place you'll make changes as you perfect your layout. `default.c` is the file that gets pull by default when typing `make`, but you can make other files as well, and specify them by typing `make KEYMAP=`, which will pull `keymaps/.c`. + +The basis of a keymap is its layers - by default, layer 0 is active. You can activate other layers, the highest of which will be referenced first. Let's start with our base layer. + +Using our previous example, let's say we want to create the following layout: + + ┌───┬───┬───┐ + │ A │ 1 │ H │ + ├───┴─┬─┴───┤ + │ TAB │ SPC │ + └─────┴─────┘ + +This can be accomplished by using the following `keymaps` definition: + + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = KEYMAP( /* Base */ + KC_A, KC_1, KC_H, \ + KC_TAB, KC_SPC \ + ), + }; + +Note that the layout of the keycodes is similar to the physical layout of our keyboard - this make it much easier to see what's going on. A lot of the keycodes should be fairly obvious, but for a full list of them, check out [tmk_code/doc/keycode.txt](https://github.com/jackhumbert/qmk_firmware/blob/master/tmk_core/doc/keycode.txt) - there are also a lot of aliases to condense your keymap file. + +It's also important to use the `KEYMAP` function we defined earlier - this is what allows the firmware to associate our intended readable keymap with the actual wiring. + +#### Compiling your firmware + +After you've written out your entire keymap, you're ready to get the firmware compiled and onto your Teensy. Before compiling, you'll need to get your [development environment set-up](https://github.com/jackhumbert/qmk_firmware/blob/master/keyboard/planck/PCB_GUIDE.md#setting-up-the-environment) - you can skip the dfu-programmer instructions, but you'll need to download and install the [Teensy Loader](https://www.pjrc.com/teensy/loader.html) to get the firmware on your Teensy. + +Once everything is installed, running `make` in the terminal should get you some output, and eventually a `.hex` file in that folder. If you're having trouble with this step, see the end of the guide for the trouble-shooting section. + +Once you have your `.hex` file, open up the Teensy loader application, and click the file icon. From here, navigate to your `QMK/keyboard//` folder, and select the `.hex` file. Plug in your keyboard and press the button on the Teensy - you should see the LED on the device turn off once you do. The Teensy Loader app will change a little, and the buttons should be clickable - click the download button (down arrow), and then the reset button (right arrow), and your keyboard should be ready to go! + +#### Testing your firmware + +Carefully flip your keyboard over, open up a new text document, and try typing - you should get the characters that you put into your keymap. Test each key, and note the ones that aren't working. Here's a quick trouble-shooting guide for non-working keys: + +0. Flip the keyboard back over and short the keyswitch's contacts with a piece wire - this will eliminate the possibility of the keyswitch being bad and needing to be replaced. +1. Check the solder points on the keyswitch - these need to be plump and whole. If you touch it with a moderate amount of force and it comes apart, it's not strong enough. +2. Check the solder joints on the diode - if the diode is loose, part of your row may register, while the other may not. +3. Check the solder joints on the columns - if your column wiring is loose, part or all of the column may not work. +4. Check the solder joints on both sides of the wires going to/from the Teensy - the wires need to be fully soldered and connect to both sides. +5. Check the .h file for errors and incorrectly placed `KC_NO`s - if you're unsure where they should be, instead duplicate a k*xy* variable. +6. Check to make sure you actually compiled the firmware and flashed the Teensy correctly. Unless you got error messages in the terminal, or a pop-up during flashing, you probably did everything correctly. + +If you've done all of these things, keep in mind that sometimes you might have had multiple things affecting the keyswitch, so it doesn't hurt to test the keyswitch by shorting it out at the end. + +#### Securing the Teensy, finishing your hardware, getting fancier firmware + +Now that you have a working board, it's time to get things in their permanent positions. I've often used liberal amounts of hot glue to secure and insulate things, so if that's your style, start spreading that stuff like butter. Otherwise, double-sided tape is always an elegant solution, and electrical tape is a distant second. Due to the nature of these builds, a lot of this part is up to you and how you planned (or didn't plan) things out. + +There are a lot of possibilities inside the firmware - check out the [README](https://github.com/jackhumbert/qmk_firmware/blob/master/README.md) for a full feature list, and dive into the different project (Planck, Ergodox EZ, etc) to see how people use all of them. You can always stop by [the OLKB subreddit for help!](http://reddit.com/r/olkb) + +## Trouble-shooting compiling + +### Windows + +#### fork: Resource temporarily unavailable + +http://www.avrfreaks.net/forum/windows-81-compilation-error + +### Mac + +### Linux From ae620fe8562254a5c00a48b863cabd4c87abd613 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 23 Jan 2016 20:35:13 -0500 Subject: [PATCH 41/52] rename file --- keyboard/planck/keymaps/keymap_eric.c | 42 --------------------------- 1 file changed, 42 deletions(-) delete mode 100644 keyboard/planck/keymaps/keymap_eric.c diff --git a/keyboard/planck/keymaps/keymap_eric.c b/keyboard/planck/keymaps/keymap_eric.c deleted file mode 100644 index ffeec5f805..0000000000 --- a/keyboard/planck/keymaps/keymap_eric.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "planck.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = { - {KC_BSLS, S(KC_SLSH), KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH}, - {TG(1), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS}, - {KC_LGUI, KC_QUOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RGUI}, - {KC_LCBR, KC_LCTL, KC_LALT, LT(1, TG(2)), KC_SPC, KC_TAB, KC_ENT, KC_BSPC, LT(1, TG(3)), KC_RALT, KC_RCTL, KC_RCBR} - }, - - [1] = { - {KC_PIPE, KC_COLN, KC_LBRC, KC_RBRC, S(KC_P), S(KC_Y), S(KC_F), S(KC_G), S(KC_C), S(KC_R), S(KC_L), KC_AMPR}, - {KC_TRNS, S(KC_A), S(KC_O), S(KC_E), S(KC_U), S(KC_I), S(KC_D), S(KC_H), S(KC_T), S(KC_N), S(KC_S), KC_GRV}, - {KC_TRNS, KC_SCLN, S(KC_Q), S(KC_J), S(KC_K), S(KC_X), S(KC_B), S(KC_M), S(KC_W), S(KC_V), S(KC_Z), KC_TRNS}, - {S(KC_COMM), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_DOT)} - }, - - [2] = { - {KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NO}, - {KC_NO, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_NO}, - {KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, 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_NO} - }, - - [3] = { - {KC_EXLM, KC_7, KC_5, KC_3, KC_1, KC_9, KC_0, KC_2, KC_4, KC_6, KC_8, KC_EQL}, - {TG(4), KC_NO, KC_PGUP, KC_HOME, KC_INSERT, KC_NO, KC_NO, BL_DEC, KC_UP, BL_INC, KC_NO, KC_NO}, - {KC_TRNS, KC_NO, KC_PGDN, KC_END, KC_DELETE, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, 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_NO} - }, - - [4] = { - {KC_TILD, KC_HASH, KC_LPRN, KC_RPRN, S(KC_QUOT), KC_PERC, KC_UNDS, KC_CIRC, KC_DLR, KC_AT, KC_ASTR, KC_PLUS}, - {KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, - {KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, 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_NO} - } -}; - -const uint16_t PROGMEM fn_actions[] = { - -}; \ No newline at end of file From 6a55a5fe484f15f37e790e276cb77ae06b534358 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 23 Jan 2016 20:40:40 -0500 Subject: [PATCH 42/52] not sure how this got here.. --- .../ergodox_ez/keymaps/keymap_generated.c | 78 ------------------- 1 file changed, 78 deletions(-) delete mode 100644 keyboard/ergodox_ez/keymaps/keymap_generated.c diff --git a/keyboard/ergodox_ez/keymaps/keymap_generated.c b/keyboard/ergodox_ez/keymaps/keymap_generated.c deleted file mode 100644 index 54fd3059f2..0000000000 --- a/keyboard/ergodox_ez/keymaps/keymap_generated.c +++ /dev/null @@ -1,78 +0,0 @@ -#include "ergodox_ez.h" -#include "debug.h" -#include "action_layer.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - -// If it accepts an argument (i.e, is a function), it doesn't need KC_. -// Otherwise, it needs KC_* - -#define SYMB 0 - -[0] = KEYMAP( \ -\ -KC_KP_EQUAL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_DELETE, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(1), KC_BSPACE, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TAB, KC_LEFT, KC_RIGHT, KC_TRANSPARENT, KC_LGUI, KC_HOME, KC_SPACE, KC_BSPACE, KC_END, KC_RIGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, TG(1), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOTE, KC_TRANSPARENT, KC_N, KC_M, KC_COMMA, KC_DOT, KC_LCTRL, KC_LSHIFT, KC_UP, KC_DOWN, KC_LBRACKET, KC_RBRACKET, KC_TRANSPARENT, KC_LALT, KC_ESCAPE, KC_PGUP, KC_PGDOWN, KC_TAB, KC_ENTER \ -\ -), - -[1] = KEYMAP( \ -\ -KC_TRANSPARENT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_TRANSPARENT, KC_UP, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_ASTERISK, KC_F12, KC_DOWN, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, KC_TRANSPARENT, KC_TRANSPARENT, , KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_SLASH, KC_TRANSPARENT, KC_TRANSPARENT, KC_KP_DOT, KC_KP_0, KC_KP_EQUAL, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT \ -\ -), - -[2] = KEYMAP( \ -\ -KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_UP, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_BTN3, KC_MS_BTN2, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MEDIA_PLAY_PAUSE, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK, KC_TRANSPARENT, KC_TRANSPARENT, KC_AUDIO_VOL_UP, KC_AUDIO_VOL_DOWN, KC_AUDIO_MUTE, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT \ -\ -), - -}; - -const uint16_t PROGMEM fn_actions[] = { - [1] = 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; -}; - -// 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) { - - uint8_t layer = biton32(layer_state); - - ergodox_board_led_off(); - ergodox_right_led_1_off(); - ergodox_right_led_2_off(); - ergodox_right_led_3_off(); - switch (layer) { - // TODO: Make this relevant to the ErgoDox EZ. - case 1: - ergodox_right_led_1_on(); - break; - case 2: - ergodox_right_led_2_on(); - break; - default: - // none - break; - } - -}; From 24f2698fba0055128eb90fbde793e3c84900df69 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 23 Jan 2016 20:45:52 -0500 Subject: [PATCH 43/52] changes to the template --- new_project.sh | 2 +- quantum/template/Makefile | 6 +-- quantum/template/README.md | 6 +-- quantum/template/config.h | 8 +-- quantum/template/keymaps/keymap_default.c | 66 ----------------------- quantum/template/template.h | 12 ++--- 6 files changed, 15 insertions(+), 85 deletions(-) delete mode 100644 quantum/template/keymaps/keymap_default.c diff --git a/new_project.sh b/new_project.sh index 86ecf692f4..199ced4113 100755 --- a/new_project.sh +++ b/new_project.sh @@ -12,7 +12,7 @@ sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/template.c > keyboard/$KEYBOA sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/config.h > keyboard/$KEYBOARD/config.h sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/README.md > keyboard/$KEYBOARD/README.md sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/Makefile > keyboard/$KEYBOARD/Makefile -sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/keymaps/keymap_default.c > keyboard/$KEYBOARD/keymaps/keymap_default.c +sed -e "s;%KEYBOARD%;$KEYBOARD;g" quantum/template/keymaps/default.c > keyboard/$KEYBOARD/keymaps/default.c cp quantum/template/bootloader.hex keyboard/$KEYBOARD/bootloader.hex echo "######################################################" diff --git a/quantum/template/Makefile b/quantum/template/Makefile index 99c97a62cf..2efa691380 100644 --- a/quantum/template/Makefile +++ b/quantum/template/Makefile @@ -53,9 +53,9 @@ TARGET_DIR = . SRC = %KEYBOARD%.c ifdef KEYMAP - SRC := keymaps/keymap_$(KEYMAP).c $(SRC) + SRC := keymaps/$(KEYMAP).c $(SRC) else - SRC := keymaps/keymap_default.c $(SRC) + SRC := keymaps/default.c $(SRC) endif CONFIG_H = config.h @@ -107,7 +107,7 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Atmel DFU loader 4096 # LUFA bootloader 4096 # USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 +OPT_DEFS += -DBOOTLOADER_SIZE=512 # Build Options diff --git a/quantum/template/README.md b/quantum/template/README.md index ecea7dd698..f34862cd9b 100644 --- a/quantum/template/README.md +++ b/quantum/template/README.md @@ -88,7 +88,7 @@ Instead of using `FNx` when defining `ACTION_*` functions, you can use `F(x)` - ## Macro shortcuts: Send a whole string when pressing just one key -Instead of using the `ACTION_MACRO` function, you can simply use `M(n)` to access macro *n* - *n* will get passed into the `action_get_macro` as the `id`, and you can use a switch statement to trigger it. This gets called on the keydown and keyup, so you'll need to use an if statement testing `record->event.pressed` (see keymap_default.c). +Instead of using the `ACTION_MACRO` function, you can simply use `M(n)` to access macro *n* - *n* will get passed into the `action_get_macro` as the `id`, and you can use a switch statement to trigger it. This gets called on the keydown and keyup, so you'll need to use an if statement testing `record->event.pressed` (see keymaps/default.c). ```c const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // this is the function signature -- just copy/paste it into your keymap file as it is. @@ -171,10 +171,10 @@ Depending on which keymap you would like to use, you will have to compile slight 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 `keymap_.c` and see keymap document (you can find in top README.md) and existent keymap files. +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 `.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|] ``` -Keymaps follow the format **__keymap\_\.c__** and are stored in the `keymaps` folder. \ No newline at end of file +Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. \ No newline at end of file diff --git a/quantum/template/config.h b/quantum/template/config.h index 9afedbcc07..7d6149f436 100644 --- a/quantum/template/config.h +++ b/quantum/template/config.h @@ -29,14 +29,14 @@ along with this program. If not, see . #define DESCRIPTION A custom keyboard /* key matrix size */ -#define MATRIX_ROWS 4 -#define MATRIX_COLS 12 +#define MATRIX_ROWS 2 +#define MATRIX_COLS 3 // Planck PCB default pin-out // Change this to how you wired your keyboard // COLS: Left to right, ROWS: Top to bottom -#define COLS (int []){ F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 } -#define ROWS (int []){ D0, D5, B5, B6 } +#define COLS (int []){ F1, F0, B0 } +#define ROWS (int []){ D0, D5 } /* COL2ROW or ROW2COL */ #define DIODE_DIRECTION COL2ROW diff --git a/quantum/template/keymaps/keymap_default.c b/quantum/template/keymaps/keymap_default.c deleted file mode 100644 index 1e6684da7b..0000000000 --- a/quantum/template/keymaps/keymap_default.c +++ /dev/null @@ -1,66 +0,0 @@ -// This is the canonical layout file for the Quantum project. If you want to add another keyboard, -// this is the style you want to emulate. - -#include "%KEYBOARD%.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. -// 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 _QW 0 -#define _CM 1 -#define _DV 2 -#define _LW 3 -#define _RS 4 - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[_QW] = { /* Qwerty */ - {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {KC_ESC, 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(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -[_CM] = { /* Colemak */ - {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, - {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, - {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -[_DV] = { /* Dvorak */ - {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, - {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, - {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, - {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -[_RS] = { /* RAISE */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -}, -[_LW] = { /* LOWER */ - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, - {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, - {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -} -}; - -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; -}; diff --git a/quantum/template/template.h b/quantum/template/template.h index de3edf3242..d4d78e4c91 100644 --- a/quantum/template/template.h +++ b/quantum/template/template.h @@ -11,16 +11,12 @@ // 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, k06, k07, k08, k09, k0a, k0b, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ - k30, k31, k32, k33, k34, k35, k37, k38, k39, k3a, k3b \ + k00, k01, k02, \ + k10, k11, \ ) \ { \ - { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \ - { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \ - { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \ - { k30, k31, k32, k33, k34, k35, k35, k37, k38, k39, k3a, k3b } \ + { k00, k01, k02 }, \ + { k10, KC_NO, k11 }, \ } void * matrix_init_user(void); From fd72a46c139c0450299e6e4ebbf4ffba531c9e2d Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 23 Jan 2016 20:52:01 -0500 Subject: [PATCH 44/52] Makefile back to defaults --- keyboard/planck/Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index dece6a7f17..8414b2ccc0 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -138,9 +138,9 @@ 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 = yes # Breathing sleep LED during USB suspend # NKRO_ENABLE = yes # USB 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 = YES # MIDI controls -AUDIO_ENABLE = YES # Audio output on port C6 +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +# MIDI_ENABLE = YES # MIDI controls +# AUDIO_ENABLE = YES # Audio output on port C6 # UNICODE_ENABLE = YES # Unicode # BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID From 0a40654b82520849fcc587e8fb76c823378649a6 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Sun, 24 Jan 2016 13:14:50 -0800 Subject: [PATCH 45/52] Add support for WS2812 LEDs --- keyboard/planck/Makefile | 13 +- keyboard/planck/config.h | 15 + keyboard/planck/keymaps/yang/keymap.c | 146 ++++++++ keyboard/planck/light_ws2812.c | 181 +++++++++ keyboard/planck/light_ws2812.h | 73 ++++ keyboard/planck/planck.c | 7 +- keyboard/planck/planck.h | 9 +- keyboard/planck/rgblight.c | 505 ++++++++++++++++++++++++++ keyboard/planck/rgblight.h | 87 +++++ 9 files changed, 1029 insertions(+), 7 deletions(-) create mode 100644 keyboard/planck/keymaps/yang/keymap.c create mode 100755 keyboard/planck/light_ws2812.c create mode 100755 keyboard/planck/light_ws2812.h create mode 100644 keyboard/planck/rgblight.c create mode 100644 keyboard/planck/rgblight.h diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index 8414b2ccc0..d37005260a 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -27,7 +27,7 @@ # make flip-ee = Download the eeprom file to the device, using Atmel FLIP # (must have Atmel FLIP installed). # -# make debug = Start either simulavr or avarice as specified for debugging, +# make debug = Start either simulavr or avarice as specified for debugging, # with avr-gdb or avr-insight as the front end for debugging. # # make filename.s = Just compile filename.c into the assembler code only. @@ -137,17 +137,25 @@ 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 = yes # Breathing sleep LED during USB suspend -# NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB 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 = YES # MIDI controls # AUDIO_ENABLE = YES # Audio output on port C6 # UNICODE_ENABLE = YES # Unicode # BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 bottom RGB light ifdef BACKLIGHT_ENABLE SRC += backlight.c endif +ifdef RGBLIGHT_ENABLE + SRC += light_ws2812.c + SRC += rgblight.c + OPT_DEFS += -DRGBLIGHT_ENABLE +endif + + # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax @@ -157,4 +165,3 @@ VPATH += $(TOP_DIR) VPATH += $(TMK_DIR) include $(TOP_DIR)/quantum/quantum.mk - diff --git a/keyboard/planck/config.h b/keyboard/planck/config.h index a4c711db82..856de73066 100644 --- a/keyboard/planck/config.h +++ b/keyboard/planck/config.h @@ -58,6 +58,21 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) +/* ws2812 RGB LED */ +#define ws2812_PORTREG PORTD +#define ws2812_DDRREG DDRD +#define ws2812_pin PD1 +#define RGBLED_NUM 28 // Number of LEDs +#ifndef RGBLIGHT_HUE_STEP +#define RGBLIGHT_HUE_STEP 10 +#endif +#ifndef RGBLIGHT_SAT_STEP +#define RGBLIGHT_SAT_STEP 17 +#endif +#ifndef RGBLIGHT_VAL_STEP +#define RGBLIGHT_VAL_STEP 17 +#endif + /* * Feature disable options * These options are also useful to firmware size reduction. diff --git a/keyboard/planck/keymaps/yang/keymap.c b/keyboard/planck/keymaps/yang/keymap.c new file mode 100644 index 0000000000..541b1a57e4 --- /dev/null +++ b/keyboard/planck/keymaps/yang/keymap.c @@ -0,0 +1,146 @@ +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, +// this is the style you want to emulate. + +#include "planck.h" +#ifdef BACKLIGHT_ENABLE + #include "backlight.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 _QW 0 +#define _CM 1 +#define _DV 2 +#define _LW 3 +#define _RS 4 +#define _RGB 5 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[_QW] = { /* Qwerty */ + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_ESC, 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(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), F(0), F(0), MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +[_CM] = { /* Colemak */ + {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT }, + {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), F(0), F(0), MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +[_DV] = { /* Dvorak */ + {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, + {KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH}, + {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT }, + {M(0), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), F(0), F(0), MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +[_RS] = { /* RAISE */ + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, +[_LW] = { /* LOWER */ + {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, + {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, + {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, DF(_QW), DF(_CM), DF(_DV), RESET, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, +[_RGB] = { /* RGBLIGHT */ + {KC_TRNS, KC_PGUP, KC_UP, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL}, + {KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_END, KC_TRNS}, + {KC_TRNS, F(1), F(2), F(3), F(4), F(5), F(6), F(7), F(8), KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} + +} +}; + +enum function_id { + RGBLED_TOGGLE, + RGBLED_STEP_MODE, + RGBLED_INCREASE_HUE, + RGBLED_DECREASE_HUE, + RGBLED_INCREASE_SAT, + RGBLED_DECREASE_SAT, + RGBLED_INCREASE_VAL, + RGBLED_DECREASE_VAL, +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_TAP_KEY(_RGB, KC_SPC), + [1] = ACTION_FUNCTION(RGBLED_TOGGLE), + [2] = ACTION_FUNCTION(RGBLED_STEP_MODE), + [3] = ACTION_FUNCTION(RGBLED_INCREASE_HUE), + [4] = ACTION_FUNCTION(RGBLED_DECREASE_HUE), + [5] = ACTION_FUNCTION(RGBLED_INCREASE_SAT), + [6] = ACTION_FUNCTION(RGBLED_DECREASE_SAT), + [7] = ACTION_FUNCTION(RGBLED_INCREASE_VAL), + [8] = ACTION_FUNCTION(RGBLED_DECREASE_VAL), +}; + +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; + } + 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; + case RGBLED_INCREASE_HUE: + if (record->event.pressed) { + rgblight_increase_hue(); + } + break; + case RGBLED_DECREASE_HUE: + if (record->event.pressed) { + rgblight_decrease_hue(); + } + break; + case RGBLED_INCREASE_SAT: + if (record->event.pressed) { + rgblight_increase_sat(); + } + break; + case RGBLED_DECREASE_SAT: + if (record->event.pressed) { + rgblight_decrease_sat(); + } + break; + case RGBLED_INCREASE_VAL: + if (record->event.pressed) { + rgblight_increase_val(); + } + break; + case RGBLED_DECREASE_VAL: + if (record->event.pressed) { + rgblight_decrease_val(); + } + break; + case RGBLED_STEP_MODE: + if (record->event.pressed) { + rgblight_step(); + } + break; + } +} diff --git a/keyboard/planck/light_ws2812.c b/keyboard/planck/light_ws2812.c new file mode 100755 index 0000000000..f20043067e --- /dev/null +++ b/keyboard/planck/light_ws2812.c @@ -0,0 +1,181 @@ +/* +* light weight WS2812 lib V2.0b +* +* Controls WS2811/WS2812/WS2812B RGB-LEDs +* Author: Tim (cpldcpu@gmail.com) +* +* Jan 18th, 2014 v2.0b Initial Version +* Nov 29th, 2015 v2.3 Added SK6812RGBW support +* +* License: GNU GPL v2 (see License.txt) +*/ + +#include "light_ws2812.h" +#include +#include +#include +#include "debug.h" + +// Setleds for standard RGB +void inline ws2812_setleds(struct cRGB *ledarray, uint16_t leds) +{ + ws2812_setleds_pin(ledarray,leds, _BV(ws2812_pin)); +} + +void inline ws2812_setleds_pin(struct cRGB *ledarray, uint16_t leds, uint8_t pinmask) +{ + ws2812_DDRREG |= pinmask; // Enable DDR + ws2812_sendarray_mask((uint8_t*)ledarray,leds+leds+leds,pinmask); + _delay_us(50); +} + +// Setleds for SK6812RGBW +void inline ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t leds) +{ + ws2812_DDRREG |= _BV(ws2812_pin); // Enable DDR + ws2812_sendarray_mask((uint8_t*)ledarray,leds<<2,_BV(ws2812_pin)); + _delay_us(80); +} + +void ws2812_sendarray(uint8_t *data,uint16_t datlen) +{ + ws2812_sendarray_mask(data,datlen,_BV(ws2812_pin)); +} + +/* + This routine writes an array of bytes with RGB values to the Dataout pin + using the fast 800kHz clockless WS2811/2812 protocol. +*/ + +// Timing in ns +#define w_zeropulse 350 +#define w_onepulse 900 +#define w_totalperiod 1250 + +// Fixed cycles used by the inner loop +#define w_fixedlow 2 +#define w_fixedhigh 4 +#define w_fixedtotal 8 + +// Insert NOPs to match the timing, if possible +#define w_zerocycles (((F_CPU/1000)*w_zeropulse )/1000000) +#define w_onecycles (((F_CPU/1000)*w_onepulse +500000)/1000000) +#define w_totalcycles (((F_CPU/1000)*w_totalperiod +500000)/1000000) + +// w1 - nops between rising edge and falling edge - low +#define w1 (w_zerocycles-w_fixedlow) +// w2 nops between fe low and fe high +#define w2 (w_onecycles-w_fixedhigh-w1) +// w3 nops to complete loop +#define w3 (w_totalcycles-w_fixedtotal-w1-w2) + +#if w1>0 + #define w1_nops w1 +#else + #define w1_nops 0 +#endif + +// The only critical timing parameter is the minimum pulse length of the "0" +// Warn or throw error if this timing can not be met with current F_CPU settings. +#define w_lowtime ((w1_nops+w_fixedlow)*1000000)/(F_CPU/1000) +#if w_lowtime>550 + #error "Light_ws2812: Sorry, the clock speed is too low. Did you set F_CPU correctly?" +#elif w_lowtime>450 + #warning "Light_ws2812: The timing is critical and may only work on WS2812B, not on WS2812(S)." + #warning "Please consider a higher clockspeed, if possible" +#endif + +#if w2>0 +#define w2_nops w2 +#else +#define w2_nops 0 +#endif + +#if w3>0 +#define w3_nops w3 +#else +#define w3_nops 0 +#endif + +#define w_nop1 "nop \n\t" +#define w_nop2 "rjmp .+0 \n\t" +#define w_nop4 w_nop2 w_nop2 +#define w_nop8 w_nop4 w_nop4 +#define w_nop16 w_nop8 w_nop8 + +void inline ws2812_sendarray_mask(uint8_t *data,uint16_t datlen,uint8_t maskhi) +{ + uint8_t curbyte,ctr,masklo; + uint8_t sreg_prev; + + masklo =~maskhi&ws2812_PORTREG; + maskhi |= ws2812_PORTREG; + sreg_prev=SREG; + cli(); + + while (datlen--) { + curbyte=*data++; + + asm volatile( + " ldi %0,8 \n\t" + "loop%=: \n\t" + " out %2,%3 \n\t" // '1' [01] '0' [01] - re +#if (w1_nops&1) +w_nop1 +#endif +#if (w1_nops&2) +w_nop2 +#endif +#if (w1_nops&4) +w_nop4 +#endif +#if (w1_nops&8) +w_nop8 +#endif +#if (w1_nops&16) +w_nop16 +#endif + " sbrs %1,7 \n\t" // '1' [03] '0' [02] + " out %2,%4 \n\t" // '1' [--] '0' [03] - fe-low + " lsl %1 \n\t" // '1' [04] '0' [04] +#if (w2_nops&1) + w_nop1 +#endif +#if (w2_nops&2) + w_nop2 +#endif +#if (w2_nops&4) + w_nop4 +#endif +#if (w2_nops&8) + w_nop8 +#endif +#if (w2_nops&16) + w_nop16 +#endif + " out %2,%4 \n\t" // '1' [+1] '0' [+1] - fe-high +#if (w3_nops&1) +w_nop1 +#endif +#if (w3_nops&2) +w_nop2 +#endif +#if (w3_nops&4) +w_nop4 +#endif +#if (w3_nops&8) +w_nop8 +#endif +#if (w3_nops&16) +w_nop16 +#endif + + " dec %0 \n\t" // '1' [+2] '0' [+2] + " brne loop%=\n\t" // '1' [+3] '0' [+4] + : "=&d" (ctr) + : "r" (curbyte), "I" (_SFR_IO_ADDR(ws2812_PORTREG)), "r" (maskhi), "r" (masklo) + ); + } + + SREG=sreg_prev; +} diff --git a/keyboard/planck/light_ws2812.h b/keyboard/planck/light_ws2812.h new file mode 100755 index 0000000000..54eef22d9e --- /dev/null +++ b/keyboard/planck/light_ws2812.h @@ -0,0 +1,73 @@ +/* + * light weight WS2812 lib include + * + * Version 2.3 - Nev 29th 2015 + * Author: Tim (cpldcpu@gmail.com) + * + * Please do not change this file! All configuration is handled in "ws2812_config.h" + * + * License: GNU GPL v2 (see License.txt) + + + */ + +#ifndef LIGHT_WS2812_H_ +#define LIGHT_WS2812_H_ + +#include +#include +//#include "ws2812_config.h" + +/* + * Structure of the LED array + * + * cRGB: RGB for WS2812S/B/C/D, SK6812, SK6812Mini, SK6812WWA, APA104, APA106 + * cRGBW: RGBW for SK6812RGBW + */ + +struct cRGB { uint8_t g; uint8_t r; uint8_t b; }; +struct cRGBW { uint8_t g; uint8_t r; uint8_t b; uint8_t w;}; + + + +/* User Interface + * + * Input: + * ledarray: An array of GRB data describing the LED colors + * number_of_leds: The number of LEDs to write + * pinmask (optional): Bitmask describing the output bin. e.g. _BV(PB0) + * + * The functions will perform the following actions: + * - Set the data-out pin as output + * - Send out the LED data + * - Wait 50�s to reset the LEDs + */ + +void ws2812_setleds (struct cRGB *ledarray, uint16_t number_of_leds); +void ws2812_setleds_pin (struct cRGB *ledarray, uint16_t number_of_leds,uint8_t pinmask); +void ws2812_setleds_rgbw(struct cRGBW *ledarray, uint16_t number_of_leds); + +/* + * Old interface / Internal functions + * + * The functions take a byte-array and send to the data output as WS2812 bitstream. + * The length is the number of bytes to send - three per LED. + */ + +void ws2812_sendarray (uint8_t *array,uint16_t length); +void ws2812_sendarray_mask(uint8_t *array,uint16_t length, uint8_t pinmask); + + +/* + * Internal defines + */ +#ifndef CONCAT +#define CONCAT(a, b) a ## b +#endif +#ifndef CONCAT_EXP +#define CONCAT_EXP(a, b) CONCAT(a, b) +#endif + +// #define ws2812_PORTREG CONCAT_EXP(PORT,ws2812_port) +// #define ws2812_DDRREG CONCAT_EXP(DDR,ws2812_port) + +#endif /* LIGHT_WS2812_H_ */ diff --git a/keyboard/planck/planck.c b/keyboard/planck/planck.c index b62862af04..63ca54761c 100644 --- a/keyboard/planck/planck.c +++ b/keyboard/planck/planck.c @@ -15,6 +15,11 @@ void * matrix_init_kb(void) { backlight_init_ports(); #endif + #ifdef RGBLIGHT_ENABLE + rgblight_init(); + #endif + + // Turn status LED on DDRE |= (1<<6); PORTE |= (1<<6); @@ -28,4 +33,4 @@ void * matrix_scan_kb(void) { if (matrix_scan_user) { (*matrix_scan_user)(); } -}; \ No newline at end of file +}; diff --git a/keyboard/planck/planck.h b/keyboard/planck/planck.h index e775ea7c62..00b01b54df 100644 --- a/keyboard/planck/planck.h +++ b/keyboard/planck/planck.h @@ -6,6 +6,9 @@ #ifdef BACKLIGHT_ENABLE #include "backlight.h" #endif +#ifdef RGBLIGHT_ENABLE + #include "rgblight.h" +#endif #include #ifdef MIDI_ENABLE #include @@ -22,7 +25,7 @@ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \ { k30, k31, k32, k33, k34, k35, k35, k37, k38, k39, k3a, k3b } \ -} +} #define PLANCK_GRID( \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ @@ -35,9 +38,9 @@ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b } \ -} +} void * matrix_init_user(void); void * matrix_scan_user(void); -#endif \ No newline at end of file +#endif diff --git a/keyboard/planck/rgblight.c b/keyboard/planck/rgblight.c new file mode 100644 index 0000000000..552456aae3 --- /dev/null +++ b/keyboard/planck/rgblight.c @@ -0,0 +1,505 @@ +#include +#include +#include +#include "progmem.h" +#include "timer.h" +#include "rgblight.h" +#include "debug.h" + +const uint8_t DIM_CURVE[] PROGMEM = { + 0, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, + 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, + 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, + 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, + 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 25, 26, 26, + 27, 27, 28, 28, 29, 29, 30, 30, 31, 32, 32, 33, 33, 34, 35, 35, + 36, 36, 37, 38, 38, 39, 40, 40, 41, 42, 43, 43, 44, 45, 46, 47, + 48, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 68, 69, 70, 71, 73, 74, 75, 76, 78, 79, 81, 82, + 83, 85, 86, 88, 90, 91, 93, 94, 96, 98, 99, 101, 103, 105, 107, 109, + 110, 112, 114, 116, 118, 121, 123, 125, 127, 129, 132, 134, 136, 139, 141, 144, + 146, 149, 151, 154, 157, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186, 190, + 193, 196, 200, 203, 207, 211, 214, 218, 222, 226, 230, 234, 238, 242, 248, 255, +}; +const uint8_t RGBLED_BREATHING_TABLE[] PROGMEM = {0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,17,18,20,21,23,25,27,29,31,33,35,37,40,42,44,47,49,52,54,57,59,62,65,67,70,73,76,79,82,85,88,90,93,97,100,103,106,109,112,115,118,121,124,127,131,134,137,140,143,146,149,152,155,158,162,165,167,170,173,176,179,182,185,188,190,193,196,198,201,203,206,208,211,213,215,218,220,222,224,226,228,230,232,234,235,237,238,240,241,243,244,245,246,248,249,250,250,251,252,253,253,254,254,254,255,255,255,255,255,255,255,254,254,254,253,253,252,251,250,250,249,248,246,245,244,243,241,240,238,237,235,234,232,230,228,226,224,222,220,218,215,213,211,208,206,203,201,198,196,193,190,188,185,182,179,176,173,170,167,165,162,158,155,152,149,146,143,140,137,134,131,128,124,121,118,115,112,109,106,103,100,97,93,90,88,85,82,79,76,73,70,67,65,62,59,57,54,52,49,47,44,42,40,37,35,33,31,29,27,25,23,21,20,18,17,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0}; +const uint8_t RGBLED_BREATHING_INTERVALS[] PROGMEM = {30, 20, 10, 5}; +const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[] PROGMEM = {120, 60, 30}; +const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {100, 50, 20}; +const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 50, 20}; +const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {100, 50, 20}; + +rgblight_config_t rgblight_config; +rgblight_config_t inmem_config; +struct cRGB led[RGBLED_NUM]; +uint8_t rgblight_inited = 0; + + +void sethsv(uint16_t hue, uint8_t sat, uint8_t val, struct cRGB *led1) { + /* convert hue, saturation and brightness ( HSB/HSV ) to RGB + The DIM_CURVE is used only on brightness/value and on saturation (inverted). + This looks the most natural. + */ + uint8_t r, g, b; + + val = pgm_read_byte(&DIM_CURVE[val]); + sat = 255 - pgm_read_byte(&DIM_CURVE[255 - sat]); + + uint8_t base; + + if (sat == 0) { // Acromatic color (gray). Hue doesn't mind. + r = val; + g = val; + b = val; + } else { + base = ((255 - sat) * val) >> 8; + + switch (hue / 60) { + case 0: + r = val; + g = (((val - base)*hue) / 60) + base; + b = base; + break; + + case 1: + r = (((val - base)*(60 - (hue % 60))) / 60) + base; + g = val; + b = base; + break; + + case 2: + r = base; + g = val; + b = (((val - base)*(hue % 60)) / 60) + base; + break; + + case 3: + r = base; + g = (((val - base)*(60 - (hue % 60))) / 60) + base; + b = val; + break; + + case 4: + r = (((val - base)*(hue % 60)) / 60) + base; + g = base; + b = val; + break; + + case 5: + r = val; + g = base; + b = (((val - base)*(60 - (hue % 60))) / 60) + base; + break; + } + } + setrgb(r,g,b, led1); +} + +void setrgb(uint8_t r, uint8_t g, uint8_t b, struct cRGB *led1) { + (*led1).r = r; + (*led1).g = g; + (*led1).b = b; +} + + +uint32_t eeconfig_read_rgblight(void) { + return eeprom_read_dword(EECONFIG_RGBLIGHT); +} +void eeconfig_write_rgblight(uint32_t val) { + eeprom_write_dword(EECONFIG_RGBLIGHT, val); +} +void eeconfig_write_rgblight_default(void) { + dprintf("eeconfig_write_rgblight_default\n"); + rgblight_config.enable = 1; + rgblight_config.mode = 1; + rgblight_config.hue = 200; + rgblight_config.sat = 204; + rgblight_config.val = 204; + eeconfig_write_rgblight(rgblight_config.raw); +} +void eeconfig_debug_rgblight(void) { + dprintf("rgblight_config eprom\n"); + dprintf("rgblight_config.enable = %d\n", rgblight_config.enable); + dprintf("rghlight_config.mode = %d\n", rgblight_config.mode); + dprintf("rgblight_config.hue = %d\n", rgblight_config.hue); + dprintf("rgblight_config.sat = %d\n", rgblight_config.sat); + dprintf("rgblight_config.val = %d\n", rgblight_config.val); +} + +void rgblight_init(void) { + debug_enable = 1; // Debug ON! + dprintf("rgblight_init called.\n"); + rgblight_inited = 1; + dprintf("rgblight_init start!\n"); + if (!eeconfig_is_enabled()) { + dprintf("rgblight_init eeconfig is not enabled.\n"); + eeconfig_init(); + eeconfig_write_rgblight_default(); + } + rgblight_config.raw = eeconfig_read_rgblight(); + if (!rgblight_config.mode) { + dprintf("rgblight_init rgblight_config.mode = 0. Write default values to EEPROM.\n"); + eeconfig_write_rgblight_default(); + rgblight_config.raw = eeconfig_read_rgblight(); + } + eeconfig_debug_rgblight(); // display current eeprom values + + rgblight_timer_init(); // setup the timer + + if (rgblight_config.enable) { + rgblight_mode(rgblight_config.mode); + } +} + +void rgblight_increase(void) { + uint8_t mode; + if (rgblight_config.mode < RGBLIGHT_MODES) { + mode = rgblight_config.mode + 1; + } + rgblight_mode(mode); +} + +void rgblight_decrease(void) { + uint8_t mode; + if (rgblight_config.mode > 1) { //mode will never < 1, if mode is less than 1, eeprom need to be initialized. + mode = rgblight_config.mode-1; + } + rgblight_mode(mode); +} + +void rgblight_step(void) { + uint8_t mode; + mode = rgblight_config.mode + 1; + if (mode > RGBLIGHT_MODES) { + mode = 1; + } + rgblight_mode(mode); +} + +void rgblight_mode(uint8_t mode) { + if (!rgblight_config.enable) { + return; + } + if (mode<1) { + rgblight_config.mode = 1; + } else if (mode > RGBLIGHT_MODES) { + rgblight_config.mode = RGBLIGHT_MODES; + } else { + rgblight_config.mode = mode; + } + eeconfig_write_rgblight(rgblight_config.raw); + dprintf("rgblight mode: %u\n", rgblight_config.mode); + if (rgblight_config.mode == 1) { + rgblight_timer_disable(); + } else if (rgblight_config.mode >=2 && rgblight_config.mode <=23) { + // MODE 2-5, breathing + // MODE 6-8, rainbow mood + // MODE 9-14, rainbow swirl + // MODE 15-20, snake + // MODE 21-23, knight + rgblight_timer_enable(); + } + rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val); +} + +void rgblight_toggle(void) { + rgblight_config.enable ^= 1; + eeconfig_write_rgblight(rgblight_config.raw); + dprintf("rgblight toggle: rgblight_config.enable = %u\n", rgblight_config.enable); + if (rgblight_config.enable) { + rgblight_mode(rgblight_config.mode); + } else { + rgblight_timer_disable(); + _delay_ms(50); + rgblight_set(); + } +} + + +void rgblight_increase_hue(void){ + uint16_t hue; + hue = (rgblight_config.hue+RGBLIGHT_HUE_STEP) % 360; + rgblight_sethsv(hue, rgblight_config.sat, rgblight_config.val); +} +void rgblight_decrease_hue(void){ + uint16_t hue; + if (rgblight_config.hue-RGBLIGHT_HUE_STEP <0 ) { + hue = (rgblight_config.hue+360-RGBLIGHT_HUE_STEP) % 360; + } else { + hue = (rgblight_config.hue-RGBLIGHT_HUE_STEP) % 360; + } + rgblight_sethsv(hue, rgblight_config.sat, rgblight_config.val); +} +void rgblight_increase_sat(void) { + uint8_t sat; + if (rgblight_config.sat + RGBLIGHT_SAT_STEP > 255) { + sat = 255; + } else { + sat = rgblight_config.sat+RGBLIGHT_SAT_STEP; + } + rgblight_sethsv(rgblight_config.hue, sat, rgblight_config.val); +} +void rgblight_decrease_sat(void){ + uint8_t sat; + if (rgblight_config.sat - RGBLIGHT_SAT_STEP < 0) { + sat = 0; + } else { + sat = rgblight_config.sat-RGBLIGHT_SAT_STEP; + } + rgblight_sethsv(rgblight_config.hue, sat, rgblight_config.val); +} +void rgblight_increase_val(void){ + uint8_t val; + if (rgblight_config.val + RGBLIGHT_VAL_STEP > 255) { + val = 255; + } else { + val = rgblight_config.val+RGBLIGHT_VAL_STEP; + } + rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, val); +} +void rgblight_decrease_val(void) { + uint8_t val; + if (rgblight_config.val - RGBLIGHT_VAL_STEP < 0) { + val = 0; + } else { + val = rgblight_config.val-RGBLIGHT_VAL_STEP; + } + rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, val); +} + +void rgblight_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val){ + inmem_config.raw = rgblight_config.raw; + if (rgblight_config.enable) { + struct cRGB tmp_led; + sethsv(hue, sat, val, &tmp_led); + inmem_config.hue = hue; + inmem_config.sat = sat; + inmem_config.val = val; + // dprintf("rgblight set hue [MEMORY]: %u,%u,%u\n", inmem_config.hue, inmem_config.sat, inmem_config.val); + rgblight_setrgb(tmp_led.r, tmp_led.g, tmp_led.b); + } +} +void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val){ + if (rgblight_config.enable) { + if (rgblight_config.mode == 1) { + // same static color + rgblight_sethsv_noeeprom(hue, sat, val); + } else { + // all LEDs in same color + if (rgblight_config.mode >= 2 && rgblight_config.mode <= 5) { + // breathing mode, ignore the change of val, use in memory value instead + val = rgblight_config.val; + } else if (rgblight_config.mode >= 6 && rgblight_config.mode <= 14) { + // rainbow mood and rainbow swirl, ignore the change of hue + hue = rgblight_config.hue; + } + } + rgblight_config.hue = hue; + rgblight_config.sat = sat; + rgblight_config.val = val; + eeconfig_write_rgblight(rgblight_config.raw); + dprintf("rgblight set hsv [EEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val); + } +} + +void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b){ + // dprintf("rgblight set rgb: %u,%u,%u\n", r,g,b); + for (uint8_t i=0;i>8)&0xff; + OCR3AL = RGBLED_TIMER_TOP&0xff; + SREG = sreg; +} +void rgblight_timer_enable(void) { + TIMSK3 |= _BV(OCIE3A); + dprintf("TIMER3 enabled.\n"); +} +void rgblight_timer_disable(void) { + TIMSK3 &= ~_BV(OCIE3A); + dprintf("TIMER3 disabled.\n"); +} +void rgblight_timer_toggle(void) { + TIMSK3 ^= _BV(OCIE3A); + dprintf("TIMER3 toggled.\n"); +} + +ISR(TIMER3_COMPA_vect) { + // Mode = 1, static light, do nothing here + if (rgblight_config.mode>=2 && rgblight_config.mode<=5) { + // mode = 2 to 5, breathing mode + rgblight_effect_breathing(rgblight_config.mode-2); + + } else if (rgblight_config.mode>=6 && rgblight_config.mode<=8) { + rgblight_effect_rainbow_mood(rgblight_config.mode-6); + } else if (rgblight_config.mode>=9 && rgblight_config.mode<=14) { + rgblight_effect_rainbow_swirl(rgblight_config.mode-9); + } else if (rgblight_config.mode>=15 && rgblight_config.mode<=20) { + rgblight_effect_snake(rgblight_config.mode-15); + } else if (rgblight_config.mode>=21 && rgblight_config.mode<=23) { + rgblight_effect_knight(rgblight_config.mode-21); + } +} + +// effects +void rgblight_effect_breathing(uint8_t interval) { + static uint8_t pos = 0; + static uint16_t last_timer = 0; + + if (timer_elapsed(last_timer)=RGBLED_NUM) k=RGBLED_NUM-1; + if (i==k) { + sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, &preled[i]); + } + } + } + if (RGBLIGHT_EFFECT_KNIGHT_OFFSET) { + for (i=0;iRGBLED_NUM+RGBLIGHT_EFFECT_KNIGHT_LENGTH) { + pos = RGBLED_NUM+RGBLIGHT_EFFECT_KNIGHT_LENGTH-1; + increament = 1; + } else { + pos += 1; + } + } + +} diff --git a/keyboard/planck/rgblight.h b/keyboard/planck/rgblight.h new file mode 100644 index 0000000000..fd39ead09f --- /dev/null +++ b/keyboard/planck/rgblight.h @@ -0,0 +1,87 @@ +#ifndef RGBLIGHT_H +#define RGBLIGHT_H + +#ifndef RGBLIGHT_MODES +#define RGBLIGHT_MODES 23 +#endif + +#ifndef RGBLIGHT_EFFECT_SNAKE_LENGTH +#define RGBLIGHT_EFFECT_SNAKE_LENGTH 7 +#endif + +#ifndef RGBLIGHT_EFFECT_KNIGHT_LENGTH +#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 7 +#endif +#ifndef RGBLIGHT_EFFECT_KNIGHT_OFFSET +#define RGBLIGHT_EFFECT_KNIGHT_OFFSET 11 +#endif + +#ifndef RGBLIGHT_EFFECT_DUALKNIGHT_LENGTH +#define RGBLIGHT_EFFECT_DUALKNIGHT_LENGTH 4 +#endif + +#ifndef RGBLIGHT_HUE_STEP +#define RGBLIGHT_HUE_STEP 10 +#endif +#ifndef RGBLIGHT_SAT_STEP +#define RGBLIGHT_SAT_STEP 17 +#endif +#ifndef RGBLIGHT_VAL_STEP +#define RGBLIGHT_VAL_STEP 17 +#endif + +#define RGBLED_TIMER_TOP F_CPU/(256*64) + +#include +#include +#include "eeconfig.h" +#include "light_ws2812.h" + +typedef union { + uint32_t raw; + struct { + bool enable :1; + uint8_t mode :6; + uint16_t hue :9; + uint8_t sat :8; + uint8_t val :8; + }; +} rgblight_config_t; + +void rgblight_init(void); +void rgblight_increase(void); +void rgblight_decrease(void); +void rgblight_toggle(void); +void rgblight_step(void); +void rgblight_mode(uint8_t mode); +void rgblight_set(void); +void rgblight_increase_hue(void); +void rgblight_decrease_hue(void); +void rgblight_increase_sat(void); +void rgblight_decrease_sat(void); +void rgblight_increase_val(void); +void rgblight_decrease_val(void); +void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val); +void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b); + +#define EECONFIG_RGBLIGHT (uint8_t *)7 +uint32_t eeconfig_read_rgblight(void); +void eeconfig_write_rgblight(uint32_t val); +void eeconfig_write_rgblight_default(void); +void eeconfig_debug_rgblight(void); + +void sethsv(uint16_t hue, uint8_t sat, uint8_t val, struct cRGB *led1); +void setrgb(uint8_t r, uint8_t g, uint8_t b, struct cRGB *led1); +void rgblight_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val); + +void rgblight_timer_init(void); +void rgblight_timer_enable(void); +void rgblight_timer_disable(void); +void rgblight_timer_toggle(void); +void rgblight_effect_breathing(uint8_t interval); +void rgblight_effect_rainbow_mood(uint8_t interval); +void rgblight_effect_rainbow_swirl(uint8_t interval); +void rgblight_effect_snake(uint8_t interval); +void rgblight_effect_knight(uint8_t interval); + +#endif From ba9ac457b2159097ecfd9848c5171c52e3a68260 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Sun, 24 Jan 2016 17:05:47 -0800 Subject: [PATCH 46/52] Integrate WS2812 code into quantum core --- keyboard/planck/Makefile | 8 +------- keyboard/planck/config.h | 6 ------ {keyboard/planck => quantum}/light_ws2812.c | 0 {keyboard/planck => quantum}/light_ws2812.h | 0 quantum/quantum.mk | 9 +++++++-- {keyboard/planck => quantum}/rgblight.c | 0 {keyboard/planck => quantum}/rgblight.h | 0 7 files changed, 8 insertions(+), 15 deletions(-) rename {keyboard/planck => quantum}/light_ws2812.c (100%) rename {keyboard/planck => quantum}/light_ws2812.h (100%) rename {keyboard/planck => quantum}/rgblight.c (100%) rename {keyboard/planck => quantum}/rgblight.h (100%) diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index d37005260a..7619399b98 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -143,18 +143,12 @@ BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality # AUDIO_ENABLE = YES # Audio output on port C6 # UNICODE_ENABLE = YES # Unicode # BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 bottom RGB light +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with MIDI at the same time. ifdef BACKLIGHT_ENABLE SRC += backlight.c endif -ifdef RGBLIGHT_ENABLE - SRC += light_ws2812.c - SRC += rgblight.c - OPT_DEFS += -DRGBLIGHT_ENABLE -endif - # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax diff --git a/keyboard/planck/config.h b/keyboard/planck/config.h index 856de73066..d3719e0cb1 100644 --- a/keyboard/planck/config.h +++ b/keyboard/planck/config.h @@ -63,15 +63,9 @@ along with this program. If not, see . #define ws2812_DDRREG DDRD #define ws2812_pin PD1 #define RGBLED_NUM 28 // Number of LEDs -#ifndef RGBLIGHT_HUE_STEP #define RGBLIGHT_HUE_STEP 10 -#endif -#ifndef RGBLIGHT_SAT_STEP #define RGBLIGHT_SAT_STEP 17 -#endif -#ifndef RGBLIGHT_VAL_STEP #define RGBLIGHT_VAL_STEP 17 -#endif /* * Feature disable options diff --git a/keyboard/planck/light_ws2812.c b/quantum/light_ws2812.c similarity index 100% rename from keyboard/planck/light_ws2812.c rename to quantum/light_ws2812.c diff --git a/keyboard/planck/light_ws2812.h b/quantum/light_ws2812.h similarity index 100% rename from keyboard/planck/light_ws2812.h rename to quantum/light_ws2812.h diff --git a/quantum/quantum.mk b/quantum/quantum.mk index df72241788..de93af7e8c 100644 --- a/quantum/quantum.mk +++ b/quantum/quantum.mk @@ -2,7 +2,7 @@ QUANTUM_DIR = quantum # # project specific files SRC += $(QUANTUM_DIR)/keymap_common.c \ - $(QUANTUM_DIR)/led.c + $(QUANTUM_DIR)/led.c # ifdef KEYMAP_FILE # ifneq (,$(shell grep USING_MIDI '$(KEYMAP_FILE)')) @@ -35,6 +35,12 @@ ifdef UNICODE_ENABLE SRC += $(QUANTUM_DIR)/keymap_unicode.c endif +ifdef RGBLIGHT_ENABLE + SRC += $(QUANTUM_DIR)/light_ws2812.c + SRC += $(QUANTUM_DIR)/rgblight.c + OPT_DEFS += -DRGBLIGHT_ENABLE +endif + # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax @@ -45,4 +51,3 @@ include $(TMK_DIR)/protocol/lufa.mk include $(TMK_DIR)/common.mk include $(TMK_DIR)/rules.mk - diff --git a/keyboard/planck/rgblight.c b/quantum/rgblight.c similarity index 100% rename from keyboard/planck/rgblight.c rename to quantum/rgblight.c diff --git a/keyboard/planck/rgblight.h b/quantum/rgblight.h similarity index 100% rename from keyboard/planck/rgblight.h rename to quantum/rgblight.h From 2647c7cd84820a833b85e41ea86caf76b36e6ee1 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Sun, 24 Jan 2016 17:19:33 -0800 Subject: [PATCH 47/52] fix bugs in animation effects --- quantum/rgblight.c | 2 +- quantum/rgblight.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 552456aae3..2215cf5cdf 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -445,7 +445,7 @@ void rgblight_effect_snake(uint8_t interval) { rgblight_set(); if (increament == 1) { if (pos - 1 < 0) { - pos = 13; + pos = RGBLED_NUM-1; } else { pos -= 1; } diff --git a/quantum/rgblight.h b/quantum/rgblight.h index fd39ead09f..9e1562328f 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -13,7 +13,7 @@ #define RGBLIGHT_EFFECT_KNIGHT_LENGTH 7 #endif #ifndef RGBLIGHT_EFFECT_KNIGHT_OFFSET -#define RGBLIGHT_EFFECT_KNIGHT_OFFSET 11 +#define RGBLIGHT_EFFECT_KNIGHT_OFFSET 9 #endif #ifndef RGBLIGHT_EFFECT_DUALKNIGHT_LENGTH From 84657a9e4be2dfa54338b659d8f0a49c2f50e3f4 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Sun, 24 Jan 2016 17:54:35 -0800 Subject: [PATCH 48/52] Add a photo for the demonstration of RGB underflow --- .../keymaps/yang/planck-with-rgb-underglow.jpg | Bin 0 -> 343033 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 keyboard/planck/keymaps/yang/planck-with-rgb-underglow.jpg diff --git a/keyboard/planck/keymaps/yang/planck-with-rgb-underglow.jpg b/keyboard/planck/keymaps/yang/planck-with-rgb-underglow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c636b9a83dfc9d5acc6e9f4d887dee98b3d65a7d GIT binary patch literal 343033 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ΝMEP{fU>JM5N)I>&L>u)YhY54JIB4jBn} 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%0DS~P}qq=kzEo{r*;I?56JK_-`A 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≺g#A<&a&eY97pG>$Re5yB!EgU^vbM@|}|io27w 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

~Oz>=bzGYcH=-=mo;P{3Wr-RNX*>X}5zQ_N>)* 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�)Ev;wSg7DNkb8eMDavd|>etv2Q!L7Q72dXyrjI zOk$>nJ6zRw+c11U>yFn>x)NQa)Ma+4tHhOJnB&D}@3|9}-o!!Ok4CMsV_NXQ! zl;-zs+r|=$5s6~5kRK3!@IneOazX!_wXY{<5fdS?Lkd$Ka%+r*?>*;#SIW|`N<#yJ~t?Z#RZ^UJq#&bI=`OO9MZh@x$~s zm(05Q#B(d_nro`6{GBX(W{kw>Jdm3LqFO6Kj0O%PsNNmk` zdpnMaDuuO^j@v92;v4LI-k1?utts?nV#5~dPX8t826OZ~a=-%UlZVGB?kS1CC$^Up z0mXjQIX+xIl0R@DP_F$)XFv`XgO{SiuPyN1M4SiZkAVs65Z~7@+(KBK9C=sP7WsAV z+zZ}!_*m7%Kc|k3t<02nWZ8wZn3SA6L%SQ=_8!bK-_+S}9bnbibK%~`rLOP1OuLQs z13+n4QSHLj)2@fV#>x^b-dvR7HsbXhkG>keJ7`NDpfQi(F~K7(<=;1~eX^OQo1Sej z(rqyJ3Xj{sBdOR?4Ry-R2EXT$T?)S~ZA~&6DVkS+08{uz)ovvG!b-8l{B!=5I-@nM zv7Qe~?WgHGxojl0^!kw3>(G-y;&9tMC#)Ru^h_(cu9xv2P~1{7vbgDZtJLuS=m5Io zRNUfrli&R1(r#)ArmwoLZT9c>5HI~yt6w!J7*z=vR`9g(rZKlkzmAhHi$e6@l=0{` zT#6-aSkaofKFBcCTB2brM+V>D;3@Vj=f_9GxnqtACaz{Vsng}THHtOKuoFbSUzV5~ z^Ri?IQ)&?`u&~o)PhdEpz?YgN#_-tfDB_qgv%i0V^ACe!A9}aj0arS?`W6n4F&h@0 zbJ7zOVXktL`jX{9(37HX?n>BIRGw%ENw|wWsO3(BD?5+#5vO!t3fo47q&q%y0eOR3 zy7M#Aq)1%ZNP8L537Xzt5^*+kE^?8!n0tB^A%mVHWo8ocaX`v5aKed!H3VwG5T-=k zTZvA)FDj*kYi7JDqKB>~WJ4mo)tI^ACFd#QA*}@l=T?DC=*cPWw}32Jo!DvB;>L;9 zp#QX;c+1M1;TjtZtE}d^Y5urG+&;$k-oXm^zX_Vo!7Ri)VO4S~?R%5YEr2U1NO1*@ zKbN6p#hX(#Uw$p0@8%SFba1{!ZR{`*(xJMIm$B$oo>A(hxc+MrC(U_VKcUe8Jxz(B`;)C1dAt3oAY5f$dw`4mK=43f&?TDOqO6yEWLFe_qK zWTzJjM#}G9v{0wR(@)h?1CF|g&DnY0_1>AOJviZaOm)M1>Vd9{+w4dFBuvOoH!euN zU}uT$riecmFul(r%}1#D*?EfBRDaLKrFQl*@(LDmaUTy_*?#r#Y8c?6ZJam!NS`nm$M^dvgFbkmPf1lUY2@`vF7cC{h4d*Ev|$p za4h&b1Ij*|OsV6ek=SdP)sXTon|ST;YOXGo9yIH?`*hZy6F00iblqw^A0t0VP`OsU z1os1q{jD2Huf}zkxj#MHj^#CNyKYE2I+|n+|Nl_p{<^}Y=b7aOSVo1%e}^F%95}Ke z-k~MxhMmrY@L29y4|9aK;}$a?9~?K8eTiBmAs?PI)@0?t@s}YaWj6WKdz+j54TMit z2OCu<@y3O=8>-^$zoWKA@hlE<|HLMjhLhh7P4=q8g!rQ2X3?`So{i_vrb|D!zVlVy zOIp5)Q*XfSAaj=F8~&B7!L6#NsH;(*#RC7HLl1AhNr7-6FIhIO&&d$s>xw#UTGm%c zmELMc7}Hn{GhMEU0q1_}gW;ZHD|W0oO9(=}c-BH1RCn;%ZJ+6Y zo_c!w$L}+*M=vZ8%G=b&TV%*)B+>Q+YUSg!6uH}#UuMqzi6xwx^<{&IhtblkZ*}sj znzYywEK*K9DVD&V+~v5t^@h*vE$8@6#&yon>vTfc@?9XxG0;WEH(%aPUR8TOsx|)4 zI^-t8*{S4iYJ?4=h2PA*&q>h4S#8iWD8zw`!W%{%@@w4A+hDJ|qNg_#XEMJQxVi5j z=9A&i+EaczIY%9s3+#xl&(nk0{y7J21XTI|9H86&5_oa9`>8{JeRh6n@>11@#PVaq zPbe4H`(;{LOTB8xA;0v#K-XkHp?h%?=7!rKV&*#I($K=Rm59^8TOGUMXTGPn#p7t7 zL|{RB=43S1Tl)$-RQsVbPnj-AS&<&kSjZYrN2Rnl?XrC$9xn!O~o_e>+e;EjOt-2mV3bOM}AK3FlvfR@C@D zX!Gs26HaCxnB@OBjzh7hKh}NTkIfq(3AV#0#hMKBGR(Nx#rJ9IxXod~;r-T^RMu>j z!#2#`x}NI z8eVo@)goynng5Hutd;RmIHuhbJ&=AX2IA85I$nQ(WUTD;dK#cID7!bH3Ai>O?7hc- zT*Z^la$`0AqvJnyYzCb2)lRVwVeSlmF_)mL_fN{HTefk86SKdbFwg>1m#e0Fb#4VI zxIw)Xi))3GFkHyK?2DC9|HaEEZ`Gt;|CM4O1Q~AjZCh6id;Qj5>H1UEgxiR@MXJhy z`?xoweun{#sm3hSGB+&Z{anY}@0wkg?-??26XwS_4r;?_!Z2v}7v2nRx1G`%mS0n^ zGkp#j%-a0`c(|Hf?n(UYo9+UO7VdiwG6~uB!~B~))w|5({Wi0X{SMPwiHs(!u~10w zGMzGk|5H(lZpu>YETNz3-a5!ht&RSHu~r)x1IQkmD?2$0`5{kdvR_`JV`H2E)5@xs z0d$QpF$a51b!Pezv~_hRpWf>f*tqTQ8&GqrOK*P*Gmq3Yj==!lR8db{0h7jRgD%P$ z*hYWirTbeG_GSsK2Yp!_!#YuQ zhtuoL2ifC~3w+V+1Z(Z3*1yx830lI{{({3|5SGtZ*FRZz0@}_@Vpzlr`H78LR_u!4 zwF{O`mvpuQpw@UNlE-2-`KrZlfP8Q^bX{=sN%_g#P0MP&tfsPP!O#8WFPi0f{Xx;7 zD`3ZBL)IC`joxQJSu5@{(5XweVKSQ@5nZ3xMh#crQ|LQ^+aNipd=Sk=k1KAC^&ySG^hMxU-YcPhUr~*ptanTf$AmJxLLamVs>WA4(6Ywo_d| z9?GPp%uSy^*(Cgi?36DgUVEv{Y2}#X^g13DGWTHA?Fl@j>Zg>dLFZJ{tKs%zm5?!u zi_oftOq(Fry&YkqOP0S%(z|4_Ix==|-{3hhNF7eCr#WV3tWUA!nl&a^Y9Ja=4#T z*E;feupP!`BYv%{Rk)K80R{Ju(LQCOFUbz5^W1K+i+}wv{hk!o^u=oLlhpXA@1mCb z7u}s|ZH{(&wLiGd0Ndm-Fuw--M*Jq24PjW|%qh)RJT;^C1T`;YmM{zRdsXdLp`|@; zsy{WO^;Dp%-d{$QyYunH|1>=;K@%UM82*j9`Jgx_;B&NyBZcMtEr;BV@GpDZ9P zLQokv!N_xhxdC7Bk+0EyssjZ};HI1{7u14ry%B0DIyx{I(wPB?q!=F6Q!|0-as`NJ zfSN+~jCzDYt{wDBN^-vxtLDCt+jF$mX!+6bPdp?~1(}<_Q8N&bXUN|rAye^WaXfhK z(Vf;doHofUyh`69G^$EC%=^8f_DrKcVb2!@R5Pmj%s!f}S}UON zcAvT^WftX#A*)3lowq?s9M)gc-HPl{ikgI8o`3Z>U ze(BhfBM+lW71qy9_o{C$7cV$H&dCiA{ye#%n}4isplr8Uuy5qz+TcftiHa%~4JZCp z=9Z7}v32(TED79KTz9K`zF!pbF7d;;zaPR4dKj`w{u)l}A$XTf-pLL=L^G_{O2-Si z;JJFwH(7MGUi2doJ#{j((5me&P2VEg0M8 zpfug!_5g$iT?IR_UnYn4SgBf-*S6FqLHWu>3G*x$Imo;J2RvK{E&<@!x6X*C3mJh5 zC$(>PpZ`bqBtEY2UkEt$C1f!eyYjCdX(jj-?`+5Q{1fmj9Dx|ft~OT zC|;wQ4zI=yLY0>G`patAekPe2|3}wLV{cJMwf{2r^e>~)!zOhM@48hh1xuhBgyNV; zqL8RoKGZ^FYb~bD-@e6=l^;HO4K*s4w|@%H2ZpGzxYNiD6}FVNlRrU*cbaxz5;fvJ zgeq&%9$79m`y2O>5(qsuc7v4hT|MjKgg>n%+$o$rfU;!VrO!CdS(GL+ybtb`>_&2u z(}?>o-Gs3!Pv_D+1vIsNEv0i>%t5)|$W^C1#H844>Be@9q=XAnfVZvmz=Nm|OY z-SJh}v8#3(YT*OmdVGNPOANdv<5Ke`gvr1Pzbje)kLE<=KB^z5z?`B->RFHMbH|?Cjgv;>LHA80sS65&6Z(piP;<2@pZx$ z+WHB-ef=ld{j=G3gbJ~@g(N5KDiu%1kc>(aP+G0GZ)_d;Yhm?xq=N5CCsSOh_ffXu z>scX(b`yGyuLot>T#BWiO_0f6#@ig0{Y<+!C?pGR)@?ymc#~V{aadHoaL}fFuceqQ zeWn8|)*83fe|b*1BLa8d!kI2X#ZDucYS+OB>GW|45W8Uv%*2!5fa}O=nh{N6HLKS%#c777c@7m2tf{x)|81Z#1ECLrdy8~GlTFIhJ+aYHvFeL5?aXu=C zbT8vF7phWzz@$OPHkvMq?^{Vu+)*9J0_p-%nT%Z=EXi9nP1^yYj|>n61iQK`#$TXu z4RG8Lr0N*E4P8R!C{pg3rt}54-WI=O-px>Q5f9ZWfW!jOFSoA450&l8Zw0xv^A&24 zF-Y(y(qF#x*G-1y-6PTKWo7e;hQxQ&8lobF@ABd%iM6&zlF`bUGt<5KkHqIcr%t_J zL-~%_Tn|JSnJ72e+vn8Nt}jA*?u$FxaCmRKQdvjJ|1fKTcT?mkiUYa)1`{5oGq(wJ zvBA~Qgf)2T)TFL5_8B~qVxDWE3LMYck9F7gn_KW>-DIaElUJurxq6UUc;GN)c+-$} z34I2C4bxl%g>xE{a`Pi-w_p{+XDXwrydm{BeG^e7UmBM0ae5WS5=a>Q=&(WL&TQ`c zVy9>`Ta?q;_}L>d%PqPC`BJB!>RI)7>0amz*Onqyp&=>GQ9+qE-i^g1y_!10J#Tp9 z@1ubZl@Zg>4)(s^*Z<1T3l5?2Qid`XggYR76g_hHVq6%6-9DY)sLMQ>$EWH`y_Q*8 z&~kG7IqlzpA*ej2ty*9XQA{U@ zm>+mYfPukf++=GdW?OIp6QlU6i3Eeb4mx^=UrDF)?d4Q+|BDqkq(uQ(eC&1_K=NMCGXDg)IpE%_@N zGOKCX?3}>`Q6jg9>|$p0v8?tAOMny$ zc(;hS3-sCc8~@kEU0|;!vs;g;J$;`x75%*GEZ|ycve18Y&5$}83whQqpvvW_!n~JL z9BVjCah*Dt=YOXN{IsgU6w9UNd7y+Dmafb67IqoWxl7>g z3*q{8XK2Pg!~azA0QmVq6NU%&>hxlcP})-Xz|Fa|nKV$Ajd18;Ab44-$>}&F|W>vFH!Bue5RnmCSdXVctiX?MC;Z>q3 z%?t%B$J36#^0~{D!o6?gNch>$H`HuQP~|MpJ;%`o7-zon{aX59+~$edK#N3EU7~lS z*UVzzMKv^#NWdP6BI<(xQ5V*C49zkC{chQ-@%U@Hy!*VU4PN7ra)z8}CF%`Np%yJ` z%}#G7sOjcE;hw}lV|;8@vqrX=YcBdlY{#q5$eRpODn=-noDg2pCD7-dR?+xYXWba|`8j2mhdUqmA#$2;w|5F?Az*>bq`wMt_mnZ(ysY?7)E77<9SE z76uq+|BHLv%&BoFg|Qh|Cb$VLv{uaU6IC=-{af(X|Ao5ffyL1ldEm!7TsXK%xb$oohX9x@-=8xA*A16@-y zp4lq!@WXxPql^KvxwvM`G1Bo$|35p5@Yvxx(!ft4sZk-;XGE3(5U2gRnFMeCy_Bf59=nu4OW>3^xWikYp) zrV>F06DBNrJeptT$KpzD$f-w=Mrnt)w?i+Q5Q1s`7!8S9wIC}`afT4ACh5nVt;;Yb>pQ5unT4-cd;N#d3CA%8K4^B$5=X@^5H>xEDPiMF4 z(bQ$Ho$tEFnVCHw0>^fsIbDz(Bsq9YQjlUyr*z+?X&tOG*MeDEO#iLIT2@|lmp7kJ zk`J|yv5Rq$zAcJlf(e~FN<+w|$OBQXv~oc{d8959P}$tHA)!LV#FsOBH@@xkzQ3m1 zzB{%FDTDL5i7;-D#V)m+f0^V`XXqVx-Sf!h<%aLg?ITz145k&!)fPHxF7o~wnw=tC zMn3EE;u!OGb;h_e!X8{oY1^(NG8M`nqat>4#;O$gdx1F46F_$v42-Pb4YYoSlrIn^ zVmyxmwR;+peEqF?w`zVGD$vnL7xOnE6=b6?B}fk~4viaQ$S5;1DATh=;$>TZ5~x|R zzXi?>Ch8C-G-P0nOPt&COAY|c-~Z@-7S^9@@IJ)zD^7V$^Z>mSTFzHH=)yb&xwY)O zIoc#hV~!&NXOJT}^%H{g2P_`Z?D3-9%HoB1CpC}kU#F2vFLLIVM|nuHDs3qz%qGM$ z(F)(kU(!IfRrQRWl;up4W}7m|blvui*vDoWspEuT(G%)psK~ ztTg-rcaUiQYc-Rarq`}Ce$aMd2}tzIw;UTUw}xT$>f)KW1kQ~9h9_)a5xgT?9uKdeblHO)M!|2fjk znPc}Kou3DD{a3^{zU*WQpyq6UO}nFuheV^gA1~Sd z6fWg;NRzeNcx>YL$|sK#H$2HWJX1sy(}G77x~dP51%@BMc6>nRk-N{vO)}uT3Xmuxgh<=v#fvUte*gU)|o+({2q56S}4an+adW z80Z$H)2#`}2EkUV?#3)XYW=8c>Kz}-t35ZYRHmJyV$vU}0PdF!GPvMWUD0qY%vFFL zH&@LI4~?gz_v0$*Lv*%0?e#F2JJ^Ljak6ap<4G<5g1v7P+{YWI8NDaEiit*7cx*MF zJ(;RWJ9|h`BOXUSD|orm@+*Sy3RN%lQe=O~q@CmNM#4QhkLIyWG`z%8Z1s)|Y8YYq zDC{kJKk_I}9OLsWa^JkhWkzaYyXK}#qLPd*33I3 zyAn5nV+@7&+?fjnEV}_Zr>6NG@$}cD`r9)6qAxT)KGj%zjdsS4wzg~*{CsHldBsqJ z;(Ju$7-{^46a3&L79P14;t#PhL|y1kixn7{+P^z$j$YO$wH_hK|IQR(qmVEN2q9WX z);Es>uQepGGW&qKc?0{*MsggDHm$jD-6lm}`j5`0H5yep-_|F(OrqTn(% z2TLE;{~F9%1re_O>gD?P{ZxQzZB3n4tj^b*oS>4D{0p!7t~^=@{(~E&X*8>ZMY&rW zruKEPlP~UC_vk(H%kl1 zjt>$xw^i-D`5bO|uJ@qK$qgM!Q?z@D$z~VIXXpo!BxHLlh;|Jox+rEY9P2juPpGag z={KkElUSV@8D;uEH2GuL({0f=2lW(^sk?N85H(AU{!G89Ce_p7L-;o#tru*&OKST7 zYCV^t-Av7+@pmD1*=8Y+D$gz6LoEB8^KaV_-BKNnMzS{5)K0YAbd_%V^-C<@nR_#+ z6gR)Q4bi12P>U$^emVVfsuLwCtFyjxo;ErrutnMUs!xf41^E}zS!iU%v`hcZT_`b5 zi)?kKgLpY^@SQ)m|B(fl-qO^JcLjTGYVM>cxrhWy)i46UmP=@{&`-NUA2?-;$&Q~8-^&zNQi z^nQZq(PkCn%&aYcA88YT5$)yHPT)C_JnAM<$B!ELleeN=9y%G@OV=v_n?^$UEwhn1 zaq5p2WrQkmuo~NA;V&_&c7G<9<>|1cT_JX|WrH}solH!(ddyGX)gV2Z=W}=YDcjH3 zXerfwAWb_f@Phh$`)*{0+<1Vv>D;?E7@y$v#NJztQp(TP|AgB}uR=sglO@4H5tSiio-jE;^e6T?T@9@k?t zZSn=8QM=#TDJrx?JjuSLcU(f%hV3It#mZt4vbBw8uY&n?)tKIuxY9FFZTe_SOGed4 zP(He3cEq!LcIt}Lo<9&OOtN@P@*QTMkNR7>Z1k(#L5UFSC5xMEsVb*dX-H`1PjAKv zjdVq_L^OIGGSMp&#tJbrAV6T%u849NX5VBjC2L(ab7qd8Ag)>POX-S6dk+FB_Q2FK z3&o6hCNzpr`LjO8%n}_D`s(8F<=BgxPYZwUiW_Pvf0jtS8~5KNjlZnP`gGjYuIzDT zo)@=<+3Jr*;E#Tlq(9r{Z~Kof#mf^1Y{Lz|Z>s3C*F4_bFv~Rc*{Xm%yLlIElu5FT zGMZ0xDkK{~uC8%L_}JjCeqa6ycbaQfeMvGcFW8it#TJw;X)PGAN&g|-Y0~esR>rBx zUUr^L*p1X2T1?PLUNd+41o+-=P7f|!j(N-bpn^_YO-JYGxTNUi=c?+V2Cj&w=3-}d zZP^l&as?MwBS);ddW-KQXuMUyW7e(Pf!ADn!*a23_<_T;J3)e-?{JxA`4Fo|X%4jL znPU>vi3OBF52c$Vo9wc)Gbf5Yt|A`CXpFc8+;{%a4f;+I9fI+DJJp5_DVzL^8#lay zT{sJ$HYIZH3B~IthxGS0!^>d!sd@;*CXKTu0YZL`G1rAKuNc(Z21nN->`D>&#ACb` zW>K{FJ>bBncmEAWGzb1iCk^@D0wQ98FEF}BYIExOZ;0#D&YwRSd$*$(XoyJ;ya>G1 z&^+`WS7@df+R@$>a-PCV5`5;G#ag=3h!!i*%M_@?D&f%(y%Ss)xV-24&%UG0s5kG^ zAt%n)-Jj1kr{cKz%*JTK#1KN~G_(+=Z|Il`GlBhWIP+E>Myg!es@je6qlu0!{6ReZ zkizK^)M0sE_e5Kb9!)TaRWMM1r<=6BOhojLf+aj?+!P40bSvuTvxcDjyKI_Q55W0q z<2(Y*OFtV`e9LoZ9*@-S8jN0SUx#2+=0j}D$9Og^f4%>hryBn7LgbOdhS|FHBZ*v$ z^A4`Trv(19!~Og)*LFMR6Y3;1FJN z2Kjg>M~JTIb#fi@WApDdti3x)lqwA?K-YoWA=TPl>f8x)vi!XdJ~igaW;6XixnuYO zax|NRv;wS}=dW#bdG)pf_Is^>kIMK1{^EW7E3znlmvv@U|E9e9mL_ z1)7N6JH$AU{m%?&!*ilpw^KHrv#p$pW$E%)fT<=EVa2bqe>p*FbA<;KS{w>A=$%hB z(-7c*yWgh#v_<_R+25a6I&~~$4@vEjzAzD9htz>-jdsTB9AoS~uB^jX5}$vc>kPP& z*40ScfqSn7Oj-gS+#3fvTE)4qv-IZZ`-Art$3I~~=EuM4vkWYR3$yg(vdhf{G>a&l zqaJZbK7C)5Kr;G!6@=`7zyRDie?R~p)%mBC5PB{Py(`EUS7w-RaCmTczROKyqJA=uZu;E z`F0|49HBAk4H{8^i%8r|KfbiO(QV^WVS?cPxomZnQ-b`#e5l6V*PD-SjrpVoIo-PG zh`15}&7}F9gnYMxtqxg5`Sbs_MNK^4(@?b&OpHAGx*D)~ergCU_Uz&LC(9qDd)48% zs-jm3GppaDih28m*PhIC01Jc%YF()9`%UTaUXzc-hbp?)`Q*>xpr!vD&p43VrST@PehAhBq@jp=0EXGQxYF`~KJl_E zD><`OweDHug93k-C>IW~VXd(1{m-EfsWx?FlSQjnvhq!@?|(~;`1Lxt$J6?001>*x z^!f0~I6|?Yx;tlOiuvO$#0(4cU|67f@Axx9m!yY%X@Q}iAH1=Z?|n^LT7k`g9?=wk zSPEdW%(m5Y`f*0P&OYxxav~Un;aj89 zMZ&kry2@{z+(tsl-bbfEWQx;KENLh^Z@9};EV#^A00qu>ISYG5eoj2=N-bzm(PUZE zcYxzJ=fN=_c!syAEA8Imm-^e8S-P_FM=NOa1JXREKN69qPN;EdZ|a5*>XqR|+K9$E zlHA*lBdt)Uhu`hnuy#Xm+&617xV=R%y2_a^?7~OSR%iA7aW;QU|8O)M9Nxk^RMD5O z_wX$XDbFZ&#wiz?%}?IO53@~C^R?4{8W>>Rm5!Ea9RDP4#OM^A_*g)4oX#)Z?{QC& z;B@V!@}w@*g!p?(rt#f9cfiH54BQVATX?LNwzqPw)!*t>y4y^eY}#!HRilmy^-)(X zsM&s?P0p`>V>5k*0mPc9A(@cFv3F?i?3PKtdVdx-?u*U!8vmYYE9}~uI8PbK7$|?a zsvC&KB4w#D2kYWp4Xgu2Mc0b(g51MGe55T=ydei|0CoLG+T3L$xm(vBo_wT(4yhL( z{ZJ3+MBc03I}m?lR1<;-lti`@yq~yM{2X$4@%V%?b)SqTK=w3dH6D{uuYz- zeJ^pr3MOCCma_E-)bg-?wvYQ(c5_VSXXKvq9IN$MGKtbY7pw4jL ze{^OVcGn+QbDs6Sri|2+U!;f2I>!nLG%FvJahi~wOV*c9Y-&alq#>5Btt@JG-(+?3 z9&hCo3*QRxv{W-Jz)I_H6=N8rFxbjn#w-pAgxZg@(pY&@8D9;p#!-3Ro1)O`4+MS` z$i0#jyNJOYLfD@c7D{#Hwvg1l)Hi?oc(9+a($W}5XNvDHEVbSlR8#G-wMg<9SdB@# zZdSkOqsD1=bFgLh-^Cp^(S|x=(M+7oV5sU5cF~fG3*9YEh4H42oAnwGc>YxmczQGa zA7)?6U7g(kps8yCh6R(tr$uD;F2yPPkt_X^`%U&7%Ymb!N1I0uz}qbqxN-gbzv}UWwpy<2OAro&HAB`~>EV@4ogf2p233)MD={IZfi=voeYJ+0qT` zDLR4X-v_d2O9dQ-?{!QdMnlj(IcFoZ7;puFB5;{#*3-kv4v42L)@3y&TxZ3PzX>-A z;swa^)bkWz^b+)))&{9I$!$VkM&5Bozi*&-%bNKy7l^HyY!fD7NC_E1OTqHFKl>!`vrsA(k zeWqM9NT#WC|7eSDw)``XS3B&p6;{j@ST3FhL5=Ne>pr>@00l}U%4wG@7Ph^6rhM`N z#)+N!Vcw&4E5$cOjm5LNkH7eM`sf4jRW%^x$?kKkl1HD2)o~Fo^-fZ+Cb~V~AMRHm z0ABh_M-M*GAki^6 zzxTf9uVRc6@gvK9ysL`^Z}1XZ|N_pCWq;%A4VV+EBmu2lHsxLp2o+F96o9eAbtZRqVE0 zmj}}Z1e-r~_le%bCVMcfj8;h;H+@Y#V;H981aX8y_k&w~(+O zy&U>NRs?_pNw^&Y;+K=E|8j_e)7qe$>o3-$nExnh*o`wTHkz5i?->XRnk(uJsu%e! zaJGf_&kv2JULy7w!?v0{rZ2)E<5tdl>@#EY=Ab591Lz#YVII?%Jrz zf`@g6^Br@Ld>2k)&7|r*yxlUnev(&u#NDUi$Gcg)%@aJM=4A`#e-!2l=)Vayf0yx{ zfm3k+344!#`rVrgeKah$_ipi#Ny_1j02RFDqdZ0e)Q2%NYuEVA`D;Sis}bgblqVZ& zkt!n5Ddr^)HVEb>Hmm2Lg+lm8vb7|B%sP?kGlOty=__ueHNK}fQ1uOORTU~%rbnyS z%L0LgESl|I0f=^1(r0zaz$rBEh?}ZVi1dFH7P-1##}&dPLWuS|4VZq*N30-?H**01m=M@?Wr;_TPs;FX zA?_$duo8%k&G9{}gi+5pvzGn7=P=8rV(?m2y}cvIEqj19Pr0SFmkJB&Ys$fZiOiVO zc~X``0+}y>%cT0FKcy$F#_DYvW3*a3@7h#{+3>bPlAKx3h@zrMI~C`lEbQUH;bxn8 z4ApXTBa-hpafFz5u@6zbrjD#?UF9>9EauNUw?2{l!lw5|Ja;x^+*_DyB*!Iw5j_!> zN7TdfX23(%ZSF1S7R1BFIFA~WCefh;CtT5Ud}_q+35f$vuH^V%zhXkOeZj_KS%5Lp z)B)+q>MNf#Fq)D2P*OfQ(dHN~JKUkk5Rskf>(hu3iPkN#Gjw8=La8J&1<_`O0ljfx z1~Q27|3>CdHean8w13+4^HZlhSI^Gp_({(lTl?B9Vg9TW z_T~MB^qBkGtg8b`H^V4PkH+w*Ef8I!Wak?@Reg8C!X;g~gM|hVWk;ix2Gc9tWTMlO z_Y~M3FyVlSci2|mrSvZ^ffgVDGIf1*tg4d@C&i=j?%H#T*U)0oGfF^k!iMa;c;R;n zuJmuih`qQ9^rQxSSO$ofMZrb)HGWiwBpty?yd<+^^?F0U#K`<1Jkt|sAAv9sXlxMr zlO0K4YmWG|E^@ULuyo@oy?|GWw!3{diA{gHUi8O#YCZXQ3ge9K04J0Vn%@O)(l&}Uq$`sNY^>zX{a=Cum7xAvj1TWtQhG);L* zB8Xn<5tS>Zrjlz>07F5ZvZdxwr#Dg7LIw(T)}*-kT6dyM+J3a2U;>!$egMp7f! z^?+zS32{_=SMS(U?w7jZDYW0aJqt zA?{}VkS=e68Bbxr(xZv-=eaK`&K4QA;+pf|EJ!MK1=t9isoshjxO+BvDALuhr@H1L zt&UE{AB!6TK^dWs?wVCYfwZSj-vE^|t-6>a&>Cv{2dWz1_t${?+J++bErr+!gVdjw z3*Q~niIgnMwkiyJHk{kV*{JtjX3oFXs}9!TKh(c6W2$ADE#AC;ohn*IItUI40(LwB z2;YSsq2^MNNKaVL@6RWi<4QA2_`}@O_;mzdoN2$JG2W+x$rAx^?-Mm_FiWzgZk&8; z=K>M#p7xcWjlHo7n?cX|oH)mue0J7)Fvka2WG>D3VGIPUCSD|&Zp~^z^E6btYcuLL z<%#9RZBX=Nf|T++9UG-0$%_tZ)wc0nIQRy{ph5u9lJ`2D(Q~_|{GR`j^KfE|(5-m{ zjs?Xo;WQ9)!7DtCqXEu3)%e&%x5Kqj!6jkJgzxsZgjA0gY#lB+A<)+Z6?_{wB1;Nb zJ*_Th!Yf)sDCgpb!h6N8QE;eKAcDxNZZLrW&Ru~Hw)Zi0immM3)uQLyz%%1|4ace|3c4x9gJaY$7%A~OCA3Rg9y zyFwG1=q38f=(s+%srEckYh@;fT7b z{Z~wvT3Yum0I3g}DSd;=e7rF6rw%u-iZ=voC00b^$m;v5qYZX!8@U9!1$`cVyXGz} zWt^1eB>MMQm7emJr_^}_1v?EG0u%&FhQ-z7@FYIyQn#&DKR+3&3Z6{GOjcLAEA{wt zN9++ufu&Aw>ijh`{bshwa-+v;PZqV_X^od{g$5j>!q7qlSq<-psqBVA?5c+{8fr2j zqEn5!co8`Ze(_!Qn#HX-l;t_NGfO$R&fe5RCV}2I}?INCpWr&TbQg)!Z zvc|kR@;C05$^@!6hkK=f-D~PQl&k@Ns2W`VWNKS^d~{ybJu%zf4>JtZA&UM8UJ+ZB z4L9DUQTvag#B1n!I<&hcyhC?S_7qIM(T%Ty%CCNP<;1P^eqOJ*MCY!ZvJZNuldBu) z{8A^S7HQ^7e}>U#OyMYT!K(nB5~gbBRAj+jY*h3*hXW zZZwDB&{F+}F>an}-1quHcwI8}P(PtCw~QlJRZe|q;~3&sOu_>#?sEYK?K^o^B2Rhh zU%OJhrjY(P$Nk!DrFoAD|7*gRV|RD|%IsX)jh2PsgmDk$GgJ=T6)|g|H?mqgx+g)L zS)+^(w2n&~R8x*7^5P>qbTi+b{7&w%#tM~!dsuL)`~C%LGbd8(pY1fjH%-ANU`IGX z*enJ{wZjoAFqvWQ7FAAh;YFif3lNn}OIP7QbPM2ae?K||X(V^n-}48e%eGs=d%-?R zsFl5wsNV^{jQ$|Tguuzx<#>UU&jr<9{F+qs8OH$79UDN%_|4+BlB4#4z4x)#KH@k7 zcMzv4zS>VU4poCwuQ5~f;Ck2@gLvtDwtQ|e=91;ffe>1-3n&JBUE=Mys!*}bY~#}p z#YRXm%GP-q>0_3QGMqd4RxIAXy?SH|tzK0#IZi<}@D0kF&&Saj;9K4|zL1iibMrX2 z^cY-f=>5sx!`tY__$Q@a%(Z4#GCRB#P`|ueV$-Cn`O1pbtn;M~D?NdX`*3fdNjS4T z*Gn+*`9}$;=;{xSj<9eUk(&G`-qzlEM&LUZg`Wj*y&wbC;<-=%k7p{>&{xQ!SDB?TJVX1mFQ%nP9wx{MP2bkZ^fPc1=0Uh{mz) z=Mcq1H}3CWhV0m_Z<2FXT&f)AMa|gP9Stofmnxbrob!-<-OI$6>v2O5ocG(Dtk&j8 z3=?o>w(3u!(B*<2B@7Rk6Su6*pa;TakAhSQr1(EKh!{<&b9LWv}e+u z#hFxLeU>&Ifl22Z@A?tPZMwp?$C+8pgV|CYYY$63<`IXYrsibV?OIx?j!XYS@jC)h z+>YmFFW%NC2^zKCQ>0=9QzC*2RG(;g*Ldw=w&876s?~h`L#3Vv7Ho{WTtZ$CJ>xY& zv8GWow{?G>|D9bJltzl-31&lot|ncKh?kW_M&)%B({U91Y(_jS0# ztxjwyLOR5jL-txPB7_Jz{_w11fu?`DUdSAW$}~8Ou3G zkKKQcIQs(GflM#8H9f^Nw>RG~-)z^j+Oc|Xbmx&eT5d2O<1Yl&Ftm^;LtsXsD&4)xM2Q0qw4l zVO5ty%LcP5?b;r4D6Xx;%_*vnmqTe>F^<`y$fxIk5`YUY^r`X59!u3k)u_V6O`Qz< zJm|xvrBrOy$0Nn!(Ml^rGw}C=@Oq)njX1lNy{o}fh)+q6){c^fDAr(VMcW~ikMPgJ z1@SfEzH~BXl-O9^wi%*q7B;^Lc4&~h$q9wK4j=D8JC9hOfux4uQ`hQ(k&Ihs{v!43 z*)@ZsEz54-K9ulK~<}FKTg91 zR%o@@Mw9e@FIZylryGa;hg3v%#42uO3FAWQd~M3+pC3L{4LRsmD{8$5ObEv0fzx{5&Tqs2wn5F5y}qm>6A8WOTcIXPP@%m7q3s6ZY;#BJoV}{XL!!o8>#eS<>Q61d$PDBuW&+qg}obli~2+}^*Z9zt@UbUrcB1e zDV7s91H1L&0Xm`Qd!%j4= zx-K|-o6c+WT)IHumuGAX{sfhC4A6x9cz#`HufwgHNO$NpHT*aw!AxF1V28PxHv7!a z@y$vzeLKcg{O-s*g(PFvRTl$CLwo(@M23*p9jDxns6; z>X$Sw+l^Y-Y$`iG_4yMPf*uCwkYO&ZZd(2>SY=Uhzw5?q+7__;{ZUoHcXulPE^>A) zku5O2Vj&}quyv*hpGr>~)0Oie4TKnsenqhpKM+g`zobc^T$nvx&5k|0eS*goh4V1y9)2jYD*|Kzf z7**1+ikYZn+YlvTNGrJM*2~0xBVTdOion;jc0AX#$yFyj`}sJ`YTS?Y7S6@>RCQxo zReMK}Ef6o6n{{WBzd1=$Yh9z-xLiB__p;)k^Y2WzNQd{&i!8B8{VPCyJk$8>q=xg3 zxfE4d%xyKPfGuQuex9zwDv5RbUBzV1k)GC`L zON|=c+v-)*vre|x2~qFsQ<~nV9Co)J#*KoeQ70#;w-M5EIpfPdlDVKoJ5AitG9ot5 zM)qY@+~iudf5*+gG-yq#Am47CBR~iXE_;^;=T1e^x{t2EwQ1u3iD|mQk@8z-5So)F zE2K%PKwj(Gu77?)N*g5vtM0|SIM;>&%vYss3MQ^cGLe}J*Md)4w`{|Tr|QGD zhZ8-ExB`(`wj!0JZ1ODz(GKZSe&%OBG^veVVGyghXXM>A%oPSvhdv?2H}aKims=AwSjKw0Iw@T3 zrWCQpD=ophbxcnO`E zw(9&v=-yK}{6vMiN~|T~yN$bGRX76xXL`59L%8n*dTVXbog#kg&EG~WkB2Dl*vjQj z^d!WM)n7HVoc4Ce4NNolyC%iAcFt)p1JWgWNWF;D$YJu`trCe?Z|8!LO!hC>w~$() zY(DiS(RCyf(G7xV|s?Pv% zvD$Ws#u7%YsbfnZE z&Tkd&b4S;wvb#MK;oQ8=BdX$f?DOaV38)nV-jWhG$+@BeIIVmn zI)6D9t&Gng#!R~a5g-BbhrtB2_EjhJgYxvg_ed^BqiZ3Erxvq_NL7JgCUp4hjrbz5 z5ynUq<=vQ=BinDXH-jzzO}t8q+d|21-2zS%mNavg7_*uqs?a@E$7xzWP+vWdipJ>u zI5`eR=1S3+A_~PdauxnG4^O#@`n>x#Rj)z$mn2U2EFr{TtVVu>V0BtK_O?z}l51;q z;Uo22HXx=mcoV~UT=34@u+qVs#q1Va|AV>li-ktI!fD8V6m8nefmF9*RPAFMV4379 zf4v$!_4?ZHees5+WJEKXKClEC3FkyJ?ZlI^ZVd@6iC>O&yJ07rB1SKtG&bnQ(v#UJ zt}@@vc&MLsvcFtWm*>Qnj=uQ~NQ8Sol+b9i%7#P#O1Uukn%Bz}#^|?pNq@48=Ewi8 zTIK2pds$t31X*_ux2vU}A%zUUl9!y+8S&RPoFCPQw%+!2JOM?P1Ui0!GXHiu0||Tz zeWcQdrByZ?SqVsqF*1(JM;Hqh&wa22@xO28Rt?5^nh1rXTr-$AdO7ZC;=SYMgQv!A zX-T|E1IIZOz#Em&U1DqG|zswM5PX8?H>%dXDs3Df8JOY>qV0lz{8@=uj-8>P z!4{mzuRZkE&VTWD_U_?aeDCn`2{!Ko0kw>c^C3`O=#VO(d46u|0e2?=no4>L!q>CE zOXj^YT~~ZuiX`p2S8TID%$mFU8_Ci~U)M8SHvr3(`aPn?u%vas2e|sZqx)dHIV!vJ z^b0#J($6KE83$A+Dbvs3ANHrvxZTNWBirNZ;k7D0{RF$D_&XUg33Kz<;o|~egF5pB zENWKYy%cB7<2ryqvMJ+C<;1g;rh)hG_A}2NayCP*paS~4(nSFC%(-ykEJ~=SYqjw; zX3G}t1kqyE<$o4O z^rh&79Tf$0$JG_UQQ~WeZqwaOsi$rJEIcZ9N5!IDC7Mnsr14VwyYW}4n8pU%~` zY!fA1dgwT%x4vMx(2z-P%x`aq5nAU=gk?v9AMGiJm0zyl(FOA~tqePSUqfaOn!~$KIS_Y*QPiXS(tcEYT zIK1C%H}|O5gctuu5yFtQ0g8pc>55)kB50gsoA(Mn?7uby^-~kgsv-E}4O&J*KCRyK zb_oso)Dogu60*MRKFik%lNn1<37)={!ORt(YnMevBiDlV<~iw$UbFww5G3=BsguxI z6T3#M|EygN80%8gx(qx^E8r7+ha;d=DCo5$B~t zb2Z12DRPTtYT>_ShkzJHZldgn>Z3)Il18VB+#mitfbCMS(Gos0=sbCJyp<;Ob-z66 z5SyhD1oPc9{`Z&tOTOV;?{@PL{{AaGqp1$r`4N}{D-zbJtT22nz{O527;f46A4T{I z?sS!)nX}mIro~~Q4|A*KPC6;@g@i*GE1iYk={>ncj5D&Iensz1)`O0e66MenLcvSr z-yMwf*C`Ga6+45zs|wm!p8DD9&FwoT$CN~UGBpFRKsnf_X=j)~!zg;{4*0_tL~5T( zjpx=ew&dZUSf| z%wYqb_k?_`sfFUgn)9Gh807Q@n`3y%ucq^s#dc>5$F`dDjv(pRfzN{R(4^c$g}NST z1uOh&;=ySK!P(af;d$q;<0VE+Mrp{PR0(AiQ(+#Q6sZa`I8k-cV51goV!lNDvvEGP z9E)57DHN$Il?c&o$oYkt~13q^(Zm*fKaH z2Nt@J0f{LNLRk@6;x2Pn?S;3W!@8i4Nzrn0g4p&!0(YQ`x_8!hRD7e!r3@kUNy6y$ zj%;ph?j@Djx>dArqKAM*v(ey1y^s;2ytNsqKVZC6U5 zQh3%h-|Evztq^tVn4mQ?wm$*xCb1S*rRR3FP`%y=`XezR+2k9doL!atfg@DDxg~z1 zsEM+g`$f8M{CWMmo z)B-a_$g%ug;O(G!OkP0Jq|9j(l7rnbJnDB2XVo-R8-i1xbDVLwaSz=OpU>uMJEM#>0g=lx@&nlbxN9`k0H&8!eLb1eHG_B*`_aWpuSR|^?h zsM*m&QfCG@e0#^Z9-aJ@GF)XR#JN@2c`+X@9ObOBaG^l8I2lbRg`8L^d*b70X%|&ALg;t=($3g!@ zYy({b2K@ZLl8lKA$C-5+v$r2lMQ@zkQp^nC7&3Z}?QS zuvKcO(i|17pt&p!sRmO6=sDK^4C-4zhmoKuZVIOyF3cqG&Ov{wbrJvBbkQwESw zf1^x)qbGz#zGD045TwQgA_j>3z|)&?sJhWZn?^SvLG|i`<8oE7v_a<|bz^Jc2>GQ} z|NQOK8wHz5oguCd<}0jfQxs@MQty{L0)4y1PNsuCxI#gK|^Ww-G z>Xh$lfO)=`y+=Mu9m%h`zGmj*$RTd<4Ha3Uy+}8m=KD37>gsa~J=bKZb31bZ3w=6; zg3+)|?{=w<$6JDKy@E->Oc8rmOxZ;=9`k;e#~XCJ6NDsp9WFIy{{iJ|xAOWur8f2_ zB`d5cchGA2VC$(Vxi$Z%-xN!n^h-o9g{wlQG}op~wnJDAyE&?D3{Be1zVX+0=}R7H z9zDhHkO8xd3hIVCj5477=<#=k#JQJ`y>GamO*vmVp8|43AcT8B7W1uTv7-;XH^!1W zSq&3SU3pzc8I^jY{?43opbiS$-Pq8us<$e*8)A)FtBn`uwpS}jCDwAU{-a3G+|mwG zw17;Ckq#o%lN&8k|BQA{n17K-e)|JZbR_4URl~nmmtYuXHJAN<`+%Z?)J|eX{_(%B zy5;}r#m8Y*N<>?e>D1|XP5p4zcz{~JIk2tSkn z3iYgLeqd{_D>}^Np2JfbLw-TdZYv*6QDQ)uP4qY_c?_p^KJcz_e zI0pm@)8t|F?SvD9nS+i~UZEPQ!HD;2&{G5IMx$q1aKFY_G@+>l^Ly z)EQTepyTyqv{*$j&s%Iiue_v_ zVL`%ff`1HC4^bnOuz4^^A|LQ7CkE84tg)su#QLz8?iH^xz7y+Oen7#^D?@=AIS7Z~ z3?)Nt?_NIBEr!1x@LsP;4hpAuEv2!qiOH(Eh%;Gz$gtsK3!;gM`7k?QrPeDn;Waqr z+=uPNN76cugg-ygf8Q|s@~jelYOA@o_s`gZ0N>-Z=`hxodm%yVc|A`W3sMn$7-FDv zh-3@kln!xAXuqvVrE-W-wT}<-mA6}&0&u<0NE}e7J9&4i@_c(xKJ%%CdjBSuQ-gVIL@7C1VC|a1PN64Y+ zT!7mU5IKuZI7m-S8AGxH^(?K?l`?>S=2$c9YrX^Z&)%-FYp*X!r)pjqHH^9z#N8zY z@PPJA5WR?gySR4a{O_Z&R-Fn&SLMr5&Pce|W%g%JYnp4XF zNL&5Y=4rVl*@5^0iH8GX->+nZ-l3qN2u?qrvc#d2F+5(_M>zX;+OCYfe1Shc#Vj)= z*eb0u08cBET%~XHOlBBG4wpIhV>bXfMys+UFMGnRTi@&n1Y1-mAN%Q5R_-E3%Jq4A zaJ9+N`8rZ4*SR1_$&dFqIGZ&(8GInM%xliQ7R-49pJrRB4#PK`P7pkC{hdO}wne2+ zBwn2a{QTDmUJh1($#1fOZo1l!-Yp-0Lps!u`6pw65JHqVK*1x>r#Mu1y<=x{cxm;; zSp;gep(^>>Gw(+;6e!Px2%c8HCJ(HtN=)hbR zu>1=j@=$$#q28)|ljexyb|1dlS1I!zBg*@xKoRLD z(Q__>EI>?mkTTuxS0GNm;i^%~dJZGcYGyx>PzFv6W-oKKIWz1Fj5J@QlbT3baCgK< z5cl3)5H*bNJz6lN=qtRk(E5V5^`6CJqVm*{&}|QxLwJeOV8*Y^x%ztBL^DVdIMZuh zUsf2DM3%m@qi^8izst7f$oc4*;+9`{Y6@51j>SY?I z`grdH4}=D6Xf|%Ek+N``le^ZntnWXH4_}3T`@ae0?Lv?IC6xGn2>0EQxzasY2TFl= zHHZUhjR<*0zXh=uH@K|U!N~uYINvw=SD-OJfFj<2Jp}9b2ebUNjFwK;wAU)5GOjVSbrc}19N^d%(#)Xqik-AmWR?t-pj3yotwFKn~z#G0M=a~<8; z(XZ&!5pod@{Bk8m+`3QR@#cWn>_F-JO5(A0{gT9VPueNi!OgOr{4jWkFauN6e86Jq;fwo~^s6YF0DQ$SDpw@kaYDLcS zk*{asZ!fBp7%bO(5jzQ(iL!EDIu1^V>wEN|n|w}kwv=gE#atE~>Q+`>W-WyvoY|BK z*K(r6rvkRoKtKo0HeA+hH9$xP+DXQr^b*gD70@z$Ne|i|s3wI<4^@Rc$4{MFlYWwE zAo9%}kn7t)wiDncsfvzAnETJ>Kf_zlRd~|muYQr-na>Z{DZJQ&$nsgDLM6J3-$E8i zpdq{AmUpkDr8jZ_!nicwA%_sX(YC3_M{K8A-wSI6La|-~YZyOTtrJC5{?Te?%%Cv# zW#Y>MA*)Uaqx!Zv0a7IbPTSyq^VM&trU_OEZ z6Us2iaAf&O$3LF|Z%gl9Qt}{>pX(foSwaPnGbJ5T1!m<9`dj1Y!ZL)7QgwJ#EsmR#M!n3mpa|Qaw0n1 zndfbnR03Vr5I@#cegC7l-}r0ge%AA~%{w#ivhX7OmMJnUGs~4Q5nIpH7A)Eor3LP$2p#z$8!BYer4Z&%Ay*Fu7VA&LpP{G zJ%?lHmau9&V~w(J>=dIiHO^KZV=sb_e;VuB3!6Io1*Q{%jq42(wC?Un1letdz`p0t zZ>9Q;D!%OLd8EYN73`Q7(zFbxa;ndGV=l6f@%HW>ZIXjhjLN?@6radd>9i-m&B0_NFI8xlKRQqn2-K2oxpaXc9e) zf4IAN`nU0PxSDTwo`!NP8pq?koRy!SBl)c_0|O3D$|Bcc;*w?aL-^y;**EoOWQWn* zA-^Q`rW$IoAa0KkD7ULhy!du-u4~m3Aqli`rLA0g= z#JJS%y!znHH?8G|Jy$66*<1Oi_GsD;;>w_gf1@{OY?A0U*oq_-S9* zR*0VKUZ{Kfx!G|7pi#ag^s|tPIbA#3Laz;L_i%ZB-08iKHc)E`2E({`H!Nbjp-JEn zF|D-mQmN~J8_H&4hZOlNeN|(#308$gvn9K~jkYIhsEL-~8;58j7Vd8^NqCN_?R@3? zRX7zBTz+JU9?Zy_0d*mW+@g2^U=nn{N*=&}Yfdp!j;St|(Vg%6`^YN8K6V8lxBGG6 z7C$5{nt7A=>evcnXRZ^@@;TS*JLWGX=KZ>)A^iqjbZ!Q7%;Z~m_vIhPJYC2Y8%y@Q zd!bjCo<0@D1-kUr-UZ<5i@gRZi!EKTP!XgpkkeC#r(xEWScz#6$#;;j>YvylJ1(E| z2%8N$*xFz6AvI&chdr4w`}?F zjve={3M%d)ykGlK;>l?_r-p=uYyx=opXu4?{gO6PhLXx7iJ+vdgW2YcvUq1Y{(5BL z%C=;&2KJaC6cZLleD#9;wIf&umH)x7zT}tnOb-XQJ)@Vj<*hRPb86^^xcrgrO1{Cs zolb@4X0Mw&Choo_Dapmw#4ga>FFhUBkSmjW@raw(d$GWPtA>Mp2=K~$bBSMv_Y@{R z=IDig-}q9eMtA2jqpD4tlYS@0b4aJqwclRC!(fV+uu(7kI#$D+KGU1Hos=Cdv#E3n zWQhApbQR<%YH)K?P{@acaMCiTNIasc4%zWD|J2jmCZ&B=++P*9{B4M)fSmoRsK(3w zl0#jvHW);0Q@%zc@?EWBD#NT>{Xs)=-VF}0q!IlUOkRi$US!LaDDCd5V32VR#xZ3% zW0sf=q@1jm1;>v3K%oGCYdT&Pub0PsJ_)GlqRIR=1in*>@k;jfnTJtT!Q!fS_X`Ka zGT<#r|4{%R@b!{by?;_2S!$w}lE4?zVfTRPh5^cqBX3`l)ZF&v*LyI#cW|24O~Am5sBF^JrxmD3 z#!?&j8qtga`7&=t;2%)j)=%sw#O^gau&Ye%hmBG4D4R`qkXdEIybdmS1s(PJoQ}1~ zDZnmt8!AZn;dDF6-CO!CW38#ub|9Zn{@7Ta>o$b8QH9${AQ8~)Cnqvew01G@c+NJb zdE&9F3KjSJmqj^>?W^MzHq8^VW;nLtVrKOOq0H>wA_~ateg^6!jIuFe<$!Y9NdwAQp(r4#NOz;(qKXJ z#V0p~ZmH=_d^YH}C*Xl27Db*;5mx-EW^JqJ1~Nt^I-N{Byt}FB7h(gjkuYUwPzAm> z)wDkAQnwbK#rnE`Ju5#U>&AiAC9ms9w=NAZD1%L_K(hub3J9^o7jK!n8Wv3cdXIe! zWe}=S+X0xONDvR1W1gTSKLB9qA@vkGIxY2ySMK_Eh15@BhB`vP?PP)BCG(0=%K4tq z@JA01mNWb~c!F*cf|fe#CnB;>gRa_anF++aQ%Jp$w6nLTU(KtUqAa}PG(JsE+y{Sv zgpmct0lfM|7rBeckVam4?3RZ8k7C01CqpEWV|78^7k+KKOW1y$ck!ftXh;0!Q@g08Zv@;PrO?8!u#myKet?3=GYdJ z>}Vre-@hbLd!JEBUQ5HYNl&aC)E?cd76 zGQxUW$hUPv=X;Q$6YSnO-dTG*dz9$!u=XLkLu~J`CvqHfm&`J^4XK8A+c4|09a@?P z)<{jObnRT?#XfTepz;@;Hfak{hsooeEtOUjkAKszXXtzfIKokK$3* zg3J1&^>;D$__>c+V95`}NkZf$EmQ|rU7()7{L03tZ~WkjxmY%R5H}^ly$?P5^%Ox^ z!d-YYGt1c(JgrO;D5X~mV858eMu45*6ameqwRM-)=|0^z|LRP)f&=_GFk{hM`Cm|) z<_$UjI+y=et^Zn2orlQ~YMxHqdtQNOMan0S(>_f#lA!?r>i3nCl?jseuDx+NNyt3- zlZR+-f;(o%ISC`G<@Wh&W!Xz^niEAHQiE9wh#TOqL-^WI5>3lP%C~%D8XmO=&V%2LQKYcBnabT2b7W`leo7L(zhsHm&s5Aj z>oZ>~j@H*cFq7lT-#qSJXvp%- z4yaj`i1KHtuKPXUf0bBNroYSZ!`<>b`>uqgbpqO>9 zp;SW~WF7P_2Pf2lV5rLLOsU}0aTMcJ39Ed4YNVk^Wh#K$YYr)Hu(X}!u!=3~p_qRJ z!Zu0EA#M@v#`#jsV&#UrMQdGJfDnP5u`K6OdHcour{5sBJh*XHEdjple&@Wr{k_=u zVacsGNXGtS8zVvIXWLL!KtHm20QrgEY{8v@tW=i;MU;4jz`5Qf3A!0$mylQY5 zQ#H;B!5mq4PQ*NRi(>iNHZ&yVsM!n33^ws61?^7p~k)Y zp~kQ~WR?>6$^c84wZZi$6H2B~laH7&l+Lbs4PU`aeFc3W;F6}E5F|0X*#62{6C5Pu zTB`;q2~}5{_{=_5M#@-eo_?9Ra&D%|i{WXQ5?Xbq4p93oqy3i3y~lx@)*l?}=wvE* z<0|39v1RyXsXx6YAIkzL@I9j&r}QMd zjT)C)_`TS9d_bh0q|5gnz8DGF%8RKjKm*jTOA|K&ZSnWc{P)VAlDPUKf00l)+xiPY z*_$FcUSESyc+p^O(YI86+4yTzEzfCLE7wNOF%%=dDgnF41p?KzCe(?B3AO$-e@YOy z$iomuGS_xg?#xo(4|6vo|DRotdQf%6J_iw5LiNs0CDbL$_beP!`tB1l97#XXoJ8Vu@Xuc zhh7Jc=WjL}6ObsDqJn|`B-Lw zx54_3%c1mA?M|mxMF6CGRy49{OyUkUM!1_dGB5c1i;x?eGd~Kx#3l2Uo#f?5S4D=$ zV)%1txk2%NTe&%L@VzMCSlyA*4$0CnU)HF+izTuskJu{Mu^9BALtCc%zPqN#Oh;jG{E19a= z2jdBE8~a}o!d7jrz9Gf>dOO}%*e&2k4CMvUiCKM@TXR#Zy%H28vVCUU7c_J*RY7FG~J0~+w;eBX^-Dk7fEw3sWs-$ z&Ut+{-?VdV*AA-AZ%5vNJZJk-A|ZB*8Y0DXpW@n;o-Ue#PAD_{H&iTf(Y<2!8vA+9 zSGUneSP_p9g8WK-_(oLW(sglvr!0$UnVYCJxX6CH-Jc1v!kUhGhRk|Q5;)*3q5D$# z!^b_hlUmmGaWsG5CuRCaU2tB}tno$`+}O)+2D#fz2i}KV{_XaM^pCNV&GZLoo`6r= zl-}7NqFVzWw9_c_q>^Z5J z=Ks9RS-y;Y+U`}AlBbl#y7DYi5^;tQ8f~&%vcj2E9lQJUiyX9?8fKL3WDy-vIzYf5 z1fSnwD?mEQ+kLlgaHEy~XbikE*(7UD$~kGi`7jfcDY$qzQ}-^mvF<8{gXeMYaku3x zOTO^?6J;SA5&unCnDf#NDCMf-Wl+og&b$jT* zmBD=_{R9((y5$|*U!jz&>>IKvhfLT=T~xr?7C^-%<$&DgFN*>;`5)sNeSxMfr$Q(@ zK^t>P*gU;7L?-H=w>b8r zJY%7fxwV_Mf@14tNYO~%cN=e`q^O%2+2T?R|H@zmCs z{3@>mDHF{@D6pj-6W{Nqp$%o~CEp8+tE%GVi^==&J0PR9+ zN7@(9vVt?BFCZ<*$|(dWt1Svz z=4%$PFVj7k$ytg5+uxS`7{-cfK}ysXy5wpsA+m zc|LV?RzegcTrSU0SC{0<|I0_!+&_BN}_vMG2Q}Y%$fw^G*lXp5EiX*4lk{ zwSKED+#$&5I-cc&ve{Q+8tLVdrTK@r#ek=G`q*WNEeJTdDG+Gg*wIUbOLPQ2yEpZpB-Hh&`S2YVK~e@cGPLV zM5xf6%C%AHQnvTh(pZwCm)+HTVYcIz^X6yC=W5G|be$OX6=T#oM3#U$^#Q8QKKqWT zUf$Oh$#t_?K)5v>K{Ufw3uXNai!XE9I~-Vw&jsLuFt>S@k*aI|lD23bH4i9JS$?f83h%zl^m8L!zguaTRb|tvPSL+21$SaPqof=V`DoxebdXyJ z`b%!t{CvG5+j-zGU)O&Ua?5>z$0JNfNclm6=F{3tCF6`&8%x@1^Caa9E$2h?=+%15 zQFZTR)Vii8p<1WCDN*^AST$6}DDfLO1n3!-G!MB)j4SMSoZw-QNU;;@NZsxA^ZZ{= zJ>vkuA*E_Q$N#MyNw3^nn>xKwUf;!L_|FH6W~(Y)a#TwLo<2JNfxK%s7i(5{#4%S< zWr#ICSAB}zw;XhjlecIC)blPN zTjLMkVf(0U-CO=rphJaArb+g=&{rBrU#AM*1g`Ob@uNj&|*)sSEN!0?qFoh&vXKGH9Kc{!oQIIg1vVFD`^D_i|mceauB> zI%sd1llzUrLb0WrURRnVlZ{qta(E7JUJ6dC&<6NCpFaPPT$db!N#5oTVCe+UKs2($zY>m)iz~Ongqlxn3k1fToIv&p@h&R!qUP zA@)Dap^VoL{_E-SLgj9sFJWJZB@ZZPBbYd|H8`GDd~tl2&6!P1U54W4Uxb{X?2y zli=^`D@cqi8cO20cJVqy;@z?)p?rZ$urkVdck%&)N@vp98}YN#A^2a?bpSs6fUr-B zKCswC+>;t?ziFfWAthjBP9$8pAM*+BdlJALf#N+_uveJ55VEQU#25mD{G{&%2yxG( zv5bTRU!hOGO7H0S7VH5xHYeXHKm2mc287Q)DZ0#t%UKruqqwDHU%0i)O{K=MmFhhj z=pH#TYTA}&FJ~J&-o{o-eW8H&%y7s=ctdg}X{uSne{R^l8OWN^6ktAmEciXP2Yu74 z`QbpO>s?yKx7La0Mty<3B0Y7cqqXHn+K+U_2ew!>PC?S@u{p*~3Qjl|HB2(W9R(rs z&+Ld@{1;dczD))@eLr~V9r!Z$Rl`E?UX+{OBpb=(|78}VB&8YNuO^pSA-*yxyD4=F zJvJeMM+~S)%B`aI;wG=^hYPhVO;UsxE4^LP%%|h2XR`ZZsn9Je5nK|`o+*6g^GI@N zj7k6kEztxM26xo=v=ez@q`Uhk#x8(v<;F%m+ev1=gx)uulZIK-j}}~Dp37k%QV=MM zMPL3P-`sM=+8Msz+3+}eem!FNN_+r;E0Kw_+Za7p2KduMexE zRt5Ram`|MYZ9Dpqbp;5NMF0n9lvt1XEhW5~*=Npt#R7Vu?wOnMsC}R<4PV@s8v$WD zx>sFAppod0X|(m@@_0p|s5vNx1l745H~%l8W&MJlWNdyc7P+pEmnJm|pFD(*y=5mi zYNvpHdG5ku0l7N_y#UBlK$xDCt>tUJ*^+%SB`Gm?iw1VW=U?ZF!c$DA&@E7`6{F4g z2ae|o2kmx{Cet{0LT=d#oIAiWrx!|{7$AhSG`9Nrj{-XlK2uOeVP+zf#L#i*&Y5bnZ|9zDhY7= z=O)UFutp8S9!}&c`bDf?F9l=2p?JkMs|)`_bbGAxbCKePqL09f%bG7zG=S&K6*SsziNZx zQGh@tT7|healbogYB4@JH{8)|FvL;FOXIpK_fQ9*r*rS{>6mRB1rHUxV zTUHwoZAl$B>zMzeu+~2|ccdJ=#`ddEQ|_5^tv8iZ_z2S`{<+2j_d6jiR^dcJaQh$ zq{2kkKRoiIzY>%$s#~ z0h(^|)o1W8Av*t46v1b5YZ2Wr+J!A0`uE7Auk}rd7u`jcnxdN4@B8CdUV4Xj$jc)? zw_`Fxu9aqdsM$FEsCDD~10`>~&!)|O0g?SbK=TtcKGOB^w=31-XYA02%eAPbIVkUI z?;H;o3#-SU#(SWQCh>gwp%uncmNu9Ejb}EYUsugC*lK=_8MYzQEZ1GhZ!UmF1`zOh zPyvHzfyCvm_S*8jJggXP+UxqZn)-O>d(|0KQVl{?{0s5)pTYXDX-J0{QE-1Jf^g8s zgQkyG@Ew}`YW(*2`UTT8Zqzl^O>aV)#8Tfa0=9`<(k$;C>RqTpRf%g?uS=ULQXT%UZuy5%$e$Ce$YinR6)V`wGTRW4!oN9V3 ziy=b-Z+dk03btCk-91=!UY43kzC01wO~t1grk_keCwGfw3|b66J8H7}F;EMCgmRxx zmq*2sq_M%z+9!|qX7y8JczTY* z4(yAvsXfW)1QQ=3y7t3VxF+DYLR?3ELuK^npQJ

!?pIvxL;PC>9a4GoZjc(grYu*Pu{XP8 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 W{P^p~dh@E+i;_(nLl0GKfB)GAF07>h literal 0 HcmV?d00001 From 2d29795de81b6655735ee5b74a57deaaa4c63f1d Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Sun, 24 Jan 2016 17:56:43 -0800 Subject: [PATCH 49/52] add one more photo --- keyboard/planck/keymaps/yang/WS2812-wiring.jpg | Bin 0 -> 290495 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 keyboard/planck/keymaps/yang/WS2812-wiring.jpg diff --git a/keyboard/planck/keymaps/yang/WS2812-wiring.jpg b/keyboard/planck/keymaps/yang/WS2812-wiring.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c65cd283a424e6c33ca33bc5d41cbfb10521f37 GIT binary patch literal 290495 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