From 00c3ecc23849efe525fb52fc82c938ce1b521c21 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Tue, 29 Dec 2015 21:36:17 +0100 Subject: Initial TypeMatrix keymap: Layer 0 --- keyboard/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; + } + +}; -- cgit v1.2.3 From 900c1f991df6b30a45a25094c61bcf5ed54119cf Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Tue, 29 Dec 2015 21:36:17 +0100 Subject: 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), -- cgit v1.2.3 From ac94577cbe03b771820a17e94ced640d78c06dfc Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Wed, 30 Dec 2015 00:51:12 +0100 Subject: TypeMatrix keymap: Layer 1 (Fn Layer) --- keyboard/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; }; -- cgit v1.2.3 From 8677ec0c9fbf0d0bb639ad082e27d6650b3c1dd0 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Wed, 30 Dec 2015 00:56:02 +0100 Subject: 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: 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 --- keyboard/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, -- cgit v1.2.3 From 56070d424b9dd90f8153b2fa1cb03c896bf5ee68 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Wed, 30 Dec 2015 13:26:31 +0100 Subject: Added description of the layout and main differences with real TM --- keyboard/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" -- cgit v1.2.3 From 38a0e62a10fcbb4b96f8f69d4fc69872d2d3a7ed Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 9 Jan 2016 00:55:54 +0100 Subject: 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 --- keyboard/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 * -- cgit v1.2.3 From bfda6ee41773355c413904b128b317ee7eb45569 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 9 Jan 2016 17:47:26 +0100 Subject: 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 --- keyboard/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: 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, -- cgit v1.2.3 From d3e4cc9af66630906f023cf83f1df46b065435a5 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sun, 10 Jan 2016 19:49:08 +0100 Subject: Implement cut/copy/paste as macros Workaround for jackhumbert/qmk_firmware#81 + added macro names + removed unused macro 0 --- keyboard/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; }; -- cgit v1.2.3 From 29de37d5c0ea9fc6b5539ce4493c7b10a2a7f33f Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Mon, 11 Jan 2016 16:53:33 -0500 Subject: pwm audio --- keyboard/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 | 231 +++++++++++++-------- 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, 593 insertions(+), 183 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); + // new - // ICR3 = 0xFFFF; - // OCR3A = (int)((float)wave[i]*ICR3/RANGE); //go to next array element + 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; - // cli(); + /* Enable the OC4A output */ + DDRC |= _BV(PORTC6); - // /* 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) { +ISR(TIMER0_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)]; + // value = *(sine_start+=(long)frequencies[0]); + // OCR4A = value; + // if (sine_start >= sine_end) { + // sine_start = &sine[(sine_start - sine_end) % 128]; + // } -// // OCR3A = sample; + // 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); + + + // 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; + +} -// OCR3A=pgm_read_byte(&sinewave[pos1]); -// pos1++; -// // PORTC &= ~(1<<6); -// /* buffered, 1x gain, active mode */ -// // SPDR = highByte(sample) | 0x70; -// // while (!(SPSR & (1< 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: 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); - - 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); -// } + TIMSK3 |= _BV(OCIE3A); -// 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: 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)(); } -- cgit v1.2.3 From 4c100dbbef5b97290cbe6d4846575a940649c958 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 13 Jan 2016 00:25:31 -0500 Subject: 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 */ + + /* 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 - /* Enable the OC4A output */ - DDRC |= _BV(PORTC6); + 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,12 +158,84 @@ 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) { freq = freq / SAMPLE_RATE; @@ -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 -- cgit v1.2.3 From 93e350caa1f5ce704741a18e6e3106787b574406 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 16 Jan 2016 00:38:13 +0100 Subject: 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 * -- cgit v1.2.3 From 6e3c36360ed291b9ca2bd014571236308a933d0c Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 15 Jan 2016 23:10:30 -0500 Subject: 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); -- cgit v1.2.3 From 4faddd3449ca553e0d8b02ba91f9a34b534eebe7 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Jan 2016 00:06:51 -0500 Subject: 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 -- cgit v1.2.3 From dfe7004bc545ff7247a0dbef4788b9e1952f9c5d Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Jan 2016 00:51:24 -0500 Subject: new keymap folder structure and makefile magic --- keyboard/planck/Makefile | 13 ++- keyboard/planck/README.md | 126 ++++++++++++++++-------- keyboard/planck/keymaps/alexey.c | 51 ++++++++++ keyboard/planck/keymaps/angerthosenear.c | 50 ++++++++++ keyboard/planck/keymaps/austin.c | 50 ++++++++++ keyboard/planck/keymaps/charlie.c | 54 ++++++++++ keyboard/planck/keymaps/daniel.c | 48 +++++++++ keyboard/planck/keymaps/david.c | 76 ++++++++++++++ keyboard/planck/keymaps/default.c | 68 +++++++++++++ keyboard/planck/keymaps/dzobert.c | 49 +++++++++ keyboard/planck/keymaps/gabriel.c | 108 ++++++++++++++++++++ keyboard/planck/keymaps/jack.c | 50 ++++++++++ keyboard/planck/keymaps/joe.c | 88 +++++++++++++++++ keyboard/planck/keymaps/keymap_alexey.c | 51 ---------- keyboard/planck/keymaps/keymap_angerthosenear.c | 50 ---------- keyboard/planck/keymaps/keymap_austin.c | 50 ---------- keyboard/planck/keymaps/keymap_charlie.c | 54 ---------- keyboard/planck/keymaps/keymap_daniel.c | 48 --------- keyboard/planck/keymaps/keymap_david.c | 76 -------------- keyboard/planck/keymaps/keymap_default.c | 68 ------------- keyboard/planck/keymaps/keymap_dzobert.c | 49 --------- keyboard/planck/keymaps/keymap_gabriel.c | 108 -------------------- keyboard/planck/keymaps/keymap_jack.c | 50 ---------- keyboard/planck/keymaps/keymap_joe.c | 88 ----------------- keyboard/planck/keymaps/keymap_kyle.c | 49 --------- keyboard/planck/keymaps/keymap_leo.c | 46 --------- keyboard/planck/keymaps/keymap_lock.c | 123 ----------------------- keyboard/planck/keymaps/keymap_max.c | 49 --------- keyboard/planck/keymaps/keymap_monkey.c | 76 -------------- keyboard/planck/keymaps/keymap_numpad.c | 26 ----- keyboard/planck/keymaps/kyle.c | 49 +++++++++ keyboard/planck/keymaps/leo.c | 46 +++++++++ keyboard/planck/keymaps/lock.c | 123 +++++++++++++++++++++++ keyboard/planck/keymaps/max.c | 49 +++++++++ keyboard/planck/keymaps/monkey.c | 76 ++++++++++++++ keyboard/planck/keymaps/numpad.c | 26 +++++ keyboard/planck/keymaps/test/default.c | 123 +++++++++++++++++++++++ quantum/quantum.mk | 14 +-- 38 files changed, 1289 insertions(+), 1109 deletions(-) create mode 100644 keyboard/planck/keymaps/alexey.c create mode 100644 keyboard/planck/keymaps/angerthosenear.c create mode 100644 keyboard/planck/keymaps/austin.c create mode 100644 keyboard/planck/keymaps/charlie.c create mode 100644 keyboard/planck/keymaps/daniel.c create mode 100644 keyboard/planck/keymaps/david.c create mode 100644 keyboard/planck/keymaps/default.c create mode 100644 keyboard/planck/keymaps/dzobert.c create mode 100644 keyboard/planck/keymaps/gabriel.c create mode 100644 keyboard/planck/keymaps/jack.c create mode 100644 keyboard/planck/keymaps/joe.c delete mode 100644 keyboard/planck/keymaps/keymap_alexey.c delete mode 100644 keyboard/planck/keymaps/keymap_angerthosenear.c delete mode 100644 keyboard/planck/keymaps/keymap_austin.c delete mode 100644 keyboard/planck/keymaps/keymap_charlie.c delete mode 100644 keyboard/planck/keymaps/keymap_daniel.c delete mode 100644 keyboard/planck/keymaps/keymap_david.c delete mode 100644 keyboard/planck/keymaps/keymap_default.c delete mode 100644 keyboard/planck/keymaps/keymap_dzobert.c delete mode 100644 keyboard/planck/keymaps/keymap_gabriel.c delete mode 100644 keyboard/planck/keymaps/keymap_jack.c delete mode 100644 keyboard/planck/keymaps/keymap_joe.c delete mode 100644 keyboard/planck/keymaps/keymap_kyle.c delete mode 100644 keyboard/planck/keymaps/keymap_leo.c delete mode 100644 keyboard/planck/keymaps/keymap_lock.c delete mode 100644 keyboard/planck/keymaps/keymap_max.c delete mode 100644 keyboard/planck/keymaps/keymap_monkey.c delete mode 100644 keyboard/planck/keymaps/keymap_numpad.c create mode 100644 keyboard/planck/keymaps/kyle.c create mode 100644 keyboard/planck/keymaps/leo.c create mode 100644 keyboard/planck/keymaps/lock.c create mode 100644 keyboard/planck/keymaps/max.c create mode 100644 keyboard/planck/keymaps/monkey.c create mode 100644 keyboard/planck/keymaps/numpad.c 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 + +Your keymap can include shortcuts to common operations (called "function actions" in tmk). + +### Switching and toggling layers + +`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. + +`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. -* `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* +### Fun with modifier keys -You can also use more than one, like this: +* `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* - LALT(LGUI(KC_ESC)) +You can also chain these, like this: -The following shortcuts automatically add `LSFT()` to keycodes to get commonly used symbols. Their long names (see `quantum/keymap_common.h`) are also availble. + 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. + +These are the values you can use for the `mod` in `MT()` (right-hand modifiers are not available): + + * MOD_LCTL + * MOD_LSFT + * MOD_LALT + * MOD_LGUI -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 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. -There are also keycode shortcuts for common actions: +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/) + +### Temporarily setting the default layer + +`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, and will require KC_TRNS on the layer being switched to - check out the default keymap for an example. +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). -### Additional keycodes for software-implemented layouts (Colemak, Dvorak, etc) +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/alexey.c b/keyboard/planck/keymaps/alexey.c new file mode 100644 index 0000000000..89af4112c6 --- /dev/null +++ b/keyboard/planck/keymaps/alexey.c @@ -0,0 +1,51 @@ +#include "keymap_common.h" +#include "planck.h" +#include "backlight.h" + +#define _QW 0 +#define _LW 1 +#define _RS 2 + +// This layout tries to imitate the Atreus keyboard + +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, MO(_LW)}, + {KC_TRNS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_TRNS}, + {M(0), KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, KC_SPC, KC_SPC, MO(_RS), KC_MINS, KC_QUOT, KC_ENT, KC_TRNS} +}, +[_RS] = { /* RAISE */ + {KC_TRNS, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_PGUP, KC_7, KC_8, KC_9, KC_ASTR, KC_TRNS}, + {KC_TRNS, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV, KC_PGDN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS}, + {KC_TRNS, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_0, KC_EQL, KC_TRNS} +}, +[_LW] = { /* LOWER */ + {KC_TRNS, KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS}, + {KC_TRNS, KC_DELETE, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_TRNS, KC_F4, KC_F5, KC_F6, KC_F11, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F12, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MNXT, KC_MPLY, KC_TRNS} +} +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + backlight_step(); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; + diff --git a/keyboard/planck/keymaps/angerthosenear.c b/keyboard/planck/keymaps/angerthosenear.c new file mode 100644 index 0000000000..cdf60632e4 --- /dev/null +++ b/keyboard/planck/keymaps/angerthosenear.c @@ -0,0 +1,50 @@ +#include "keymap_common.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = { /* Qwerty */ + {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT}, + {KC_LCTL, KC_LGUI, KC_LALT, BL_STEP, 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] = { /* WASD + NumPad */ + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P7, KC_P8, KC_P9, KC_PSLS, KC_PMNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P4, KC_P5, KC_P6, KC_PAST, KC_PPLS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P1, KC_P2, KC_P3, KC_PDOT, KC_PENT, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_SPC, KC_P0, FUNC(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} +}, +[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_TRNS}, + {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_MPRV, 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_DEL}, + {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_HOME, KC_PGDN, KC_PGUP, KC_END} +} +}; + + +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), + +}; + +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/austin.c b/keyboard/planck/keymaps/austin.c new file mode 100644 index 0000000000..49fc98a587 --- /dev/null +++ b/keyboard/planck/keymaps/austin.c @@ -0,0 +1,50 @@ +#include "keymap_common.h" + +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}, + {BL_STEP, KC_LGUI, KC_LALT, KC_LCTL, 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_LGUI, KC_LALT, KC_LCTL, 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), 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] = { /* 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 RAISE + [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER + + [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/charlie.c b/keyboard/planck/keymaps/charlie.c new file mode 100644 index 0000000000..88f454d789 --- /dev/null +++ b/keyboard/planck/keymaps/charlie.c @@ -0,0 +1,54 @@ +#include "keymap_common.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = { /* Native */ + {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, FUNC(2)}, + {KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {KC_TAB, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, + {KC_DEL, KC_LCTL, KC_NO, KC_LSFT, KC_LALT, KC_SPC, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + [1] = { /* QWERTY->PHOTOSHOP */ + {KC_DELETE, KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, FUNC(1)}, + {KC_O, KC_G, KC_S, KC_U, KC_T, FUNC(27), KC_F21, KC_F10, KC_F11, KC_F7, KC_F8, KC_F9}, + {KC_TAB, FUNC(4), FUNC(5), FUNC(6), KC_F1, FUNC(7), KC_F18, KC_F19, KC_F23, KC_F20, KC_F22, FUNC(9)}, + {KC_COMM, KC_DOT, KC_R, FUNC(11), FUNC(3), KC_SPC, FUNC(12), KC_F2, FUNC(8), KC_F3, KC_F14} + }, + [2] = { /* 2: FUNC(3 PHOTOSHOP */ + {KC_ESC, FUNC(25), FUNC(26), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, + {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, FUNC(19), FUNC(20), FUNC(21)}, + {KC_C, KC_NO, FUNC(22), FUNC(5), KC_NO, FUNC(23), KC_NO, KC_NO, KC_NO, KC_NO, FUNC(13), KC_NO}, + {FUNC(14), FUNC(15), FUNC(16), FUNC(17), FUNC(3), KC_SPC, FUNC(18), KC_NO, KC_NO, KC_F24, KC_NO} + } +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_DEFAULT_LAYER_SET(0), // set Qwerty layout + [2] = ACTION_DEFAULT_LAYER_SET(1), // set Photoshop presets + [3] = ACTION_LAYER_MOMENTARY(2), // Photoshop function layer + + [4] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F9), // photo folder AHK + [5] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_I), // select inverse + [6] = ACTION_MODS_KEY(MOD_LSFT, KC_M), // marquee select + [7] = ACTION_MODS_KEY(MOD_LALT, KC_BSPC), // fill + [8] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_X), // warp + [9] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT | MOD_LSFT, KC_F12), // merge all new layer + [10] = ACTION_MODS_KEY(MOD_LCTL, KC_MINS), // zoom out + [11] = ACTION_MODS_KEY(MOD_LCTL, KC_H), // RBG sliders + [12] = ACTION_MODS_KEY(MOD_LCTL, KC_S), // save + [13] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_F5), // layer mask from transparancy + [14] = ACTION_MODS_KEY(MOD_LCTL, KC_F2), // stroke + [15] = ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_F2), // stroke layer + [16] = ACTION_MODS_KEY(MOD_LCTL, KC_0), // zoom 0 + [17] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_H), // HSV sliders + [18] = ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_S), // save as + [19] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F7), // gaussian blur + [20] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F8), // motion blur + [21] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_X), // liquify filter + [22] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // prev layer blending + [23] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_BSPC), // KC_NOrmal layer blending + [24] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // next layer blending + [25] = ACTION_MODS_KEY(MOD_LCTL, KC_Z), // step back + [26] = ACTION_MODS_KEY(MOD_LCTL, KC_Y), // step forward + [27] = ACTION_MODS_KEY(MOD_LCTL, KC_R), // rasterize + +}; diff --git a/keyboard/planck/keymaps/daniel.c b/keyboard/planck/keymaps/daniel.c new file mode 100644 index 0000000000..234e48ff4a --- /dev/null +++ b/keyboard/planck/keymaps/daniel.c @@ -0,0 +1,48 @@ +#include "keymap_common.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = { /* Qwerty */ + {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_TAB, 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_RSFT}, + {FUNC(3), 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] = { /* RAISE */ + {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_EQL}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, S(KC_MINS), KC_BSLS, 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} +}, +[2] = { /* LOWER */ + {S(KC_GRV), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, S(KC_EQL)}, + {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, + {KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_ENT}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, +[3] = { /* Qwerty */ + {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL}, + {KC_TAB, 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_RSFT}, + {KC_TRNS, 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 +} +}; + + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(1), // to RAISE + [2] = ACTION_LAYER_MOMENTARY(2), // to LOWER + [3] = ACTION_LAYER_MOMENTARY(3) // to LOWER +}; + +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/david.c b/keyboard/planck/keymaps/david.c new file mode 100644 index 0000000000..f483084801 --- /dev/null +++ b/keyboard/planck/keymaps/david.c @@ -0,0 +1,76 @@ +#include "keymap_common.h" +#include "beeps.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = { /* Qwerty */ + {KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_A, KC_S, KC_D, KC_F, KC_G, KC_ENT, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ESC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, + {M(10), 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, M(0), M(1), M(2), KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {KC_TRNS, KC_F11, KC_F12, M(0), M(1), M(2), M(3), M(4), M(5), M(6), M(7), 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, M(0), M(1), M(2), 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 RAISE + [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER + + [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 + if (record->event.pressed) { + switch(id) { + case 0: + true_note(12, 12, 20); + break; + case 1: + true_note(14, 14, 20); + break; + case 2: + true_note(16, 16, 20); + break; + case 3: + true_note(17, 17, 20); + break; + case 4: + true_note(19, 19, 20); + break; + case 5: + true_note(21, 21, 20); + break; + case 6: + true_note(23, 23, 20); + break; + case 7: + true_note(24, 24, 20); + break; + case 10: + + break; + } + } + return MACRO_NONE; +}; diff --git a/keyboard/planck/keymaps/default.c b/keyboard/planck/keymaps/default.c new file mode 100644 index 0000000000..49670dafd3 --- /dev/null +++ b/keyboard/planck/keymaps/default.c @@ -0,0 +1,68 @@ +// 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" +#include "backlight.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); + backlight_step(); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboard/planck/keymaps/dzobert.c b/keyboard/planck/keymaps/dzobert.c new file mode 100644 index 0000000000..665e9c20b6 --- /dev/null +++ b/keyboard/planck/keymaps/dzobert.c @@ -0,0 +1,49 @@ +#include "keymap_common.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = { /* Qwerty */ + {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_TAB}, + {KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_BSPC}, + {KC_LALT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, + {KC_FN4, KC_RSFT, KC_LGUI, KC_LSFT, 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_TAB}, + {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_BSPC}, + {KC_LALT, 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_RSFT, KC_LGUI, KC_LSFT, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +[2] = { /* RAISE */ + {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, + {KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_DEL}, + {KC_TRNS, KC_GRV, KC_MINS, KC_EQL, KC_QUOT, S(KC_QUOT), S(KC_LBRC), S(KC_RBRC), KC_LBRC, KC_RBRC, KC_BSLS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(1), KC_HOME, KC_PGUP, KC_PGDN, KC_END} +}, +[3] = { /* LOWER */ + {KC_POWER,KC_PSCR, KC_SLCK, KC_PAUSE, KC_NLCK, KC_EXECUTE, KC_MENU, KC_APP, KC_7, KC_8, KC_9, KC_KP_SLASH}, + {KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_CAPS, KC_CANCEL, KC_UNDO, KC_AGAIN, KC_4, KC_5, KC_6, KC_KP_ASTERISK}, + {KC_TRNS, KC_INSERT,KC_CUT, KC_COPY, KC_PASTE, KC_BSLS, KC_9, KC_0, KC_1, KC_2, KC_3, KC_KP_MINUS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_0, KC_KP_DOT, KC_KP_ENTER, KC_KP_PLUS} +} +}; + +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), + +}; + +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; +}; \ No newline at end of file diff --git a/keyboard/planck/keymaps/gabriel.c b/keyboard/planck/keymaps/gabriel.c new file mode 100644 index 0000000000..805484488b --- /dev/null +++ b/keyboard/planck/keymaps/gabriel.c @@ -0,0 +1,108 @@ +#include "planck.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 _LW 1 +#define _RS 2 +#define _FN 3 + +// This a slightly modified 'default' keymap that's closer to the Mac keyboard layout. I like the position +// of 'esc' and 'tab' better this way. I also got rid of the backlighting control key and the dvorak and +// colemak layers. I added an 'fn' layer that makes the 'bspc' a forward delete (like on OSX). +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* MIT Layout (QWERTY layer) + * + * ,-----------------------------------------------------------------------. + * | esc | q | w | e | r | t | y | u | i | o | p | bspc| + * |-----------------------------------------------------------------------| + * | tab | a | s | d | f | g | h | j | k | l | ; | ' | + * |-----------------------------------------------------------------------| + * |shift| z | x | c | v | b | n | m | , | . | / |enter| + * |-----------------------------------------------------------------------| + * | fn | ctl | alt | cmd |lower| spc |raise|left |down | up |right| + * `-----------------------------------------------------------------------' + */ +[_QW] = { /* QWERTY */ + {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_TAB, 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 }, + {MO(_FN), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +/* MIT Layout (Raised layer) + * + * ,-----------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | + * |-----------------------------------------------------------------------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | - | + | [ | ] | | | + * |-----------------------------------------------------------------------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------' + */ +[_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_PLUS, KC_LBRC, KC_RBRC, KC_PIPE}, + {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, 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} +}, +/* MIT Layout (Lowered layer) + * + * ,-----------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | + * |-----------------------------------------------------------------------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | _ | = | { | } | \ | + * |-----------------------------------------------------------------------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------' + */ +[_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_EQL, KC_LCBR, KC_RCBR, KC_BSLS}, + {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, 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} +}, +/* MIT Layout (FN layer) + * + * ,-----------------------------------------------------------------------. + * | | | | | | | | | | | | del | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------| + * | | | | | | | |home |pgdn |pgup | end | + * `-----------------------------------------------------------------------' + */ +[_FN] = { /* FUNCTION */ + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DELT}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END} +} +}; + +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); + backlight_step(); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboard/planck/keymaps/jack.c b/keyboard/planck/keymaps/jack.c new file mode 100644 index 0000000000..0b93bba33f --- /dev/null +++ b/keyboard/planck/keymaps/jack.c @@ -0,0 +1,50 @@ +#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/joe.c b/keyboard/planck/keymaps/joe.c new file mode 100644 index 0000000000..5b7bbe2bbb --- /dev/null +++ b/keyboard/planck/keymaps/joe.c @@ -0,0 +1,88 @@ +#include "keymap_common.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = { /* Joe colemak */ + {F(3), KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_MINS}, + {KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_ENT }, + {F(15), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_UP, KC_QUOT}, + {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT} + }, + [1] = { /* Joe soft Colemak */ + {F(3), CM_Q, CM_W, CM_F, CM_P, CM_G, CM_J, CM_L, CM_U, CM_Y, CM_SCLN, KC_MINS}, + {KC_BSPC, CM_A, CM_R, CM_S, CM_T, CM_D, CM_H, CM_N, CM_E, CM_I, CM_O, KC_ENT }, + {F(15), CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, KC_COMM, KC_DOT, KC_UP, KC_QUOT}, + {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT} + }, + [2] = { /* Joe NUMPAD */ + {F(3), KC_NO, KC_UP, KC_NO, KC_NO, KC_NO, LSFT(KC_9), LSFT(KC_0), KC_PSLS, KC_P7, KC_P8, KC_P9 }, + {KC_BSPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, LSFT(KC_5), KC_PEQL, KC_PAST, KC_P4, KC_P5, KC_P6 }, + {F(15), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PCMM, KC_PMNS, KC_P1, KC_P2, KC_P3 }, + {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_TRNS, KC_TRNS, F(2), KC_PPLS, KC_P0, KC_PDOT, KC_PENT} + }, + [3] = { /* Joe 1337 haxOr5*/ + {F(3), KC_Q, KC_W, KC_F, KC_P, KC_6, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_MINS}, + {KC_BSPC, KC_4, KC_R, KC_5, KC_7, KC_D, KC_H, KC_N, KC_3, KC_1, KC_0, KC_ENT }, + {F(15), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_UP, KC_QUOT}, + {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT} + }, + [4] = { /* Joe LOWER fn1 */ + {KC_GRV, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, M(3), M(2), M(1), M(0) }, + {KC_BSPC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS}, + {KC_BSLS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LBRC, KC_RBRC, KC_PGUP, KC_EQL }, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), KC_TRNS, KC_TRNS, F(2), KC_NO, KC_HOME, KC_PGDN, KC_END } + }, + [5] = { /* Joe UPPER fn2 */ + {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 }, + {KC_DEL, KC_BTN1, KC_MS_U, KC_BTN2, KC_BTN3, KC_WH_U, KC_BTN4, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO }, + {KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_L, KC_WH_D, KC_WH_R, KC_NO, KC_NO, LCTL(KC_PGUP), LCTL(LALT(KC_UP)), LCTL(KC_PGDN) }, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), KC_NO, KC_NO, F(2), KC_NO, LCTL(LALT(KC_LEFT)), LCTL(LALT(KC_DOWN)), LCTL(LALT(KC_RGHT))} + }, + [6] = { /* Joe SPECIAL fn3 */ + {KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, + {KC_NO, KC_MPLY, KC_MPRV, KC_MNXT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RESET }, + {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, + {F(6), F(7), F(8), F(9), F(1), KC_TRNS, KC_TRNS, F(2), KC_POWER, KC_WAKE, KC_SLEP, LCTL(LALT(KC_L))} + } +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(4), // fn1 + [2] = ACTION_LAYER_MOMENTARY(5), // fn2 + + /* ESC on tap, fn3 on hold */ + [3] = ACTION_LAYER_TAP_KEY(6, KC_ESC), + + /* toggle layers */ + [6] = ACTION_DEFAULT_LAYER_SET(0), + [7] = ACTION_DEFAULT_LAYER_SET(1), + [8] = ACTION_DEFAULT_LAYER_SET(2), + [9] = ACTION_DEFAULT_LAYER_SET(3), + + /* tab on tap, shift on hold */ + [15] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB), +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch (id) { + case 0: + /* :) */ + return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_SCLN), TYPE(KC_0), UP(KC_LSFT), END ); + break; + case 1: + /* :( */ + return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_SCLN), TYPE(KC_9), UP(KC_LSFT), END ); + break; + case 2: + /* (: | :) */ + return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_9), TYPE(KC_SCLN), TYPE(KC_SPC), TYPE(KC_SPC), TYPE(KC_SCLN), TYPE(KC_0), UP(KC_LSFT), TYPE(KC_LEFT), TYPE(KC_LEFT), TYPE(KC_LEFT), END ); + break; + case 3: + /* :( | ): */ + return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_SCLN), TYPE(KC_9), TYPE(KC_SPC), TYPE(KC_SPC), TYPE(KC_0), TYPE(KC_SCLN), UP(KC_LSFT), TYPE(KC_LEFT), TYPE(KC_LEFT), TYPE(KC_LEFT), END ); + break; + default: + break; + } + return MACRO_NONE; +} diff --git a/keyboard/planck/keymaps/keymap_alexey.c b/keyboard/planck/keymaps/keymap_alexey.c deleted file mode 100644 index 89af4112c6..0000000000 --- a/keyboard/planck/keymaps/keymap_alexey.c +++ /dev/null @@ -1,51 +0,0 @@ -#include "keymap_common.h" -#include "planck.h" -#include "backlight.h" - -#define _QW 0 -#define _LW 1 -#define _RS 2 - -// This layout tries to imitate the Atreus keyboard - -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, MO(_LW)}, - {KC_TRNS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_TRNS}, - {M(0), KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, KC_SPC, KC_SPC, MO(_RS), KC_MINS, KC_QUOT, KC_ENT, KC_TRNS} -}, -[_RS] = { /* RAISE */ - {KC_TRNS, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_PGUP, KC_7, KC_8, KC_9, KC_ASTR, KC_TRNS}, - {KC_TRNS, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV, KC_PGDN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS}, - {KC_TRNS, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_0, KC_EQL, KC_TRNS} -}, -[_LW] = { /* LOWER */ - {KC_TRNS, KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS}, - {KC_TRNS, KC_DELETE, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_TRNS, KC_F4, KC_F5, KC_F6, KC_F11, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F12, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MNXT, KC_MPLY, KC_TRNS} -} -}; - -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - backlight_step(); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; - diff --git a/keyboard/planck/keymaps/keymap_angerthosenear.c b/keyboard/planck/keymaps/keymap_angerthosenear.c deleted file mode 100644 index cdf60632e4..0000000000 --- a/keyboard/planck/keymaps/keymap_angerthosenear.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "keymap_common.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = { /* Qwerty */ - {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT}, - {KC_LCTL, KC_LGUI, KC_LALT, BL_STEP, 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] = { /* WASD + NumPad */ - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P7, KC_P8, KC_P9, KC_PSLS, KC_PMNS, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P4, KC_P5, KC_P6, KC_PAST, KC_PPLS, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P1, KC_P2, KC_P3, KC_PDOT, KC_PENT, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_SPC, KC_P0, FUNC(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} -}, -[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_TRNS}, - {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_MPRV, 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_DEL}, - {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_HOME, KC_PGDN, KC_PGUP, KC_END} -} -}; - - -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), - -}; - -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/keymap_austin.c b/keyboard/planck/keymaps/keymap_austin.c deleted file mode 100644 index 49fc98a587..0000000000 --- a/keyboard/planck/keymaps/keymap_austin.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "keymap_common.h" - -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}, - {BL_STEP, KC_LGUI, KC_LALT, KC_LCTL, 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_LGUI, KC_LALT, KC_LCTL, 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), 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] = { /* 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 RAISE - [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER - - [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/keymap_charlie.c b/keyboard/planck/keymaps/keymap_charlie.c deleted file mode 100644 index 88f454d789..0000000000 --- a/keyboard/planck/keymaps/keymap_charlie.c +++ /dev/null @@ -1,54 +0,0 @@ -#include "keymap_common.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = { /* Native */ - {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, FUNC(2)}, - {KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, - {KC_TAB, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, - {KC_DEL, KC_LCTL, KC_NO, KC_LSFT, KC_LALT, KC_SPC, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, - [1] = { /* QWERTY->PHOTOSHOP */ - {KC_DELETE, KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, FUNC(1)}, - {KC_O, KC_G, KC_S, KC_U, KC_T, FUNC(27), KC_F21, KC_F10, KC_F11, KC_F7, KC_F8, KC_F9}, - {KC_TAB, FUNC(4), FUNC(5), FUNC(6), KC_F1, FUNC(7), KC_F18, KC_F19, KC_F23, KC_F20, KC_F22, FUNC(9)}, - {KC_COMM, KC_DOT, KC_R, FUNC(11), FUNC(3), KC_SPC, FUNC(12), KC_F2, FUNC(8), KC_F3, KC_F14} - }, - [2] = { /* 2: FUNC(3 PHOTOSHOP */ - {KC_ESC, FUNC(25), FUNC(26), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO}, - {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, FUNC(19), FUNC(20), FUNC(21)}, - {KC_C, KC_NO, FUNC(22), FUNC(5), KC_NO, FUNC(23), KC_NO, KC_NO, KC_NO, KC_NO, FUNC(13), KC_NO}, - {FUNC(14), FUNC(15), FUNC(16), FUNC(17), FUNC(3), KC_SPC, FUNC(18), KC_NO, KC_NO, KC_F24, KC_NO} - } -}; - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_DEFAULT_LAYER_SET(0), // set Qwerty layout - [2] = ACTION_DEFAULT_LAYER_SET(1), // set Photoshop presets - [3] = ACTION_LAYER_MOMENTARY(2), // Photoshop function layer - - [4] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F9), // photo folder AHK - [5] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_I), // select inverse - [6] = ACTION_MODS_KEY(MOD_LSFT, KC_M), // marquee select - [7] = ACTION_MODS_KEY(MOD_LALT, KC_BSPC), // fill - [8] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_X), // warp - [9] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT | MOD_LSFT, KC_F12), // merge all new layer - [10] = ACTION_MODS_KEY(MOD_LCTL, KC_MINS), // zoom out - [11] = ACTION_MODS_KEY(MOD_LCTL, KC_H), // RBG sliders - [12] = ACTION_MODS_KEY(MOD_LCTL, KC_S), // save - [13] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_F5), // layer mask from transparancy - [14] = ACTION_MODS_KEY(MOD_LCTL, KC_F2), // stroke - [15] = ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_F2), // stroke layer - [16] = ACTION_MODS_KEY(MOD_LCTL, KC_0), // zoom 0 - [17] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_H), // HSV sliders - [18] = ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_S), // save as - [19] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F7), // gaussian blur - [20] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F8), // motion blur - [21] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_X), // liquify filter - [22] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // prev layer blending - [23] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_BSPC), // KC_NOrmal layer blending - [24] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // next layer blending - [25] = ACTION_MODS_KEY(MOD_LCTL, KC_Z), // step back - [26] = ACTION_MODS_KEY(MOD_LCTL, KC_Y), // step forward - [27] = ACTION_MODS_KEY(MOD_LCTL, KC_R), // rasterize - -}; diff --git a/keyboard/planck/keymaps/keymap_daniel.c b/keyboard/planck/keymaps/keymap_daniel.c deleted file mode 100644 index 234e48ff4a..0000000000 --- a/keyboard/planck/keymaps/keymap_daniel.c +++ /dev/null @@ -1,48 +0,0 @@ -#include "keymap_common.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = { /* Qwerty */ - {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {KC_TAB, 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_RSFT}, - {FUNC(3), 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] = { /* RAISE */ - {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_EQL}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, S(KC_MINS), KC_BSLS, 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} -}, -[2] = { /* LOWER */ - {S(KC_GRV), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, S(KC_EQL)}, - {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, - {KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_ENT}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -}, -[3] = { /* Qwerty */ - {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL}, - {KC_TAB, 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_RSFT}, - {KC_TRNS, 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 -} -}; - - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_MOMENTARY(1), // to RAISE - [2] = ACTION_LAYER_MOMENTARY(2), // to LOWER - [3] = ACTION_LAYER_MOMENTARY(3) // to LOWER -}; - -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/keymap_david.c b/keyboard/planck/keymaps/keymap_david.c deleted file mode 100644 index f483084801..0000000000 --- a/keyboard/planck/keymaps/keymap_david.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "keymap_common.h" -#include "beeps.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = { /* Qwerty */ - {KC_Q, KC_W, KC_E, KC_R, KC_T, KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {KC_A, KC_S, KC_D, KC_F, KC_G, KC_ENT, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, - {KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ESC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, - {M(10), 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, M(0), M(1), M(2), KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {KC_TRNS, KC_F11, KC_F12, M(0), M(1), M(2), M(3), M(4), M(5), M(6), M(7), 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, M(0), M(1), M(2), 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 RAISE - [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER - - [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 - if (record->event.pressed) { - switch(id) { - case 0: - true_note(12, 12, 20); - break; - case 1: - true_note(14, 14, 20); - break; - case 2: - true_note(16, 16, 20); - break; - case 3: - true_note(17, 17, 20); - break; - case 4: - true_note(19, 19, 20); - break; - case 5: - true_note(21, 21, 20); - break; - case 6: - true_note(23, 23, 20); - break; - case 7: - true_note(24, 24, 20); - break; - case 10: - - break; - } - } - return MACRO_NONE; -}; diff --git a/keyboard/planck/keymaps/keymap_default.c b/keyboard/planck/keymaps/keymap_default.c deleted file mode 100644 index 49670dafd3..0000000000 --- a/keyboard/planck/keymaps/keymap_default.c +++ /dev/null @@ -1,68 +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 "planck.h" -#include "backlight.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); - backlight_step(); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; diff --git a/keyboard/planck/keymaps/keymap_dzobert.c b/keyboard/planck/keymaps/keymap_dzobert.c deleted file mode 100644 index 665e9c20b6..0000000000 --- a/keyboard/planck/keymaps/keymap_dzobert.c +++ /dev/null @@ -1,49 +0,0 @@ -#include "keymap_common.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = { /* Qwerty */ - {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_TAB}, - {KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_BSPC}, - {KC_LALT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT}, - {KC_FN4, KC_RSFT, KC_LGUI, KC_LSFT, 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_TAB}, - {KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_BSPC}, - {KC_LALT, 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_RSFT, KC_LGUI, KC_LSFT, FUNC(2), KC_SPC, KC_SPC, FUNC(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -[2] = { /* RAISE */ - {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, - {KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_DEL}, - {KC_TRNS, KC_GRV, KC_MINS, KC_EQL, KC_QUOT, S(KC_QUOT), S(KC_LBRC), S(KC_RBRC), KC_LBRC, KC_RBRC, KC_BSLS, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(1), KC_HOME, KC_PGUP, KC_PGDN, KC_END} -}, -[3] = { /* LOWER */ - {KC_POWER,KC_PSCR, KC_SLCK, KC_PAUSE, KC_NLCK, KC_EXECUTE, KC_MENU, KC_APP, KC_7, KC_8, KC_9, KC_KP_SLASH}, - {KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_CAPS, KC_CANCEL, KC_UNDO, KC_AGAIN, KC_4, KC_5, KC_6, KC_KP_ASTERISK}, - {KC_TRNS, KC_INSERT,KC_CUT, KC_COPY, KC_PASTE, KC_BSLS, KC_9, KC_0, KC_1, KC_2, KC_3, KC_KP_MINUS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_0, KC_KP_DOT, KC_KP_ENTER, KC_KP_PLUS} -} -}; - -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), - -}; - -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; -}; \ No newline at end of file diff --git a/keyboard/planck/keymaps/keymap_gabriel.c b/keyboard/planck/keymaps/keymap_gabriel.c deleted file mode 100644 index 805484488b..0000000000 --- a/keyboard/planck/keymaps/keymap_gabriel.c +++ /dev/null @@ -1,108 +0,0 @@ -#include "planck.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 _LW 1 -#define _RS 2 -#define _FN 3 - -// This a slightly modified 'default' keymap that's closer to the Mac keyboard layout. I like the position -// of 'esc' and 'tab' better this way. I also got rid of the backlighting control key and the dvorak and -// colemak layers. I added an 'fn' layer that makes the 'bspc' a forward delete (like on OSX). -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* MIT Layout (QWERTY layer) - * - * ,-----------------------------------------------------------------------. - * | esc | q | w | e | r | t | y | u | i | o | p | bspc| - * |-----------------------------------------------------------------------| - * | tab | a | s | d | f | g | h | j | k | l | ; | ' | - * |-----------------------------------------------------------------------| - * |shift| z | x | c | v | b | n | m | , | . | / |enter| - * |-----------------------------------------------------------------------| - * | fn | ctl | alt | cmd |lower| spc |raise|left |down | up |right| - * `-----------------------------------------------------------------------' - */ -[_QW] = { /* QWERTY */ - {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {KC_TAB, 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 }, - {MO(_FN), KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC, KC_SPC, MO(_RS), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -/* MIT Layout (Raised layer) - * - * ,-----------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | - * |-----------------------------------------------------------------------| - * | | F1 | F2 | F3 | F4 | F5 | F6 | - | + | [ | ] | | | - * |-----------------------------------------------------------------------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | | - * |-----------------------------------------------------------------------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------' - */ -[_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_PLUS, KC_LBRC, KC_RBRC, KC_PIPE}, - {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, 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} -}, -/* MIT Layout (Lowered layer) - * - * ,-----------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | - * |-----------------------------------------------------------------------| - * | | F1 | F2 | F3 | F4 | F5 | F6 | _ | = | { | } | \ | - * |-----------------------------------------------------------------------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | | - * |-----------------------------------------------------------------------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------' - */ -[_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_EQL, KC_LCBR, KC_RCBR, KC_BSLS}, - {KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, 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} -}, -/* MIT Layout (FN layer) - * - * ,-----------------------------------------------------------------------. - * | | | | | | | | | | | | del | - * |-----------------------------------------------------------------------| - * | | | | | | | | | | | | | - * |-----------------------------------------------------------------------| - * | | | | | | | | | | | | | - * |-----------------------------------------------------------------------| - * | | | | | | | |home |pgdn |pgup | end | - * `-----------------------------------------------------------------------' - */ -[_FN] = { /* FUNCTION */ - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DELT}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END} -} -}; - -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); - backlight_step(); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; diff --git a/keyboard/planck/keymaps/keymap_jack.c b/keyboard/planck/keymaps/keymap_jack.c deleted file mode 100644 index 0b93bba33f..0000000000 --- a/keyboard/planck/keymaps/keymap_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/keymap_joe.c b/keyboard/planck/keymaps/keymap_joe.c deleted file mode 100644 index 5b7bbe2bbb..0000000000 --- a/keyboard/planck/keymaps/keymap_joe.c +++ /dev/null @@ -1,88 +0,0 @@ -#include "keymap_common.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = { /* Joe colemak */ - {F(3), KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_MINS}, - {KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_ENT }, - {F(15), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_UP, KC_QUOT}, - {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT} - }, - [1] = { /* Joe soft Colemak */ - {F(3), CM_Q, CM_W, CM_F, CM_P, CM_G, CM_J, CM_L, CM_U, CM_Y, CM_SCLN, KC_MINS}, - {KC_BSPC, CM_A, CM_R, CM_S, CM_T, CM_D, CM_H, CM_N, CM_E, CM_I, CM_O, KC_ENT }, - {F(15), CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, KC_COMM, KC_DOT, KC_UP, KC_QUOT}, - {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT} - }, - [2] = { /* Joe NUMPAD */ - {F(3), KC_NO, KC_UP, KC_NO, KC_NO, KC_NO, LSFT(KC_9), LSFT(KC_0), KC_PSLS, KC_P7, KC_P8, KC_P9 }, - {KC_BSPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, LSFT(KC_5), KC_PEQL, KC_PAST, KC_P4, KC_P5, KC_P6 }, - {F(15), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PCMM, KC_PMNS, KC_P1, KC_P2, KC_P3 }, - {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_TRNS, KC_TRNS, F(2), KC_PPLS, KC_P0, KC_PDOT, KC_PENT} - }, - [3] = { /* Joe 1337 haxOr5*/ - {F(3), KC_Q, KC_W, KC_F, KC_P, KC_6, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_MINS}, - {KC_BSPC, KC_4, KC_R, KC_5, KC_7, KC_D, KC_H, KC_N, KC_3, KC_1, KC_0, KC_ENT }, - {F(15), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_UP, KC_QUOT}, - {KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, F(1), KC_SPC, KC_SPC, F(2), KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT} - }, - [4] = { /* Joe LOWER fn1 */ - {KC_GRV, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, M(3), M(2), M(1), M(0) }, - {KC_BSPC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS}, - {KC_BSLS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LBRC, KC_RBRC, KC_PGUP, KC_EQL }, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), KC_TRNS, KC_TRNS, F(2), KC_NO, KC_HOME, KC_PGDN, KC_END } - }, - [5] = { /* Joe UPPER fn2 */ - {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 }, - {KC_DEL, KC_BTN1, KC_MS_U, KC_BTN2, KC_BTN3, KC_WH_U, KC_BTN4, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO }, - {KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_L, KC_WH_D, KC_WH_R, KC_NO, KC_NO, LCTL(KC_PGUP), LCTL(LALT(KC_UP)), LCTL(KC_PGDN) }, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, F(1), KC_NO, KC_NO, F(2), KC_NO, LCTL(LALT(KC_LEFT)), LCTL(LALT(KC_DOWN)), LCTL(LALT(KC_RGHT))} - }, - [6] = { /* Joe SPECIAL fn3 */ - {KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, - {KC_NO, KC_MPLY, KC_MPRV, KC_MNXT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RESET }, - {KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, - {F(6), F(7), F(8), F(9), F(1), KC_TRNS, KC_TRNS, F(2), KC_POWER, KC_WAKE, KC_SLEP, LCTL(LALT(KC_L))} - } -}; - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_MOMENTARY(4), // fn1 - [2] = ACTION_LAYER_MOMENTARY(5), // fn2 - - /* ESC on tap, fn3 on hold */ - [3] = ACTION_LAYER_TAP_KEY(6, KC_ESC), - - /* toggle layers */ - [6] = ACTION_DEFAULT_LAYER_SET(0), - [7] = ACTION_DEFAULT_LAYER_SET(1), - [8] = ACTION_DEFAULT_LAYER_SET(2), - [9] = ACTION_DEFAULT_LAYER_SET(3), - - /* tab on tap, shift on hold */ - [15] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB), -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch (id) { - case 0: - /* :) */ - return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_SCLN), TYPE(KC_0), UP(KC_LSFT), END ); - break; - case 1: - /* :( */ - return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_SCLN), TYPE(KC_9), UP(KC_LSFT), END ); - break; - case 2: - /* (: | :) */ - return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_9), TYPE(KC_SCLN), TYPE(KC_SPC), TYPE(KC_SPC), TYPE(KC_SCLN), TYPE(KC_0), UP(KC_LSFT), TYPE(KC_LEFT), TYPE(KC_LEFT), TYPE(KC_LEFT), END ); - break; - case 3: - /* :( | ): */ - return MACRODOWN( DOWN(KC_LSFT), TYPE(KC_SCLN), TYPE(KC_9), TYPE(KC_SPC), TYPE(KC_SPC), TYPE(KC_0), TYPE(KC_SCLN), UP(KC_LSFT), TYPE(KC_LEFT), TYPE(KC_LEFT), TYPE(KC_LEFT), END ); - break; - default: - break; - } - return MACRO_NONE; -} diff --git a/keyboard/planck/keymaps/keymap_kyle.c b/keyboard/planck/keymaps/keymap_kyle.c deleted file mode 100644 index da32b74f96..0000000000 --- a/keyboard/planck/keymaps/keymap_kyle.c +++ /dev/null @@ -1,49 +0,0 @@ -#include "keymap_common.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = { /* Qwerty */ - {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {KC_TAB, 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}, - {KC_RCTL, 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_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, - {KC_TAB, 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), 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] = { /* 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)), LSFT(RSFT(KC_D)), 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}, - {BL_STEP, 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 RAISE - [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER - - [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/keymap_leo.c b/keyboard/planck/keymaps/keymap_leo.c deleted file mode 100644 index 6d66441822..0000000000 --- a/keyboard/planck/keymaps/keymap_leo.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "keymap_common.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = { /* BASE */ - {KC_ESC, KC_LBRC, KC_QUOT, KC_SCLN, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, - {KC_TAB, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_ENT}, - {KC_LSFT, KC_DOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_COMM}, - {KC_LCTL, KC_LALT, KC_LGUI, FUNC(3), FUNC(2), KC_SPC, KC_SPC, FUNC(1), FUNC(3), KC_RGUI, KC_RALT, KC_RCTL} -}, -[2] = { /* RAISE */ - {RALT(KC_RBRC), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, S(KC_RBRC)}, - {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} -}, -[3] = { /* LOWER */ - {S(KC_EQL),S(KC_1),S(KC_2),S(KC_3),RALT(KC_5),S(KC_5), S(KC_6), S(KC_7),RALT(KC_7),RALT(KC_0),S(KC_0), KC_MINS}, - {KC_TRNS,RALT(KC_2),S(KC_SLSH),KC_NUBS,S(KC_NUBS),RALT(KC_MINS),RALT(KC_NUBS), KC_NUHS, S(KC_8), S(KC_9), S(KC_MINS), KC_SLSH}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RALT(KC_8), RALT(KC_9), KC_TRNS, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} -}, -[4] = { /* META */ - {KC_TRNS, KC_HOME, KC_UP, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_UP, KC_END, KC_TRNS, KC_DEL}, - {KC_TRNS, KC_RGHT, KC_DOWN, KC_LEFT, KC_PGUP, KC_TRNS, KC_PGUP, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_PGDN, KC_TRNS, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} -} -}; - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE - [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER - [3] = ACTION_LAYER_MOMENTARY(4), // to META - -}; - -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/keymap_lock.c b/keyboard/planck/keymaps/keymap_lock.c deleted file mode 100644 index bc81adcf97..0000000000 --- a/keyboard/planck/keymaps/keymap_lock.c +++ /dev/null @@ -1,123 +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) { - // 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/keyboard/planck/keymaps/keymap_max.c b/keyboard/planck/keymaps/keymap_max.c deleted file mode 100644 index 7fb29bc7a4..0000000000 --- a/keyboard/planck/keymaps/keymap_max.c +++ /dev/null @@ -1,49 +0,0 @@ -#include "keymap_common.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = { /* Qwerty */ - {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT }, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT}, - {KC_LCTL, BL_STEP, 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_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, - {KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_ENT }, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT}, - {KC_LCTL, BL_STEP, 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_TRNS}, - {KC_TRNS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_BSLS}, - {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), KC_TRNS}, - {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, S(KC_BSLS)}, - {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 RAISE - [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER - - [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/keymap_monkey.c b/keyboard/planck/keymaps/keymap_monkey.c deleted file mode 100644 index 21a2c146ab..0000000000 --- a/keyboard/planck/keymaps/keymap_monkey.c +++ /dev/null @@ -1,76 +0,0 @@ -#include "keymap_common.h" -#include "backlight.h" -#include "debug.h" - -#define COLEMAK_LAYER 0 -#define QWERTY_LAYER 1 -#define LOWER_LAYER 2 -#define UPPER_LAYER 3 -#define SPACEFN_LAYER 4 -#define TENKEY_LAYER 5 - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[COLEMAK_LAYER] = { /* Colemak */ - {KC_TAB, UNI(0x1961), KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, - {KC_LCTL, 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}, - {FUNC(5), KC_ESC, KC_LGUI, KC_LALT, FUNC(1), FUNC(6), FUNC(6), FUNC(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -[QWERTY_LAYER] = { /* 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_LCTL, 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}, - {FUNC(5), KC_ESC, KC_LGUI, KC_LALT, FUNC(1), FUNC(6), FUNC(6), FUNC(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -[LOWER_LAYER] = { /* LOWER */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DELETE}, - {KC_TRNS, FUNC(3), FUNC(4), RESET, DEBUG, 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, KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END} -}, -[UPPER_LAYER] = { /* RAISE */ - {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_DELETE}, - {KC_CALC, FUNC(3), FUNC(4), RESET, DEBUG, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -}, -[SPACEFN_LAYER] = { /* SpaceFN */ - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_UP, KC_END, KC_TRNS, KC_TRNS}, - {KC_TRNS, FUNC(3), FUNC(4), KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS}, - {KC_TRNS, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} -}, -[TENKEY_LAYER] = { /* TENKEY */ - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, KC_BSPC}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, KC_NLCK}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_1, KC_KP_2, KC_KP_3, KC_PDOT, KC_ENT}, - {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_SPC, KC_KP_0, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} -} -}; - -const uint16_t PROGMEM fn_actions[] = { - [1] = ACTION_LAYER_TAP_KEY(LOWER_LAYER, KC_BSPC), // Tap for backspace, hold for LOWER - [2] = ACTION_LAYER_TAP_KEY(UPPER_LAYER, KC_ENT), // Tap for enter, hold for RAISE - - [3] = ACTION_DEFAULT_LAYER_SET(COLEMAK_LAYER), - [4] = ACTION_DEFAULT_LAYER_SET(QWERTY_LAYER), - [5] = ACTION_LAYER_TOGGLE(TENKEY_LAYER), - - [6] = ACTION_LAYER_TAP_KEY(SPACEFN_LAYER, KC_SPC), // Tap for space, hold for SpaceFN -}; - -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); - backlight_step(); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; \ No newline at end of file diff --git a/keyboard/planck/keymaps/keymap_numpad.c b/keyboard/planck/keymaps/keymap_numpad.c deleted file mode 100644 index 7de4372ab0..0000000000 --- a/keyboard/planck/keymaps/keymap_numpad.c +++ /dev/null @@ -1,26 +0,0 @@ -#include "keymap_common.h" - -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_KP_MINUS, KC_KP_PLUS, KC_KP_PLUS, KC_KP_ENTER, KC_KP_ENTER}, - {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_KP_ASTERISK, KC_KP_9, KC_KP_6, KC_KP_3, KC_KP_DOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_KP_SLASH, KC_KP_8, KC_KP_5, KC_KP_2, KC_KP_0}, - {BL_STEP, KC_LCTL, KC_LALT, KC_LGUI, KC_NO, KC_SPC, KC_SPC, KC_NUMLOCK, KC_KP_7, KC_KP_4, KC_KP_1, KC_KP_0} - // Space is repeated to accommadate for both spacebar wiring positions -} -}; - -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: - return MACRODOWN(T(CM_T), END); - break; - } - return MACRO_NONE; -}; \ No newline at end of file diff --git a/keyboard/planck/keymaps/kyle.c b/keyboard/planck/keymaps/kyle.c new file mode 100644 index 0000000000..da32b74f96 --- /dev/null +++ b/keyboard/planck/keymaps/kyle.c @@ -0,0 +1,49 @@ +#include "keymap_common.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = { /* Qwerty */ + {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_TAB, 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}, + {KC_RCTL, 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_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {KC_TAB, 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), 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] = { /* 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)), LSFT(RSFT(KC_D)), 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}, + {BL_STEP, 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 RAISE + [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER + + [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/leo.c b/keyboard/planck/keymaps/leo.c new file mode 100644 index 0000000000..6d66441822 --- /dev/null +++ b/keyboard/planck/keymaps/leo.c @@ -0,0 +1,46 @@ +#include "keymap_common.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = { /* BASE */ + {KC_ESC, KC_LBRC, KC_QUOT, KC_SCLN, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, + {KC_TAB, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_ENT}, + {KC_LSFT, KC_DOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_COMM}, + {KC_LCTL, KC_LALT, KC_LGUI, FUNC(3), FUNC(2), KC_SPC, KC_SPC, FUNC(1), FUNC(3), KC_RGUI, KC_RALT, KC_RCTL} +}, +[2] = { /* RAISE */ + {RALT(KC_RBRC), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, S(KC_RBRC)}, + {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} +}, +[3] = { /* LOWER */ + {S(KC_EQL),S(KC_1),S(KC_2),S(KC_3),RALT(KC_5),S(KC_5), S(KC_6), S(KC_7),RALT(KC_7),RALT(KC_0),S(KC_0), KC_MINS}, + {KC_TRNS,RALT(KC_2),S(KC_SLSH),KC_NUBS,S(KC_NUBS),RALT(KC_MINS),RALT(KC_NUBS), KC_NUHS, S(KC_8), S(KC_9), S(KC_MINS), KC_SLSH}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RALT(KC_8), RALT(KC_9), KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} +}, +[4] = { /* META */ + {KC_TRNS, KC_HOME, KC_UP, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_UP, KC_END, KC_TRNS, KC_DEL}, + {KC_TRNS, KC_RGHT, KC_DOWN, KC_LEFT, KC_PGUP, KC_TRNS, KC_PGUP, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_PGDN, KC_TRNS, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} +} +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_MOMENTARY(2), // to RAISE + [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER + [3] = ACTION_LAYER_MOMENTARY(4), // to META + +}; + +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.c b/keyboard/planck/keymaps/lock.c new file mode 100644 index 0000000000..bc81adcf97 --- /dev/null +++ b/keyboard/planck/keymaps/lock.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/keyboard/planck/keymaps/max.c b/keyboard/planck/keymaps/max.c new file mode 100644 index 0000000000..7fb29bc7a4 --- /dev/null +++ b/keyboard/planck/keymaps/max.c @@ -0,0 +1,49 @@ +#include "keymap_common.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = { /* Qwerty */ + {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT }, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT}, + {KC_LCTL, BL_STEP, 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_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_ENT }, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT}, + {KC_LCTL, BL_STEP, 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_TRNS}, + {KC_TRNS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_BSLS}, + {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), KC_TRNS}, + {KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, S(KC_BSLS)}, + {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 RAISE + [2] = ACTION_LAYER_MOMENTARY(3), // to LOWER + + [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/monkey.c b/keyboard/planck/keymaps/monkey.c new file mode 100644 index 0000000000..21a2c146ab --- /dev/null +++ b/keyboard/planck/keymaps/monkey.c @@ -0,0 +1,76 @@ +#include "keymap_common.h" +#include "backlight.h" +#include "debug.h" + +#define COLEMAK_LAYER 0 +#define QWERTY_LAYER 1 +#define LOWER_LAYER 2 +#define UPPER_LAYER 3 +#define SPACEFN_LAYER 4 +#define TENKEY_LAYER 5 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[COLEMAK_LAYER] = { /* Colemak */ + {KC_TAB, UNI(0x1961), KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {KC_LCTL, 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}, + {FUNC(5), KC_ESC, KC_LGUI, KC_LALT, FUNC(1), FUNC(6), FUNC(6), FUNC(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +[QWERTY_LAYER] = { /* 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_LCTL, 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}, + {FUNC(5), KC_ESC, KC_LGUI, KC_LALT, FUNC(1), FUNC(6), FUNC(6), FUNC(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, +[LOWER_LAYER] = { /* LOWER */ + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DELETE}, + {KC_TRNS, FUNC(3), FUNC(4), RESET, DEBUG, 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, KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END} +}, +[UPPER_LAYER] = { /* RAISE */ + {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_DELETE}, + {KC_CALC, FUNC(3), FUNC(4), RESET, DEBUG, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, +[SPACEFN_LAYER] = { /* SpaceFN */ + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_UP, KC_END, KC_TRNS, KC_TRNS}, + {KC_TRNS, FUNC(3), FUNC(4), KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} +}, +[TENKEY_LAYER] = { /* TENKEY */ + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_7, KC_KP_8, KC_KP_9, KC_PMNS, KC_BSPC}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, KC_NLCK}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_1, KC_KP_2, KC_KP_3, KC_PDOT, KC_ENT}, + {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_SPC, KC_KP_0, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS} +} +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_KEY(LOWER_LAYER, KC_BSPC), // Tap for backspace, hold for LOWER + [2] = ACTION_LAYER_TAP_KEY(UPPER_LAYER, KC_ENT), // Tap for enter, hold for RAISE + + [3] = ACTION_DEFAULT_LAYER_SET(COLEMAK_LAYER), + [4] = ACTION_DEFAULT_LAYER_SET(QWERTY_LAYER), + [5] = ACTION_LAYER_TOGGLE(TENKEY_LAYER), + + [6] = ACTION_LAYER_TAP_KEY(SPACEFN_LAYER, KC_SPC), // Tap for space, hold for SpaceFN +}; + +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); + backlight_step(); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; \ No newline at end of file diff --git a/keyboard/planck/keymaps/numpad.c b/keyboard/planck/keymaps/numpad.c new file mode 100644 index 0000000000..7de4372ab0 --- /dev/null +++ b/keyboard/planck/keymaps/numpad.c @@ -0,0 +1,26 @@ +#include "keymap_common.h" + +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_KP_MINUS, KC_KP_PLUS, KC_KP_PLUS, KC_KP_ENTER, KC_KP_ENTER}, + {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_KP_ASTERISK, KC_KP_9, KC_KP_6, KC_KP_3, KC_KP_DOT}, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_KP_SLASH, KC_KP_8, KC_KP_5, KC_KP_2, KC_KP_0}, + {BL_STEP, KC_LCTL, KC_LALT, KC_LGUI, KC_NO, KC_SPC, KC_SPC, KC_NUMLOCK, KC_KP_7, KC_KP_4, KC_KP_1, KC_KP_0} + // Space is repeated to accommadate for both spacebar wiring positions +} +}; + +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: + return MACRODOWN(T(CM_T), END); + break; + } + return MACRO_NONE; +}; \ No newline at end of file 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 -- cgit v1.2.3 From c9a096dc99a2af45d288f9915d70fa339c0e5a6e Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Jan 2016 00:57:35 -0500 Subject: 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)","") -- cgit v1.2.3 From 547fa6e461ceacd04e7daa0b25b58f7d64d29239 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Jan 2016 01:01:32 -0500 Subject: 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; } -- cgit v1.2.3 From f66a251e5d9d741ccd3eda5a87de5a71c14843e9 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 16 Jan 2016 01:01:32 -0500 Subject: 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; } -- cgit v1.2.3 From fb181304083b884c60a30f64a634b592479aed6d Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 16 Jan 2016 01:35:28 +0100 Subject: Implemented Dvorak layer --- keyboard/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 -- cgit v1.2.3 From eb61700912f1713ba27d34c23d7f07be66ee6513 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 20 Jan 2016 00:06:52 -0500 Subject: 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/audio.h | 11 + quantum/beeps.c | 265 ---------------------- quantum/beeps.h | 15 -- quantum/keymap_midi.c | 4 +- quantum/quantum.mk | 7 +- tmk_core/common.mk | 3 + tmk_core/protocol/lufa/lufa.c | 7 +- 12 files changed, 413 insertions(+), 340 deletions(-) create mode 100644 quantum/audio.c create mode 100644 quantum/audio.h delete mode 100644 quantum/beeps.c delete mode 100644 quantum/beeps.h 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/audio.h b/quantum/audio.h new file mode 100644 index 0000000000..99203cea7a --- /dev/null +++ b/quantum/audio.h @@ -0,0 +1,11 @@ +#include +#include +#include +#include + +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/beeps.h b/quantum/beeps.h deleted file mode 100644 index 4ccc344973..0000000000 --- a/quantum/beeps.h +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include -#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/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, -- cgit v1.2.3 From a820533ab770e1919f190c102a091c1060f6302e Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 20 Jan 2016 00:15:29 -0500 Subject: keymap.c changes, disable grep stuff --- keyboard/planck/Makefile | 10 ++- keyboard/planck/keymaps/default.c | 68 ----------------- keyboard/planck/keymaps/default/README.md | 34 +++++++++ keyboard/planck/keymaps/default/keymap.c | 68 +++++++++++++++++ keyboard/planck/keymaps/jack.c | 50 ------------ keyboard/planck/keymaps/lock.c | 123 ------------------------------ keyboard/planck/keymaps/lock/README.md | 3 + keyboard/planck/keymaps/lock/keymap.c | 123 ++++++++++++++++++++++++++++++ keyboard/planck/keymaps/test/README.md | 3 - keyboard/planck/keymaps/test/default.c | 85 --------------------- quantum/quantum.mk | 28 +++---- 11 files changed, 249 insertions(+), 346 deletions(-) delete mode 100644 keyboard/planck/keymaps/default.c create mode 100644 keyboard/planck/keymaps/default/README.md create mode 100644 keyboard/planck/keymaps/default/keymap.c delete mode 100644 keyboard/planck/keymaps/jack.c delete mode 100644 keyboard/planck/keymaps/lock.c create mode 100644 keyboard/planck/keymaps/lock/README.md create mode 100644 keyboard/planck/keymaps/lock/keymap.c 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.c b/keyboard/planck/keymaps/default.c deleted file mode 100644 index 49670dafd3..0000000000 --- a/keyboard/planck/keymaps/default.c +++ /dev/null @@ -1,68 +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 "planck.h" -#include "backlight.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); - backlight_step(); - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; -}; 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/keymap.c b/keyboard/planck/keymaps/default/keymap.c new file mode 100644 index 0000000000..49670dafd3 --- /dev/null +++ b/keyboard/planck/keymaps/default/keymap.c @@ -0,0 +1,68 @@ +// 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" +#include "backlight.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); + backlight_step(); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; 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.c b/keyboard/planck/keymaps/lock.c deleted file mode 100644 index bc81adcf97..0000000000 --- a/keyboard/planck/keymaps/lock.c +++ /dev/null @@ -1,123 +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) { - // 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/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/keymap.c b/keyboard/planck/keymaps/lock/keymap.c new file mode 100644 index 0000000000..bc81adcf97 --- /dev/null +++ b/keyboard/planck/keymaps/lock/keymap.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/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 -- cgit v1.2.3 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: 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 ), -- cgit v1.2.3 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: replaced qwertz with adnw-koy as default --- .../ergodox_ez/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: added koy layer to default, but disabled it --- keyboard/ergodox_ez/keymaps/keymap_osx_de.c | 68 ++++++++++++++-------- .../ergodox_ez/keymaps/keymap_osx_de_adnw_koy.c | 42 ++++++------- 2 files changed, 66 insertions(+), 44 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_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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + 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_MUTE, KC_MPRV, KC_MNXT, KC_UP, KC_TRNS, - KC_VOLU, KC_VOLD, KC_LEFT, KC_DOWN, KC_RIGHT, + 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 ), -// Cursor layer +// 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: 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 -- cgit v1.2.3 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: 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; + } + +}; -- cgit v1.2.3 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: new hex file --- keyboard/ergodox_ez/keymaps/osx_de/osx_de.hex | 44 +++++++++++++-------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/keyboard/ergodox_ez/keymaps/osx_de/osx_de.hex b/keyboard/ergodox_ez/keymaps/osx_de/osx_de.hex index eb82384d54..2c83055b0d 100644 --- a/keyboard/ergodox_ez/keymaps/osx_de/osx_de.hex +++ b/keyboard/ergodox_ez/keymaps/osx_de/osx_de.hex @@ -16,17 +16,17 @@ :1000F000E20001E001E101E20002E001E3010602A9 :100100000602E30002E00001E00002E001E3011961 :10011000021902E30002E00001E0000000F0A1F09B -:10012000A329002B000354E100358100001E0014B8 +:10012000A329002B00E200E100358100001E00142D :100130000004001D7135004D001F001A0016001B41 :1001400000E1044C00200008000700060050002ACF :100150000021001500090019004F004A0022001775 -:10016000000A000500000002540130E3000000E234 -:1001700000000003300230E7000000E60000002E1F -:100180007F23001C000B0011000000045424001801 +:10016000000A000500000003300130E3000000E257 +:1001700000000002540230E7000000E60000000426 +:100180005423001C000B00110000002E7F240018D7 :10019000000D00100052004B0025000C000E003630 :1001A0000051002C00260012000F003700E1082843 :1001B00000270013003300387130004E002D002F4F -:1001C000003482E5003181000001000100010001DE +:1001C000003474E5003181000001000100010001EC :1001D00000010000003A003500310001000100017B :1001E000003B0035022102350001004C003C001E9E :1001F0000224062202010001003D002D02240224F7 @@ -38,26 +38,26 @@ :100250000425041F021E0201004300310026043160 :1002600002010001004400450001002D02010000D0 :100270000001000100010001000100000001000177 -:10028000000100FB000100010001000100F200F983 -:1002900000010001000100F000F100FA00F400018B -:1002A0000001000100F300FC00F500010001000165 -:1002B000000100F600000001000100010000000143 -:1002C0000000000100010001000000010000000129 -:1002D0000001000100010001000000010001000117 -:1002E000000100A800A9000100010001000100AC0C -:1002F00000AA00B600010001000100AB005000019F +:100280000001000100010001000100F400F200FB88 +:1002900000010001000100F000F100FA000100017E +:1002A000000100F500F300FC00010001000100F96D +:1002B00000FA00F60000000100010001000000014A +:1002C0000000000100A80001000000010000000182 +:1002D0000001000100A900AA0000000100010001C6 +:1002E000000100010001000100010001000100AC5B +:1002F000000100B600010001000100AB0050000148 :1003000000010001000100520051000100AE000197 :1003100000010001004F0000000100010001000188 -:1003200000010000000100010001000100010001C6 -:1003300000010001000100010001000100010001B5 -:1003400000010001000100010001000100010001A5 -:100350000001000100010001000100010000000196 +:10032000000100000001000E000B001B7101000124 +:100330000001003700040014000100010001001258 +:10034000000800340001000100010036000C002FFD +:10035000000100010001001D001800330000000131 :100360000001000100000001000000010001000187 -:100370000000000100000001000100010001000177 -:100380000000000100010001000100010001000166 -:100390000001000100010001000100010001000155 -:1003A00000010001005000010001000100010052A5 -:1003B000005100010001000100010001004F000098 +:100370000000000100000001000100190007000555 +:10038000000000010001000A001700130001000135 +:10039000000100060015001A000100010001000F15 +:1003A00000110010000100010001002D0016000DD9 +:1003B000710100010038001C0009820100010000E9 :1003C0000001000100010001000100000001000126 :1003D00000010001000100010001000100500001C6 :1003E0000001000100010052005100010001000164 -- cgit v1.2.3 From caf82bcacef6dc5eacfd8c7fccff304bdb38595b Mon Sep 17 00:00:00 2001 From: Evan Pitstick Date: Fri, 22 Jan 2016 07:33:56 -0500 Subject: 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 } -- cgit v1.2.3 From 51fec6647a288862244a50b616255d84564db02d Mon Sep 17 00:00:00 2001 From: Olivier Lechevalier Date: Sat, 23 Jan 2016 14:07:13 +0900 Subject: Add colemak keymap to Ergodox EZ. --- keyboard/ergodox_ez/keymaps/colemak/colemak.hex | 1471 +++++++++++++++++++++++ keyboard/ergodox_ez/keymaps/colemak/keymap.c | 184 +++ keyboard/ergodox_ez/keymaps/colemak/readme.md | 4 + 3 files changed, 1659 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 0000000000..cd3bf781af --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/colemak/colemak.hex @@ -0,0 +1,1471 @@ +:100000000C9400070C9444070C9444070C94440788 +:100010000C9444070C9444070C9444070C94440734 +:100020000C9444070C9444070C9458120C942A1313 +:100030000C9444070C9444070C9444070C94440714 +:100040000C9444070C94002C0C9444070C94440723 +:100050000C9444070C94F8210C9444070C94440726 +:100060000C9444070C9444070C9444070C944407E4 +:100070000C9444070C9444070C9444070C944407D4 +:100080000C9444070C9444070C9444070C944407C4 +:100090000C9444070C9444070C9444070C944407B4 +:1000A0000C9444070C9444070C9444079713B91319 +:1000B000A714B913A714FE132114A71476148914D6 +:1000C000D017D017FF17FF1742188018991A991ADE +:1000D0009918991A9A199A196D1A991A991A841ACB +:1000E0000000F0A12E004C002A00E1003581000044 +:1000F0001E00140004001D7134004D001F001A0082 +:1001000015001B00E1042A0020000900160006006B +:1001100050002C0021001300170019004F004A0066 +:1001200022000A0007000500000065745000015419 +:100130000000007F0000E3004F0001540000007742 +:100140000000E20023000D000B000E0000002971EA +:1001500024000F001100100052004B002500180071 +:10016000080036005100280026001C000C00370053 +:100170002F002B00270033001282387130004E0010 +:100180002D0031003400E500C10000000100010035 +:1001900001000100010000003A001E0220022202BC +:1001A000010001003B001F022102230201000100A7 +:1001B0003C002F0226022F00010001003D0030020A +:1001C00027023000010001003E00310235003502F7 +:1001D000000001000100010000000100000001001A +:1001E0000100010000000100000001003F0052007A +:1001F00051002402000001004000240021001E00E4 +:10020000010001004100250022001F00370001000D +:1002100042002600230020002700010043002502A1 +:100220002E0231002E0001004400450001000100B3 +:1002300001000000010001000100010001000000B8 +:1002400001000100010001000100010001000100A6 +:10025000F2000100010001000100F000F1000100C6 +:10026000F400010001000100F3000100F5000100AD +:100270000100010001000100000001000100010077 +:100280000000010000000100010001000000010069 +:100290000000010001000100010001000000010058 +:1002A0000100010001000100A9000100010001009E +:1002B0000100AC00AA00B600010001000100AB0083 +:1002C000A80001000100010001000100010001007F +:1002D00001000100AE000100010000000A0025300D +:1002E000313662003A200025303258000A722F63FE +:1002F0002030313233343536373839414243444582 +:10030000460A000A002530325800626F756E636538 +:10031000213A20006C6566742073696465206174FD +:100320007461636865640A006C656674207369644F +:1003300065206E6F7420726573706F6E64696E678E +:100340000A00747279696E6720746F207265736534 +:1003500074206D637032333031380A000A444542EC +:1003600055473A20656E61626C65642E0A005B73C6 +:100370005D004B6579626F617264207374617274A1 +:100380002E0A005B575D005B535D005B525D005BB6 +:10039000445D005B435D0016034500720067006F1B +:1003A0000044006F007800200045005A000000164D +:1003B000034500720067006F0044006F0078002062 +:1003C0000045005A0000000403090409028D0005DD +:1003D0000100A0FA09040000010301010009211134 +:1003E000010001223F000705810308000A090401FA +:1003F000000103010200092111010001224D000743 +:1004000005820308000A0904020001030000000934 +:1004100021110100012236000705830308000A09A3 +:100420000403000203000000092111010001222041 +:1004300000070584032000010705040320000109CB +:100440000404000103000000092111010001223908 +:1004500000070585031000011201100100000008CB +:10046000EDFE071301000102000105010906A101CB +:10047000050719E029E71500250195087501810296 +:100480000508190129059505750191029501750366 +:100490009101050719002977150025019578750147 +:1004A0008102C00631FF0974A1010975150025FFFD +:1004B0009520750881020976150025FF952075089D +:1004C0009102C005010980A101850216010026B72D +:1004D000001A01002AB700751095018100C0050CB3 +:1004E0000901A1018503160100269C021A01002AB8 +:1004F0009C02751095018100C005010902A1010946 +:1005000001A10005091901290515002501950575A9 +:100510000181029501750381010501093009311539 +:1005200081257F95027508810609381581257F95FB +:100530000175088106050C0A38021581257F950191 +:1005400075088106C0C005010906A101050719E06B +:1005500029E71500250195087501810295017508A7 +:10056000810105081901290595057501910295017B +:10057000750391010507190029FF150025FF950650 +:1005800075088100C00A002530325820006B65795B +:10059000626F6172645F7265706F72743A20000AF4 +:1005A0000025303258006B6579626F6172645F7349 +:1005B00065745F6C65643A200064656C5F6B657997 +:1005C0005F6269743A2063616E27742064656C3AD7 +:1005D00020253032580A006164645F6B65795F6280 +:1005E00069743A2063616E2774206164643A20253F +:1005F0003032580A00646F6E652E0A00626F6F67B2 +:100600006D61676963207363616E3A202E2E2E2020 +:1006100000290A002575002F002575005D2800259A +:10062000640020002564002000256400200025646B +:10063000007C0025303258006D6F7573656B6579ED +:10064000205B62746E7C782079207620685D287249 +:1006500065702F61636C293A205B006D6B5F776872 +:1006600065656C5F74696D655F746F5F6D6178203F +:100670003D2025640A006D6B5F776865656C5F6D72 +:1006800061785F7370656564203D2025640A006DA4 +:100690006B5F74696D655F746F5F6D6178203D207D +:1006A00025640A006D6B5F6D61785F7370656564CA +:1006B000203D2025640A006D6B5F696E746572765B +:1006C000616C203D2025640A006D6B5F64656C6180 +:1006D00079203D2025640A006D6B5F776865656C45 +:1006E0005F74696D655F746F5F6D6178203D202573 +:1006F000640A006D6B5F776865656C5F6D61785F3C +:100700007370656564203D2025640A006D6B5F741D +:10071000696D655F746F5F6D6178203D2025640AA7 +:10072000006D6B5F6D61785F7370656564203D205F +:1007300025640A006D6B5F696E74657276616C206A +:100740003D2025640A006D6B5F64656C6179203D16 +:100750002025640A000A00257500363A207768656E +:10076000656C5F74696D655F746F5F6D61783A2069 +:10077000000A00257500353A20776865656C5F6D65 +:1007800061785F73706565643A20000A0025750022 +:10079000343A2074696D655F746F5F6D61783A20DB +:1007A000000A00257500333A206D61785F7370652B +:1007B00065643A20000A00257500323A20696E749B +:1007C000657276616C286D73293A20000A002575E0 +:1007D00000313A2064656C6179282A31306D7329C3 +:1007E0003A20000A092D2056616C756573202D0A88 +:1007F000004D3E004D25643E20003F00736574208F +:1008000064656661756C740A00433E200077686514 +:1008100072652064656C74613A20637572736F72DF +:100820003D25642C20776865656C3D25640A536519 +:100830006520687474703A2F2F656E2E77696B6926 +:1008400070656469612E6F72672F77696B692F4DD0 +:100850006F7573655F6B6579730A000A092D204D0A +:100860006F7573656B6579202D0A4553432F713A77 +:1008700009717569740A313A0964656C6179282ACD +:1008800031306D73290A323A09696E746572766186 +:100890006C286D73290A333A096D61785F7370654E +:1008A00065640A343A0974696D655F746F5F6D61E0 +:1008B000780A353A09776865656C5F6D61785F73B2 +:1008C000706565640A363A09776865656C5F7469B6 +:1008D0006D655F746F5F6D61780A0A703A097072B6 +:1008E000696E742076616C7565730A643A09736584 +:1008F000742064656661756C74730A75703A092BAF +:10090000310A646F776E3A092D310A706775703A53 +:10091000092B31300A7067646F776E3A092D3130D8 +:100920000A0A7370656564203D2064656C746120FB +:100930002A206D61785F7370656564202A202872B3 +:100940006570656174202F2074696D655F746F5FD9 +:100950006D6178290A003F004D3E2000433E200093 +:100960004C25640A000A092D20436F6E736F6C6575 +:10097000202D0A4553432F713A09717569740A6D28 +:100980003A096D6F7573656B65790A000A092D2048 +:100990004D61676963202D0A643A09646562756771 +:1009A0000A783A096465627567206D6174726978C6 +:1009B0000A6B3A096465627567206B6579626F61DD +:1009C00072640A6D3A096465627567206D6F7573AC +:1009D000650A763A0976657273696F6E0A733A0929 +:1009E0007374617475730A633A09636F6E736F6C25 +:1009F00065206D6F64650A302D343A096C61796544 +:100A000072302D34284631302D4634290A50617514 +:100A1000733A09626F6F746C6F616465720A653A4C +:100A200009656570726F6D0A6E3A094E4B524F0A36 +:100A30007A3A09736C656570204C4544207465737F +:100A4000740A000A002575002E6E6B726F3A200042 +:100A50000A002575002E737761705F6261636B73A6 +:100A60006C6173685F6261636B73706163653A2088 +:100A7000000A002575002E737761705F67726176DA +:100A8000655F6573633A20000A002575002E6E6F5E +:100A90005F6775693A20000A002575002E7377613B +:100AA000705F72616C745F726775693A20000A004A +:100AB0002575002E737761705F6C616C745F6C6775 +:100AC00075693A20000A002575002E636170736C09 +:100AD0006F636B5F746F5F636F6E74726F6C3A20DD +:100AE000000A002575002E737761705F636F6E7466 +:100AF000726F6C5F636170736C6F636B3A20000A96 +:100B00000025303258006B65796D61705F636F6EE0 +:100B10006669672E7261773A20000A002575002EFB +:100B20006D6F7573653A20000A002575002E6B65A0 +:100B300079626F6172643A20000A002575002E6D9B +:100B400061747269783A20000A002575002E656E7E +:100B500061626C653A20000A0025303258006465F5 +:100B60006275675F636F6E6669672E7261773A20A0 +:100B7000000A0025750064656661756C745F6C61C0 +:100B80007965723A20003F004E4B524F3A206F6613 +:100B9000660A004E4B524F3A206F6E0A0074696D20 +:100BA00065725F636F756E743A202530346C580A35 +:100BB000006B6579626F6172645F6E6B726F3A2071 +:100BC00025580A006B6579626F6172645F69646CB5 +:100BD000653A2025580A006B6579626F6172645F1F +:100BE00070726F746F636F6C3A2025580A00686FDB +:100BF00073745F6B6579626F6172645F6C65647357 +:100C000028293A2025580A000A092D2053746174B6 +:100C10007573202D0A004743433A20342E392E3273 +:100C2000204156522D4C4942433A20312E382E3124 +:100C3000204156525F415243483A20617672350A4C +:100C4000004F5054494F4E533A204C554641204294 +:100C50004F4F544D41474943204D4F5553454B4508 +:100C6000592045585452414B455920434F4E534FFC +:100C70004C4520434F4D4D414E44204E4B524F204A +:100C80003531320A004255494C443A2061313864CA +:100C9000636330202831343A30353A3534204A61A4 +:100CA0006E2032332032303136290A005649443A18 +:100CB00020307846454544284572676F446F782058 +:100CC000455A29205049443A20307831333037286A +:100CD0004572676F446F7820455A29205645523A2D +:100CE000203078303030310A00444553433A207484 +:100CF0002E6D2E6B2E206B6579626F61726420669B +:100D000069726D7761726520666F72204572676FD8 +:100D1000646F780A000A092D2056657273696F6E38 +:100D2000202D0A000A6D6F7573653A206F66660A9A +:100D3000000A6D6F7573653A206F6E0A000A6B6565 +:100D400079626F6172643A206F66660A000A6B65A9 +:100D500079626F6172643A206F6E0A000A6D617485 +:100D60007269783A206F66660A000A6D617472696A +:100D7000783A206F6E0A000A64656275673A206FE0 +:100D80006E0A000A64656275673A206F66660A003B +:100D90000A0A626F6F746C6F616465722E2E2E206A +:100DA00000433E20006565636F6E6669673A0A001E +:100DB000536C656570204C454420746573740A005B +:100DC0000000000000000000000000010204060A0C +:100DD0000F17202C3A4A5D71879DB3C7DAE9F5FCFD +:100DE000FFFCF5E9DAC7B39D87715D4A3A2C2017FD +:100DF0000F0A0604020100000000000000000000CD +:100E000011241FBECFEFDAE0DEBFCDBF04B603FE74 +:100E100024C08091F9019091FA01A091FB01B09159 +:100E2000FC018730904BA740B04BB9F41092F90108 +:100E30001092FA011092FB011092FC0114BE84B7CB +:100E4000877F84BF88E10FB6F8948093600010928A +:100E500060000FBEE0E0FFE3099511E0A0E0B1E023 +:100E6000ECE9FBE502C005900D92AA33B107D9F772 +:100E700011E0AAE3B1E001C01D92A93FB107E1F77B +:100E80000E94900F0C94CC2D0C940000FF93EF93D4 +:100E9000E0913A01F0913B01309709F00995EF910B +:100EA000FF910895FC018591803011F0EFDFFBCFB9 +:100EB0000895FF27E0E230E247FF0CC0419597FF1D +:100EC00009C0EDE26095709580959095611D711D4A +:100ED000811D911D27FF02C0219530E350E2AA2712 +:100EE000660F771F881F991FAA1FA41710F0A41B55 +:100EF00063955A95A9F7AA3008F0A95FA05DAF9352 +:100F0000F395611571058105910541F7ED3211F4F5 +:100F1000EF93F395F21718F43F93F395FBCF8F916E +:100F2000B5DFFA95E1F70895E991F991859180305F +:100F300021F0853219F0AADFF9CF089520E0E89476 +:100F400055915532C1F3503311F4689455915A3389 +:100F500048F4505390F3220F022E220F220F200D3F +:100F6000250FF4CF0EF4219589919991533619F3F9 +:100F7000533729F1533559F1BC0188279927E89453 +:100F80005C3621F48991999168945591543639F4DD +:100F900046EF7EF077FF0DC08FEF9FEF0AC0553709 +:100FA0004AE039F0583540E121F0523642E009F08C +:100FB0000895FF93EF937DDFEF91FF91B7CFFF93FC +:100FC000EF93FC0181918030B9F360DFFBCFFF9399 +:100FD000EF9368DFF1CFDF93CF93CDB7DEB72596E0 +:100FE000A3DFCF91DF91089561110BC0FC018281D5 +:100FF000882321F085EE0E946D1603C085EE0E94C5 +:10100000351780E090E0089508956091BC017091DB +:10101000BD018091BE019091BF010E94FB205698B6 +:101020005E9825982D9826982E9827982F9881308D +:1010300019F0823021F00895259A2D9A0895269A64 +:101040002E9A089585E098E0892B11F00E940508FA +:1010500080E090E0089556985E9825982D982698FF +:101060002E9827982F988FEF90E090938900809387 +:10107000880090938B0080938A0090938D008093DA +:101080008C00259A2D9A2FEF80E792E02150804026 +:101090009040E1F700C00000269A2E9A2FEF80E7DB +:1010A00092E0215080409040E1F700C00000279A74 +:1010B0002F9A2FEF80E792E0215080409040E1F797 +:1010C00000C0000025982D982FEF80E792E0215076 +:1010D00080409040E1F700C0000026982E982FEF46 +:1010E00080E792E0215080409040E1F700C000008E +:1010F00027982F9856985E9825982D9826982E9880 +:1011000027982F98089589EA8093800089E080933A +:10111000810024982C983F988AB18F748AB96E9870 +:10112000479A8BB1806B8BB9769A0E942B0884E02A +:1011300098E0892B11F00E94040880E090E0089567 +:1011400080E28093000180913C0181110EC00E94D9 +:10115000EF0881E080933C012FEF83ED90E3215075 +:1011600080409040E1F700C0000080E40E94F50854 +:101170008093000181112EC00E941F0980930001FD +:10118000811128C00E941F0980930001811122C093 +:101190008FE30E941F098093000181111BC00E94F0 +:1011A000170980E40E94F50880930001811112C0A4 +:1011B0008CE00E941F098093000181110BC00E94E6 +:1011C0001F0980930001811105C08FE30E941F0950 +:1011D000809300010E9417098091000108951092E8 +:1011E000B9008AE08093B800089594EA9093BC0017 +:1011F0009091BC0097FFFCCF9091B900987F9830F8 +:1012000021F0903111F081E008958093BB0084E8D3 +:101210008093BC008091BC0087FFFCCF8091B90017 +:10122000887F883111F0803471F780E0089584E977 +:101230008093BC008091BC0084FDFCCF0895809316 +:10124000BB0084E88093BC008091BC0087FFFCCF8A +:101250009091B900987F81E0983209F480E0089578 +:1012600084E88093BC008091BC0087FFFCCF809114 +:10127000BB00089580910001811115C080E40E9497 +:10128000F5088093000181110CC082E10E941F09C2 +:1012900080930001811105C08FEF0E941F09809388 +:1012A00000010E94170984B1807F84B985B1807FD5 +:1012B00085B98AB1837F8AB98BB1837F8BB93E9818 +:1012C000469808950E94A008809300010E943A0960 +:1012D00080B38C7080BB81B3836F81BBAEE3B1E020 +:1012E000ECE4F1E08EE08E0F11921D928E13FCCF94 +:1012F00083E898E0892B11F00C94830808959F925D +:10130000AF92BF92CF92DF92EF92FF920F931F9313 +:10131000CF93DF93809100018823E1F080913D011C +:101320008F5F80933D01811115C082E493E00E949C +:1013300052070E94A00880930001882329F088E2C8 +:1013400093E00E94520706C084E193E00E94520796 +:101350000E942B080EE311E0C0E0D0E0BB24B39460 +:1013600082E0A82ECC24C394D12C25E0E22E23E0E9 +:10137000F22EC730D10500F580910001811164C0C3 +:1013800080E40E94F50880930001811112C082E17F +:101390000E941F098093000181110BC0C6010C2E11 +:1013A00001C0880F0A94EAF780950E941F09809374 +:1013B00000010E94170948C0CA30A1F028F4C830C3 +:1013C00059F0C93061F005C0CC3089F070F0CD30F3 +:1013D00089F0209A289810C0219A29980DC0229A45 +:1013E0002A980AC0239A2B9807C0529A01C0539A90 +:1013F0005B9802C03E9A469890EA9A95F1F79FB1A1 +:10140000799902C082E001C080E091709B25982B01 +:101410007C9902C084E001C080E0892B7D9902C0E4 +:1014200038E001C030E0832B7E9902C020E101C08A +:1014300020E0822B9FB19095991F9927991F929533 +:10144000990F907E892B10C080910001811174C08A +:1014500080E40E94F50880930001882309F459C0B4 +:10146000912C0E941709892DF8019081981739F164 +:10147000808380910101882301F18091D70180FF51 +:1014800004C08AE093E00E9452078091D70180FF58 +:101490000CC0809101011F928F93FF92EF920E94E6 +:1014A000EB070F900F900F900F908091D70180FF66 +:1014B00004C083E093E00E945207A09201010E94C1 +:1014C0003A0921960F5F1F4FCE30D10509F051CF59 +:1014D000809101018823B1F081508093010188231C +:1014E00039F08FE99FE00197F1F700C000000AC0D2 +:1014F000ACE4B1E0EEE3F1E0CF01825F91919D9326 +:101500008E13FCCF82E298E0892BC1F00E94220862 +:1015100015C083E10E941F09809300018111A0CFB3 +:1015200081E40E94F50880930001811199CF0E9407 +:101530003009982E909495CF80E096CF81E0DF918E +:10154000CF911F910F91FF90EF90DF90CF90BF90C0 +:10155000AF909F900895E82FF0E0E45BFE4F80810C +:101560000895CF92DF92EF92FF920F931F93CF9344 +:10157000DF938CEE92E00E9452078CE4E82E81E02B +:10158000F82EC0E0D0E097EEC92E92E0D92E0EEDF5 +:1015900012E0DF93CF93DF92CF920E94EB0784EEAD +:1015A00092E00E945207F70181917F0190E00E9432 +:1015B00061219F938F931F930F930E94EB078CEDF4 +:1015C00092E00E94520721968DB79EB708960FB6FB +:1015D000F8949EBF0FBE8DBFCE30D105D1F6DF91FE +:1015E000CF911F910F91FF90EF90DF90CF900895D2 +:1015F0008B3B910578F4883A910540F5853A910541 +:10160000D0F48430910508F0B1C08130910509F41F +:10161000ADC06BC0803E910508F467C0883E91055F +:1016200008F4A4C09C01205F31092031310508F085 +:101630005CC090650895853A910509F459C0863AD1 +:10164000910509F058C082E890E40895883A910520 +:1016500009F454C0893A910509F453C08A3A9105B6 +:1016600009F452C08B3A910509F451C08C3A9105A6 +:1016700009F450C08D3A910509F44FC0803B9105A3 +:1016800009F44EC08E3A910509F44DC08F3A910588 +:1016900009F44CC0813B910509F44BC0823B910594 +:1016A00009F44AC0833B910509F449C0843B910584 +:1016B00009F448C0853B910509F447C0863B910574 +:1016C00009F446C0873B910509F445C0883B910564 +:1016D00009F444C0893B910509F443C08A3B910554 +:1016E00009F442C080E094E4089580E090E0089519 +:1016F00081E890E4089583E890E4089582EE94E40C +:10170000089589EE94E408958AEE94E4089585EBB3 +:1017100094E4089586EB94E4089587EB94E40895A7 +:101720008CEC94E408958DEC94E4089583E895E4BA +:1017300008958AE895E4089582E995E4089584E996 +:1017400095E4089581E296E4089583E296E408958D +:1017500084E296E4089585E296E4089586E296E4AC +:10176000089587E296E408958AE296E4089508953C +:1017700096E0799FF001112494E5899FE00DF11D19 +:101780001124E60FF11DEE0FFF1FEC51FF4F859165 +:1017900094910895880F991FFC01E05AF0408591BB +:1017A00094910895880F991FFC01E052FF4F859195 +:1017B0009491089526E0729FF001112444E5849FDE +:1017C000E00DF11D1124E60FF11DEE0FFF1FEC518E +:1017D000FF4F859194919C013A9521154FE1340773 +:1017E00008F41EC13F512115304120F49F700E9422 +:1017F000D20B08959C0130532115304118F49927DC +:10180000906C0895811520E5920769F40E94BB1A37 +:101810004FEF84E39CE0415080409040E1F700C0EE +:1018200000000C941D22813020E5920751F48CE5D4 +:1018300093E00E9452078091D70181608093D70185 +:1018400008959C0130552115304108F051C0292FD1 +:1018500033272F70332721303105D9F4AC01437081 +:10186000552702C0220F331F4A95E2F73C68AC01AE +:1018700064E0440F551F6A95E1F744275370242B09 +:10188000352B73E0880F991F7A95E1F780769927B9 +:101890001DC02230310529F4982F8827816F906A66 +:1018A000089523303105A9F4AC014370552721E098 +:1018B00030E002C0220F331F4A95E2F73C6843E054 +:1018C000880F991F4A95E1F7807E9770822B932BA2 +:1018D000089524303105E1F4AC014370552721E02F +:1018E00030E002C0220F331F4A95E2F73A68E7CF93 +:1018F0009C0130572115304118F49F709062089573 +:101900009C0130582115304118F49F70906A089559 +:10191000803E9105E0F4803C910558F581339105B6 +:1019200009F46FC048F48932910509F463C08A3222 +:10193000910509F46DC072C089339105E9F08238D0 +:101940009105D1F08533910509F44DC067C0833E00 +:10195000910581F138F4803E9105B9F0823E910500 +:10196000D9F05CC0863E910561F1873E9105A1F1F9 +:1019700055C00E94CA0B08952091EA0120FD02C0C3 +:1019800021FF4CC080EE90E049C08091EA0180FFC9 +:10199000F9CF89E390E042C08091EA0182FF0EC056 +:1019A0008091EA0184FF03C080E090E037C083EEBD +:1019B00090E034C08091EA0182FFF2CF82EE90E0A5 +:1019C0002DC08091EA0183FF0BC08091EA0184FD64 +:1019D000EBCF87EE90E022C08091EA0183FFF5CF44 +:1019E00086EE90E01BC08091EA0185FF07C089E286 +:1019F00090E014C08091EA0185FFF9CF85E390E083 +:101A00000DC08091EA0186FF07C08AE290E006C01F +:101A10008091EA0186FFF9CF81E390E00E94F80A05 +:101A20000895089580916D0108959FB7F8941092DC +:101A30005C019FBF9091F001943009F057C09091E4 +:101A4000E9009F703091EC00232F217030FD20E8D9 +:101A5000922B24E02093E9002091EB0020FF43C06B +:101A60002091EE0027FF3FC020915A01222321F050 +:101A70002091E80025FF37C010925A0126E03091EE +:101A8000E80035FD15C03091F001343061F530913A +:101A9000EB0035FD28C0215021F481E080935A01EC +:101AA00022C0EFE9FFE03197F1F700C00000E7CF77 +:101AB0008093F1008091E80085FD0AC08091E800E4 +:101AC00080FFFCCF8091E8008E778093E80006C00D +:101AD0008FB7F89421E020935C018FBF9F709093A3 +:101AE000E90080E008959F709093E9008FEF0895DA +:101AF000CF93DF9300D01F92CDB7DEB79C018091CA +:101B0000F001843019F593E099833B832A83909305 +:101B1000E9008FEF9091E800815095FD06C095EDAA +:101B20009A95F1F700008111F5CF8091E80085FFCB +:101B30000DC040E050E063E070E0CE0101960E94ED +:101B400048108091E8008E778093E8000F900F9006 +:101B50000F90DF91CF910895CF93DF9300D01F9224 +:101B6000CDB7DEB72091F001243021F522E02983A2 +:101B70009B838A8383E08093E9008FEF9091E80054 +:101B8000815095FD06C095ED9A95F1F70000811101 +:101B9000F5CF8091E80085FF0DC040E050E063E0A4 +:101BA00070E0CE0101960E9448108091E8008E7787 +:101BB0008093E8000F900F900F90DF91CF910895E0 +:101BC0002091F0012430F1F422E02093E9002FEF7E +:101BD0003091E800215035FD06C035ED3A95F1F71A +:101BE00000002111F5CF2091E80025FF0BC040E057 +:101BF00050E065E070E00E9448108091E8008E7728 +:101C00008093E8000895CF93DF932091F001243072 +:101C100009F048C0EC0180910C018823E1F080912B +:101C20000D018823C1F085E08093E9008FEF90914A +:101C3000E800815095FD06C095E19A95F1F7000006 +:101C40008111F5CF8091E80085FF2CC040E050E085 +:101C500060E170E017C081E08093E9008FEF909120 +:101C6000E800815095FD06C095ED9A95F1F70000CA +:101C70008111F5CF8091E80085FF14C040E050E06D +:101C800068E070E0CE010E9448108091E8008E77F5 +:101C90008093E80080E1FE01ADE5B1E001900D9296 +:101CA0008A95E1F7DF91CF91089583E993E00E944F +:101CB00052078091EF01811109C00E94DD110E943D +:101CC0003A128091E20084608093E20008958FE8E8 +:101CD00093E00E9452071092EF0108958BE893E081 +:101CE0000C94520787E893E00E9452070C94ED2B66 +:101CF00083E893E00E9452070E94B7210E94F32BD1 +:101D00000E94DF140C94110D20915B012F5F822F34 +:101D100062E30E94612D992319F020935B010895DD +:101D200010925B0180915C01882371F18091F00138 +:101D3000843041F58091E9008F702091EC00922F62 +:101D4000917020FD90E8892B94E09093E9009091A8 +:101D5000EB0090FF14C09091EE0097FF10C090919F +:101D6000E80095FF03C01092F100F9CF9091E800D0 +:101D700090FF05C09091E8009E779093E8008F70E7 +:101D80008093E90010925C01089542E061EC81E0EB +:101D90000E94571142E061EC82E00E94571142E03C +:101DA00061EC83E00E94571142E261EC84E00E9402 +:101DB000571142E161EC85E00C9457118091F201DA +:101DC000833009F455C030F4813071F0823009F469 +:101DD0008EC008958A3009F47AC08B3009F460C04F +:101DE000893009F09CC020C08091F101813A09F04E +:101DF00096C08091E800877F8093E8008091F5018C +:101E00009091F601892B21F460E18DE591E003C00A +:101E100060E080E090E070E00E9493108091E80024 +:101E20008B778093E80008958091F101813209F069 +:101E300076C08091F5019091F601009719F0049712 +:101E400009F06DC08091E800877F8093E800809161 +:101E5000E80082FD05C08091F0018111F8CF5FC0DC +:101E60008091F10080936D018091E8008B7753C0E1 +:101E70008091F101813A09F052C08091F501909171 +:101E8000F601892B09F04BC08091E800877F809391 +:101E9000E8008091E80080FFFCCF80910C0136C003 +:101EA0008091F1018132D9F58091F5019091F6018F +:101EB000892BA9F58091E800877F8093E8000E9434 +:101EC0008C118091F30180930C010C94BB1A8091CA +:101ED000F101813221F58091E800877F8093E8004D +:101EE0000E948C118091F40180936E01089580917D +:101EF000F101813AA1F48091E800877F8093E800A6 +:101F00008091E80080FFFCCF80916E018093F1000A +:101F10008091E8008E778093E8000C948C110895EE +:101F200084B7877F84BF88E10FB6F8948093600000 +:101F3000109260000FBE90E080E80FB6F894809396 +:101F40006100909361000FBE0E946C150E94DD112C +:101F50000E943A128091E20084608093E20085E161 +:101F60009DE00E94F62078940E94BF140E946E1596 +:101F700082E091E00E94DA140E94DB2B82E793E07A +:101F80000E9452078091F001853089F48EE693E03B +:101F90000E9452070E947B218091EE01882391F3D9 +:101FA0000E94A321882371F30E943210EBCF0E947C +:101FB0009C15E8CF292F332723303105C9F064F46D +:101FC0002130310581F02230310509F043C08DE820 +:101FD00090E02BEC33E042C021323105F1F02232A7 +:101FE000310541F137C082E190E028E534E036C0A8 +:101FF00099278130910541F08230910541F0892B7C +:1020000049F5E7ECF3E005C0EFEAF3E002C0E7E9E9 +:10201000F3E0849190E09F0121C06530D8F4E62F71 +:10202000F0E0EE0FFF1FEB5DFE4F2081318189E074 +:1020300090E014C0653070F470E0FB01EE0FFF1FFC +:10204000E55EFE4F20813181FB01EA5EFE4F80811B +:1020500090E004C080E090E020E030E0FA013183BD +:102060002083089580E189BD82E189BD09B400FE25 +:10207000FDCF8091D8008F7D8093D8008091E000C3 +:1020800082608093E0008091E00081FDFCCF0895A4 +:10209000CF92DF92EF92FF920F931F93CF93DF9334 +:1020A000EC018B016A010E94AB11811133C0C11494 +:1020B000D10439F0F60180819181081B190BC80FFA +:1020C000D91FE12CF12C0115110519F18091E800BF +:1020D00085FD16C08091E8008E778093E800C114DA +:1020E000D10449F0F60180819181E80EF91EF18258 +:1020F000E08285E00FC00E94AB11882321F30AC063 +:1021000089918093F10001501109FFEFEF1AFF0A46 +:10211000DACF80E0DF91CF911F910F91FF90EF9088 +:10212000DF90CF9008952091F7013091F8012617A4 +:10213000370748F06115710539F42091E8002E77D2 +:102140002093E80001C0B90140E061157105A9F1D3 +:102150002091F001222309F443C0253009F442C044 +:102160002091E80023FD40C02091E80022FD32C00C +:102170002091E80020FFE9CF4091F3002091F20088 +:1021800030E0342BFC01CF016115710559F0283086 +:10219000310540F481918093F100615071092F5F06 +:1021A0003F4FF1CF41E02830310509F040E0209168 +:1021B000E8002E772093E800C8CF4111C9CF0AC0AC +:1021C0008091F001882361F0853061F08091E80012 +:1021D00083FD0AC08091E80082FFF2CF80E008957D +:1021E00082E0089583E0089581E008952091F70149 +:1021F0003091F8012617370748F06115710539F459 +:102200002091E8002E772093E80001C0B901FC017D +:1022100020E06115710591F18091F001882309F4A6 +:1022200040C0853009F43FC08091E80083FD3DC087 +:102230008091E80082FD2FC08091E80080FFE9CF07 +:102240002091F3008091F20090E0922B61157105CE +:1022500059F08830910540F424912093F100319693 +:10226000615071090196F2CF21E0089709F020E052 +:102270008091E8008E778093E800CBCF2111CCCFFE +:102280000AC08091F001882361F0853061F080916F +:10229000E80083FD0AC08091E80082FFF2CF80E071 +:1022A000089582E0089583E0089581E00895982FCD +:1022B000973058F59093E900981739F07091EC0039 +:1022C0002091ED005091F00003C0242F762F50E0B4 +:1022D00021FF19C03091EB003E7F3093EB0030912D +:1022E000ED003D7F3093ED003091EB003160309395 +:1022F000EB007093EC002093ED005093F0002091E0 +:10230000EE0027FF07C09F5FD3CF8F708093E90057 +:1023100081E0089580E008958091F10187FF11C068 +:102320008091E80082FD05C08091F0018111F8CF15 +:1023300011C08091E8008B770BC08091F001882359 +:1023400049F08091E80080FFF8CF8091E8008E7717 +:102350008093E80008952091E4003091E50095E62F +:102360004091EC00842F817040FF22C08091E800F2 +:1023700080FD1CC08091F001882391F0853091F0A0 +:102380008091EB0085FD10C04091E4005091E50084 +:102390004217530729F39A01915011F784E00895E9 +:1023A00082E0089583E0089581E0089580E0089533 +:1023B0004091E80042FFDECF08950E944B120E9438 +:1023C0005312E0EEF0E0808181608083E8EDF0E080 +:1023D00080818F77808319BCA7EDB0E08C918E7FD0 +:1023E0008C9380818F7E80831092EF0108950F93EC +:1023F0001F93CF93DF930E944B120E945312C8ED9C +:10240000D0E088818F7788838881806888838881FD +:102410008F7D888319BC1092F0011092EC0110920C +:10242000EE011092ED0100EE10E0F80180818B7F4B +:10243000808388818160888342E060E080E00E9440 +:102440005711E1EEF0E080818E7F8083E2EEF0E0D4 +:10245000808181608083808188608083F8018081B1 +:102460008E7F8083888180618883DF91CF911F91E7 +:102470000F910895E8EDF0E080818F7E8083E7ED95 +:10248000F0E080818160808384E082BF81E080937E +:10249000EF010C94F711E8EDF0E080818E7F8083EE +:1024A0001092E20008951092DA001092E10008956F +:1024B0001F920F920FB60F9211242F933F934F93B9 +:1024C0005F936F937F938F939F93AF93BF93EF939C +:1024D000FF938091E10082FF0BC08091E20082FFB8 +:1024E00007C08091E1008B7F8093E1000E94840E01 +:1024F0008091DA0080FF1FC08091D80080FF1BC050 +:102500008091DA008E7F8093DA008091D90080FF7D +:102510000DC080E189BD82E189BD09B400FEFDCF17 +:1025200081E08093F0010E94550E05C019BC109205 +:10253000F0010E94670E8091E10080FF19C0809138 +:10254000E20080FF15C08091E2008E7F8093E20060 +:102550008091E20080618093E2008091D8008062E7 +:102560008093D80019BC85E08093F0010E94720E20 +:102570008091E10084FF30C08091E20084FF2CC094 +:1025800080E189BD82E189BD09B400FEFDCF809163 +:10259000D8008F7D8093D8008091E1008F7E80935A +:1025A000E1008091E2008F7E8093E2008091E20062 +:1025B00081608093E2008091EC01882311F084E037 +:1025C00007C08091E30087FD02C081E001C083E085 +:1025D0008093F0010E94780E8091E10083FF29C072 +:1025E0008091E20083FF25C08091E100877F809386 +:1025F000E10082E08093F0011092EC018091E10013 +:102600008E7F8093E1008091E2008E7F8093E200D4 +:102610008091E20080618093E20042E060E080E02F +:102620000E9457118091F00088608093F0000E9412 +:102630006E0EFF91EF91BF91AF919F918F917F911E +:102640006F915F914F913F912F910F900FBE0F901F +:102650001F9018951F920F920FB60F9211242F936F +:102660003F934F935F936F937F938F939F93AF931A +:10267000BF93CF93DF93EF93FF93C091E900CF70A7 +:102680008091EC00D82FD17080FDD0E81092E90045 +:102690008091F000877F8093F00078940E946E1301 +:1026A0001092E9008091F00088608093F000CD2BBB +:1026B000CF70C093E900FF91EF91DF91CF91BF916F +:1026C000AF919F918F917F916F915F914F913F91CA +:1026D0002F910F900FBE0F901F9018951F93CF93BF +:1026E000DF93CDB7DEB7AA970FB6F894DEBF0FBE63 +:1026F000CDBFE1EFF1E088E08E0F9091F100919372 +:102700008E13FBCF0E94DE0E8091E80083FF1FC175 +:102710008091F1019091F201492F50E04A3051052A +:1027200008F015C1FA01EA5AFF4F0C94812D803848 +:1027300081F0823809F00BC18091F5018F70809390 +:10274000E9008091EB0085FB882780F91092E90071 +:1027500006C08091ED019091EE01911182609091FF +:10276000E800977F9093E8008093F1001092F100C9 +:10277000C8C0282F2D7F09F0EAC0882319F08230C5 +:1027800061F0E5C08091F301813009F0E0C0933041 +:1027900009F080E08093EE012BC08091F30181115C +:1027A00027C08091F5018F7009F4D1C08093E900B2 +:1027B0002091EB0020FF1CC0933021F48091EB00AE +:1027C000806214C09091EB0090619093EB0021E047 +:1027D00030E0A90102C0440F551F8A95E2F74093EB +:1027E000EA001092EA008091EB0088608093EB0091 +:1027F0001092E9008091E800877F86C08111A7C010 +:102800001091F3011F778091E3008078812B8093F2 +:10281000E3008091E800877F8093E8000E948C119C +:102820008091E80080FFFCCF8091E3008068809376 +:10283000E300111102C082E001C083E08093F00147 +:1028400086C08058823008F082C08091F301909158 +:10285000F4018C3D53E0950779F583E08A838AE2A1 +:1028600089834FB7F894DE01139620E03EE051E2F1 +:10287000E32FF0E050935700E49120FF03C0E2956E +:10288000EF703F5FEF708E2F90E0EA3010F0C79648 +:1028900001C0C0968D939D932F5F243149F74FBFA0 +:1028A0008091E800877F8093E8006AE270E0CE01C3 +:1028B00001960E94931014C0AE014F5F5F4F60916C +:1028C000F5010E94DA0FBC01009709F440C0909115 +:1028D000E800977F9093E80089819A810E94F61022 +:1028E0008091E8008B778093E80031C0803879F5DB +:1028F0008091E800877F8093E8008091EC018093CD +:10290000F1008091E8008E778093E8000E948C119E +:102910001EC081111CC09091F3019230C0F48091CF +:10292000E800877F8093E8009093EC010E948C116F +:102930008091EC01811106C08091E30087FD02C007 +:1029400081E001C084E08093F0010E94C50E809177 +:10295000E80083FF0AC08091E800877F8093E80049 +:102960008091EB0080628093EB00AA960FB6F894FA +:10297000DEBF0FBECDBFDF91CF911F910895CF93E2 +:102980008091F0018823A1F0C091E900CF7090916F +:10299000EC00892F817090FD80E8C82B1092E9002F +:1029A0008091E80083FD0E946E13CF70C093E90010 +:1029B000CF91089590937401809373010895E091ED +:1029C0007301F0917401309721F00190F081E02DB6 +:1029D000099480E00895EF92FF920F931F93CF9395 +:1029E000DF93E0917301F09174013097B1F18C01A4 +:1029F0000280F381E02D09958091D70182FF2DC0DF +:102A000080FF04C08DE895E00E945207E80110E1C4 +:102A100087E8E82E85E0F82E8091D70180FF0BC073 +:102A200088811F928F93FF92EF920E94EB070F9085 +:102A30000F900F900F90115021961111EDCF8091B2 +:102A4000D70180FF0AC085E895E0DF91CF911F9103 +:102A50000F91FF90EF900C945207DF91CF911F914F +:102A60000F91FF90EF900895E0917301F091740140 +:102A7000309721F00480F581E02D0994089520918C +:102A80007101309172018217930771F09093720176 +:102A900080937101E0917301F0917401309721F0FE +:102AA0000680F781E02D0994089520916F013091FF +:102AB00070018217930771F09093700180936F01FA +:102AC000E0917301F0917401309721F00084F18559 +:102AD000E02D0994089508950C946B150E94B92176 +:102AE0000E9462090C947F22CF93C82F8091D70156 +:102AF00082FF1EC080FF04C086EA95E00E94520754 +:102B00008091D70180FF0CC01F92CF9381EA95E09E +:102B10009F938F930E94EB070F900F900F900F9051 +:102B20008091D70180FF04C08FE995E00E94520791 +:102B30008C2FCF910C94110DCF92DF92EF92FF92D8 +:102B40000F931F93CF93DF93CDB7DEB72B970FB6BD +:102B5000F894DEBF0FBECDBF0E947F0986E7C82E66 +:102B600081E0D82E00E010E0E02E802F0E94AB0A1A +:102B7000F60141916F01F42EF826B1F40F5F1F4F5B +:102B80000E30110589F78FEF89838A831B820E949B +:102B9000C2218160782F9D838C8349815A816B810A +:102BA0008D810E943F1640C09091D70191FF04C0D3 +:102BB0008B870E94B10A8B8520E030E04F2D50E0DA +:102BC000922FBA01022E02C0759567950A94E2F71A +:102BD00060FF24C02E83EF8221E030E0690102C053 +:102BE000CC0CDD1C9A95E2F790E08C219D21892B7D +:102BF00009F420E028870E94C2218160782F9A87FB +:102C000089874E815F8168858A850E943F16F80119 +:102C1000EA58FE4F8081C826C08206C02F5F3F4F12 +:102C20002630310569F6AACF0E94F0251091750172 +:102C30000E94DF141817A1F00E94DF148093750121 +:102C40002B960FB6F894DEBF0FBECDBFDF91CF91AC +:102C50001F910F91FF90EF90DF90CF900C9474151F +:102C60002B960FB6F894DEBF0FBECDBFDF91CF918C +:102C70001F910F91FF90EF90DF90CF900895CF9329 +:102C8000DF93CDB7DEB72B970FB6F894DEBF0FBE3C +:102C9000CDBF4F83588769877A878B87DE0111966E +:102CA00086E0FD0111928A95E9F785E0FE013796ED +:102CB00001900D928A95E1F749815A816B817C815F +:102CC0008D819E810E94551D2B960FB6F894DEBF14 +:102CD0000FBECDBFDF91CF910895CF93882309F424 +:102CE000C2C0C82F823859F40E94DF1481FDBBC0D6 +:102CF00089E30E94F11F0E94D02089E30CC0833831 +:102D000079F40E94DF1480FDAEC083E50E94F11FBC +:102D10000E94D02083E50E944420CF910C94D020C3 +:102D2000843859F40E94DF1482FD9DC087E40E941C +:102D3000F11F0E94D02087E4EECF8CEF8C0F813AF8 +:102D400048F48C2F0E94832A81118DC08C2F0E9401 +:102D5000F11FE3CF80E28C0F883048F4C77081E028 +:102D600001C0880FCA95EAF70E949920D6CF8BE55B +:102D70008C0F833078F4C53A29F0C63A31F083E8F5 +:102D800090E005C081E890E002C082E890E0CF9139 +:102D90000C943F1588E58C0F833108F064C0C83A65 +:102DA00039F1C93A41F1CA3A49F1CB3A51F1CC3A39 +:102DB00059F1CD3A61F1C03B69F1CE3A71F1CF3AA8 +:102DC00079F1C13B81F1C23B89F1C33B91F1C43B35 +:102DD00099F1C53BA1F1C63BA9F1C73BB1F1C83B95 +:102DE000B9F1C93BC1F1CA3BC9F180E090E038C0FC +:102DF00082EE90E035C089EE90E032C08AEE90E03D +:102E00002FC085EB90E02CC086EB90E029C087EBCB +:102E100090E026C08CEC90E023C08DEC90E020C0C8 +:102E200083E891E01DC08AE891E01AC082E991E050 +:102E300017C084E991E014C081E292E011C083E2FE +:102E400092E00EC084E292E00BC085E292E008C0FE +:102E500086E292E005C087E292E002C08AE292E058 +:102E6000CF910C945515CF910895882309F44BC048 +:102E7000823859F40E94DF1481FF45C089E30E9423 +:102E8000F11F0E94D02089E30CC0833871F40E94A6 +:102E9000DF1480FF38C083E50E94F11F0E94D0201C +:102EA00083E50E9444200C94D020843859F40E9479 +:102EB000DF1482FF28C087E40E94F11F0E94D02007 +:102EC00087E4EFCF9CEF980F913A58F390E2980F78 +:102ED000983050F4877091E001C0990F8A95EAF715 +:102EE000892F0E949F20DFCF9BE5980F933020F41D +:102EF00080E090E00C943F15885A833120F480E004 +:102F000090E00C9455150895882321F00E94992093 +:102F10000C94D0200895882321F00E949F200C94C7 +:102F2000D0200895BF92CF92DF92EF92FF920F933D +:102F30001F93CF93DF9300D000D000D0CDB7DEB782 +:102F400025E0FC01DE01119601900D922A95E1F732 +:102F5000FC01408131810281258122952F7063819E +:102F60007481672B09F4E5C23F3F19F44F3F09F420 +:102F7000E0C27C0149833A8389819A812E830E9431 +:102F8000B01F182FB92E0E94AF1F0E94761EEB2D86 +:102F9000E295EF70F0E0E05AFF4F2E810C94812D06 +:102FA0008B2D807F9B2D9F70F92E882319F0F29432 +:102FB00080EFF822002349F0FF2009F467C28F2D2B +:102FC0000E94A9200E94D02061C2812F0E94351743 +:102FD000FF2009F4AEC28F2D0E94AF2026960FB6B7 +:102FE000F894DEBF0FBECDBFDF91CF911F910F913F +:102FF000FF90EF90DF90CF90BF900C94D0203B2DAE +:10300000307F8B2D8F70303211F08295807F1123AD +:1030100019F0113021F12CC00023B9F0222309F45A +:10302000A0C1213009F09DC126960FB6F894DEBFED +:103030000FBECDBFDF91CF911F910F91FF90EF9009 +:10304000DF90CF90BF900C94B920222319F021304B +:1030500009F46FC28E830E94BC208E8196C100232A +:1030600021F0223008F065C27CC1211162C28DC1FD +:10307000002321F0222309F474C108C2222309F499 +:1030800084C119C22B2D26952695237030E0211579 +:10309000310521F021303105D1F04BC2002321F060 +:1030A000812F9B2D937002C080E090E026960FB692 +:1030B000F894DEBF0FBECDBFDF91CF911F910F916E +:1030C000FF90EF90DF90CF90BF900C943F150023BE +:1030D00021F0812F9B2D937002C080E090E0269616 +:1030E0000FB6F894DEBF0FBECDBFDF91CF911F9119 +:1030F0000F91FF90EF90DF90CF90BF900C945515FB +:10310000812F002319F00E94762402C00E94DE2441 +:1031100026960FB6F894DEBF0FBECDBFDF91CF91DC +:103120001F910F91FF90EF90DF90CF90BF900C9484 +:1031300063258B2D837009F07BC00111FAC1812FAB +:10314000829586958770880F880F912F9F70C92E62 +:10315000D12CE12CF12C082E04C0CC0CDD1CEE1C73 +:10316000FF1C0A94D2F714FF12C04FE050E060E059 +:1031700070E004C0440F551F661F771F8A95D2F771 +:10318000CB01BA01609570958095909503C060E081 +:1031900070E0CB012B2D269526952370422F50E011 +:1031A00042305105D9F04330510569F16C297D2930 +:1031B0008E299F294130510551F126960FB6F8947A +:1031C000DEBF0FBECDBFDF91CF911F910F91FF905A +:1031D000EF90DF90CF90BF900C949D1E6C297D29BD +:1031E0008E299F2926960FB6F894DEBF0FBECDBF5D +:1031F000DF91CF911F910F91FF90EF90DF90CF90D3 +:10320000BF900C94B91E0E949D1EC701B601269660 +:103210000FB6F894DEBF0FBECDBFDF91CF911F91E7 +:103220000F91FF90EF90DF90CF90BF900C94811E94 +:10323000002319F08B2D817001C08695882309F435 +:1032400078C1812F829586958770880F880F912F7E +:103250009F70C92ED12CE12CF12C082E04C0CC0C6F +:10326000DD1CEE1CFF1C0A94D2F714FF12C04FE0C5 +:1032700050E060E070E004C0440F551F661F771FE8 +:103280008A95D2F7CB01BA0160957095809590959B +:1032900003C060E070E0CB012B2D269526952370AE +:1032A000422F50E042305105D9F04330510569F1C9 +:1032B0006C297D298E299F294130510551F126968F +:1032C0000FB6F894DEBF0FBECDBFDF91CF911F9137 +:1032D0000F91FF90EF90DF90CF90BF900C94771FED +:1032E0006C297D298E299F2926960FB6F894DEBF7A +:1032F0000FBECDBFDF91CF911F910F91FF90EF9047 +:10330000DF90CF90BF900C94931F0E94771FC7014E +:10331000B60126960FB6F894DEBF0FBECDBFDF9183 +:10332000CF911F910F91FF90EF90DF90CF90BF90C2 +:103330000C945B1F103FD1F118F4103E50F4A1C063 +:10334000123F09F463C008F44CC0133F09F473C082 +:1033500098C01F708B2D8F710023A1F00E94F41E66 +:10336000812F26960FB6F894DEBF0FBECDBFDF913A +:10337000CF911F910F91FF90EF90DF90CF90BF9072 +:103380000C9484170E94151F812F26960FB6F8946F +:10339000DEBF0FBECDBFDF91CF911F910F91FF9088 +:1033A000EF90DF90CF90BF900C948B170023A9F083 +:1033B0002111BFC08B2D8F7126960FB6F894DEBFFA +:1033C0000FBECDBFDF91CF911F910F91FF90EF9076 +:1033D000DF90CF90BF900C943A1F223008F0A9C024 +:1033E000E9CF0023A9F08B2D8F7126960FB6F894A4 +:1033F000DEBF0FBECDBFDF91CF911F910F91FF9028 +:10340000EF90DF90CF90BF900C94F41E002359F3FF +:103410008B2D8F7126960FB6F894DEBF0FBECDBFF1 +:10342000DF91CF911F910F91FF90EF90DF90CF90A0 +:10343000BF900C94151F002399F08B2D8F71269649 +:103440000FB6F894DEBF0FBECDBFDF91CF911F91B5 +:103450000F91FF90EF90DF90CF90BF900C94DF1E04 +:1034600026960FB6F894DEBF0FBECDBFDF91CF9189 +:103470001F910F91FF90EF90DF90CF90BF900C9431 +:10348000D51E0023A9F0222309F4ADCF812F269663 +:103490000FB6F894DEBF0FBECDBFDF91CF911F9165 +:1034A0000F91FF90EF90DF90CF90BF900C946D162E +:1034B000222309F4ADCF812F26960FB6F894DEBFF4 +:1034C0000FBECDBFDF91CF911F910F91FF90EF9075 +:1034D000DF90CF90BF900C9435174B2D4F70612F1C +:1034E000C7010E94F40726960FB6F894DEBF0FBE00 +:1034F000CDBFDF91CF911F910F91FF90EF90DF90A3 +:10350000CF90BF900C94F91D4B2D4F70612FC701C8 +:1035100026960FB6F894DEBF0FBECDBFDF91CF91D8 +:103520001F910F91FF90EF90DF90CF90BF900C9480 +:10353000B70B26960FB6F894DEBF0FBECDBFDF9156 +:10354000CF911F910F91FF90EF90DF90CF90BF90A0 +:1035500008950E94B6200E948B200E94D0200E94D5 +:1035600096260E94632580E090E00E943F1580E04F +:1035700090E00C9455150E94A6200C94A91A0E9464 +:10358000B01F292F22952F7030E02C3031054CF4DC +:103590002A3031056CF4225031092230310588F48B +:1035A00007C02C30310549F02F30310531F009C00A +:1035B000803E48F0803F29F406C093FB882780F9BD +:1035C000089580E0089581E00895CF93DF9300D0BF +:1035D00000D01F92CDB7DEB70F900F900F900F90D5 +:1035E0000F90DF91CF910895CF93DF9300D000D05B +:1035F00000D0CDB7DEB726960FB6F894DEBF0FBE6B +:10360000CDBFDF91CF9108951F93CF93DF93C091EA +:10361000840116E080918501C81799F0D0E01C9FC5 +:10362000F0011D9FF00D1124EA57FE4F408151819A +:1036300062817381848195810E94F41A2196C770FA +:10364000E9CFDF91CF911F9108954091B60150913C +:10365000B7016091B8017091B9018091BA01909160 +:10366000BB010C94F41A8091BB0182958F7009F014 +:1036700054C08091B801882309F44FC0809184011F +:10368000A09185016091B6017091B7014091B90197 +:103690005091BA01B6E08A1709F43FC090E0411595 +:1036A0005105C1F17F3F11F46F3FA1F1B89FF001C7 +:1036B000B99FF00D1124EA57FE4F218172132AC0E1 +:1036C0002081621327C02281211124C023813481EB +:1036D0002417350710F421503109241B350B283CE1 +:1036E0003105C0F42091BB012F7020612093BB01F4 +:1036F00026E0289FF001299FF00D1124E557FE4F89 +:1037000080818F708061808386EB91E00E949217A8 +:103710000C94041B01968770BECF0895CF92DF9260 +:10372000EF92FF920F931F93CF93DF93CDB7DEB746 +:1037300062970FB6F894DEBF0FBECDBF8C0185E057 +:10374000F801DE011D9601900D928A95E1F7D801EE +:103750004C9111965C91119712966C911297139659 +:10376000CD90DC9014973091B6017091B7018091A3 +:10377000B9019091BA01009709F46BC17F3F19F428 +:103780003F3F09F466C1E090B801EE2009F4C0C0E3 +:103790002091BB01C816D90628F0F601E81BF90BE9 +:1037A000CF0104C0809590958C0D9D1DFF24F3944E +:1037B000883C910578F0F12C207F09F0C6C07C2D63 +:1037C000D98AC88A89890E94E51A86EB91E00E940D +:1037D0009217B1C0822F807F09F046C0751314C0C4 +:1037E000341312C0611110C02F7020612093BB01EF +:1037F0000E94251B86EB91E00E9492178091BB01ED +:10380000D80115968C932EC0CD2819F15F3F11F485 +:103810004F3FF9F0F62E61111CC080918401209178 +:10382000850136E0821709F45AC090E0389FF00114 +:10383000399FF00D1124EA57FE4F7181571306C0CE +:103840007081471303C07281711103C001968770A4 +:10385000E9CFF62E662309F418C18091BB0181607F +:103860008093BB01F12C11C1751308C0341306C03D +:10387000611104C08091BB01D801C3C04D875E8730 +:103880008D859E856A8B0E94BF1A6A898823E1F123 +:103890006623D1F12091BB01822F82958F7090E039 +:1038A000029774F08091B6019091B70198878F8349 +:1038B0001986DB86CA862C87CE0107960E9492174E +:1038C00086E0F801A6EBB1E001900D928A95E1F750 +:1038D0000E94331B0E94251BFF24F394D6C04D8702 +:1038E0005E878D859E850E94B01F292F22952F709F +:1038F00030E0223031050CF0BCC09F7009F0B6C03A +:10390000805E883008F4C1C0C8010E949217E4CFDD +:10391000C816D90608F453C0F601E81BF90BCF010D +:10392000883C910508F450C0F12C7C2DD98AC88AB6 +:1039300089890E94E51AE6EBF1E086E0DF011D923D +:103940008A95E9F70E94251BA0C0751314C0341393 +:1039500012C0611110C08091BB01F8018583C801BC +:103960000E94921786E0E6EBF1E0DF011D928A9556 +:10397000E9F7FE2C8AC04D875E878D859E856A8B10 +:103980000E94BF1A6A89882309F4BECF662309F40E +:10399000BBCF2091BB01822F82958F7090E0029760 +:1039A0000CF48ECF8091B6019091B7019A838983F0 +:1039B0001B82DD82CC822E83CE0101967FCF809543 +:1039C00090958C0D9D1DACCFF62E662309F49CCFEF +:1039D00075132EC034132CC02091BB0120FD1FC0D5 +:1039E000822F82958F70D9F0D80115962C93159758 +:1039F0008F3049F08F5F982F9295907F822F8F7034 +:103A0000892B15968C93C8010E94921786E0F801C5 +:103A1000A6EBB1E001900D928A95E1F793CF86E095 +:103A2000F801A6EBB1E001900D928A95E1F72DC067 +:103A30004D875E878D859E850E94BF1A811140CF7C +:103A40008091BB0181608093BB01C8010E949217E5 +:103A50001CC0662309F458CF4D875E878D859E85EF +:103A60000E94BF1A882309F44FCF2ACF811148CF73 +:103A70000CC0243031050CF047CF9F7009F440CFC3 +:103A8000F8019581907F09F03BCF8F2D62960FB69C +:103A9000F894DEBF0FBECDBFDF91CF911F910F9184 +:103AA000FF90EF90DF90CF9008951F93CF93DF9317 +:103AB000CDB7DEB72C970FB6F894DEBF0FBECDBFE3 +:103AC0004F83588769877A878B879C87CE010796B3 +:103AD0000E948E1B882369F08F8198852A853B85FB +:103AE000232BF1F19F3F09F063C08F3F09F060C0C5 +:103AF00037C086E0FE013796DE01119601900D92E7 +:103B00008A95E1F76F817885EA85FB85309741F1E9 +:103B10007F3F11F46F3F21F12091850130E0C90111 +:103B20000196877099274091840150E0841795078A +:103B300009F447C069837A83FD83EC8396E0929F02 +:103B4000D001939FB00D1124AA57BE4FFE013196AC +:103B500001900D929A95E1F7809385010E94041BD4 +:103B600016E080918401909185018917C1F1189F19 +:103B7000C00111248A579E4F0E948E1B882379F121 +:103B8000E09184011E9FF0011124EA57FE4F40810D +:103B9000518162817381848195810E94F41A8091A0 +:103BA000840190E001968770992780938401D9CF92 +:103BB0004F81588569857A858B859C850E94F41A8A +:103BC000CFCF0E94BB1A1092850110928401E6EBC0 +:103BD000F1E086E0DF011D928A95E9F7C1CF2C96CE +:103BE0000FB6F894DEBF0FBECDBFDF91CF911F910E +:103BF0000895EF92FF920F931F93CF93DF938C0161 +:103C0000009709F46CC0F12CEE24E394E8012196AE +:103C1000F8018491843740F4843008F051C0813039 +:103C200081F0823019F15BC0853709F444C0A8F1F6 +:103C30009CE7980F903708F052C08F770E94351795 +:103C400041C00E5F1F4FFE01C49180E28C0F88308F +:103C500048F4C7708E2D01C0880FCA95EAF70E94FC +:103C6000A92014C08C2F0E946D162DC00E5F1F4F0F +:103C7000FE01C49180E28C0F883058F4C7708E2DFD +:103C800001C0880FCA95EAF70E94AF200E94D02099 +:103C90001AC08C2F0E94351716C00E5F1F4FFE01F1 +:103CA000C491CC2381F08FE99FE00197F1F700C028 +:103CB0000000C150F6CF0E5F1F4FFE01F49003C00D +:103CC0000E946D168E018F2D882309F49FCFEFE996 +:103CD000FFE03197F1F700C000008150F5CFDF9190 +:103CE000CF911F910F91FF90EF90089508956093E9 +:103CF000C0017093C1018093C2019093C3010C94E1 +:103D0000A91A0F931F930091C0011091C101209136 +:103D1000C2013091C301DC01CB01802B912BA22B7E +:103D2000B32B8093C0019093C101A093C201B093C3 +:103D3000C3011F910F910C94A91A0F931F93009127 +:103D4000C0011091C1012091C2013091C301DC0179 +:103D5000CB0180239123A223B3238093C0019093AE +:103D6000C101A093C201B093C3011F910F910C94A4 +:103D7000A91A0F931F930091C0011091C1012091C6 +:103D8000C2013091C301DC01CB0180279127A2271A +:103D9000B3278093C0019093C101A093C201B09357 +:103DA000C3011F910F910C94A91A1092BC0110929B +:103DB000BD011092BE011092BF010C94A91A41E0FE +:103DC00050E060E070E004C0440F551F661F771F8D +:103DD0008A95D2F74093BC015093BD016093BE0118 +:103DE0007093BF010C94A91A41E050E060E070E0CC +:103DF00004C0440F551F661F771F8A95D2F7809124 +:103E0000BC019091BD01A091BE01B091BF01482BB2 +:103E1000592B6A2B7B2B4093BC015093BD016093BF +:103E2000BE017093BF010C94A91A41E050E060E01C +:103E300070E004C0440F551F661F771F8A95D2F7A4 +:103E400040955095609570958091BC019091BD0111 +:103E5000A091BE01B091BF01482359236A237B235F +:103E60004093BC015093BD016093BE017093BF01AC +:103E70000C94A91A41E050E060E070E004C0440FE7 +:103E8000551F661F771F8A95D2F78091BC019091CC +:103E9000BD01A091BE01B091BF01482759276A27F3 +:103EA0007B274093BC015093BD016093BE0170938A +:103EB000BF010C94A91A0F931F930091BC0110919C +:103EC000BD012091BE013091BF01DC01CB01802BEF +:103ED000912BA22BB32B8093BC019093BD01A09397 +:103EE000BE01B093BF011F910F910C94A91A0F93BB +:103EF0001F930091BC011091BD012091BE01309132 +:103F0000BF01DC01CB0180239123A223B323809343 +:103F1000BC019093BD01A093BE01B093BF011F915E +:103F20000F910C94A91A0F931F930091BC0110914B +:103F3000BD012091BE013091BF01DC01CB01802782 +:103F40009127A227B3278093BC019093BD01A09332 +:103F5000BE01B093BF011F910F910C94A91A08954F +:103F6000CF92DF92EF92FF920F931F93CF93DF9345 +:103F70008C01C090C001D090C101E090C201F090CE +:103F8000C3014091BC015091BD016091BE0170918F +:103F9000BF01C42AD52AE62AF72ACFE1D0E0D7010B +:103FA000C6010C2E04C0B695A795979587950A94DF +:103FB000D2F780FF07C0B8018C2F0E94DA0B813046 +:103FC000910531F4219758F7B80180E00E94DA0B8F +:103FD000DF91CF911F910F91FF90EF90DF90CF90E5 +:103FE000089590910C01992321F090910D01911168 +:103FF00009C020910E0130910F01F90132969FEF17 +:1040000040E030C0982F9695969596959F30A0F4F5 +:10401000E0910E01F0910F01E90FF11D877021E091 +:1040200030E0A90102C0440F551F8A95E2F7CA018A +:104030009181892B818308959091D70190FF23C0AE +:104040001F928F9387ED95E09F938F930E94EB07CC +:104050000F900F900F900F9008959F3F39F04F5F92 +:104060004E3041F051915813F8CF0DC05111F7CF98 +:10407000942FF5CF9F3F39F0F901E90FF11D97FD1E +:10408000FA9582830895089590910C01992321F067 +:1040900090910D01911109C020910E0130910F01F5 +:1040A000F9013296205F3F4F30C0982F9695969534 +:1040B00096959F30A8F4E0910E01F0910F01E90F61 +:1040C000F11D877021E030E0A90102C0440F551FA7 +:1040D0008A95E2F7CA0180959181892381830895A9 +:1040E0009091D70190FF16C01F928F9389EB95E0B6 +:1040F0009F938F930E94EB070F900F900F900F905C +:1041000008953196E217F30729F090819813F9CFBB +:104110001082F7CF089581E090E0E0910E01F091D8 +:104120000F01E80FF91F1082019680319105A9F760 +:1041300008959091D601892B8093D601089580959A +:104140009091D60189238093D60108951092D601CB +:1041500008959091D501892B8093D501089580957C +:104160009091D50189238093D50108951092D501AE +:1041700008958093C40108951092C4010895809118 +:104180000E0190910F01FC0131969C01205F3F4F81 +:1041900080E0919191118F5FE217F307D1F70895B5 +:1041A000E0910E01F0910F018091D6018083E091A2 +:1041B0000E01F0910F0190818091D501892B8083B0 +:1041C0008091C401882361F0E0910E01F0910F010C +:1041D0009081892B80830E94BF2081111092C4019D +:1041E00080910E0190910F010C94EB1490933B0180 +:1041F00080933A010895CF92DF92EF92FF926C0183 +:10420000EE24FF24C114D104E104F10421F0C7011C +:10421000B60120E101C020E0C72ED82EE92EFF24F0 +:10422000C114D104E104F10419F0285FC701B601FB +:104230006B017C0154E0F694E794D794C7945A95A7 +:10424000D1F7C114D104E104F10419F02C5FC701C6 +:10425000B6016B017C0142E0F694E794D794C794D1 +:104260004A95D1F7C114D104E104F10419F02E5F8D +:10427000C701B601DC01CB01B695A7959795879547 +:10428000892B8A2B8B2B09F02F5F822FFF90EF90C9 +:10429000DF90CF9008958295982F9C7C392F36958A +:1042A0003695282F237344E0249FC0011124932FB7 +:1042B000982B292F2A7A2695892F8575880F822B8E +:1042C00008951F93CF93DF931F92CDB7DEB79983E5 +:1042D0000E944B21182F9981892F0E944B21212F59 +:1042E00030E0322F2227A901482BCA010F90DF911D +:1042F000CF911F9108958091F001843009F11092BF +:10430000D80120E488E190E00FB6F894A895809356 +:1043100060000FBE2093600083B7817F846083BFFD +:1043200083B7816083BF7894889583B78E7F83BF7E +:1043300088E10FB6F89480936000109260000FBE81 +:10434000089508950895CF930E94A1210E947F09A6 +:104350000E94A221C0E08C2F0E94AB0A811104C0F0 +:10436000CF5FCE30C1F701C081E0CF9108950C94AA +:10437000BB1A82E084BD93E095BD9AEF97BD809310 +:104380006E0008952FB7F8948091D9019091DA01C9 +:10439000A091DB01B091DC012FBF0895CF92DF9295 +:1043A000EF92FF920F931F932FB7F8944091D9018A +:1043B0005091DA016091DB017091DC012FBF6A013D +:1043C0007B01EE24FF248C0120E030E0C016D106F2 +:1043D000E206F30610F4415051099A01281B390BEB +:1043E000C9011F910F91FF90EF90DF90CF9008953A +:1043F0001F920F920FB60F9211248F939F93AF933A +:10440000BF938091D9019091DA01A091DB01B09125 +:10441000DC010196A11DB11D8093D9019093DA01B1 +:10442000A093DB01B093DC01BF91AF919F918F917D +:104430000F900FBE0F901F9018950E94DD11F894F9 +:104440002FEF87EA91E6215080409040E1F700C0CD +:10445000000087E090EBDC018093F9019093FA0172 +:10446000A093FB01B093FC019CE088E10FB6F894A7 +:10447000A895809360000FBE90936000FFCFEF92ED +:10448000FF920F931F93CF93DF93D82FC0E08C2F11 +:104490000E94AB0A00E010E0E82EF12CC701002ECC +:1044A00002C0959587950A94E2F780FD06C00F5FDC +:1044B0001F4F0630110591F709C0602F7C2F80E057 +:1044C0000E94B80BD813F3CF81E004C0CF5FCE3089 +:1044D000F1F680E0DF91CF911F910F91FF90EF9067 +:1044E0000895CF93C82F8CE20E943F22882321F0A9 +:1044F0008C2FCF910C943F2280E0CF910895CF93E1 +:104500000E94CE23811102C00E94B4238CEF95E05B +:104510000E945207C5E6C15049F00E947F098FE30F +:104520009CE90197F1F700C00000F5CF85EF95E019 +:104530000E94520789E20E947122811113C18AE20E +:104540000E94712281110E94B42385E00E94712291 +:1045500081110E941D220E94D9238093D70187E0F8 +:104560000E9471228823A9F18BE10E947122882385 +:1045700051F08091D70181FB222720F991E0922709 +:1045800090FB81F90EC08EE00E947122882361F0B9 +:104590008091D70182FB222720F991E0922790FB9E +:1045A00082F98093D70115C080E10E947122909119 +:1045B000D701882341F093FB222720F981E082274D +:1045C00080FB93F904C0892F809580FB90F990932C +:1045D000D7018091D7010E94DD230E94EB238093B5 +:1045E000EA0180EE0E947122882341F08091EA0165 +:1045F000982F909590FB80F98093EA0189E30E94BF +:104600007122882359F08091EA0181FB222720F949 +:1046100091E0922790FB81F98093EA0182EE0E945B +:104620007122882359F08091EA0182FB222720F928 +:1046300091E0922790FB82F98093EA0186EE0E9436 +:104640007122882359F08091EA0183FB222720F907 +:1046500091E0922790FB83F98093EA0183EE0E9418 +:104660007122882359F08091EA0184FB222720F9E6 +:1046700091E0922790FB84F98093EA0185E30E9400 +:104680007122882359F08091EA0185FB222720F9C5 +:1046900091E0922790FB85F98093EA0181E30E94E3 +:1046A0007122882359F08091EA0186FB222720F9A4 +:1046B00091E0922790FB86F98093EA0181E10E94C4 +:1046C0007122882359F08091EA0187FB222720F983 +:1046D00091E0922790FB87F98093EA018091EA01AB +:1046E0000E94EF238091EA0187FB882780F980935D +:1046F0000D0187E20E947122C82F8EE10E94712273 +:104700008111C2608FE10E9471228111C46080E238 +:104710000E9471228111C86081E20E947122811180 +:10472000C06182E20E9471228111C06283E20E9414 +:1047300071228111C06484E20E947122882311F0E9 +:10474000C06802C0CC2329F08C2F0E94E6236C2F76 +:1047500003C00E94E223682F70E080E090E0CF91D8 +:104760000C94771ECF9108956DEE7EEF80E090E07F +:104770000E94B72D60E082E090E00E94A92D60E0E9 +:1047800083E090E00E94A92D60E084E090E00E9428 +:10479000A92D60E085E090E00C94A92D80E090E0E8 +:1047A0000E94A32D21E08D3E9E4F09F020E0822F34 +:1047B000089582E090E00C949B2D682F82E090E0B9 +:1047C0000C94A92D83E090E00C949B2D682F83E03E +:1047D00090E00C94A92D84E090E00C949B2D682F20 +:1047E00084E090E00C94A92D8091DF0180FF0BC044 +:1047F0006091130185E0689FB0011124759567955C +:10480000759567952BC081FF09C06091130185E004 +:10481000689FB00111247595679520C082FF07C07D +:104820006091130185E0689FB001112417C0909139 +:10483000E0019923D1F060911201961788F7209139 +:10484000130185E0289F90011124929FA001939F5E +:10485000500D112470E0CA010E946D2D6038710561 +:1048600040F46115710539F002C065E070E0862FF3 +:1048700008958FE7089581E008958091DF0180FF1A +:1048800008C06091110170E0759567957595679501 +:1048900021C081FF06C06091110170E07595679598 +:1048A00019C082FF04C06091110170E010C09091A6 +:1048B000E0019923C1F0609110019617A0F7809153 +:1048C0001101899FC001112470E00E946D2D603894 +:1048D000710528F46115710521F0862F08958FE781 +:1048E000089581E0089561E070E0F4CF803F21F405 +:1048F0000E94F423819504C0813F29F40E94F4238F +:104900008093E3010895823F21F40E94F42381956E +:1049100004C0833F29F40E94F4238093E2010895A8 +:10492000893F19F40E943D2405C08A3F31F40E945A +:104930003D2481958093E40108958B3F21F40E94EA +:104940003D24819504C08C3F29F40E943D2480932E +:10495000E5010895843F21F48091E101816017C051 +:10496000853F21F48091E101826011C0863F21F4EE +:104970008091E10184600BC0873F21F48091E101C7 +:10498000886005C0883F31F48091E10180618093A7 +:10499000E10108958D3F21F48091DF0181600BC01A +:1049A0008E3F21F48091DF01826005C08F3F29F4A2 +:1049B0008091DF0184608093DF010895803F39F4A6 +:1049C0008091E30187FF6CC01092E30169C0813FD1 +:1049D00029F48091E3011816BCF362C09091E201C2 +:1049E000823F29F497FF5CC01092E20159C0833FD7 +:1049F00019F41916CCF354C0893F41F48091E401B5 +:104A000018160CF04DC01092E4014AC08A3F29F4F8 +:104A10008091E40187FF44C0F6CF8B3F39F4809149 +:104A2000E50187FF3DC01092E5013AC08C3F29F4B3 +:104A30008091E5011816BCF333C0843F21F48091C6 +:104A4000E1018E7F17C0853F21F48091E1018D7FC8 +:104A500011C0863F21F48091E1018B7F0BC0873F1D +:104A600021F48091E101877F05C0883F31F4809176 +:104A7000E1018F7E8093E10113C08D3F21F480918D +:104A8000DF018E7F0BC08E3F21F48091DF018D7F8F +:104A900005C08F3F29F48091DF018B7F8093DF0178 +:104AA0008091E20181110EC08091E30181110AC061 +:104AB0008091E401811106C08091E501811102C05D +:104AC0001092E00108958091D70183FF7EC088E3B2 +:104AD00096E00E9452078091E1011F928F9383E339 +:104AE00096E09F938F930E94EB0781E396E00E94EC +:104AF00052078091E201282F332727FD30953F93FD +:104B00008F938EE296E09F938F930E94EB078CE247 +:104B100096E00E9452078091E301282F332727FD5A +:104B200030953F938F9389E296E09F938F930E94F5 +:104B3000EB0787E296E00E9452078091E401282F5C +:104B4000332727FD30953F938F9384E296E09F9320 +:104B50008F930E94EB0782E296E00E9452078091B9 +:104B6000E501282F332727FD30953F938F938FE161 +:104B700096E09F938F930E94EB078CE196E00E9452 +:104B800052078091E0011F928F9389E196E09F93F5 +:104B90008F930E94EB0787E196E00E945207809175 +:104BA000DF011F928F9384E196E09F938F930E9481 +:104BB000EB0781E196E00E9452078DB79EB74C96B5 +:104BC0000FB6F8949EBF0FBE8DBF81EE91E00E949C +:104BD00034150E94C2219093DE018093DD01089577 +:104BE0001F93CF93DF938091DD019091DE010E94AE +:104BF000CE21AC019091E001992321F02091140184 +:104C000030E006C0209115018AE0289F9001112410 +:104C10004217530708F486C08091E201C091E30176 +:104C2000D091E4011091E501811107C0C11176C056 +:104C3000D11174C0111172C075C09F3F19F09F5FF0 +:104C40009093E001181624F40E94F4238093E2016B +:104C50008091E20187FF05C00E94F4238195809333 +:104C6000E2011C1624F40E94F4238093E301809156 +:104C7000E30187FF05C00E94F42381958093E3013F +:104C80006091E201662339F1C091E301CC2319F16F +:104C9000772767FD7095872F972F0E94722C23E34B +:104CA00033E343E35FE30E94D62C0E943F2C6093E2 +:104CB000E2016C2F772767FD7095872F972F0E9451 +:104CC000722C23E333E343E35FE30E94D62C0E947C +:104CD0003F2C6093E3011D1624F40E943D24809331 +:104CE000E4018091E40187FF05C00E943D24819585 +:104CF0008093E401111624F40E943D248093E50181 +:104D00008091E50187FF05C00E943D248195809335 +:104D1000E501DF91CF911F910C9463259F3F09F02E +:104D20008ECF96CFDF91CF911F910895E1EEF1E004 +:104D300085E0DF011D928A95E9F71092E00110925B +:104D4000DF0108958BE598E00E9452071F9281E0F1 +:104D50008F931F9285E08F938DE098E09F938F93C0 +:104D60000E94EB070F900F900F900F900F900F90F5 +:104D700008958330E9F128F4813061F0823009F13F +:104D80000895853009F462C008F449C0863009F4FA +:104D900074C0089580911501262F30E0280F311D31 +:104DA0002F3F310524F4680F6093150103C08FEF86 +:104DB00080931501809115011F928F9386E497E0EF +:104DC00072C080911401262F30E0280F311D2F3F33 +:104DD000310524F4680F6093140103C08FEF8093B2 +:104DE0001401809114011F928F9384E397E05BC0BC +:104DF00080911301262F30E0280F311D2F3F310500 +:104E000024F4680F6093130103C08FEF80931301A4 +:104E1000809113011F928F9381E297E044C08091AB +:104E20001201262F30E0280F311D2F3F310524F4C9 +:104E3000680F6093120103C08FEF8093120180917D +:104E400012011F928F938CE097E02DC08091110189 +:104E5000262F30E0280F311D2F3F310524F4680F35 +:104E60006093110103C08FEF8093110180911101B4 +:104E70001F928F9383EF96E016C080911001262F2A +:104E800030E0280F311D2F3F310524F4680F609367 +:104E9000100103C08FEF80931001809110011F92C9 +:104EA0008F9388ED96E09F938F930E94EB070F906E +:104EB0000F900F900F900895833081F128F4813086 +:104EC00059F08230D1F00895853009F449C0B8F125 +:104ED000863009F456C0089580911501681720F4B2 +:104EE000861B8093150102C0109215018091150157 +:104EF0001F928F9389EC96E054C08091140168173B +:104F000020F4861B8093140102C01092140180913A +:104F100014011F928F9387EB96E043C08091130199 +:104F2000681720F4861B8093130102C010921301AE +:104F3000809113011F928F9384EA96E032C0809192 +:104F40001201681720F4861B8093120102C0109290 +:104F50001201809112011F928F938FE896E021C079 +:104F600080911101681720F4861B8093110102C003 +:104F700010921101809111011F928F9386E796E0A4 +:104F800010C080911001681720F4861B80931001D7 +:104F900002C010921001809110011F928F938BE537 +:104FA00096E09F938F930E94EB070F900F900F90C6 +:104FB0000F900895CF93C82F1F928F9380E699E0AA +:104FC0009F938F930E94EB0781E090E0A0E0B0E018 +:104FD000BC01CD0104C0660F771F881F991FCA95B9 +:104FE000D2F70E94771E0F900F900F900F90CF91E5 +:104FF0000C94BB1ACF938D3109F465C0B0F58E3097 +:1050000009F4CCC100F5873009F49BC1A8F48630BF +:1050100009F06DC28091D701817F8E7F8093D70187 +:1050200085E699E00E94520781EA9DE00E945207BE +:1050300081E08093E70180C1883009F44FC08B3054 +:1050400009F47CC154C2863109F4F0C138F48031CE +:1050500009F4B8C1813109F430C249C2893109F477 +:10506000CEC18B3109F486C142C2853309F437C2FF +:1050700048F4873209F433C208F433C2893209F4A0 +:105080002EC235C2833438F48A3308F02CC28833F8 +:1050900009F454C12CC2833409F421C2883409F0C4 +:1050A00026C20E94BB1A80E99DE00E9452079FEF32 +:1050B00023ED80E3915020408040E1F700C00000E4 +:1050C0000E941D2239C180EB9DE00E9452070E9480 +:1050D000F92B0E94DF140E94110D2EC185EA9DE07C +:1050E0000E94520786E79BE00E9452070E94E2233B +:1050F0001F928F9383E79BE09F938F930E94EB0710 +:1051000081E79BE00E9452070E94D923C82F8EE5B9 +:105110009BE00E9452071F92CF9389E59BE09F93EB +:105120008F930E94EB0787E59BE00E9452078DE476 +:105130009BE00E9452078C2F81701F928F938AE40C +:105140009BE09F938F930E94EB0788E49BE00E9473 +:1051500052078EE39BE00E945207C1FB882780F92B +:105160001F928F938BE39BE09F938F930E94EB079B +:1051700089E39BE00E9452078DE29BE00E94520768 +:10518000C2FB882780F91F928F938AE29BE09F934E +:105190008F930E94EB0788E29BE00E9452078FE109 +:1051A0009BE00E945207C3FBCC27C0F91F92CF930C +:1051B0008CE19BE09F938F930E94EB078AE19BE039 +:1051C0000E9452070E94EB23C82F86E09BE00E94BA +:1051D00052071F92CF9381E09BE09F938F930E9491 +:1051E000EB078FEF9AE00E94520786EE9AE00E944A +:1051F00052078C2F81701F928F9383EE9AE09F93BA +:105200008F930E94EB078DB79EB780960FB6F894E8 +:105210009EBF0FBE8DBF81EE9AE00E9452078AECBE +:105220009AE00E945207C1FB882780F91F928F9352 +:1052300087EC9AE09F938F930E94EB0785EC9AE0AE +:105240000E94520783EB9AE00E945207C2FB882714 +:1052500080F91F928F9380EB9AE09F938F930E9427 +:10526000EB078EEA9AE00E9452078CE99AE00E94CE +:105270005207C3FB882780F91F928F9389E99AE030 +:105280009F938F930E94EB0787E99AE00E94520751 +:105290008DE89AE00E945207C4FB882780F91F928C +:1052A0008F938AE89AE09F938F930E94EB0788E898 +:1052B0009AE00E94520786E79AE00E945207C5FBD7 +:1052C000882780F91F928F9383E79AE09F938F93AB +:1052D0000E94EB0781E79AE00E94520785E59AE079 +:1052E0000E945207C6FB882780F91F928F9382E5A0 +:1052F0009AE09F938F930E94EB0780E59AE00E94CB +:10530000520788E49AE00E945207C7FBCC27C0F9F5 +:105310001F92CF9385E49AE09F938F930E94EB07AF +:1053200083E49AE00E9452078DB79EB74C960FB661 +:10533000F8949EBF0FBE8DBFC1E0DEC08CE899E03F +:105340005BC08091D701C82FC17080FF09C083E87E +:105350009DE00E9452078091D701817F8E7F47C0D8 +:1053600087E79DE00E9452078091D701816080937A +:10537000D701E2CF9091D70191FBCC27C0F981E012 +:10538000C827892FC0FB81F98093D701CC2319F05E +:105390008AE69DE027C08CE59DE02EC09091D70164 +:1053A00092FBCC27C0F981E0C827892FC0FB82F986 +:1053B0008093D701CC2319F08DE49DE013C08DE3D9 +:1053C0009DE01AC09091D70193FBCC27C0F981E0F2 +:1053D000C827892FC0FB83F98093D701CC2351F0D4 +:1053E00081E39DE00E9452078091D7018160809304 +:1053F000D70182C084E29DE00E9452079DCF85E1E3 +:105400009DE00E94520789EE9CE00E9452078CEAC0 +:105410009CE00E94520785E89CE00E94520781E4CC +:105420009CE00E94520786E19CE0E6CF88E09CE089 +:105430000E9452070E94DF141F928F938EEE9BE012 +:105440009F938F930E94EB0780910C011F928F9383 +:1054500087ED9BE09F938F930E94EB0780916E01F5 +:105460001F928F9384EC9BE09F938F930E94EB0796 +:1054700080910D011F928F9381EB9BE09F938F93FF +:105480000E94EB078091D9019091DA01A091DB0194 +:10549000B091DC01BF93AF939F938F938DE99BE015 +:1054A0009F938F930E94EB078DB79EB746960FB6DA +:1054B000F8949EBF0FBE8DBF3FCF0E94BB1AC09114 +:1054C0000D0181E0C827C0930D01CC2329F083E9A9 +:1054D0009BE00E94520710C088E89BE08DCF80E0DF +:1054E00003C08D5101C089530E94DA2725CF86E879 +:1054F0009BE00E945207C0E08C2FCF91089580E07E +:10550000089580E00895CF93C82F8091E7018130FE +:1055100081F020F0823009F44FC045C1E0910E01C6 +:10552000F0910F018081813169F0823209F03DC133 +:1055300009C0E0910E01F0910F018081813111F0DD +:10554000823261F48C2F0E947F2A811104C08C2F3B +:105550000E94FA272FC081E090E02CC08C2F0E947F +:10556000812A811126C0C431E1F070F4CB3081F082 +:10557000C031D1F40E94A22688E599E00E9452072A +:1055800082E08093E70115C0C93259F0C83361F455 +:1055900085E699E00E9452078CE599E00E94520747 +:1055A00008C01092E70103C186E599E00E94520706 +:1055B000FEC081E08170FDC0C43220F5CE3108F01C +:1055C000C0C0CB3099F1C8F4C73009F0D2C08AE02E +:1055D0008093150194E19093140193E0909313014B +:1055E0008093120188E08093110188E2809310017A +:1055F0008CEF97E00E945207BFC0C33149F1C4311C +:10560000C1F0B7C0CB3409F4A9C028F4C93289F07D +:10561000C83361F0AEC0C13509F49EC0C23509F48B +:1056200099C0CE3409F0A5C06AE09EC00E94A226AF +:10563000A3C08091E601882319F01092E6019CC076 +:1056400089E098E00E94520781E08093E701B1C0B1 +:1056500083EE97E00E94520781ED97E00E94520787 +:10566000809115011F928F938EEC97E09F938F93FB +:105670000E94EB078CEC97E00E9452078AEB97E0C0 +:105680000E945207809114011F928F9387EB97E03D +:105690009F938F930E94EB0785EB97E00E94520740 +:1056A00086EA97E00E945207809113011F928F9320 +:1056B00083EA97E09F938F930E94EB0781EA97E03C +:1056C0000E94520780E997E00E94520780911201E0 +:1056D0001F928F938DE897E09F938F930E94EB0723 +:1056E0008BE897E00E94520786E797E00E945207F6 +:1056F000809111011F928F9383E797E09F938F937F +:105700000E94EB0781E797E00E9452078AE597E045 +:105710000E945207809110011F928F9387E597E0B6 +:105720009F938F930E94EB0785E597E00E945207B5 +:105730008DB79EB748960FB6F8949EBF0FBE8DBF2B +:105740001BC0CE51EC2FF0E0E15DFE4F80818093D5 +:10575000E60112C061E003C061E006C06AE080912A +:10576000E6010E94B92608C08091E6010E945C27EC +:1057700003C08AEF97E013C08091E601882369F0A7 +:105780001F928F9384EF97E09F938F930E94EB0774 +:105790000F900F900F900F9004C081EF97E00E9440 +:1057A000520781E006C01092E70180E002C080E06D +:1057B00001CFCF910895E1E8F0E080818860808397 +:1057C0008081816080838FB7F89493E09093890003 +:1057D00090ED909388008FBF0895EFE6F0E0808110 +:1057E000826080830895EFE6F0E080818D7F808382 +:1057F0000895EFE6F0E0908182E0892780830895A4 +:105800001F920F920FB60F9211242F933F934F9335 +:105810005F936F937F938F939F93AF93BF93EF9318 +:10582000FF938091E8019091E90101969093E9013D +:105830008093E801811103C082E00E94110DE09184 +:10584000E901E695E695F0E0E054F24FE4918091AD +:10585000E8018E1303C080E00E94110DFF91EF91CB +:10586000BF91AF919F918F917F916F915F914F9178 +:105870003F912F910F900FBE0F901F90189504D05D +:105880006894B1118DC0089570D088F09F5790F042 +:10589000B92F9927B751A0F0D1F0660F771F881F55 +:1058A000991F1AF0BA95C9F712C0B13081F077D0BC +:1058B000B1E0089574C0672F782F8827B85F39F05A +:1058C000B93FCCF3869577956795B395D9F73EF4B4 +:1058D00090958095709561957F4F8F4F9F4F08955C +:1058E000E89409C097FB3EF490958095709561957A +:1058F0007F4F8F4F9F4F9923A9F0F92F96E9BB2730 +:105900009395F695879577956795B795F111F8CFAB +:10591000FAF4BB0F11F460FF1BC06F5F7F4F8F4F16 +:105920009F4F16C0882311F096E911C0772321F00C +:105930009EE8872F762F05C0662371F096E8862FA4 +:1059400070E060E02AF09A95660F771F881FDAF7FB +:10595000880F9695879597F9089557FD9058440FAD +:10596000551F59F05F3F71F04795880F97FB991FBE +:1059700061F09F3F79F0879508951216130614067B +:10598000551FF2CF4695F1DF08C016161706180608 +:10599000991FF1CF86957105610508940895E894E3 +:1059A000BB2766277727CB0197F908950BD078C0DE +:1059B00069D028F06ED018F0952309F05AC05FC066 +:1059C0001124EECFCADFA0F3959FD1F3950F50E0DD +:1059D000551F629FF001729FBB27F00DB11D639FA1 +:1059E000AA27F00DB11DAA1F649F6627B00DA11D47 +:1059F000661F829F2227B00DA11D621F739FB00DED +:105A0000A11D621F839FA00D611D221F749F33275C +:105A1000A00D611D231F849F600D211D822F762FF5 +:105A20006A2F11249F5750408AF0E1F088234AF0F2 +:105A3000EE0FFF1FBB1F661F771F881F915050403E +:105A4000A9F79E3F510570F014C0AACF5F3FECF359 +:105A5000983EDCF3869577956795B795F795E7952A +:105A60009F5FC1F7FE2B880F911D9695879597F93B +:105A7000089597F99F6780E870E060E008959FEFD0 +:105A800080EC089500240A941616170618060906D5 +:105A9000089500240A9412161306140605060895A4 +:105AA000092E0394000C11F4882352F0BB0F40F42C +:105AB000BF2B11F460FF04C06F5F7F4F8F4F9F4F6C +:105AC0000895991B79E004C0991F961708F0961B5A +:105AD000881F7A95C9F78095089597FB072E16F4CD +:105AE000009407D077FD09D00E94872D07FC05D0D0 +:105AF0003EF4909581959F4F0895709561957F4FE5 +:105B00000895EE0FFF1F0590F491E02D0994AA1B54 +:105B1000BB1B51E107C0AA1FBB1FA617B70710F098 +:105B2000A61BB70B881F991F5A95A9F780959095CA +:105B3000BC01CD010895F999FECF92BD81BDF89ABF +:105B4000992780B50895A8E1B0E042E050E00C94B8 +:105B5000BE2D262FF999FECF1FBA92BD81BD20BD63 +:105B60000FB6F894FA9AF99A0FBE019608950E941A +:105B7000A92D272F0C94AA2DDC01CB01FC01F9994A +:105B8000FECF06C0F2BDE1BDF89A319600B40D9289 +:0C5B900041505040B8F70895F894FFCF42 +:105B9C002002120D030EE00DAC0D780D0101C501B4 +:105BAC0028080A03140A3F4D3620394605F904C368 +:105BBC0004A3046A04DD03F6030F0428044804015B +:0A5BCC0002030405060708090000A3 +:00000001FF diff --git a/keyboard/ergodox_ez/keymaps/colemak/keymap.c b/keyboard/ergodox_ez/keymaps/colemak/keymap.c new file mode 100644 index 0000000000..ee72c42635 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/colemak/keymap.c @@ -0,0 +1,184 @@ +#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 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Del | Q | W | F | P | G | L1 | | L1 | J | L | U | Y | ; | \ | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | BkSp | A | R | S | T | D |------| |------| H | N | E | I |O / L2| ' | + * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| + * | LShift |Z/Ctrl| X | C | V | B | | | | K | 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_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, + KC_DELT, KC_Q, KC_W, KC_F, KC_P, KC_G, TG(SYMB), + KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, + KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT, + ALT_T(KC_APP), KC_LGUI, + KC_HOME, + KC_SPC,KC_BSPC,KC_END, + // right hand + KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + TG(SYMB), KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS, + KC_H, KC_N, KC_E, KC_I, LT(MDIA, KC_O), KC_QUOT, + MEH_T(KC_NO),KC_K, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT, + KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1, + KC_LALT, CTL_T(KC_ESC), + KC_PGUP, + KC_PGDN,KC_TAB, KC_ENT + ), +/* 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 +[MDIA] = 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; + } + +}; 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. + -- cgit v1.2.3 From e5f84058bb6884e0c2d024a1f2e64436395cbd60 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 23 Jan 2016 16:59:33 +0100 Subject: Implemented new folders structure. moved keymap_typematrix.c to tm2030/keymap.c --- keyboard/ergodox_ez/keymaps/keymap_typematrix.c | 282 ------------------------ keyboard/ergodox_ez/keymaps/tm2030/keymap.c | 282 ++++++++++++++++++++++++ 2 files changed, 282 insertions(+), 282 deletions(-) delete mode 100644 keyboard/ergodox_ez/keymaps/keymap_typematrix.c create mode 100644 keyboard/ergodox_ez/keymaps/tm2030/keymap.c diff --git a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c b/keyboard/ergodox_ez/keymaps/keymap_typematrix.c deleted file mode 100644 index 931170c387..0000000000 --- a/keyboard/ergodox_ez/keymaps/keymap_typematrix.c +++ /dev/null @@ -1,282 +0,0 @@ -/* 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: 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 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 - * - middle (2nd) led is used to indicate Dvorak layout - * - right (3rd) led is used to indicate caps-lock - */ -#include "ergodox_ez.h" -#include "debug.h" -#include "action_layer.h" -#include "led.h" - -#define BASE 0 // default layer -#define DVRK 1 // Dvorak layer -#define NMBR 8 // numbers layer -#define FNLR 9 // 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] = { -/* 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 | ; | '/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 | | | - * `---------------------' `--------------------' - */ -// 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, 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_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_RSFT, KC_SPC - ), -/* 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 | / | * | - | - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | 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| - * ,------|------|------| |------+------+------. - * | | | | | | | | - * | | |------| |------| | | - * | | | | | | | | - * `--------------------' `--------------------' - */ -// SYMBOLS -[NMBR] = 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, - 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_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, - 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(MDBL0),KC_PDOT, CTL_T(KC_PENT), - - KC_NLCK, KC_CAPS, - KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS -), -/* fn layer - * - * ,--------------------------------------------------. ,--------------------------------------------------. - * | | | | | | |Insert| |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk| - * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | | | | | | |VolUp | | | | | | | | Pause | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | |------| |------| | | | | | | - * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | cut | copy |paste | Mute |VolDn | | | | | | | | | - * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' - * | | | | | | | | | | | | - * `----------------------------------' `----------------------------------' - * ,-------------. ,-------------. - * | | | | | | - * ,------|------|------| |------+------+------. - * | | | | | Next | | | - * | Mute | |------| |------| | | - * | | | | | Prev | | | - * `--------------------' `--------------------' - */ -// MEDIA AND MOUSE -[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, M(MCUT), M(MCOPY), M(MPSTE), KC_MUTE, KC_VOLD, - 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_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, - - KC_TRNS, KC_TRNS, - KC_MPRV, - KC_MNXT, KC_TRNS, KC_TRNS -), -}; - -const uint16_t PROGMEM fn_actions[] = { -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch(id) { - case MDBL0: - if (record->event.pressed) { - return MACRO( I(25), T(P0), T(P0), END ); - } - break; - 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; -}; - -// 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) { - - ergodox_board_led_off(); - ergodox_right_led_1_off(); - ergodox_right_led_2_off(); - ergodox_right_led_3_off(); - // led 1: numbers layer - if (layer_state & (1 << NMBR)) { - ergodox_right_led_1_on(); - } - // led 2: Dvorak layer - if (default_layer_state == 1 << DVRK) { - ergodox_right_led_2_on(); - } - // led 3: caps lock - if (host_keyboard_leds() & (1<event.pressed) { + return MACRO( I(25), T(P0), T(P0), END ); + } + break; + 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; +}; + +// 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) { + + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + // led 1: numbers layer + if (layer_state & (1 << NMBR)) { + ergodox_right_led_1_on(); + } + // led 2: Dvorak layer + if (default_layer_state == 1 << DVRK) { + ergodox_right_led_2_on(); + } + // led 3: caps lock + if (host_keyboard_leds() & (1< Date: Sat, 23 Jan 2016 18:04:45 +0100 Subject: 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 -- cgit v1.2.3 From 96b9089d9f4237c2d4e4760181628fc96c4f93b6 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 23 Jan 2016 18:15:21 +0100 Subject: 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, -- cgit v1.2.3 From 294bd256150e381d3eac619a6eab1877eb95728f Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 23 Jan 2016 18:52:16 +0100 Subject: 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" -- cgit v1.2.3 From b0d7d9d922ea5b432fcbb499df0881a2e80d5092 Mon Sep 17 00:00:00 2001 From: Didier Loiseau Date: Sat, 23 Jan 2016 18:59:06 +0100 Subject: Added keymap.hex --- keyboard/ergodox_ez/keymaps/tm2030/keymap.hex | 1544 +++++++++++++++++++++++++ 1 file changed, 1544 insertions(+) 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 0000000000..7e1118e3b2 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/tm2030/keymap.hex @@ -0,0 +1,1544 @@ +:100000000C9462090C94A6090C94A6090C94A609F8 +:100010000C94A6090C94A6090C94A6090C94A609A4 +:100020000C94A6090C94A6090C94F4140C94C6150F +:100030000C94A6090C94A6090C94A6090C94A60984 +:100040000C94A6090C94472E0C94A6090C94A609AE +:100050000C94A6090C944E240C94A6090C94A609A1 +:100060000C94A6090C94A6090C94A6090C94A60954 +:100070000C94A6090C94A6090C94A6090C94A60944 +:100080000C94A6090C94A6090C94A6090C94A60934 +:100090000C94A6090C94A6090C94A6090C94A60924 +:1000A0000C94A6090C94A6090C94A6092B164D16BF +:1000B00038174D1638178F16B216381707171A1734 +:1000C000681A681A961A961AD81A141B141D141D49 +:1000D0002C1B141D231C231CEE1C141D141D021D9F +:1000E00001E10149024902E10001E001490249023E +:1000F000E00001E1014C024C02E1007519016202CD +:1001000062016202620035002B00E100E100E000C4 +:1001100000001E00140004001D0002304E001F00ED +:100120001A0016001B00E300E10020000800070091 +:100130000600AE002C0021001500090019006574AE +:100140004B00220017000A000500000029744C0033 +:100150002A0000002800000008544C002A0000007B +:1001600028000000500023001C000B0011000000BC +:100170004F00240018000D001000E600520025007A +:100180000C000E0036002D002C00260012000F007F +:1001900037004A00E50027001300330038002E0026 +:1001A000510030002F00347231724D710000350063 +:1001B0002B00E100E100E00000001E00340004001C +:1001C000330002304E001F00360012001400E3001E +:1001D000E1002000370008000D00AE002C002100D7 +:1001E000130018000E0065744B0022001C000C0068 +:1001F0001B00000029744C002A00000028000000A9 +:1002000008544C002A000000280000005000230081 +:1002100009000700050000004F0024000A000B0041 +:100220001000E60052002500060017001A002F00FB +:100230002C0026001500110019004A00E5002700D7 +:100240000F0016001D00300051002E0038002D72E6 +:1002500031724D710000000000000000000000003D +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000000000BA +:1006400000000000000001000100010001000100A5 +:1006500000003A003F0044000100010001003B009F +:10066000400045000100010001003C004100010084 +:100670000100010001003D004200010001000100F5 +:1006800001003E00430001000100000001000100E4 +:10069000010000000100000001004900010000000D +:1006A0005000000053003F000100520051000000C4 +:1006B000390040004A004D004F00010001002B00AE +:1006C0005F005C00590062000100540060005D00A2 +:1006D0005A0001300100550061005E005B006300BC +:1006E00001005600570057005800587100000100E3 +:1006F00001000100010001000000010001000100F3 +:1007000001000100010001000100010003300100AF +:10071000010001000100B20004300100A800010046 +:100720000100B10005300100010001000100B50029 +:10073000A800000001004900A9000000AA00000074 +:100740000100490001000000010000000100B000AC +:1007500001000100010000000100A50001000100EE +:1007600001000100AC00A600010001000100010031 +:100770000100A70001000100010001000100460086 +:100780000100010001000100AB004700480001002A +:100790000100010000000A002530313662003A20D5 +:1007A0000025303258000A722F6320303132333442 +:1007B00035363738394142434445460A000A002558 +:1007C00030325800626F756E6365213A20006C65A7 +:1007D000667420736964652061747461636865641C +:1007E0000A006C6566742073696465206E6F7420FE +:1007F000726573706F6E64696E670A0074727969EE +:100800006E6720746F207265736574206D6370323B +:10081000333031380A000A44454255473A20656E64 +:1008200061626C65642E0A005B735D004B657962E2 +:100830006F6172642073746172742E0A005B575D7D +:10084000005B535D005B525D005B445D005B435D9C +:100850000016034500720067006F0044006F0078C7 +:1008600000200045005A0000001603450072006792 +:10087000006F0044006F007800200045005A00001F +:10088000000403090409028D00050100A0FA09040F +:1008900000000103010100092111010001223F00B4 +:1008A0000705810308000A09040100010301020091 +:1008B000092111010001224D000705820308000AE9 +:1008C00009040200010300000009211101000122B6 +:1008D00036000705830308000A0904030002030029 +:1008E00000000921110100012220000705840320D6 +:1008F00000010705040320000109040400010300AE +:1009000000000921110100012239000705850310AB +:1009100000011201100100000008EDFE07130100A4 +:100920000102000105010906A101050719E029E7F7 +:100930001500250195087501810205081901290591 +:10094000950575019102950175039101050719003F +:10095000297715002501957875018102C00631FFC0 +:100960000974A1010975150025FF952075088102FC +:100970000976150025FF952075089102C00501092B +:1009800080A101850216010026B7001A01002AB7CE +:1009900000751095018100C0050C0901A1018503B6 +:1009A000160100269C021A01002A9C02751095016E +:1009B0008100C005010902A1010901A10005091971 +:1009C000012905150025019505750181029501751F +:1009D0000381010501093009311581257F950275D3 +:1009E00008810609381581257F950175088106055E +:1009F0000C0A38021581257F950175088106C0C053 +:100A000005010906A101050719E029E715002501DF +:100A10009508750181029501750881010508190184 +:100A20002905950575019102950175039101050749 +:100A3000190029FF150025FF950675088100C00AD9 +:100A4000002530325820006B6579626F6172645FF7 +:100A50007265706F72743A20000A002530325800B7 +:100A60006B6579626F6172645F7365745F6C6564F6 +:100A70003A200064656C5F6B65795F6269743A2047 +:100A800063616E27742064656C3A20253032580A01 +:100A9000006164645F6B65795F6269743A206361C9 +:100AA0006E2774206164643A20253032580A00644D +:100AB0006F6E652E0A00626F6F676D6167696320F4 +:100AC0007363616E3A202E2E2E2000290A002575B0 +:100AD000002F002575005D28002564002000256496 +:100AE00000200025640020002564007C00253032B1 +:100AF00058006D6F7573656B6579205B62746E7CF1 +:100B0000782079207620685D287265702F61636C8B +:100B1000293A205B006D6B5F776865656C5F74696F +:100B20006D655F746F5F6D6178203D2025640A00FC +:100B30006D6B5F776865656C5F6D61785F7370651D +:100B40006564203D2025640A006D6B5F74696D65E6 +:100B50005F746F5F6D6178203D2025640A006D6BC6 +:100B60005F6D61785F7370656564203D2025640A60 +:100B7000006D6B5F696E74657276616C203D202537 +:100B8000640A006D6B5F64656C6179203D202564AB +:100B90000A006D6B5F776865656C5F74696D655F92 +:100BA000746F5F6D6178203D2025640A006D6B5F76 +:100BB000776865656C5F6D61785F737065656420EB +:100BC0003D2025640A006D6B5F74696D655F746F0D +:100BD0005F6D6178203D2025640A006D6B5F6D615B +:100BE000785F7370656564203D2025640A006D6B35 +:100BF0005F696E74657276616C203D2025640A0021 +:100C00006D6B5F64656C6179203D2025640A000A84 +:100C100000257500363A20776865656C5F74696DEC +:100C2000655F746F5F6D61783A20000A002575007A +:100C3000353A20776865656C5F6D61785F737065C4 +:100C400065643A20000A00257500343A2074696D05 +:100C5000655F746F5F6D61783A20000A002575004A +:100C6000333A206D61785F73706565643A20000ADD +:100C700000257500323A20696E74657276616C28C1 +:100C80006D73293A20000A00257500313A20646509 +:100C90006C6179282A31306D73293A20000A092DB8 +:100CA0002056616C756573202D0A004D3E004D2560 +:100CB000643E20003F007365742064656661756C56 +:100CC000740A00433E200077686572652064656C95 +:100CD00074613A20637572736F723D25642C2077BE +:100CE0006865656C3D25640A536565206874747099 +:100CF0003A2F2F656E2E77696B6970656469612E76 +:100D00006F72672F77696B692F4D6F7573655F6BB6 +:100D10006579730A000A092D204D6F7573656B653F +:100D200079202D0A4553432F713A09717569740A68 +:100D3000313A0964656C6179282A31306D73290A6A +:100D4000323A09696E74657276616C286D73290A8E +:100D5000333A096D61785F73706565640A343A09E6 +:100D600074696D655F746F5F6D61780A353A0977F4 +:100D70006865656C5F6D61785F73706565640A3680 +:100D80003A09776865656C5F74696D655F746F5F5C +:100D90006D61780A0A703A097072696E7420766122 +:100DA0006C7565730A643A097365742064656661DD +:100DB000756C74730A75703A092B310A646F776E1B +:100DC0003A092D310A706775703A092B31300A7073 +:100DD00067646F776E3A092D31300A0A7370656562 +:100DE00064203D2064656C7461202A206D61785F09 +:100DF0007370656564202A202872657065617420AF +:100E00002F2074696D655F746F5F6D6178290A00CA +:100E10003F004D3E2000433E20004C25640A000A5E +:100E2000092D20436F6E736F6C65202D0A45534367 +:100E30002F713A09717569740A6D3A096D6F75738E +:100E4000656B65790A000A092D204D616769632089 +:100E50002D0A643A0964656275670A783A0964651F +:100E6000627567206D61747269780A6B3A0964650E +:100E7000627567206B6579626F6172640A6D3A0909 +:100E80006465627567206D6F7573650A763A0976D9 +:100E9000657273696F6E0A733A097374617475735E +:100EA0000A633A09636F6E736F6C65206D6F6465DA +:100EB0000A302D343A096C61796572302D34284638 +:100EC00031302D4634290A506175733A09626F6FCB +:100ED000746C6F616465720A653A09656570726F5A +:100EE0006D0A6E3A094E4B524F0A7A3A09736C6595 +:100EF0006570204C454420746573740A000A00250F +:100F000075002E6E6B726F3A20000A002575002E58 +:100F1000737761705F6261636B736C6173685F624A +:100F200061636B73706163653A20000A0025750088 +:100F30002E737761705F67726176655F6573633A80 +:100F400020000A002575002E6E6F5F6775693A20D4 +:100F5000000A002575002E737761705F72616C74F2 +:100F60005F726775693A20000A002575002E737755 +:100F700061705F6C616C745F6C6775693A20000A20 +:100F8000002575002E636170736C6F636B5F746F07 +:100F90005F636F6E74726F6C3A20000A00257500F3 +:100FA0002E737761705F636F6E74726F6C5F6361D5 +:100FB00070736C6F636B3A20000A00253032580062 +:100FC0006B65796D61705F636F6E6669672E7261C4 +:100FD000773A20000A002575002E6D6F7573653A0B +:100FE00020000A002575002E6B6579626F617264BE +:100FF0003A20000A002575002E6D61747269783AF6 +:1010000020000A002575002E656E61626C653A202D +:10101000000A00253032580064656275675F636FAF +:101020006E6669672E7261773A20000A00257500A6 +:1010300064656661756C745F6C617965723A2000F5 +:101040003F004E4B524F3A206F66660A004E4B529D +:101050004F3A206F6E0A0074696D65725F636F7539 +:101060006E743A202530346C580A006B6579626FD3 +:101070006172645F6E6B726F3A2025580A006B656F +:1010800079626F6172645F69646C653A2025580A01 +:10109000006B6579626F6172645F70726F746F6309 +:1010A0006F6C3A2025580A00686F73745F6B65791E +:1010B000626F6172645F6C65647328293A202558F9 +:1010C0000A000A092D20537461747573202D0A00DB +:1010D0004743433A20342E382E31204156522D4C6E +:1010E0004942433A20312E382E3073766E204156D5 +:1010F000525F415243483A20617672350A004F50A0 +:1011000054494F4E533A204C55464120424F4F547C +:101110004D41474943204D4F5553454B4559204577 +:10112000585452414B455920434F4E534F4C452044 +:10113000434F4D4D414E44204E4B524F203531329E +:101140000A004255494C443A2065356638343035FA +:101150002D6469727479202831373A34363A33393C +:10116000204A616E2032332032303136290A00564F +:1011700049443A20307846454544284572676F44D3 +:101180006F7820455A29205049443A20307831332D +:101190003037284572676F446F7820455A292056AA +:1011A00045523A203078303030310A0044455343BC +:1011B0003A20742E6D2E6B2E206B6579626F6172F2 +:1011C00064206669726D7761726520666F72204572 +:1011D00072676F646F780A000A092D205665727372 +:1011E000696F6E202D0A000A6D6F7573653A206F66 +:1011F00066660A000A6D6F7573653A206F6E0A00A5 +:101200000A6B6579626F6172643A206F66660A00E4 +:101210000A6B6579626F6172643A206F6E0A000A28 +:101220006D61747269783A206F66660A000A6D61B2 +:10123000747269783A206F6E0A000A646562756795 +:101240003A206F6E0A000A64656275673A206F661D +:10125000660A000A0A626F6F746C6F616465722EB1 +:101260002E2E2000433E20006565636F6E66696721 +:101270003A0A00536C656570204C454420746573D0 +:10128000740A0000000000000000000000000102DD +:1012900004060A0F17202C3A4A5D71879DB3C7DAFE +:1012A000E9F5FCFFFCF5E9DAC7B39D87715D4A3AC1 +:1012B0002C20170F0A0604020100000000000000A5 +:1012C0000000000011241FBECFEFDAE0DEBFCDBF6B +:1012D00004B603FE24C08091F9019091FA01A09117 +:1012E000FB01B091FC018730904BA740B04BB9F4A3 +:1012F0001092F9011092FA011092FB011092FC0178 +:1013000014BE84B7877F84BF88E10FB6F8948093BA +:101310006000109260000FBEE0E0FFE3099511E06D +:10132000A0E0B1E0EAE2F0E602C005900D92AA3337 +:10133000B107D9F721E0AAE3B1E001C01D92A93FAE +:10134000B207E1F70E942E120C9413300C940000A7 +:10135000FF93EF93E0913A01F0913B01309709F050 +:101360000995EF91FF910895FC018591803011F06E +:10137000EFDFFBCF0895FF27E0E230E247FF0CC02C +:10138000419597FF09C0EDE2609570958095909525 +:10139000611D711D811D911D27FF02C0219530E344 +:1013A00050E2AA27660F771F881F991FAA1FA4174C +:1013B00010F0A41B63955A95A9F7AA3008F0A95F0D +:1013C000A05DAF93F395611571058105910541F716 +:1013D000ED3211F4EF93F395F21718F43F93F39570 +:1013E000FBCF8F91B5DFFA95E1F70895E991F99177 +:1013F0008591803021F0853219F0AADFF9CF089568 +:1014000020E0E89455915532C1F3503311F46894BB +:1014100055915A3348F4505390F3220F022E220F65 +:10142000220F200D250FF4CF0EF42195899199916B +:10143000533619F3533729F1533559F1BC01882735 +:101440009927E8945C3621F4899199916894559193 +:10145000543639F446EF7EF077FF0DC08FEF9FEFE3 +:101460000AC055374AE039F0583540E121F052368C +:1014700042E009F00895FF93EF937DDFEF91FF9134 +:10148000B7CFFF93EF93FC0181918030B9F360DF18 +:10149000FBCFFF93EF9368DFF1CFDF93CF93CDB70F +:1014A000DEB72596A3DFCF91DF910895FC0163306D +:1014B00019F1B8F46130D1F0623081F58091BC014E +:1014C0009091BD01A091BE01B091BF0123E0922790 +:1014D0008093BC019093BD01A093BE01B093BF0166 +:1014E0001DC0643079F0653099F018C0828188237E +:1014F000A9F08BEF90E008958281882379F082EF44 +:1015000090E008958281882349F089EE90E0089563 +:101510008281882319F080EE90E0089580E090E0C9 +:101520000895089556985E9825982D9826982E9897 +:1015300027982F988091BC019091BD01A091BE0188 +:10154000B091BF0190FF02C0259A2D9A8091C001F1 +:101550009091C101A091C201B091C3010297A10570 +:10156000B10511F4269A2E9A0E94721781FF02C0CB +:10157000279A2F9A089582E99AE0892B11F00E9408 +:10158000920A80E090E0089556985E9825982D98EC +:1015900026982E9827982F988FEF90E090938900A7 +:1015A0008093880090938B0080938A0090938D00A5 +:1015B00080938C00259A2D9A2FEF80E792E021509E +:1015C00080409040E1F700C00000269A2E9A2FEF4D +:1015D00080E792E0215080409040E1F700C0000099 +:1015E000279A2F9A2FEF80E792E021508040904079 +:1015F000E1F700C0000025982D982FEF80E792E0DA +:10160000215080409040E1F700C0000026982E98BD +:101610002FEF80E792E0215080409040E1F700C03A +:10162000000027982F9856985E9825982D98269810 +:101630002E9827982F98089589EA8093800089E052 +:101640008093810024982C983F988AB18F748AB92E +:101650006E98479A8BB1806B8BB9769A0E94C40AB8 +:1016600081E99AE0892B11F00E94910A80E090E0D4 +:10167000089580E28093000180913C0181110EC0A9 +:101680000E94880B81E080933C012FEF83ED90E373 +:10169000215080409040E1F700C0000080E40E94AB +:1016A0008E0B8093000181112EC00E94B80B809395 +:1016B0000001811128C00E94B80B809300018111A4 +:1016C00022C08FE30E94B80B8093000181111BC0E0 +:1016D0000E94B00B80E40E948E0B80930001811168 +:1016E00012C08CE00E94B80B8093000181110BC0E6 +:1016F0000E94B80B80930001811105C08FE30E9406 +:10170000B80B809300010E94B00B809100010895F6 +:101710001092B9008AE08093B800089594EA9093FB +:10172000BC009091BC0097FFFCCF9091B900987FCE +:10173000983021F0903111F081E008958093BB0042 +:1017400084E88093BC008091BC0087FFFCCF80912F +:10175000B900887F883111F0803471F780E00895F6 +:1017600084E98093BC008091BC0084FDFCCF089587 +:101770008093BB0084E88093BC008091BC0087FF0D +:10178000FCCF9091B900987F81E0983209F480E015 +:10179000089584E88093BC008091BC0087FFFCCF53 +:1017A0008091BB00089580910001811115C080E4F3 +:1017B0000E948E0B8093000181110CC082E10E9477 +:1017C000B80B80930001811105C08FEF0E94B80B08 +:1017D000809300010E94B00B84B1807F84B985B1F1 +:1017E000807F85B98AB1837F8AB98BB1837F8BB9BA +:1017F0003E98469808950E94390B809300010E94FC +:10180000D30B80B38C7080BB81B3836F81BBECE45E +:10181000F1E0AEE3B1E011921D9281E0EA35F80704 +:10182000D1F78CE19BE0892B11F00C941C0B0895EF +:101830009F92AF92BF92CF92DF92EF92FF920F935F +:101840001F93CF93DF93809100018823E1F0809173 +:101850003D018F5F80933D01811115C08CEF97E0B2 +:101860000E94B4090E94390B80930001882329F05B +:1018700082EE97E00E94B40906C08EEC97E00E94C9 +:10188000B4090E94C40A0EE311E0C0E0D0E0BB241A +:10189000B39482E0A82ECC24C394D12C2FEBE22E5B +:1018A00027E0F22EC73000F580910001811162C05F +:1018B00080E40E948E0B80930001811112C082E1AE +:1018C0000E94B80B8093000181110BC0C6010C2E41 +:1018D00001C0880F0A94EAF780950E94B80B8093A4 +:1018E00000010E94B00B46C0CA30A1F028F4C830F5 +:1018F00059F0C93061F005C0CC3089F070F0CD30BE +:1019000089F0209A289810C0219A29980DC0229A0F +:101910002A980AC0239A2B9807C0529A01C0539A5A +:101920005B9802C03E9A4698E0EAEA95F1F78FB1DB +:10193000799985C092E081708B25892B7C9B02C0B0 +:1019400090E001C094E0892B7D9B02C090E001C033 +:1019500098E0892B7E9B02C090E001C090E1892B2A +:101960009FB19095991F9927991F9295990F907EF5 +:10197000892B10C080910001811176C080E40E9403 +:101980008E0B80930001882309F45BC0912C0E9488 +:10199000B00B892DF8019081981739F180838091DF +:1019A0000101882301F18091D70180FF04C084ECFC +:1019B00097E00E94B4098091D70180FF0CC080910C +:1019C00001011F928F93FF92EF920E944D0A0F9098 +:1019D0000F900F900F908091D70180FF04C08DEB86 +:1019E00097E00E94B409A09201010E94D30B2196B6 +:1019F0000F5F1F4FCE30D10509F054CF8091010108 +:101A00008823B1F0815080930101882339F08FE958 +:101A10009FE00197F1F700C000000AC0ACE4B1E01C +:101A2000EEE3F1E081918D9391E0EC34F907D1F789 +:101A30008BEB9AE0892BD1F00E94BB0A17C090E093 +:101A40007ACF83E10E94B80B8093000181119ECF71 +:101A500081E40E948E0B80930001811197CF0E9438 +:101A6000C90B982E909493CF80E094CF81E0DF91C2 +:101A7000CF911F910F91FF90EF90DF90CF90BF908B +:101A8000AF909F900895E82FF0E0E45BFE4F8081D7 +:101A90000895CF92DF92EF92FF920F931F93CF930F +:101AA000DF9386EA97E00E94B4093CE4E32E31E03C +:101AB000F32EC0E0D0E041EAC42E47E0D42E08E97E +:101AC00017E0DF93CF93DF92CF920E944D0A8EE909 +:101AD00097E00E94B409F70181917F0190E00E9494 +:101AE000B7239F938F931F930F930E944D0A86E90C +:101AF00097E00E94B40921968DB79EB708960FB65D +:101B0000F8949EBF0FBE8DBFCE30D105D1F6DF91C8 +:101B1000CF911F910F91FF90EF90DF90CF9008959C +:101B20008B3B910578F4883A910540F5853A91050B +:101B3000D0F48430910508F0B1C08130910509F4EA +:101B4000ADC06BC0803E910508F467C0883E91052A +:101B500008F4A4C09C01205F31092031310508F050 +:101B60005CC090650895853A910509F459C0863A9C +:101B7000910509F458C083E890E40895883A9105E6 +:101B800009F454C0893A910509F453C08A3A910581 +:101B900009F452C08B3A910509F451C08C3A910571 +:101BA00009F450C08D3A910509F44FC0803B91056E +:101BB00009F44EC08E3A910509F44DC08F3A910553 +:101BC00009F44CC0813B910509F44BC0823B91055F +:101BD00009F44AC0833B910509F449C0843B91054F +:101BE00009F448C0853B910509F447C0863B91053F +:101BF00009F446C0873B910509F445C0883B91052F +:101C000009F444C0893B910509F443C08A3B91051E +:101C100009F042C08AE296E4089580E090E00895D9 +:101C200081E890E4089582E890E4089582EE94E4D7 +:101C3000089589EE94E408958AEE94E4089585EB7E +:101C400094E4089586EB94E4089587EB94E4089572 +:101C50008CEC94E408958DEC94E4089583E895E485 +:101C600008958AE895E4089582E995E4089584E961 +:101C700095E4089581E296E4089583E296E4089558 +:101C800084E296E4089585E296E4089586E296E477 +:101C9000089587E296E4089580E094E40895089515 +:101CA00096E0799FF001112494E5899FE00DF11DE4 +:101CB0001124E60FF11DEE0FFF1FEA5FFE4F859125 +:101CC00094910895880F991F8A579040FC0185913F +:101CD00094910895880F991F8A5F9E4FFC0185910A +:101CE0009491089526E0729FF001112444E5849FA9 +:101CF000E00DF11D1124E60FF11DEE0FFF1FEA5F4D +:101D0000FE4F25913491C9019A9581159F4110F498 +:101D1000C9010895C90190528115904128F4C90163 +:101D20009F700E946A0E0895C901905381159041D9 +:101D300020F4C9019927906C0895211580E5380792 +:101D400069F40E94351D9FEF24E34CE09150204040 +:101D50004040E1F700C000000C947324213080E57E +:101D6000380751F486E198E00E94B4098091D701C8 +:101D700081608093D7010895C901905581159041E4 +:101D800008F050C0832F99278F70992781309105D3 +:101D9000D9F4A9014370552702C0880F991F4A95AD +:101DA000E2F79C68A90164E0440F551F6A95E1F7CA +:101DB00044275370842B952B73E0220F331F7A95A1 +:101DC000E1F7207633271DC08230910529F4922F48 +:101DD0008827816F906A089583309105A9F4A9013D +:101DE0004370552781E090E002C0880F991F4A9503 +:101DF000E2F79C6843E0220F331F4A95E1F7207E0B +:101E00003770822B932B08950497F1F4A901437046 +:101E1000552781E090E002C0880F991F4A95E2F7AC +:101E20009A68E8CFC90190578115904120F4C90103 +:101E30009F7090620895C90190588115904120F4D7 +:101E4000C9019F70906A0895203E3105E0F4203C5E +:101E5000310558F52133310509F470C048F42932B1 +:101E6000310509F464C02A32310509F46EC074C02A +:101E700029333105F1F022383105D9F02533310508 +:101E800009F44EC069C0233E310589F138F4203E83 +:101E90003105C1F0223E3105E1F05EC0263E31053C +:101EA00069F1273E3105A9F157C0C9010E94620EB0 +:101EB00008958091EA0180FD02C081FF4DC080EE4F +:101EC00090E04BC08091EA0180FFF9CF89E390E078 +:101ED00044C08091EA0182FF0EC08091EA0184FF34 +:101EE00003C080E090E039C083EE90E036C080917E +:101EF000EA0182FFF2CF82EE90E02FC08091EA01EA +:101F000083FF0BC08091EA0184FDEBCF87EE90E068 +:101F100024C08091EA0183FFF5CF86EE90E01DC0DA +:101F20008091EA0185FF07C089E290E016C08091A8 +:101F3000EA0185FFF9CF85E390E00FC08091EA01C7 +:101F400086FF07C08AE290E008C08091EA0186FF20 +:101F5000F9CF81E390E001C0C9010E94900D08957E +:101F6000089580916D0108959FB7F89410925C01D7 +:101F70009FBF9091F001943009F058C09091E90012 +:101F80009F702091EC0020FF02C020E801C020E0FB +:101F9000292B94E09093E9009091EB0090FF43C0CF +:101FA0009091EE0097FF3FC090915A01992321F044 +:101FB0009091E80095FF37C010925A0196E0309159 +:101FC000E80035FD15C03091F001343061F53091F5 +:101FD000EB0035FD28C0915021F481E080935A0137 +:101FE00022C0EFE9FFE03197F1F700C00000E7CF32 +:101FF0008093F1008091E80085FD0AC08091E8009F +:1020000080FFFCCF8091E8008E778093E80006C0C7 +:102010008FB7F89491E090935C018FBF2F7020935D +:10202000E90080E008952F702093E9008FEF089574 +:10203000CF93DF9300D01F92CDB7DEB72091F00190 +:10204000243019F523E029839B838A832093E900B8 +:102050008FEF9091E800815095FD06C095ED9A951F +:10206000F1F700008111F5CF8091E80085FF0DC0E8 +:1020700040E050E063E070E0CE0101960E94E7127C +:102080008091E8008E778093E8000F900F900F907A +:10209000DF91CF910895CF93DF9300D01F92CDB7FA +:1020A000DEB72091F001243021F522E029839B83C3 +:1020B0008A8383E08093E9008FEF9091E80081505C +:1020C00095FD06C095ED9A95F1F700008111F5CFC9 +:1020D0008091E80085FF0DC040E050E063E070E0D3 +:1020E000CE0101960E94E7128091E8008E778093DE +:1020F000E8000F900F900F90DF91CF9108952091FD +:10210000F0012430F1F422E02093E9002FEF309128 +:10211000E800215035FD06C035ED3A95F1F7000095 +:102120002111F5CF2091E80025FF0BC040E050E0E1 +:1021300065E070E00E94E7128091E8008E7780935E +:10214000E8000895CF93DF93EC018091F001843093 +:1021500009F047C080910C018823E1F080910D01C6 +:102160008823C1F085E08093E9008FEF9091E8002B +:10217000815095FD06C095E19A95F1F70000811117 +:10218000F5CF8091E80085FF2CC040E050E060E191 +:1021900070E017C081E08093E9008FEF9091E80034 +:1021A000815095FD06C095ED9A95F1F700008111DB +:1021B000F5CF8091E80085FF14C040E050E068E072 +:1021C00070E0CE010E94E7128091E8008E77809344 +:1021D000E80080E1FE01ADE5B1E001900D928A9545 +:1021E000E1F7DF91CF9108958DE498E00E94B40962 +:1021F0008091EF01811109C00E9479140E94D614C8 +:102200008091E20084608093E200089589E498E080 +:102210000E94B4091092EF01089585E498E00C94AF +:10222000B40981E498E00E94B4090C94342E8DE343 +:1022300098E00E94B4090E940E240E943A2E0E9447 +:1022400072170C94B00F80915B018F5F80935B01DC +:1022500062E30E94A82F911135C010925B0180911A +:102260005C01882379F18091F001843049F58091F7 +:10227000E9008F709091EC0090FF02C090E801C0DF +:1022800090E0982B84E08093E9008091EB0080FF40 +:1022900014C08091EE0087FF10C08091E80085FF98 +:1022A00003C01092F100F9CF8091E80080FF05C0D3 +:1022B0008091E8008E778093E8009F709093E9000A +:1022C00010925C01089542E061EC81E00E94F313FA +:1022D00042E061EC82E00E94F31342E061EC83E0B3 +:1022E0000E94F31342E261EC84E00E94F31342E1A6 +:1022F00061EC85E00C94F3138091F201833009F4D2 +:1023000055C030F4813071F0823009F48EC00895E8 +:102310008A3009F47AC08B3009F460C0893009F042 +:102320009CC020C08091F101813A09F096C0809153 +:10233000E800877F8093E8008091F5019091F60195 +:10234000892B21F060E080E090E003C060E18DE542 +:1023500091E070E00E9430138091E8008B778093C9 +:10236000E80008958091F101813209F076C08091F2 +:10237000F5019091F601009719F0049709F06DC0EE +:102380008091E800877F8093E8008091E80082FDDB +:1023900005C08091F0018111F8CF5FC08091F100FC +:1023A00080936D018091E8008B7753C08091F1019B +:1023B000813A09F052C08091F5019091F601892B84 +:1023C00009F04BC08091E800877F8093E8008091FE +:1023D000E80080FFFCCF80910C0136C08091F101B4 +:1023E0008132D9F58091F5019091F601892BA9F5FB +:1023F0008091E800877F8093E8000E9428148091F4 +:10240000F30180930C010C94351D8091F101813210 +:1024100021F58091E800877F8093E8000E942814CE +:102420008091F40180936E0108958091F101813AC9 +:10243000A1F48091E800877F8093E8008091E80014 +:1024400080FFFCCF80916E018093F1008091E800C5 +:102450008E778093E8000C942814089584B7877FC2 +:1024600084BF88E10FB6F8948093600010926000FA +:102470000FBE90E080E80FB6F894809361009093CF +:1024800061000FBE0E94FB170E9479140E94D614AF +:102490008091E20084608093E20084EB9FE00E94E0 +:1024A000A02378940E9450170E94FD1782E091E0CB +:1024B0000E946D170E94222E8CE298E00E94B409BF +:1024C0008091F001853089F488E298E00E94B40997 +:1024D0000E94D1238091EE01882391F30E94F92379 +:1024E000882371F30E94D112EBCF0E942B18E8CF02 +:1024F000292F332723303105A9F06CF42130310521 +:1025000009F442C02230310509F043C08DE890E063 +:1025100025E838E042C021323105C9F022323105C8 +:1025200019F137C099278130910541F0823091052A +:1025300041F0892B71F5E1E8F8E005C0E9E6F8E043 +:1025400002C0E1E5F8E0849190E09F0126C065308B +:1025500000F5E62FF0E0EE0FFF1FEB5DFE4F208150 +:10256000318189E090E019C0653098F4E62FF0E001 +:10257000DF01AA0FBB1FA55EBE4F2D913C91EA5E05 +:10258000FE4F808190E009C082E190E022E139E0D5 +:1025900004C080E090E020E030E0FA013183208345 +:1025A000089580E189BD82E189BD09B400FEFDCFB7 +:1025B0008091D8008F7D8093D8008091E000826068 +:1025C0008093E0008091E00081FDFCCF0895CF92E0 +:1025D000DF92EF92FF920F931F93CF93DF937C01D3 +:1025E0008B01EA010E944914811131C0209731F01A +:1025F00088819981081B190BE80EF91EC12CD12C7A +:102600000115110519F18091E80085FD14C0809134 +:10261000E8008E778093E800209741F088819981C7 +:102620008C0D9D1D9983888385E011C00E944914FB +:10263000882331F30CC0F70181917F018093F10071 +:1026400001501109FFEFCF1ADF0ADACF80E0DF91E6 +:10265000CF911F910F91FF90EF90DF90CF90089551 +:102660002091F7013091F8012617370748F06115DE +:10267000710539F42091E8002E772093E80001C01D +:10268000B901FC0120E061157105B9F18091F001FB +:10269000882309F440C0853009F43FC08091E800E8 +:1026A00083FD3DC08091E80082FF06C08091E80074 +:1026B00082FF26C080E008958091E80080FFE3CF8C +:1026C0002091F3008091F20090E0922B611571054A +:1026D00051F08830910538F421912093F100615038 +:1026E00071090196F3CF21E0089709F020E080916D +:1026F000E8008E778093E800C6CF2111C7CFD6CFF0 +:102700008091F001882339F0853039F08091E8001C +:1027100083FFCCCF04C082E0089583E0089581E078 +:1027200008952091F7013091F8012617370748F0F6 +:102730006115710539F42091E8002E772093E800A7 +:1027400001C0B901FC0120E061157105C1F1809162 +:10275000F001882309F441C0853009F440C080911C +:10276000E80083FD3EC08091E80082FF06C08091B2 +:10277000E80082FF27C080E008958091E80080FF94 +:10278000E3CF2091F3008091F20090E0922B61154D +:10279000710559F08830910540F424912093F1009F +:1027A0003196615071090196F2CF21E0089709F046 +:1027B00020E08091E8008E778093E800C5CF21115A +:1027C000C6CFD5CF8091F001882339F0853039F01C +:1027D0008091E80083FFCBCF04C082E0089583E0BE +:1027E000089581E00895982F973058F59093E90067 +:1027F000981739F07091EC002091ED005091F000A5 +:1028000003C0242F762F50E021FF19C03091EB0038 +:102810003E7F3093EB003091ED003D7F3093ED0033 +:102820003091EB0031603093EB007093EC0020931B +:10283000ED005093F0002091EE0027FF07C09F5F4E +:10284000D3CF8F708093E90081E0089580E00895F0 +:102850008091F10187FD05C08091E80080FF0EC0E6 +:1028600012C08091E80082FD05C08091F0018111C5 +:10287000F8CF08958091E8008B7708C08091F0012F +:102880008111EACF08958091E8008E778093E80067 +:1028900008958091E4009091E50045E62091EC00D8 +:1028A00020FF21C02091E80020FD21C02091F001EF +:1028B000222389F0253089F02091EB0025FD0FC0FF +:1028C0002091E4003091E5002817390739F3415091 +:1028D00041F0C901E3CF82E0089583E0089581E0EB +:1028E000089584E008952091E80022FFDFCF80E082 +:1028F00008950E94E7140E94EF14E0EEF0E080815A +:1029000081608083E8EDF0E080818F77808319BC5F +:10291000A7EDB0E08C918E7F8C9380818F7E808339 +:102920001092EF0108950F931F93CF93DF930E94AE +:10293000E7140E94EF14C8EDD0E088818F77888378 +:1029400088818068888388818F7D888319BC1092F4 +:10295000F0011092EC011092EE011092ED0100EEE8 +:1029600010E0F80180818B7F80838881816088837B +:1029700042E060E080E00E94F313E1EEF0E080814D +:102980008E7F8083E2EEF0E08081816080838081B1 +:1029900088608083F80180818E7F80838881806158 +:1029A0008883DF91CF911F910F910895E8EDF0E0BA +:1029B00080818F7E8083E7EDF0E08081816080837D +:1029C00084E082BF81E08093EF010C949314E8EDE2 +:1029D000F0E080818E7F80831092E2000895109253 +:1029E000DA001092E10008951F920F920FB60F9235 +:1029F00011242F933F934F935F936F937F938F9304 +:102A00009F93AF93BF93EF93FF938091E10082FF79 +:102A10000BC08091E20082FF07C08091E1008B7FB4 +:102A20008093E1000E9423118091DA0080FF1FC093 +:102A30008091D80080FF1BC08091DA008E7F809348 +:102A4000DA008091D90080FF0DC080E189BD82E16C +:102A500089BD09B400FEFDCF81E08093F0010E94A2 +:102A6000F41005C019BC1092F0010E94061180916B +:102A7000E10080FF19C08091E20080FF15C08091C5 +:102A8000E2008E7F8093E2008091E200806180937B +:102A9000E2008091D80080628093D80019BC85E064 +:102AA0008093F0010E9411118091E10084FF30C0F9 +:102AB0008091E20084FF2CC080E189BD82E189BD64 +:102AC00009B400FEFDCF8091D8008F7D8093D8009F +:102AD0008091E1008F7E8093E1008091E2008F7E03 +:102AE0008093E2008091E20081608093E200809117 +:102AF000EC01882311F084E007C08091E30087FF98 +:102B000002C083E001C081E08093F0010E941711B0 +:102B10008091E10083FF29C08091E20083FF25C0FE +:102B20008091E100877F8093E10082E08093F00153 +:102B30001092EC018091E1008E7F8093E100809102 +:102B4000E2008E7F8093E2008091E20080618093BA +:102B5000E20042E060E080E00E94F3138091F00028 +:102B600088608093F0000E940D11FF91EF91BF915A +:102B7000AF919F918F917F916F915F914F913F9115 +:102B80002F910F900FBE0F901F9018951F920F92CC +:102B90000FB60F9211242F933F934F935F936F9330 +:102BA0007F938F939F93AF93BF93CF93EF93FF93B5 +:102BB000C091E900CF708091EC001092E900809103 +:102BC000F000877F8093F00078940E9402161092A4 +:102BD000E9008091F00088608093F000C093E900E4 +:102BE000FF91EF91CF91BF91AF919F918F917F9185 +:102BF0006F915F914F913F912F910F900FBE0F906A +:102C00001F9018951F93CF93DF93CDB7DEB7AA9788 +:102C10000FB6F894DEBF0FBECDBFE1EFF1E08091BB +:102C2000F100819321E0E93FF207C9F70E947C118E +:102C30008091E80083FF1CC12091F1013091F201E5 +:102C4000832F90E08A30910508F012C1FC01EA5A06 +:102C5000FF4F0C94C82F203881F0223809F008C1AA +:102C60008091F5018F708093E9008091EB0085FBE6 +:102C7000882780F91092E90006C08091ED019091BB +:102C8000EE01911182609091E800977F9093E800A7 +:102C90008093F1001092F100C5C0822F8D7F09F062 +:102CA000E7C0222319F0223061F0E2C08091F301E5 +:102CB000813009F0DDC0333009F080E08093EE010F +:102CC00028C08091F301811124C02091F5012F705B +:102CD00009F4CEC02093E9008091EB0080FF19C079 +:102CE0008091EB00333011F4806211C080618093D9 +:102CF000EB0081E090E0022E01C0880F0A94EAF711 +:102D00008093EA001092EA008091EB008860809343 +:102D1000EB001092E9008091E800877F86C02111C6 +:102D2000A7C01091F3011F778091E3008078812B79 +:102D30008093E3008091E800877F8093E8000E9401 +:102D400028148091E80080FFFCCF8091E300806828 +:102D50008093E300112311F083E001C082E08093AF +:102D6000F00186C02058223008F082C08091F30123 +:102D70009091F4018C3D23E0920779F583E08A83FA +:102D80008AE289834FB7F894DE01139620E03EE093 +:102D900051E2E32FF0E050935700E49120FF03C08D +:102DA000E295EF703F5FEF708E2F90E0EA3010F009 +:102DB000C79601C0C0968D939D932F5F243149F72C +:102DC0004FBF8091E800877F8093E8006AE270E05F +:102DD000CE0101960E94301314C0AE014F5F5F4FC9 +:102DE0006091F5010E947812009709F441C020918A +:102DF000E800277F2093E800BC0189819A810E9426 +:102E000091138091E8008B778093E80031C02038DF +:102E100079F58091E800877F8093E8008091EC014C +:102E20008093F1008091E8008E778093E8000E9403 +:102E300028141EC021111CC09091F3019230C0F4DF +:102E40008091E800877F8093E8009093EC010E94D6 +:102E500028148091EC01811104C08091E30087FF68 +:102E600002C084E001C081E08093F0010E94631100 +:102E70008091E80083FF0AC08091E800877F8093FB +:102E8000E8008091EB0080628093EB00AA960FB679 +:102E9000F894DEBF0FBECDBFDF91CF911F91089593 +:102EA000CF938091F0018823B1F08091E9008F7079 +:102EB0009091EC0090FF02C090E801C090E0C92F13 +:102EC000C82B1092E9008091E80083FD0E94021651 +:102ED000CF70C093E900CF910895909374018093CF +:102EE00073010895E0917301F0917401309721F01E +:102EF0000190F081E02D099480E00895FF920F93F6 +:102F00001F93CF93DF938C01E0917301F0917401D3 +:102F1000309799F10280F381E02D09958091D701D6 +:102F200082FF2BC080FF04C087E49AE00E94B409AE +:102F3000E80180E1F82E01E41AE08091D70180FFDA +:102F40000BC088811F928F931F930F930E944D0A8D +:102F50000F900F900F900F90FA942196F110EDCFF3 +:102F60008091D70180FF09C08FE39AE0DF91CF9174 +:102F70001F910F91FF900C94B409DF91CF911F9195 +:102F80000F91FF900895E0917301F09174013097D3 +:102F900021F00480F581E02D0994089520917101BC +:102FA000309172018217930771F0909372018093B0 +:102FB0007101E0917301F0917401309721F0068066 +:102FC000F781E02D0994089520916F0130917001EF +:102FD0008217930771F09093700180936F01E091D5 +:102FE0007301F0917401309721F00084F185E02D98 +:102FF0000994089508950C94FA170E9410240E94D1 +:10300000FB0B0C94D624CF93C82F8091D70182FF5D +:103010001EC080FF04C080E69AE00E94B40980913F +:10302000D70180FF0CC01F92CF932BE53AE03F936E +:103030002F930E944D0A0F900F900F900F90809148 +:10304000D70180FF04C089E59AE00E94B4098C2F63 +:10305000CF910C94B00FCF92DF92EF92FF920F932B +:103060001F93CF93DF93CDB7DEB72B970FB6F894AE +:10307000DEBF0FBECDBF0E94180C36E7E32E31E055 +:10308000F32E00E010E0C02E802F0E94430DF701C8 +:10309000D1907F01D826B1F40F5F1F4F0E3011057C +:1030A00091F78FEF89838A831B820E9419248160A4 +:1030B000782F9D838C8349815A816B818D810E94F9 +:1030C000CE1841C09091D70191FF04C08B870E9418 +:1030D000490D8B8520E030E04D2D50E0922FBA0154 +:1030E000022E02C0759567950A94E2F760FF25C02D +:1030F0002E83CF82EE24E394F12C02C0EE0CFF1C51 +:103100009A95E2F790E08E219F2121E0892B09F426 +:1031100020E028870E9419248160782F9A87898768 +:103120004E815F8168858A850E94CE18F801EA5831 +:10313000FE4F80818E25808306C02F5F3F4F263053 +:10314000310561F6A9CF0E944428109175010E94B3 +:1031500072171817A1F00E947217809375012B96B1 +:103160000FB6F894DEBF0FBECDBFDF91CF911F9198 +:103170000F91FF90EF90DF90CF900C9403182B9657 +:103180000FB6F894DEBF0FBECDBFDF91CF911F9178 +:103190000F91FF90EF90DF90CF900895CF93DF9342 +:1031A000CDB7DEB72B970FB6F894DEBF0FBECDBFFD +:1031B0004F83588769877A878B87DE01119686E06F +:1031C000FD0111928A95E9F785E0FE01379601909D +:1031D0000D928A95E1F749815A816B817C818D81BD +:1031E0009E810E9401202B960FB6F894DEBF0FBE81 +:1031F000CDBFDF91CF910895CF93C82F882309F4D5 +:10320000C1C0823859F40E94721781FDBBC089E3A6 +:103210000E949E220E947A2389E30CC0833879F4AD +:103220000E94721780FDAEC083E50E949E220E941C +:103230007A2383E50E94EF22CF910C947A2384387D +:1032400059F40E94721782FD9DC087E40E949E225D +:103250000E947A2387E4EECF8CEF8C0F813A48F4FA +:103260008C2F0E94CD2C81118DC08C2F0E949E220C +:10327000E3CF80E28C0F883048F4C77081E001C052 +:10328000880FCA95EAF70E944123D6CF8BE58C0FB1 +:10329000833078F4C53A29F0C63A31F482E890E0F8 +:1032A00005C081E890E002C083E890E0CF910C94E3 +:1032B000CE1788E58C0F833108F064C0C83A39F125 +:1032C000C93A41F1CA3A49F1CB3A51F1CC3A59F1F4 +:1032D000CD3A61F1C03B69F1CE3A71F1CF3A79F163 +:1032E000C13B81F1C23B89F1C33B91F1C43B99F1F0 +:1032F000C53BA1F1C63BA9F1C73BB1F1C83BB9F150 +:10330000C93BC1F1CA3BC9F58AE292E038C082EEFE +:1033100090E035C089EE90E032C08AEE90E02FC098 +:1033200085EB90E02CC086EB90E029C087EB90E025 +:1033300026C08CEC90E023C08DEC90E020C083E8A8 +:1033400091E01DC08AE891E01AC082E991E017C0BF +:1033500084E991E014C081E292E011C083E292E03E +:103360000EC084E292E00BC085E292E008C086E2E3 +:1033700092E005C087E292E002C080E090E0CF9149 +:103380000C94E417CF910895882309F44BC0823838 +:1033900059F40E94721781FF45C089E30E949E2262 +:1033A0000E947A2389E30CC0833871F40E9472175B +:1033B00080FF38C083E50E949E220E947A2383E525 +:1033C0000E94EF220C947A23843859F40E947217D9 +:1033D00082FF28C087E40E949E220E947A2387E40D +:1033E000EFCF9CEF980F913A58F390E2980F9830F6 +:1033F00050F4877091E001C0990F8A95EAF7892F00 +:103400000E944723DFCF9BE5980F933020F480E0A4 +:1034100090E00C94CE17885A833120F480E090E03D +:103420000C94E4170895882321F00E9441230C9402 +:103430007A230895882321F00E9447230C947A234D +:103440000895CF92DF92EF92FF920F931F93CF9345 +:10345000DF93CDB7DEB728970FB6F894DEBF0FBE67 +:10346000CDBF8C0185E0F801DE01119601900D922F +:103470008A95E1F7F80140813181F280258122951A +:103480002F7083819481892B31F03F3F31F481E0AB +:103490004F3F19F403C081E001C080E080FDC4C249 +:1034A00049833A8389819A812F830E945C229E837B +:1034B00088870E945B220E942E214E81E42FE29594 +:1034C000EF70F0E0E05AFF4F2F8168850C94C82F11 +:1034D000842F807F142F1F70882311F01295107F86 +:1034E000FF2059F0112309F454C2812F68870E94EC +:1034F00051230E947A2368854CC2862F0E94C419EA +:10350000112309F491C2812F0E94572328960FB6E8 +:10351000F894DEBF0FBECDBFDF91CF911F910F9109 +:10352000FF90EF90DF90CF900C947A23342F307F70 +:10353000842F8F70303211F08295807F662319F0CE +:10354000613019F12BC0FF20B1F0222309F493C19F +:10355000213009F090C128960FB6F894DEBF0FBE57 +:10356000CDBFDF91CF911F910F91FF90EF90DF9032 +:10357000CF900C946123222319F0213009F454C216 +:103580008E830E9464238E8189C1FF2021F0223026 +:1035900008F04AC270C1211147C280C1FF2021F04A +:1035A000222309F468C1F5C1222309F477C105C2B9 +:1035B000242F26952695237030E02115310521F022 +:1035C00021303105C9F030C2FF2021F0862F942F21 +:1035D000937002C080E090E028960FB6F894DEBFAA +:1035E0000FBECDBFDF91CF911F910F91FF90EF9054 +:1035F000DF90CF900C94CE17FF2021F0862F942FD0 +:10360000937002C080E090E028960FB6F894DEBF79 +:103610000FBECDBFDF91CF911F910F91FF90EF9023 +:10362000DF90CF900C94E417862FFF2019F00E94B2 +:10363000CA2602C00E94322728960FB6F894DEBF31 +:103640000FBECDBFDF91CF911F910F91FF90EF90F3 +:10365000DF90CF900C94B727842F837009F076C049 +:10366000F110E2C1262F229526952770220F220FF6 +:10367000862F8F70C82ED12CE12CF12C022E04C085 +:10368000CC0CDD1CEE1CFF1C0A94D2F764FF10C0AA +:103690006FE070E080E090E004C0660F771F881F45 +:1036A000991F2A95D2F7609570958095909503C0E3 +:1036B00060E070E0CB01242F269526952370422FE1 +:1036C00050E042305105D1F04330510559F16C2999 +:1036D0007D298E299F294130510541F128960FB649 +:1036E000F894DEBF0FBECDBFDF91CF911F910F9138 +:1036F000FF90EF90DF90CF900C9453216C297D299F +:103700008E299F2928960FB6F894DEBF0FBECDBF35 +:10371000DF91CF911F910F91FF90EF90DF90CF90AD +:103720000C946D210E945321C701B60128960FB653 +:10373000F894DEBF0FBECDBFDF91CF911F910F91E7 +:10374000FF90EF90DF90CF900C943921FF2019F07B +:10375000842F817001C08695882309F465C1262FC6 +:10376000229526952770220F220F862F8F70C82E44 +:10377000D12CE12CF12C022E04C0CC0CDD1CEE1C53 +:10378000FF1C0A94D2F764FF10C06FE070E080E085 +:1037900090E004C0660F771F881F991F2A95D2F703 +:1037A000609570958095909503C060E070E0CB01C6 +:1037B000242F269526952370422F50E04230510544 +:1037C000D1F04330510559F16C297D298E299F296B +:1037D0004130510541F128960FB6F894DEBF0FBE77 +:1037E000CDBFDF91CF911F910F91FF90EF90DF90B0 +:1037F000CF900C9427226C297D298E299F29289609 +:103800000FB6F894DEBF0FBECDBFDF91CF911F91F1 +:103810000F91FF90EF90DF90CF900C9441220E9487 +:103820002722C701B60128960FB6F894DEBF0FBE57 +:10383000CDBFDF91CF911F910F91FF90EF90DF905F +:10384000CF900C940D22603FC9F118F4603E50F403 +:103850009BC0623F09F460C008F44AC0633F09F4AA +:103860006FC092C0162F1F70842F8F71FF2099F0A8 +:103870000E94A621812F28960FB6F894DEBF0FBEB6 +:10388000CDBFDF91CF911F910F91FF90EF90DF900F +:10389000CF900C94131A0E94C721812F28960FB63F +:1038A000F894DEBF0FBECDBFDF91CF911F910F9176 +:1038B000FF90EF90DF90CF900C941A1AFF20A1F0A8 +:1038C0002111B2C0842F8F7128960FB6F894DEBFF5 +:1038D0000FBECDBFDF91CF911F910F91FF90EF9061 +:1038E000DF90CF900C94EC21223008F09DC0EACFFD +:1038F000FF20A1F0842F8F7128960FB6F894DEBFB9 +:103900000FBECDBFDF91CF911F910F91FF90EF9030 +:10391000DF90CF900C94A621FF2061F3842F8F714C +:1039200028960FB6F894DEBF0FBECDBFDF91CF91C2 +:103930001F910F91FF90EF90DF90CF900C94C721D3 +:10394000FF2091F0842F8F7128960FB6F894DEBF78 +:103950000FBECDBFDF91CF911F910F91FF90EF90E0 +:10396000DF90CF900C94912128960FB6F894DEBF8B +:103970000FBECDBFDF91CF911F910F91FF90EF90C0 +:10398000DF90CF900C948721FF20A1F0222309F42F +:10399000B1CF862F28960FB6F894DEBF0FBECDBFED +:1039A000DF91CF911F910F91FF90EF90DF90CF901B +:1039B0000C94FC18222309F4B1CF862F28960FB659 +:1039C000F894DEBF0FBECDBFDF91CF911F910F9155 +:1039D000FF90EF90DF90CF900C94C4194F70C80106 +:1039E0000E94560A28960FB6F894DEBF0FBECDBFD0 +:1039F000DF91CF911F910F91FF90EF90DF90CF90CB +:103A00000C94AE204F70C80128960FB6F894DEBF14 +:103A10000FBECDBFDF91CF911F910F91FF90EF901F +:103A2000DF90CF900C944F0E28960FB6F894DEBF1F +:103A30000FBECDBFDF91CF911F910F91FF90EF90FF +:103A4000DF90CF9008950E945E230E9433230E944E +:103A50007A230E94E5280E94B72780E090E00E9428 +:103A6000CE1780E090E00C94E4170E944E230C9453 +:103A7000231D0E945C22292F22952F7030E02C30CC +:103A800031054CF42A3031056CF4225031092230D2 +:103A9000310590F407C02C30310551F02F3031053D +:103AA00039F00AC0803E10F0803F31F481E0089583 +:103AB00093FB882780F9089580E00895CF93DF93E2 +:103AC00000D000D01F92CDB7DEB70F900F900F90AF +:103AD0000F900F90DF91CF910895CF93DF9300D097 +:103AE00000D000D0CDB7DEB726960FB6F894DEBF73 +:103AF0000FBECDBFDF91CF9108951F93CF93DF937A +:103B0000C091840116E080918501C81799F0D0E03A +:103B10001C9FF0011D9FF00D1124EA57FE4F4081BC +:103B2000518162817381848195810E946D1D2196EE +:103B3000C770E9CFDF91CF911F9108954091B601F1 +:103B40005091B7016091B8017091B9018091BA01AB +:103B50009091BB010C946D1DCF938091BB01829518 +:103B60008F7009F05FC08091B801882309F45AC0B2 +:103B700020918401A09185016091B6017091B701F7 +:103B80008091B9019091BA0131E06F3F09F030E0C6 +:103B9000B32FC6E02A1709F445C0009721F07F3FF4 +:103BA00021F44B2F03C041E001C040E030E040FD74 +:103BB00035C0C29FF001C39FF00D1124EA57FE4F9C +:103BC000418174132BC04081641328C0428141118C +:103BD00025C0438154814817590710F441505109B9 +:103BE000481B590B483C5105C8F48091BB018F70AC +:103BF00080618093BB0186E0829FF001839FF00D7E +:103C00001124E557FE4F80818F708061808386EBA1 +:103C100091E00E94211ACF910C947D1D2F5F3F4FA0 +:103C20002770B8CFCF910895CF92DF92EF92FF9295 +:103C30000F931F93CF93DF93CDB7DEB762970FB685 +:103C4000F894DEBF0FBECDBF8C0185E0F801DE0128 +:103C50001D9601900D928A95E1F7D8014C9111962D +:103C60005C91119712966C9112971396ED90FC90BF +:103C700014977091B601E091B7012091B90130918C +:103C8000BA012115310531F0EF3F31F481E07F3F7A +:103C900019F403C081E001C080E0B82FB170CB2ED1 +:103CA00080FD6CC1D090B801DD2009F4F5C0F09121 +:103CB000BB01E216F30638F0C701821B930B883C68 +:103CC000910548F09BC0209530952E0D3F1D283C56 +:103CD000310508F093C08F2F807F09F052C0E513A3 +:103CE00014C0741312C0D62E61110FC0FF70F061A2 +:103CF000F093BB010E949E1D86EB91E00E94211A69 +:103D00008091BB01F80185836CC1EF2831F05F3FE2 +:103D100031F481E04F3F19F403C081E001C080E03D +:103D200080FD03C081E0862701C080E0F82FF1709C +:103D3000FF2E80FF1CC0809184012091850136E018 +:103D4000821709F428C190E0389FF001399FF00DE7 +:103D50001124EA57FE4F7181571306C07081471333 +:103D600003C07281671303C001968770E9CFD62E16 +:103D7000662309F436C18091BB0181608093BB0149 +:103D800053C0E51308C0741306C0611104C0D80104 +:103D90001596FC93AEC04D875E878D859E856A8B98 +:103DA0000E94391D6A89882329F1D62E662311F1D4 +:103DB0002091BB01822F82958F7090E002970CF4C6 +:103DC00060C08091B6019091B70198878F83198662 +:103DD000FB86EA862C87CE01079651C0E51731F1A4 +:103DE0004D875E878D859E856A8B0E94391D6A8905 +:103DF00081112EC0C8010E94211AA4C08F2F807F7C +:103E000069F77E2DF98AE88A89890E945E1D86EB12 +:103E100091E00E94211AE6EBF1E086E0DF011D92BD +:103E20008A95E9F70E949E1DD12CDBC07413D8CF70 +:103E30006111D6CFD8011596FC93C8010E94211AB2 +:103E4000E6EBF1E086E0DF011D928A95E9F7C9C053 +:103E5000D62E662379F22091BB01822F82958F7036 +:103E600090E0029774F08091B6019091B7019A8327 +:103E700089831B82FD82EC822E83CE0101960E94F3 +:103E8000211A86E0F801A6EBB1E001900D928A9527 +:103E9000E1F70E94AC1D6FC0E216F30628F0C701DF +:103EA000821B930B9C0104C0209530952E0D3F1D65 +:103EB000283C310508F052C0D62E662309F49ACF6B +:103EC000E5132CC074132AC08091BB0180FD1DC076 +:103ED000982F92959F70C9F0D80115968C931597DD +:103EE0009F3039F09F5F9295907F8F70892B159648 +:103EF0008C93C8010E94211A86E0F801A6EBB1E07C +:103F000001900D928A95E1F736C086E0F801A6EBA4 +:103F1000B1E001900D928A95E1F763C04D875E870D +:103F20008D859E850E94391D882379F086E0F801F1 +:103F3000A6EBB1E001900D928A95E1F70E94AC1DCD +:103F40000E949E1DDD24D3944CC08091BB018160F2 +:103F50008093BB01C8010E94211A43C07E2DF98ABB +:103F6000E88A89890E945E1DE6EBF1E086E0DF01C8 +:103F70001D928A95E9F70E949E1D33C0662309F4BD +:103F800039CF4D875E878D859E850E94391D882398 +:103F900009F430CFCBCF4D875E878D859E850E94FB +:103FA0005C22292F22952F7030E0223031052CF42D +:103FB0009F7041F0811106C00CC0243031052CF4F3 +:103FC0009F7049F4805E883020F0C8010E94211A59 +:103FD000CF2CDC2C06C0D80115969C91907F91F7D0 +:103FE000F8CF8D2D62960FB6F894DEBF0FBECDBF11 +:103FF000DF91CF911F910F91FF90EF90DF90CF90C5 +:1040000008951F93CF93DF93CDB7DEB72C970FB6EC +:10401000F894DEBF0FBECDBF4F83588769877A877C +:104020008B879C87CE0107960E94141E8823C1F0BF +:104030002F8138858A859B85892B31F03F3F11F090 +:1040400080E003C02F3FE1F781E0811147C04F813D +:10405000588569857A858B859C850E946D1D3EC03B +:1040600086E0FE013796DE01119601900D928A9549 +:10407000E1F7FF81E8854A855B854115510531F0FF +:10408000EF3F31F481E0FF3F19F403C081E001C04C +:1040900080E080FD23C02091850130E0C9010196B8 +:1040A000877099276091840170E086179707F1F176 +:1040B000F983EA835D834C8396E0929FD001939FBE +:1040C000B00D1124AA57BE4FFE01319601900D92FA +:1040D0009A95E1F7809385010E947D1D16E08091FD +:1040E000840190918501891779F1189FC0011124ED +:1040F0008A579E4F0E94141E882331F1E09184015B +:104100001E9FF0011124EA57FE4F408151816281C8 +:104110007381848195810E946D1D8091840190E05E +:1041200001968770992780938401D9CF0E94351D0D +:104130001092850110928401E6EBF1E086E0DF0148 +:104140001D928A95E9F7CACF2C960FB6F894DEBF78 +:104150000FBECDBFDF91CF911F910895EF92FF92D7 +:104160000F931F93CF93DF93FC01009709F46FC067 +:10417000F12CEE24E394EF0121968491843740F4EE +:10418000843008F055C0813081F0823021F15FC069 +:10419000853709F447C0C0F19CE7980F903708F0C5 +:1041A00056C08F770E94C41945C08F010E5F1F4F04 +:1041B000FE01849190E2980F983050F48770FE2DA4 +:1041C00001C0FF0F8A95EAF78F2F0E94512315C077 +:1041D0000E94FC1814C08F010E5F1F4FFE018491D6 +:1041E00090E2980F983068F48770FE2D01C0FF0FA1 +:1041F0008A95EAF78F2F0E9457230E947A23E801BD +:1042000019C00E94C419FBCFCF010296FE01C491D0 +:10421000CC2361F0EFE9FFE03197F1F700C0000037 +:10422000C150F6CFCF010296FE01F490EC0102C01E +:104230000E94FC188F2D882341F0EFE9FFE03197B1 +:10424000F1F700C000008150F6CFFE0194CFDF915E +:10425000CF911F910F91FF90EF9008950895609373 +:10426000C0017093C1018093C2019093C3010C946B +:10427000231D0F931F930091C0011091C101209144 +:10428000C2013091C301062B172B282B392B009329 +:10429000C0011093C1012093C2013093C3011F914B +:1042A0000F910C94231D0F931F930091C001109147 +:1042B000C1012091C2013091C30106231723282395 +:1042C00039230093C0011093C1012093C2013093A0 +:1042D000C3011F910F910C94231D0F931F93009105 +:1042E000C0011091C1012091C2013091C301062784 +:1042F0001727282739270093C0011093C101209365 +:10430000C2013093C3011F910F910C94231D109291 +:10431000BC011092BD011092BE011092BF010C941D +:10432000231D41E050E060E070E004C0440F551FE1 +:10433000661F771F8A95D2F74093BC015093BD0149 +:104340006093BE017093BF010C94231D41E050E0C7 +:1043500060E070E004C0440F551F661F771F8A9508 +:10436000D2F78091BC019091BD01A091BE01B091A6 +:10437000BF01842B952BA62BB72B8093BC01909368 +:10438000BD01A093BE01B093BF010C94231D41E079 +:1043900050E060E070E004C0440F551F661F771FB7 +:1043A0008A95D2F740955095609570958091BC01A3 +:1043B0009091BD01A091BE01B091BF0184239523CE +:1043C000A623B7238093BC019093BD01A093BE01A7 +:1043D000B093BF010C94231D41E050E060E070E019 +:1043E00004C0440F551F661F771F8A95D2F780912E +:1043F000BC019091BD01A091BE01B091BF01842785 +:104400009527A627B7278093BC019093BD01A09361 +:10441000BE01B093BF010C94231D0F931F93009115 +:10442000BC011091BD012091BE013091BF01062B4E +:10443000172B282B392B0093BC011093BD0120931F +:10444000BE013093BF011F910F910C94231D0F9358 +:104450001F930091BC011091BD012091BE013091CC +:10446000BF0106231723282339230093BC0110938F +:10447000BD012093BE013093BF011F910F910C9499 +:10448000231D0F931F930091BC011091BD0120913A +:10449000BE013091BF01062717272827392700932F +:1044A000BC011093BD012093BE013093BF011F9149 +:1044B0000F910C94231D0895CF92DF92EF92FF92FB +:1044C0000F931F93CF93DF93EC01C090C001D09066 +:1044D000C101E090C201F090C3018091BC019091B4 +:1044E000BD01A091BE01B091BF01C82AD92AEA2A14 +:1044F000FB2A0FE110E0B701A601002E04C076955B +:104500006795579547950A94D2F740FF07C0BE01BB +:10451000802F0E94720E8130910539F401501109EB +:1045200050F7BE0180E00E94720EDF91CF911F9183 +:104530000F91FF90EF90DF90CF90089590910C0134 +:10454000992361F190910D01992341F1982F96954E +:10455000969596959F3088F4E0910E01F0910F01A9 +:10456000E90FF11D877021E030E001C0220F8A952C +:10457000EAF78181822B818308959091D70190FF82 +:104580002DC01F928F9381E99AE09F938F930E9491 +:104590004D0A0F900F900F900F90089540910E01CB +:1045A00050910F0120E030E09FEFFA01E20FF31F7E +:1045B0006281681799F09F3F19F4611101C0922F31 +:1045C0002F5F3F4F2E30310581F79F3F39F0FA01C1 +:1045D000E90FF11D97FDFA95828308950895909152 +:1045E0000C01992369F190910D01992349F1982FBC +:1045F0009695969596959F3090F4E0910E01F091E6 +:104600000F01E90FF11D877021E030E001C0220F9A +:104610008A95EAF720958181282321830895909136 +:10462000D70190FF1FC01F928F9383E79AE09F935B +:104630008F930E944D0A0F900F900F900F90089546 +:1046400040910E0150910F0120E030E0FA01E20F9D +:10465000F31F9281981301C012822F5F3F4F2E30BB +:104660003105A1F7089581E090E0E0910E01F0910D +:104670000F01E80FF91F1082019680319105A9F70B +:1046800008959091D601982B9093D6010895809526 +:104690009091D60198239093D60108951092D60157 +:1046A00008959091D501982B9093D5010895809508 +:1046B0009091D50198239093D50108951092D5013A +:1046C00008958093C40108951092C4010895409103 +:1046D0000E0150910F0120E030E080E0FA01E20F7E +:1046E000F31F918191118F5F2F5F3F4F2F30310565 +:1046F000A9F70895E0910E01F0910F018091D60184 +:104700008083E0910E01F0910F0180819091D5019D +:10471000892B80839091C401992361F0E0910E016F +:10472000F0910F018081892B80830E946723811182 +:104730001092C40180910E0190910F010C947E178C +:1047400090933B0180933A0108958295982F9C7C29 +:1047500096959695837344E0849F90011124922B43 +:10476000892F8A7A86959575990F892B08951F93BD +:10477000CF93DF931F92CDB7DEB799830E94A52315 +:10478000182F9981892F0E94A523212F30E0322FE5 +:104790002227A901482BCA010F90DF91CF911F91C9 +:1047A00008958091F001843009F11092D80120E43D +:1047B00088E190E00FB6F894A895809360000FBE52 +:1047C0002093600083B7817F846083BF83B781605B +:1047D00083BF7894889583B78E7F83BF88E10FB6B7 +:1047E000F89480936000109260000FBE08950895C1 +:1047F0000895CF930E94F7230E94180C0E94F8237B +:10480000C0E08C2F0E94430D811105C0CF5FCE30D8 +:10481000C1F780E001C081E0CF9108950C94351D6F +:1048200082E084BD93E095BD9AEF97BD80936E00C2 +:1048300008952FB7F8948091D9019091DA01A09151 +:10484000DB01B091DC012FBF0895CF92DF92EF9290 +:10485000FF920F931F932FB7F8944091D901509175 +:10486000DA016091DB017091DC012FBF6A017B01ED +:10487000EE24FF248C0120E030E0C016D106E206D1 +:10488000F30610F441505109481B590BCA011F91FE +:104890000F91FF90EF90DF90CF9008951F920F92AD +:1048A0000FB60F9211248F939F93AF93BF93809174 +:1048B000D9019091DA01A091DB01B091DC01019660 +:1048C000A11DB11D8093D9019093DA01A093DB0162 +:1048D000B093DC01BF91AF919F918F910F900FBE6C +:1048E0000F901F9018950E947914F8942FEF87EA83 +:1048F00091E6215080409040E1F700C0000087E041 +:1049000090EBDC018093F9019093FA01A093FB01F5 +:10491000B093FC012CE088E190E00FB6F894A895E4 +:10492000809360000FBE20936000FFCFEF92FF9254 +:104930000F931F93CF93DF93E82EF12C8F2D0E94BE +:10494000430DC0E0D0E0082F10E098010C2E02C00B +:10495000359527950A94E2F720FD05C02196C630CB +:10496000D10599F709C06C2F7F2D80E00E94500E71 +:10497000E812F4CF81E005C0F3948EE0F812DECFA8 +:1049800080E0DF91CF911F910F91FF90EF900895FC +:10499000CF93C82F8CE20E949624882321F08C2F7D +:1049A000CF910C94962480E0CF910895CF930E94EC +:1049B0002326811102C00E94092686EB9AE00E94FC +:1049C000B409C5E6C15049F00E94180C8FE39CE978 +:1049D0000197F1F700C00000F5CF8FEA9AE00E943E +:1049E000B40989E20E94C824811111C18AE20E949F +:1049F000C82481110E94092685E00E94C8248111E3 +:104A00000E9473240E942E268093D70187E00E9483 +:104A1000C824882399F18BE10E94C824882351F08F +:104A20009091D70191FB882780F921E0822780FBB4 +:104A300091F922C08EE00E94C824882351F0909101 +:104A4000D70192FB882780F921E0822780FB92F929 +:104A500013C080E10E94C8249091D701882341F0BF +:104A600093FB882780F921E0822780FB93F904C01B +:104A7000892F809580FB90F99093D7018091D70181 +:104A80000E9432260E9440268093EA0180EE0E9416 +:104A9000C824882341F08091EA01982F909590FBDB +:104AA00080F98093EA0189E30E94C824882359F0A1 +:104AB0009091EA0191FB882780F921E0822780FB11 +:104AC00091F99093EA0182EE0E94C824882359F05C +:104AD0009091EA0192FB882780F921E0822780FBF0 +:104AE00092F99093EA0186EE0E94C824882359F037 +:104AF0009091EA0193FB882780F921E0822780FBCF +:104B000093F99093EA0183EE0E94C824882359F018 +:104B10009091EA0194FB882780F921E0822780FBAD +:104B200094F99093EA0185E30E94C824882359F000 +:104B30009091EA0195FB882780F921E0822780FB8C +:104B400095F99093EA0181E30E94C824882359F0E3 +:104B50009091EA0196FB882780F921E0822780FB6B +:104B600096F99093EA0181E10E94C824882359F0C4 +:104B70009091EA0197FB882780F921E0822780FB4A +:104B800097F99093EA018091EA010E94442680916E +:104B9000EA0187FB882780F980930D0187E20E9454 +:104BA000C824C82F8EE10E94C8248111C2608FE101 +:104BB0000E94C8248111C46080E20E94C82481112F +:104BC000C86081E20E94C8248111C06182E20E9413 +:104BD000C8248111C06283E20E94C8248111C0648C +:104BE00084E20E94C824882311F0C06802C0CC234C +:104BF00029F08C2F0E943B266C2F03C00E94372681 +:104C0000682F70E080E090E0CF910C942F21CF913D +:104C100008956DEE7EEF80E090E00E94FE2F60E050 +:104C200082E090E00E94F02F60E083E090E00E943C +:104C3000F02F60E084E090E00E94F02F60E085E0DB +:104C400090E00C94F02F80E090E00E94EA2F21E0A9 +:104C50008D3E9E4F09F020E0822F089582E090E083 +:104C60000C94E22F682F82E090E00C94F02F83E008 +:104C700090E00C94E22F682F83E090E00C94F02FEA +:104C800084E090E00C94E22F682F84E090E00C9494 +:104C9000F02F8091DF0180FF0BC06091130185E050 +:104CA000689FB001112475956795759567952AC021 +:104CB00081FF09C06091130185E0689FB001112454 +:104CC000759567951FC082FF07C06091130185E04D +:104CD000689FB001112416C04091E0014423C9F03F +:104CE00060911201461788F72091130185E0289FF3 +:104CF00090011124429FC001439F900D112470E048 +:104D00000E94B42F6038710540F46115710539F0C7 +:104D100002C065E070E0862F08958FE7089581E076 +:104D200008958091DF0180FF08C06091110170E05B +:104D3000759567957595679521C081FF06C060914F +:104D4000110170E07595679519C082FF04C06091EC +:104D5000110170E010C08091E0018823C1F06091E2 +:104D600010018617A0F790911101989FC00111249E +:104D700070E00E94B42F6038710528F46115710548 +:104D800021F0862F08958FE7089581E0089561E06E +:104D900070E0F4CF803F21F40E944926819504C041 +:104DA000813F29F40E9449268093E3010895823FC0 +:104DB00021F40E944926819504C0833F29F40E9472 +:104DC00049268093E2010895893F19F40E949126B3 +:104DD00005C08A3F31F40E94912681958093E401B9 +:104DE00008958B3F21F40E949126819504C08C3F49 +:104DF00029F40E9491268093E5010895843F21F4CF +:104E00008091E101816017C0853F21F48091E1012B +:104E1000826011C0863F21F48091E10184600BC063 +:104E2000873F21F48091E101886005C0883F31F41B +:104E30008091E10180618093E10108958D3F21F42B +:104E40008091DF0181600BC08E3F21F48091DF01F2 +:104E5000826005C08F3F29F48091DF0184608093D8 +:104E6000DF010895803F39F48091E30187FF6CC032 +:104E70001092E30169C0813F29F48091E301181683 +:104E8000BCF362C09091E201823F29F497FF5CC0BD +:104E90001092E20159C0833F19F41916CCF354C0A3 +:104EA000893F41F48091E40118160CF04DC0109236 +:104EB000E4014AC08A3F29F48091E40187FF44C09D +:104EC000F6CF8B3F39F48091E50187FF3DC010920A +:104ED000E5013AC08C3F29F48091E5011816BCF336 +:104EE00033C0843F21F48091E1018E7F17C0853F5C +:104EF00021F48091E1018D7F11C0863F21F48091E2 +:104F0000E1018B7F0BC0873F21F48091E101877F16 +:104F100005C0883F31F48091E1018F7E8093E101EB +:104F200013C08D3F21F48091DF018E7F0BC08E3F37 +:104F300021F48091DF018D7F05C08F3F29F480919E +:104F4000DF018B7F8093DF018091E20181110EC030 +:104F50008091E30181110AC08091E401811106C0B2 +:104F60008091E501811102C01092E00108958091C5 +:104F7000D70183FF7EC082EF9AE00E94B40980913E +:104F8000E1011F928F938DEE9AE09F938F930E9481 +:104F90004D0A8BEE9AE00E94B4092091E201822F23 +:104FA000992787FD90959F932F9388EE9AE09F9382 +:104FB0008F930E944D0A86EE9AE00E94B4092091D8 +:104FC000E301822F992787FD90959F932F9383EE7E +:104FD0009AE09F938F930E944D0A81EE9AE00E947F +:104FE000B4092091E401822F992787FD90959F9322 +:104FF0002F938EED9AE09F938F930E944D0A8CED34 +:105000009AE00E94B4092091E501822F992787FD3B +:1050100090959F932F9389ED9AE09F938F930E9491 +:105020004D0A86ED9AE00E94B4098091E0011F923A +:105030008F9383ED9AE09F938F930E944D0A81EDA9 +:105040009AE00E94B4098091DF011F928F938EEC49 +:105050009AE09F938F930E944D0A8BEC9AE00E94F6 +:10506000B4098DB79EB74C960FB6F8949EBF0FBE8D +:105070008DBF81EE91E00E94C3170E941924909386 +:10508000DE018093DD0108951F93CF93DF9380911C +:10509000DD019091DE010E9425244091E00144232E +:1050A00021F02091140130E006C0209115015AE052 +:1050B000259F900111248217930708F482C08091E4 +:1050C000E2011091E301D091E401C091E501811169 +:1050D00007C0111105C0D11103C0CC2309F471C060 +:1050E0004F3F19F04F5F4093E001181624F40E94DF +:1050F00049268093E2018091E20187FF05C00E946A +:10510000492681958093E201111624F40E944926D4 +:105110008093E3018091E30187FF05C00E94492647 +:1051200081958093E3016091E201662339F110914A +:10513000E301112319F1772767FD7095872F972FCA +:105140000E94B92E23E333E343E35FE30E941D2F64 +:105150000E94862E6093E201612F772767FD70958C +:10516000872F972F0E94B92E23E333E343E35FE3B6 +:105170000E941D2F0E94862E6093E3011D1624F4C9 +:105180000E9491268093E4018091E40187FF05C08D +:105190000E94912681958093E4011C1624F40E94BC +:1051A00091268093E5018091E50187FF05C00E946B +:1051B000912681958093E501DF91CF911F910C9409 +:1051C000B727DF91CF911F910895E1EEF1E085E0DF +:1051D000DF011D928A95E9F71092E0011092DF013C +:1051E000089585E19DE00E94B4091F9281E08F93AC +:1051F0001F9285E08F9387EC9CE09F938F930E9492 +:105200004D0A0F900F900F900F900F900F900895F0 +:105210008330E9F128F4813061F0823009F108959A +:10522000853009F462C008F449C0863009F474C0BE +:10523000089520911501862F90E0820F911D8F3FD8 +:10524000910520F4620F6093150103C08FEF8093E6 +:105250001501809115011F928F9380E09CE072C030 +:1052600020911401862F90E0820F911D8F3F9105B0 +:1052700020F4620F6093140103C08FEF8093140138 +:10528000809114011F928F938EEE9BE05BC0209162 +:105290001301862F90E0820F911D8F3F910520F41E +:1052A000620F6093130103C08FEF8093130180910D +:1052B00013011F928F938BED9BE044C0209112014C +:1052C000862F90E0820F911D8F3F910520F4620F91 +:1052D0006093120103C08FEF80931201809112013D +:1052E0001F928F9386EC9BE02DC020911101862F99 +:1052F00090E0820F911D8F3F910520F4620F609323 +:10530000110103C08FEF80931101809111011F9251 +:105310008F938DEA9BE016C020911001862F90E0BC +:10532000820F911D8F3F910520F4620F6093100151 +:1053300003C08FEF80931001809110011F928F9313 +:1053400082E99BE09F938F930E944D0A0F900F90EC +:105350000F900F900895833081F128F4813059F037 +:105360008230D1F00895853009F449C0B8F1863013 +:1053700009F456C0089580911501681720F4861B22 +:105380008093150102C010921501809115011F92A2 +:105390008F9383E89BE054C080911401681720F438 +:1053A000861B8093140102C0109214018091140195 +:1053B0001F928F9381E79BE043C080911301681790 +:1053C00020F4861B8093130102C010921301809178 +:1053D00013011F928F938EE59BE032C080911201E2 +:1053E000681720F4861B8093120102C010921201EC +:1053F000809112011F928F9389E49BE021C08091DC +:105400001101681720F4861B8093110102C01092CD +:105410001101809111011F928F9380E39BE010C0D6 +:1054200080911001681720F4861B8093100102C040 +:1054300010921001809110011F928F9385E19BE0E3 +:105440009F938F930E944D0A0F900F900F900F9093 +:105450000895CF93C82F1F928F932AE13EE03F9388 +:105460002F930E944D0A61E070E080E090E004C05C +:10547000660F771F881F991FCA95D2F70E942F21A8 +:105480000F900F900F900F90CF910C94351DCF93EC +:105490008D3109F465C0B0F58E3009F4CBC100F54B +:1054A000873009F49BC1A8F4863009F06AC2809164 +:1054B000D701817F8E7F8093D7018FE19EE00E948C +:1054C000B40984E692E10E94B40981E08093E70187 +:1054D00080C1883009F44FC08B3009F47CC151C2BF +:1054E000863109F4EDC138F4803109F4B6C1813157 +:1054F00009F42DC246C2893109F4CBC18B3109F4BC +:1055000086C13FC2853309F434C248F4873209F4B6 +:1055100030C208F430C2893209F42BC232C283345B +:1055200038F48A3308F029C2883309F454C129C2F7 +:10553000833409F41EC2883409F023C20E94351D49 +:1055400083E592E10E94B4099FEF23ED80E391503F +:1055500020408040E1F700C000000E94732439C160 +:1055600083E792E10E94B4090E94402E0E947217C4 +:105570000E94B00F2EC188E692E10E94B40980E338 +:1055800090E10E94B4090E9437261F928F938DE20A +:1055900090E19F938F930E944D0A8BE290E10E94CD +:1055A000B4090E942E26C82F88E190E10E94B40918 +:1055B0001F92CF9323E130E13F932F930E944D0A36 +:1055C00081E190E10E94B40987E090E10E94B40972 +:1055D0008C2F81701F928F9324E030E13F932F93A3 +:1055E0000E944D0A82E090E10E94B40988EF9FE09A +:1055F0000E94B409C1FB882780F91F928F9325EF81 +:105600003FE03F932F930E944D0A83EF9FE00E945B +:10561000B40987EE9FE00E94B409C2FB882780F995 +:105620001F928F9324EE3FE03F932F930E944D0AE9 +:1056300082EE9FE00E94B40989ED9FE00E94B409C8 +:10564000C3FBCC27C0F91F92CF9386ED9FE09F93B9 +:105650008F930E944D0A84ED9FE00E94B4090E943E +:105660004026C82F80EC9FE00E94B4091F92CF9380 +:105670002BEB3FE03F932F930E944D0A89EB9FE075 +:105680000E94B40980EA9FE00E94B4098C2F8170C7 +:105690001F928F932DE93FE03F932F930E944D0A75 +:1056A0008DB79EB780960FB6F8949EBF0FBE8DBF84 +:1056B0008BE99FE00E94B40984E89FE00E94B4094E +:1056C000C1FB882780F91F928F9321E83FE03F9329 +:1056D0002F930E944D0A8FE79FE00E94B4098DE648 +:1056E0009FE00E94B409C2FB882780F91F928F9324 +:1056F0002AE63FE03F932F930E944D0A88E69FE001 +:105700000E94B40986E59FE00E94B409C3FB882784 +:1057100080F91F928F9323E53FE03F932F930E94E0 +:105720004D0A81E59FE00E94B40987E49FE00E9452 +:10573000B409C4FB882780F91F928F9324E43FE0CB +:105740003F932F930E944D0A82E49FE00E94B40988 +:1057500080E39FE00E94B409C5FB882780F91F926F +:105760008F932DE23FE03F932F930E944D0A8BE2EF +:105770009FE00E94B4098FE09FE00E94B409C6FB3D +:10578000882780F91F928F932CE03FE03F932F935F +:105790000E944D0A8AE09FE00E94B40982E09FE0E7 +:1057A0000E94B409C7FBCC27C0F91F92CF938FEF9B +:1057B0009EE09F938F930E944D0A8DEF9EE00E9482 +:1057C000B4098DB79EB74C960FB6F8949EBF0FBE26 +:1057D0008DBFC1E0DBC086E49EE058C08091D70158 +:1057E000C82FC17080FF09C086E492E10E94B4090D +:1057F0008091D701817F8E7F44C08AE392E10E942D +:10580000B4098091D70181608093D701E2CF809164 +:10581000D70181FBCC27C0F991E0C927C0FB81F9F2 +:105820008093D701CC2319F08DE292E125C08FE15E +:1058300092E12CC08091D70182FBCC27C0F991E086 +:10584000C927C0FB82F98093D701CC2319F080E1EE +:1058500092E112C080E092E119C08091D70183FBF0 +:10586000CC27C0F991E0C927C0FB83F98093D70109 +:10587000CC2351F084EF91E10E94B4098091D701CB +:1058800081608093D70182C087EE91E10E94B409C4 +:10589000A0CF88ED91E10E94B4098CEA91E10E94C9 +:1058A000B4098FE691E10E94B40982E491E10E947B +:1058B000B4098EEF90E10E94B40980ED90E1E6CF4B +:1058C00082EC90E10E94B4090E9472171F928F939C +:1058D00088EA90E19F938F930E944D0A80910C017A +:1058E0001F928F9381E990E19F938F930E944D0ABD +:1058F00080916E011F928F938EE790E19F938F931B +:105900000E944D0A80910D011F928F938BE690E1CA +:105910009F938F930E944D0A8091D9019091DA0153 +:10592000A091DB01B091DC01BF93AF939F938F9364 +:1059300087E590E19F938F930E944D0A8DB79EB7A4 +:1059400046960FB6F8949EBF0FBE8DBF42CF0E9401 +:10595000351DC0910D0181E0C827C0930D01CC23F6 +:1059600029F08DE490E10E94B40910C082E490E136 +:105970008DCF80E003C08D5101C089530E94292A38 +:1059800028CF80E490E10E94B409C0E08C2FCF9131 +:10599000089580E0089580E00895CF93C82F809106 +:1059A000E701813081F020F0823009F44CC042C11F +:1059B000A0910E01B0910F018C91813169F082327A +:1059C00009F03AC109C0A0910E01B0910F018C916C +:1059D000813111F0823249F48C2F0E94C92C81113F +:1059E0002FC08C2F0E94472A2CC08C2F0E94CB2CBA +:1059F000811126C0C431E1F070F4CB3081F0C031A8 +:105A0000D1F40E94F12882E19EE00E94B40982E074 +:105A10008093E70115C0C93259F0C83361F48FE1B2 +:105A20009EE00E94B40986E19EE00E94B40908C08D +:105A30001092E70103C180E19EE00E94B409FEC01C +:105A400081E08170FDC0C43220F5CE3108F0C0C0C5 +:105A5000CB3099F1C8F4C73009F0D2C08AE0809306 +:105A6000150194E19093140193E0909313018093B6 +:105A7000120188E08093110188E28093100186EB87 +:105A80009CE00E94B409BFC0C33149F1C431C1F0E8 +:105A9000B7C0CB3409F4A9C028F4C93289F0C8339F +:105AA00061F0AEC0C13509F49EC0C23509F499C099 +:105AB000CE3409F0A5C06AE09EC00E94F128A3C0C0 +:105AC0008091E601882319F01092E6019CC083ECD6 +:105AD0009CE00E94B40981E08093E701B1C08DE9A8 +:105AE0009CE00E94B4098BE89CE00E94B40980917C +:105AF00015011F928F9388E89CE09F938F930E94DB +:105B00004D0A86E89CE00E94B40984E79CE00E946C +:105B1000B409809114011F928F9381E79CE09F93B9 +:105B20008F930E944D0A8FE69CE00E94B40980E6A4 +:105B30009CE00E94B409809113011F928F938DE520 +:105B40009CE09F938F930E944D0A8BE59CE00E94FE +:105B5000B4098AE49CE00E94B409809112011F926A +:105B60008F9387E49CE09F938F930E944D0A85E476 +:105B70009CE00E94B40980E39CE00E94B4098091FB +:105B800011011F928F938DE29CE09F938F930E944F +:105B90004D0A8BE29CE00E94B40984E19CE00E94E3 +:105BA000B409809110011F928F9381E19CE09F9333 +:105BB0008F930E944D0A8FE09CE00E94B4098DB73C +:105BC0009EB748960FB6F8949EBF0FBE8DBF1BC000 +:105BD000CE51EC2FF0E0E15DFE4F80818093E60135 +:105BE00012C061E003C061E006C06AE08091E60196 +:105BF0000E94082908C08091E6010E94AB2903C0D9 +:105C000084EB9CE013C08091E601882369F01F9229 +:105C10008F938EEA9CE09F938F930E944D0A0F9082 +:105C20000F900F900F9004C08BEA9CE00E94B40983 +:105C300081E006C01092E70180E002C080E001CF61 +:105C4000CF910895E1E8F0E08081886080838081D1 +:105C5000816080838FB7F89493E09093890090EDF2 +:105C6000909388008FBF0895EFE6F0E08081826016 +:105C700080830895EFE6F0E080818D7F8083089532 +:105C8000EFE6F0E0808192E08927808308951F92FB +:105C90000F920FB60F9211242F933F934F935F9360 +:105CA0006F937F938F939F93AF93BF93EF93FF93E4 +:105CB0008091E8019091E90101969093E901809328 +:105CC000E801811103C082E00E94B00FE091E90178 +:105CD000E695E695F0E0ED57FD4EE4918091E80100 +:105CE0008E1303C080E00E94B00FFF91EF91BF912F +:105CF000AF919F918F917F916F915F914F913F9164 +:105D00002F910F900FBE0F901F90189504D068949C +:105D1000B1118DC0089570D088F09F5790F0B92FC1 +:105D20009927B751A0F0D1F0660F771F881F991FF0 +:105D30001AF0BA95C9F712C0B13081F077D0B1E04E +:105D4000089574C0672F782F8827B85F39F0B93F5E +:105D5000CCF3869577956795B395D9F73EF49095F2 +:105D60008095709561957F4F8F4F9F4F0895E89470 +:105D700009C097FB3EF490958095709561957F4F93 +:105D80008F4F9F4F9923A9F0F92F96E9BB27939541 +:105D9000F695879577956795B795F111F8CFFAF451 +:105DA000BB0F11F460FF1BC06F5F7F4F8F4F9F4F82 +:105DB00016C0882311F096E911C0772321F09EE8E0 +:105DC000872F762F05C0662371F096E8862F70E046 +:105DD00060E02AF09A95660F771F881FDAF7880F20 +:105DE0009695879597F9089557FD9058440F551F3C +:105DF00059F05F3F71F04795880F97FB991F61F04D +:105E00009F3F79F087950895121613061406551FC3 +:105E1000F2CF4695F1DF08C0161617061806991F2F +:105E2000F1CF86957105610508940895E894BB2724 +:105E300066277727CB0197F908950BD078C069D0F2 +:105E400028F06ED018F0952309F05AC05FC01124D5 +:105E5000EECFCADFA0F3959FD1F3950F50E0551F09 +:105E6000629FF001729FBB27F00DB11D639FAA27AF +:105E7000F00DB11DAA1F649F6627B00DA11D661FFE +:105E8000829F2227B00DA11D621F739FB00DA11D1F +:105E9000621F839FA00D611D221F749F3327A00DD9 +:105EA000611D231F849F600D211D822F762F6A2F75 +:105EB00011249F5750408AF0E1F088234AF0EE0FFA +:105EC000FF1FBB1F661F771F881F91505040A9F707 +:105ED0009E3F510570F014C0AACF5F3FECF3983E8F +:105EE000DCF3869577956795B795F795E7959F5F6E +:105EF000C1F7FE2B880F911D9695879597F9089508 +:105F000097F99F6780E870E060E008959FEF80EC6C +:105F1000089500240A94161617061806090608950F +:105F200000240A9412161306140605060895092E75 +:105F30000394000C11F4882352F0BB0F40F4BF2BE4 +:105F400011F460FF04C06F5F7F4F8F4F9F4F089524 +:105F5000991B79E004C0991F961708F0961B881FBB +:105F60007A95C9F78095089597FB072E16F400944B +:105F700007D077FD09D00E94CE2F07FC05D03EF454 +:105F8000909581959F4F0895709561957F4F0895E5 +:105F9000EE0FFF1F0590F491E02D0994AA1BBB1B87 +:105FA00051E107C0AA1FBB1FA617B70710F0A61B19 +:105FB000B70B881F991F5A95A9F780959095BC013A +:105FC000CD010895F999FECF92BD81BDF89A992728 +:105FD00080B50895A8E1B0E042E050E00C940530AF +:105FE000262FF999FECF1FBA92BD81BD20BD0FB6F5 +:105FF000F894FA9AF99A0FBE019608950E94F02F2C +:10600000272F0C94F12FDC01CB01FC01F999FECF75 +:1060100006C0F2BDE1BDF89A319600B40D92415030 +:0A6020005040B8F70895F894FFCF40 +:10602A002002B10FA2107F104B1018100101C501F8 +:10603A0028080A03140A3F4D362039000AB3097D9D +:10604A00095D0924099708B008C908E2080209018C +:0A605A000203040506070809000010 +:00000001FF -- cgit v1.2.3 From 606d63e602bf5a01912a4c5b9c8536c705bcc777 Mon Sep 17 00:00:00 2001 From: DidierLoiseau Date: Sat, 23 Jan 2016 19:18:37 +0100 Subject: 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 | 58 ++++++++++++++-------------- 1 file changed, 30 insertions(+), 28 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 | | | | | | | | | `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' -- cgit v1.2.3 From 3e31fa4c50562b0d441262963ac6489351e7035d Mon Sep 17 00:00:00 2001 From: DidierLoiseau Date: Sat, 23 Jan 2016 19:29:14 +0100 Subject: 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 -- cgit v1.2.3 From e5aee62e54d0b6f02ff170f4e9bf1e738d36fb4c Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 23 Jan 2016 20:29:54 -0500 Subject: 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 -- cgit v1.2.3 From ae620fe8562254a5c00a48b863cabd4c87abd613 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 23 Jan 2016 20:35:13 -0500 Subject: 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 -- cgit v1.2.3 From 6a55a5fe484f15f37e790e276cb77ae06b534358 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 23 Jan 2016 20:40:40 -0500 Subject: not sure how this got here.. --- keyboard/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; - } - -}; -- cgit v1.2.3 From 24f2698fba0055128eb90fbde793e3c84900df69 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 23 Jan 2016 20:45:52 -0500 Subject: 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); -- cgit v1.2.3 From fd72a46c139c0450299e6e4ebbf4ffba531c9e2d Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 23 Jan 2016 20:52:01 -0500 Subject: 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 -- cgit v1.2.3 From 0a40654b82520849fcc587e8fb76c823378649a6 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Sun, 24 Jan 2016 13:14:50 -0800 Subject: 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 -- cgit v1.2.3 From ba9ac457b2159097ecfd9848c5171c52e3a68260 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Sun, 24 Jan 2016 17:05:47 -0800 Subject: Integrate WS2812 code into quantum core --- keyboard/planck/Makefile | 8 +- keyboard/planck/config.h | 6 - keyboard/planck/light_ws2812.c | 181 --------------- keyboard/planck/light_ws2812.h | 73 ------ keyboard/planck/rgblight.c | 505 ----------------------------------------- keyboard/planck/rgblight.h | 87 ------- quantum/light_ws2812.c | 181 +++++++++++++++ quantum/light_ws2812.h | 73 ++++++ quantum/quantum.mk | 9 +- quantum/rgblight.c | 505 +++++++++++++++++++++++++++++++++++++++++ quantum/rgblight.h | 87 +++++++ 11 files changed, 854 insertions(+), 861 deletions(-) delete mode 100755 keyboard/planck/light_ws2812.c delete mode 100755 keyboard/planck/light_ws2812.h delete mode 100644 keyboard/planck/rgblight.c delete mode 100644 keyboard/planck/rgblight.h create mode 100755 quantum/light_ws2812.c create mode 100755 quantum/light_ws2812.h create mode 100644 quantum/rgblight.c create mode 100644 quantum/rgblight.h 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/keyboard/planck/light_ws2812.c deleted file mode 100755 index f20043067e..0000000000 --- a/keyboard/planck/light_ws2812.c +++ /dev/null @@ -1,181 +0,0 @@ -/* -* 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 deleted file mode 100755 index 54eef22d9e..0000000000 --- a/keyboard/planck/light_ws2812.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * 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/rgblight.c b/keyboard/planck/rgblight.c deleted file mode 100644 index 552456aae3..0000000000 --- a/keyboard/planck/rgblight.c +++ /dev/null @@ -1,505 +0,0 @@ -#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 deleted file mode 100644 index fd39ead09f..0000000000 --- a/keyboard/planck/rgblight.h +++ /dev/null @@ -1,87 +0,0 @@ -#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 diff --git a/quantum/light_ws2812.c b/quantum/light_ws2812.c new file mode 100755 index 0000000000..f20043067e --- /dev/null +++ b/quantum/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/quantum/light_ws2812.h b/quantum/light_ws2812.h new file mode 100755 index 0000000000..54eef22d9e --- /dev/null +++ b/quantum/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/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/quantum/rgblight.c b/quantum/rgblight.c new file mode 100644 index 0000000000..552456aae3 --- /dev/null +++ b/quantum/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/quantum/rgblight.h b/quantum/rgblight.h new file mode 100644 index 0000000000..fd39ead09f --- /dev/null +++ b/quantum/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 -- cgit v1.2.3 From 2647c7cd84820a833b85e41ea86caf76b36e6ee1 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Sun, 24 Jan 2016 17:19:33 -0800 Subject: 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 -- cgit v1.2.3 From 84657a9e4be2dfa54338b659d8f0a49c2f50e3f4 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Sun, 24 Jan 2016 17:54:35 -0800 Subject: Add a photo for the demonstration of RGB underflow --- .../planck/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 0000000000..c636b9a83d Binary files /dev/null and b/keyboard/planck/keymaps/yang/planck-with-rgb-underglow.jpg differ -- cgit v1.2.3 From 2d29795de81b6655735ee5b74a57deaaa4c63f1d Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Sun, 24 Jan 2016 17:56:43 -0800 Subject: 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 0000000000..2c65cd283a Binary files /dev/null and b/keyboard/planck/keymaps/yang/WS2812-wiring.jpg differ -- cgit v1.2.3 From 6bc5e0cc314ad907023d2b91ef270a04b6395159 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Sun, 24 Jan 2016 18:12:19 -0800 Subject: Update README --- README.md | 52 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 2ed05e76e2..9c476e507a 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ The following shortcuts automatically add `LSFT()` to keycodes to get commonly u KC_PIPE | KC_COLN : -`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. +`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. These are the values you can use for the `mod` in `MT()` (right-hand modifiers are not available): @@ -86,15 +86,15 @@ These can also be combined like `MOD_LCTL | MOD_LSFT` e.g. `MT(MOD_LCTL | MOD_LS We've added shortcuts to make common modifier/tap (mod-tap) mappings more compact: - * `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 + * `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. 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/) * `LCAG_T(kc)` - is CtrlAltGui when held and *kc* when tapped * `MEH_T(kc)` - is like Hyper, but not as cool -- does not include the Cmd/Win key, so just sends Alt+Ctrl+Shift. -### Temporarily setting the default layer +### Temporarily setting the default layer `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. @@ -115,7 +115,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // 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; @@ -141,11 +141,11 @@ Everything is assuming you're in Qwerty (in software) by default, but there is b #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 * `DV_*` for all of the Dvorak-equivalent characters - -These implementations assume you're using Colemak or Dvorak on your OS, not on your keyboard - this is referred to as a software-implemented layout. If your computer is in Qwerty and your keymap is in Colemak or Dvorak, this is referred to as a firmware-implemented layout, and you won't need these features. + +These implementations assume you're using Colemak or Dvorak on your OS, not on your keyboard - this is referred to as a software-implemented layout. If your computer is in Qwerty and your keymap is in Colemak or Dvorak, this is referred to as a firmware-implemented layout, and you won't need these features. 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`. @@ -188,7 +188,7 @@ The method does not require Unicode support in the keyboard itself but depends i First you need to select a modifier combination that is not in use by any of your programs. CtrlAltWin is not used very widely and should therefore be perfect for this. There is a macro defined for a mod-tab combo `LCAG_T`. -Add this mod-tab combo to a key on your keyboard, e.g.: `LCAG_T(KC_TAB)`. +Add this mod-tab combo to a key on your keyboard, e.g.: `LCAG_T(KC_TAB)`. This makes the key behave like a tab key if pressed and released immediately but changes it to the modifier if used with another key. In the default script of AutoHotkey you can define custom hotkeys. @@ -198,3 +198,33 @@ In the default script of AutoHotkey you can define custom hotkeys. The hotkeys above are for the combination CtrlAltGui and CtrlAltGuiShift plus the letter a. AutoHotkey inserts the Text right of `Send, ` when this combination is pressed. + +## RGB Under Glow Mod + +![Planck with RGB Underglow](https://raw.githubusercontent.com/yangliu/qmk_firmware/planck-rgb/keyboard/planck/keymaps/yang/planck-with-rgb-underglow.jpg) + +Here is a quick demo on Youtube (with NPKC KC60) (https://www.youtube.com/watch?v=VKrpPAHlisY). + +For this mod, you need an unused pin wiring to DI of WS2812 strip. After wiring the VCC, GND, and DI, you can enable the underglow in your Makefile. + + RGBLIGHT_ENABLE = yes + +Please note that the underglow is not compatible with MIDI functions. So you cannot enable both of them at the same time. + +Please add the following options into your config.h, and set them up according your hardware configuration. + + #define ws2812_PORTREG PORTF + #define ws2812_DDRREG DDRF + #define ws2812_pin PF4 + #define RGBLED_NUM 14 // Number of LEDs + #define RGBLIGHT_HUE_STEP 10 + #define RGBLIGHT_SAT_STEP 17 + #define RGBLIGHT_VAL_STEP 17 + +The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. For details, please check this keymap. `keyboard/planck/keymaps/yang/keymap.c` + +### WS2812 Wiring + +![WS2812 Wiring](https://raw.githubusercontent.com/yangliu/qmk_firmware/planck-rgb/keyboard/planck/keymaps/yang/WS2812-wiring.jpg) + +Please note the USB port can only supply a limited amount of power to the keyboard (500mA by standard, however, modern computer and most usb hubs can provide 700+mA.). According to the data of NeoPixel from Adafruit, 30 WS2812 LEDs require a 5V 1A power supply, LEDs used in this mod should not more than 20. -- cgit v1.2.3 From f277079dfa831d44456f00f307e26cf79d36c03d Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Sun, 24 Jan 2016 18:16:40 -0800 Subject: no message --- keyboard/planck/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboard/planck/Makefile b/keyboard/planck/Makefile index 7619399b98..307b0c7f4f 100644 --- a/keyboard/planck/Makefile +++ b/keyboard/planck/Makefile @@ -137,13 +137,13 @@ 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 RGB underlight. Do not enable this with MIDI at the same time. +# RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with MIDI at the same time. ifdef BACKLIGHT_ENABLE SRC += backlight.c -- cgit v1.2.3 From baddbc6b23b34b5873e7a355c55f1e04485881f6 Mon Sep 17 00:00:00 2001 From: tonyabra Date: Sun, 24 Jan 2016 23:33:26 -0600 Subject: Simplified osx layout for ergodox ez --- keyboard/ergodox_ez/keymaps/tonyabra_osx/keymap.c | 184 +++ keyboard/ergodox_ez/keymaps/tonyabra_osx/readme.md | 5 + .../keymaps/tonyabra_osx/tonyabra_osx.hex | 1471 ++++++++++++++++++++ 3 files changed, 1660 insertions(+) create mode 100644 keyboard/ergodox_ez/keymaps/tonyabra_osx/keymap.c create mode 100644 keyboard/ergodox_ez/keymaps/tonyabra_osx/readme.md create mode 100644 keyboard/ergodox_ez/keymaps/tonyabra_osx/tonyabra_osx.hex diff --git a/keyboard/ergodox_ez/keymaps/tonyabra_osx/keymap.c b/keyboard/ergodox_ez/keymaps/tonyabra_osx/keymap.c new file mode 100644 index 0000000000..fb7c00983e --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/tonyabra_osx/keymap.c @@ -0,0 +1,184 @@ +#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 + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | = | | - | 6 | 7 | 8 | 9 | 0 | Enter | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | BkSp | A | S | D | F | G |------| |------| H | J | K | L | ; | '" | + * |--------+------+------+------+------+------| LGui | | LGui |------+------+------+------+------+--------| + * | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | L1 | ` | { | } | '" | | Left | Up | Down | Right| L2 | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | Del | Alt | | Alt | Ctrl | + * ,------|------|------| |------+--------+------. + * | | | 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_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_EQL, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), + KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LGUI, + TG(SYMB), KC_GRV, KC_LBRC, KC_RBRC,KC_QUOT, + KC_DELT,KC_LALT, + KC_HOME, + KC_SPC,KC_BSPC,KC_END, + // right hand + KC_MINS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_ENT, + TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LGUI, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, + KC_LEFT,KC_UP, KC_DOWN,KC_RIGHT, TG(MDIA), + KC_RALT, KC_RCTL, + KC_PGUP, + KC_PGDN,KC_TAB, KC_ENT + ), +/* 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 +[MDIA] = 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; + } + +}; diff --git a/keyboard/ergodox_ez/keymaps/tonyabra_osx/readme.md b/keyboard/ergodox_ez/keymaps/tonyabra_osx/readme.md new file mode 100644 index 0000000000..f9d76efc23 --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/tonyabra_osx/readme.md @@ -0,0 +1,5 @@ +# ErgoDox EZ OS X Simplified Configuration + +This keyboard configuration replaces the hyper and meh keys with the command key. It also removes all of the meta keys that require a "hold" because I found that I hesitate when I type, which can accidentally fire those combinations. On the upper left of the left hand, I mimicked the Mac placement of tab and escape, and on the upper right of the right hand, I placed an additional enter key for convenience when breezing through prompts. + +This is my standard working configuration for now, but I can see myself tweaking it as I use it more. I highly recommend you do the same. \ No newline at end of file diff --git a/keyboard/ergodox_ez/keymaps/tonyabra_osx/tonyabra_osx.hex b/keyboard/ergodox_ez/keymaps/tonyabra_osx/tonyabra_osx.hex new file mode 100644 index 0000000000..c3481dccbe --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/tonyabra_osx/tonyabra_osx.hex @@ -0,0 +1,1471 @@ +:100000000C9400070C9444070C9444070C94440788 +:100010000C9444070C9444070C9444070C94440734 +:100020000C9444070C9444070C9458120C942A1313 +:100030000C9444070C9444070C9444070C94440714 +:100040000C9444070C94002C0C9444070C94440723 +:100050000C9444070C94F8210C9444070C94440726 +:100060000C9444070C9444070C9444070C944407E4 +:100070000C9444070C9444070C9444070C944407D4 +:100080000C9444070C9444070C9444070C944407C4 +:100090000C9444070C9444070C9444070C944407B4 +:1000A0000C9444070C9444070C9444079713B91319 +:1000B000A714B913A714FE132114A71476148914D6 +:1000C000D017D017FF17FF1742188018991A991ADE +:1000D0009918991A9A199A196D1A991A991A841ACB +:1000E0000000F0A129002B002A00E10001540000CB +:1000F0001E00140004001D0035004D001F001A00F2 +:1001000016001B002F002A00200008000700060030 +:1001100030002C00210015000900190034004A00AD +:10012000220017000A00050000004C002E000154B8 +:100130000000E3000000E2002D0001540000E30095 +:100140000000E60023001C000B0011000000E4008A +:10015000240018000D00100050004B0025000C007A +:100160000E00360052002800260012000F00370053 +:1001700051002B0027001300330038004F004E00C1 +:10018000280031003400E5000254000001000100A5 +:1001900001000100010000003A001E0220022202BC +:1001A000010001003B001F022102230201000100A7 +:1001B0003C002F0226022F00010001003D0030020A +:1001C00027023000010001003E00310235003502F7 +:1001D000000001000100010000000100000001001A +:1001E0000100010000000100000001003F0052007A +:1001F00051002402000001004000240021001E00E4 +:10020000010001004100250022001F00370001000D +:1002100042002600230020002700010043002502A1 +:100220002E0231002E0001004400450001000100B3 +:1002300001000000010001000100010001000000B8 +:1002400001000100010001000100010001000100A6 +:10025000F2000100010001000100F000F1000100C6 +:10026000F400010001000100F3000100F5000100AD +:100270000100010001000100000001000100010077 +:100280000000010000000100010001000000010069 +:100290000000010001000100010001000000010058 +:1002A0000100010001000100A9000100010001009E +:1002B0000100AC00AA00B600010001000100AB0083 +:1002C000A80001000100010001000100010001007F +:1002D00001000100AE000100010000000A0025300D +:1002E000313662003A200025303258000A722F63FE +:1002F0002030313233343536373839414243444582 +:10030000460A000A002530325800626F756E636538 +:10031000213A20006C6566742073696465206174FD +:100320007461636865640A006C656674207369644F +:1003300065206E6F7420726573706F6E64696E678E +:100340000A00747279696E6720746F207265736534 +:1003500074206D637032333031380A000A444542EC +:1003600055473A20656E61626C65642E0A005B73C6 +:100370005D004B6579626F617264207374617274A1 +:100380002E0A005B575D005B535D005B525D005BB6 +:10039000445D005B435D0016034500720067006F1B +:1003A0000044006F007800200045005A000000164D +:1003B000034500720067006F0044006F0078002062 +:1003C0000045005A0000000403090409028D0005DD +:1003D0000100A0FA09040000010301010009211134 +:1003E000010001223F000705810308000A090401FA +:1003F000000103010200092111010001224D000743 +:1004000005820308000A0904020001030000000934 +:1004100021110100012236000705830308000A09A3 +:100420000403000203000000092111010001222041 +:1004300000070584032000010705040320000109CB +:100440000404000103000000092111010001223908 +:1004500000070585031000011201100100000008CB +:10046000EDFE071301000102000105010906A101CB +:10047000050719E029E71500250195087501810296 +:100480000508190129059505750191029501750366 +:100490009101050719002977150025019578750147 +:1004A0008102C00631FF0974A1010975150025FFFD +:1004B0009520750881020976150025FF952075089D +:1004C0009102C005010980A101850216010026B72D +:1004D000001A01002AB700751095018100C0050CB3 +:1004E0000901A1018503160100269C021A01002AB8 +:1004F0009C02751095018100C005010902A1010946 +:1005000001A10005091901290515002501950575A9 +:100510000181029501750381010501093009311539 +:1005200081257F95027508810609381581257F95FB +:100530000175088106050C0A38021581257F950191 +:1005400075088106C0C005010906A101050719E06B +:1005500029E71500250195087501810295017508A7 +:10056000810105081901290595057501910295017B +:10057000750391010507190029FF150025FF950650 +:1005800075088100C00A002530325820006B65795B +:10059000626F6172645F7265706F72743A20000AF4 +:1005A0000025303258006B6579626F6172645F7349 +:1005B00065745F6C65643A200064656C5F6B657997 +:1005C0005F6269743A2063616E27742064656C3AD7 +:1005D00020253032580A006164645F6B65795F6280 +:1005E00069743A2063616E2774206164643A20253F +:1005F0003032580A00646F6E652E0A00626F6F67B2 +:100600006D61676963207363616E3A202E2E2E2020 +:1006100000290A002575002F002575005D2800259A +:10062000640020002564002000256400200025646B +:10063000007C0025303258006D6F7573656B6579ED +:10064000205B62746E7C782079207620685D287249 +:1006500065702F61636C293A205B006D6B5F776872 +:1006600065656C5F74696D655F746F5F6D6178203F +:100670003D2025640A006D6B5F776865656C5F6D72 +:1006800061785F7370656564203D2025640A006DA4 +:100690006B5F74696D655F746F5F6D6178203D207D +:1006A00025640A006D6B5F6D61785F7370656564CA +:1006B000203D2025640A006D6B5F696E746572765B +:1006C000616C203D2025640A006D6B5F64656C6180 +:1006D00079203D2025640A006D6B5F776865656C45 +:1006E0005F74696D655F746F5F6D6178203D202573 +:1006F000640A006D6B5F776865656C5F6D61785F3C +:100700007370656564203D2025640A006D6B5F741D +:10071000696D655F746F5F6D6178203D2025640AA7 +:10072000006D6B5F6D61785F7370656564203D205F +:1007300025640A006D6B5F696E74657276616C206A +:100740003D2025640A006D6B5F64656C6179203D16 +:100750002025640A000A00257500363A207768656E +:10076000656C5F74696D655F746F5F6D61783A2069 +:10077000000A00257500353A20776865656C5F6D65 +:1007800061785F73706565643A20000A0025750022 +:10079000343A2074696D655F746F5F6D61783A20DB +:1007A000000A00257500333A206D61785F7370652B +:1007B00065643A20000A00257500323A20696E749B +:1007C000657276616C286D73293A20000A002575E0 +:1007D00000313A2064656C6179282A31306D7329C3 +:1007E0003A20000A092D2056616C756573202D0A88 +:1007F000004D3E004D25643E20003F00736574208F +:1008000064656661756C740A00433E200077686514 +:1008100072652064656C74613A20637572736F72DF +:100820003D25642C20776865656C3D25640A536519 +:100830006520687474703A2F2F656E2E77696B6926 +:1008400070656469612E6F72672F77696B692F4DD0 +:100850006F7573655F6B6579730A000A092D204D0A +:100860006F7573656B6579202D0A4553432F713A77 +:1008700009717569740A313A0964656C6179282ACD +:1008800031306D73290A323A09696E746572766186 +:100890006C286D73290A333A096D61785F7370654E +:1008A00065640A343A0974696D655F746F5F6D61E0 +:1008B000780A353A09776865656C5F6D61785F73B2 +:1008C000706565640A363A09776865656C5F7469B6 +:1008D0006D655F746F5F6D61780A0A703A097072B6 +:1008E000696E742076616C7565730A643A09736584 +:1008F000742064656661756C74730A75703A092BAF +:10090000310A646F776E3A092D310A706775703A53 +:10091000092B31300A7067646F776E3A092D3130D8 +:100920000A0A7370656564203D2064656C746120FB +:100930002A206D61785F7370656564202A202872B3 +:100940006570656174202F2074696D655F746F5FD9 +:100950006D6178290A003F004D3E2000433E200093 +:100960004C25640A000A092D20436F6E736F6C6575 +:10097000202D0A4553432F713A09717569740A6D28 +:100980003A096D6F7573656B65790A000A092D2048 +:100990004D61676963202D0A643A09646562756771 +:1009A0000A783A096465627567206D6174726978C6 +:1009B0000A6B3A096465627567206B6579626F61DD +:1009C00072640A6D3A096465627567206D6F7573AC +:1009D000650A763A0976657273696F6E0A733A0929 +:1009E0007374617475730A633A09636F6E736F6C25 +:1009F00065206D6F64650A302D343A096C61796544 +:100A000072302D34284631302D4634290A50617514 +:100A1000733A09626F6F746C6F616465720A653A4C +:100A200009656570726F6D0A6E3A094E4B524F0A36 +:100A30007A3A09736C656570204C4544207465737F +:100A4000740A000A002575002E6E6B726F3A200042 +:100A50000A002575002E737761705F6261636B73A6 +:100A60006C6173685F6261636B73706163653A2088 +:100A7000000A002575002E737761705F67726176DA +:100A8000655F6573633A20000A002575002E6E6F5E +:100A90005F6775693A20000A002575002E7377613B +:100AA000705F72616C745F726775693A20000A004A +:100AB0002575002E737761705F6C616C745F6C6775 +:100AC00075693A20000A002575002E636170736C09 +:100AD0006F636B5F746F5F636F6E74726F6C3A20DD +:100AE000000A002575002E737761705F636F6E7466 +:100AF000726F6C5F636170736C6F636B3A20000A96 +:100B00000025303258006B65796D61705F636F6EE0 +:100B10006669672E7261773A20000A002575002EFB +:100B20006D6F7573653A20000A002575002E6B65A0 +:100B300079626F6172643A20000A002575002E6D9B +:100B400061747269783A20000A002575002E656E7E +:100B500061626C653A20000A0025303258006465F5 +:100B60006275675F636F6E6669672E7261773A20A0 +:100B7000000A0025750064656661756C745F6C61C0 +:100B80007965723A20003F004E4B524F3A206F6613 +:100B9000660A004E4B524F3A206F6E0A0074696D20 +:100BA00065725F636F756E743A202530346C580A35 +:100BB000006B6579626F6172645F6E6B726F3A2071 +:100BC00025580A006B6579626F6172645F69646CB5 +:100BD000653A2025580A006B6579626F6172645F1F +:100BE00070726F746F636F6C3A2025580A00686FDB +:100BF00073745F6B6579626F6172645F6C65647357 +:100C000028293A2025580A000A092D2053746174B6 +:100C10007573202D0A004743433A20342E392E3372 +:100C2000204156522D4C4942433A20312E382E3124 +:100C3000204156525F415243483A20617672350A4C +:100C4000004F5054494F4E533A204C554641204294 +:100C50004F4F544D41474943204D4F5553454B4508 +:100C6000592045585452414B455920434F4E534FFC +:100C70004C4520434F4D4D414E44204E4B524F204A +:100C80003531320A004255494C443A2066643732C5 +:100C9000613436202832323A35363A3234204A61CD +:100CA0006E2032342032303136290A005649443A17 +:100CB00020307846454544284572676F446F782058 +:100CC000455A29205049443A20307831333037286A +:100CD0004572676F446F7820455A29205645523A2D +:100CE000203078303030310A00444553433A207484 +:100CF0002E6D2E6B2E206B6579626F61726420669B +:100D000069726D7761726520666F72204572676FD8 +:100D1000646F780A000A092D2056657273696F6E38 +:100D2000202D0A000A6D6F7573653A206F66660A9A +:100D3000000A6D6F7573653A206F6E0A000A6B6565 +:100D400079626F6172643A206F66660A000A6B65A9 +:100D500079626F6172643A206F6E0A000A6D617485 +:100D60007269783A206F66660A000A6D617472696A +:100D7000783A206F6E0A000A64656275673A206FE0 +:100D80006E0A000A64656275673A206F66660A003B +:100D90000A0A626F6F746C6F616465722E2E2E206A +:100DA00000433E20006565636F6E6669673A0A001E +:100DB000536C656570204C454420746573740A005B +:100DC0000000000000000000000000010204060A0C +:100DD0000F17202C3A4A5D71879DB3C7DAE9F5FCFD +:100DE000FFFCF5E9DAC7B39D87715D4A3A2C2017FD +:100DF0000F0A0604020100000000000000000000CD +:100E000011241FBECFEFDAE0DEBFCDBF04B603FE74 +:100E100024C08091F9019091FA01A091FB01B09159 +:100E2000FC018730904BA740B04BB9F41092F90108 +:100E30001092FA011092FB011092FC0114BE84B7CB +:100E4000877F84BF88E10FB6F8948093600010928A +:100E500060000FBEE0E0FFE3099511E0A0E0B1E023 +:100E6000ECE9FBE502C005900D92AA33B107D9F772 +:100E700011E0AAE3B1E001C01D92A93FB107E1F77B +:100E80000E94900F0C94CC2D0C940000FF93EF93D4 +:100E9000E0913A01F0913B01309709F00995EF910B +:100EA000FF910895FC018591803011F0EFDFFBCFB9 +:100EB0000895FF27E0E230E247FF0CC0419597FF1D +:100EC00009C0EDE26095709580959095611D711D4A +:100ED000811D911D27FF02C0219530E350E2AA2712 +:100EE000660F771F881F991FAA1FA41710F0A41B55 +:100EF00063955A95A9F7AA3008F0A95FA05DAF9352 +:100F0000F395611571058105910541F7ED3211F4F5 +:100F1000EF93F395F21718F43F93F395FBCF8F916E +:100F2000B5DFFA95E1F70895E991F991859180305F +:100F300021F0853219F0AADFF9CF089520E0E89476 +:100F400055915532C1F3503311F4689455915A3389 +:100F500048F4505390F3220F022E220F220F200D3F +:100F6000250FF4CF0EF4219589919991533619F3F9 +:100F7000533729F1533559F1BC0188279927E89453 +:100F80005C3621F48991999168945591543639F4DD +:100F900046EF7EF077FF0DC08FEF9FEF0AC0553709 +:100FA0004AE039F0583540E121F0523642E009F08C +:100FB0000895FF93EF937DDFEF91FF91B7CFFF93FC +:100FC000EF93FC0181918030B9F360DFFBCFFF9399 +:100FD000EF9368DFF1CFDF93CF93CDB7DEB72596E0 +:100FE000A3DFCF91DF91089561110BC0FC018281D5 +:100FF000882321F085EE0E946D1603C085EE0E94C5 +:10100000351780E090E0089508956091BC017091DB +:10101000BD018091BE019091BF010E94FB205698B6 +:101020005E9825982D9826982E9827982F9881308D +:1010300019F0823021F00895259A2D9A0895269A64 +:101040002E9A089585E098E0892B11F00E940508FA +:1010500080E090E0089556985E9825982D982698FF +:101060002E9827982F988FEF90E090938900809387 +:10107000880090938B0080938A0090938D008093DA +:101080008C00259A2D9A2FEF80E792E02150804026 +:101090009040E1F700C00000269A2E9A2FEF80E7DB +:1010A00092E0215080409040E1F700C00000279A74 +:1010B0002F9A2FEF80E792E0215080409040E1F797 +:1010C00000C0000025982D982FEF80E792E0215076 +:1010D00080409040E1F700C0000026982E982FEF46 +:1010E00080E792E0215080409040E1F700C000008E +:1010F00027982F9856985E9825982D9826982E9880 +:1011000027982F98089589EA8093800089E080933A +:10111000810024982C983F988AB18F748AB96E9870 +:10112000479A8BB1806B8BB9769A0E942B0884E02A +:1011300098E0892B11F00E94040880E090E0089567 +:1011400080E28093000180913C0181110EC00E94D9 +:10115000EF0881E080933C012FEF83ED90E3215075 +:1011600080409040E1F700C0000080E40E94F50854 +:101170008093000181112EC00E941F0980930001FD +:10118000811128C00E941F0980930001811122C093 +:101190008FE30E941F098093000181111BC00E94F0 +:1011A000170980E40E94F50880930001811112C0A4 +:1011B0008CE00E941F098093000181110BC00E94E6 +:1011C0001F0980930001811105C08FE30E941F0950 +:1011D000809300010E9417098091000108951092E8 +:1011E000B9008AE08093B800089594EA9093BC0017 +:1011F0009091BC0097FFFCCF9091B900987F9830F8 +:1012000021F0903111F081E008958093BB0084E8D3 +:101210008093BC008091BC0087FFFCCF8091B90017 +:10122000887F883111F0803471F780E0089584E977 +:101230008093BC008091BC0084FDFCCF0895809316 +:10124000BB0084E88093BC008091BC0087FFFCCF8A +:101250009091B900987F81E0983209F480E0089578 +:1012600084E88093BC008091BC0087FFFCCF809114 +:10127000BB00089580910001811115C080E40E9497 +:10128000F5088093000181110CC082E10E941F09C2 +:1012900080930001811105C08FEF0E941F09809388 +:1012A00000010E94170984B1807F84B985B1807FD5 +:1012B00085B98AB1837F8AB98BB1837F8BB93E9818 +:1012C000469808950E94A008809300010E943A0960 +:1012D00080B38C7080BB81B3836F81BBAEE3B1E020 +:1012E000ECE4F1E08EE08E0F11921D928E13FCCF94 +:1012F00083E898E0892B11F00C94830808959F925D +:10130000AF92BF92CF92DF92EF92FF920F931F9313 +:10131000CF93DF93809100018823E1F080913D011C +:101320008F5F80933D01811115C082E493E00E949C +:1013300052070E94A00880930001882329F088E2C8 +:1013400093E00E94520706C084E193E00E94520796 +:101350000E942B080EE311E0C0E0D0E0BB24B39460 +:1013600082E0A82ECC24C394D12C25E0E22E23E0E9 +:10137000F22EC730D10500F580910001811164C0C3 +:1013800080E40E94F50880930001811112C082E17F +:101390000E941F098093000181110BC0C6010C2E11 +:1013A00001C0880F0A94EAF780950E941F09809374 +:1013B00000010E94170948C0CA30A1F028F4C830C3 +:1013C00059F0C93061F005C0CC3089F070F0CD30F3 +:1013D00089F0209A289810C0219A29980DC0229A45 +:1013E0002A980AC0239A2B9807C0529A01C0539A90 +:1013F0005B9802C03E9A469890EA9A95F1F79FB1A1 +:10140000799902C082E001C080E091709B25982B01 +:101410007C9902C084E001C080E0892B7D9902C0E4 +:1014200038E001C030E0832B7E9902C020E101C08A +:1014300020E0822B9FB19095991F9927991F929533 +:10144000990F907E892B10C080910001811174C08A +:1014500080E40E94F50880930001882309F459C0B4 +:10146000912C0E941709892DF8019081981739F164 +:10147000808380910101882301F18091D70180FF51 +:1014800004C08AE093E00E9452078091D70180FF58 +:101490000CC0809101011F928F93FF92EF920E94E6 +:1014A000EB070F900F900F900F908091D70180FF66 +:1014B00004C083E093E00E945207A09201010E94C1 +:1014C0003A0921960F5F1F4FCE30D10509F051CF59 +:1014D000809101018823B1F081508093010188231C +:1014E00039F08FE99FE00197F1F700C000000AC0D2 +:1014F000ACE4B1E0EEE3F1E0CF01825F91919D9326 +:101500008E13FCCF82E298E0892BC1F00E94220862 +:1015100015C083E10E941F09809300018111A0CFB3 +:1015200081E40E94F50880930001811199CF0E9407 +:101530003009982E909495CF80E096CF81E0DF918E +:10154000CF911F910F91FF90EF90DF90CF90BF90C0 +:10155000AF909F900895E82FF0E0E45BFE4F80810C +:101560000895CF92DF92EF92FF920F931F93CF9344 +:10157000DF938CEE92E00E9452078CE4E82E81E02B +:10158000F82EC0E0D0E097EEC92E92E0D92E0EEDF5 +:1015900012E0DF93CF93DF92CF920E94EB0784EEAD +:1015A00092E00E945207F70181917F0190E00E9432 +:1015B00061219F938F931F930F930E94EB078CEDF4 +:1015C00092E00E94520721968DB79EB708960FB6FB +:1015D000F8949EBF0FBE8DBFCE30D105D1F6DF91FE +:1015E000CF911F910F91FF90EF90DF90CF900895D2 +:1015F0008B3B910578F4883A910540F5853A910541 +:10160000D0F48430910508F0B1C08130910509F41F +:10161000ADC06BC0803E910508F467C0883E91055F +:1016200008F4A4C09C01205F31092031310508F085 +:101630005CC090650895853A910509F459C0863AD1 +:10164000910509F058C082E890E40895883A910520 +:1016500009F454C0893A910509F453C08A3A9105B6 +:1016600009F452C08B3A910509F451C08C3A9105A6 +:1016700009F450C08D3A910509F44FC0803B9105A3 +:1016800009F44EC08E3A910509F44DC08F3A910588 +:1016900009F44CC0813B910509F44BC0823B910594 +:1016A00009F44AC0833B910509F449C0843B910584 +:1016B00009F448C0853B910509F447C0863B910574 +:1016C00009F446C0873B910509F445C0883B910564 +:1016D00009F444C0893B910509F443C08A3B910554 +:1016E00009F442C080E094E4089580E090E0089519 +:1016F00081E890E4089583E890E4089582EE94E40C +:10170000089589EE94E408958AEE94E4089585EBB3 +:1017100094E4089586EB94E4089587EB94E40895A7 +:101720008CEC94E408958DEC94E4089583E895E4BA +:1017300008958AE895E4089582E995E4089584E996 +:1017400095E4089581E296E4089583E296E408958D +:1017500084E296E4089585E296E4089586E296E4AC +:10176000089587E296E408958AE296E4089508953C +:1017700096E0799FF001112494E5899FE00DF11D19 +:101780001124E60FF11DEE0FFF1FEC51FF4F859165 +:1017900094910895880F991FFC01E05AF0408591BB +:1017A00094910895880F991FFC01E052FF4F859195 +:1017B0009491089526E0729FF001112444E5849FDE +:1017C000E00DF11D1124E60FF11DEE0FFF1FEC518E +:1017D000FF4F859194919C013A9521154FE1340773 +:1017E00008F41EC13F512115304120F49F700E9422 +:1017F000D20B08959C0130532115304118F49927DC +:10180000906C0895811520E5920769F40E94BB1A37 +:101810004FEF84E39CE0415080409040E1F700C0EE +:1018200000000C941D22813020E5920751F48CE5D4 +:1018300093E00E9452078091D70181608093D70185 +:1018400008959C0130552115304108F051C0292FD1 +:1018500033272F70332721303105D9F4AC01437081 +:10186000552702C0220F331F4A95E2F73C68AC01AE +:1018700064E0440F551F6A95E1F744275370242B09 +:10188000352B73E0880F991F7A95E1F780769927B9 +:101890001DC02230310529F4982F8827816F906A66 +:1018A000089523303105A9F4AC014370552721E098 +:1018B00030E002C0220F331F4A95E2F73C6843E054 +:1018C000880F991F4A95E1F7807E9770822B932BA2 +:1018D000089524303105E1F4AC014370552721E02F +:1018E00030E002C0220F331F4A95E2F73A68E7CF93 +:1018F0009C0130572115304118F49F709062089573 +:101900009C0130582115304118F49F70906A089559 +:10191000803E9105E0F4803C910558F581339105B6 +:1019200009F46FC048F48932910509F463C08A3222 +:10193000910509F46DC072C089339105E9F08238D0 +:101940009105D1F08533910509F44DC067C0833E00 +:10195000910581F138F4803E9105B9F0823E910500 +:10196000D9F05CC0863E910561F1873E9105A1F1F9 +:1019700055C00E94CA0B08952091EA0120FD02C0C3 +:1019800021FF4CC080EE90E049C08091EA0180FFC9 +:10199000F9CF89E390E042C08091EA0182FF0EC056 +:1019A0008091EA0184FF03C080E090E037C083EEBD +:1019B00090E034C08091EA0182FFF2CF82EE90E0A5 +:1019C0002DC08091EA0183FF0BC08091EA0184FD64 +:1019D000EBCF87EE90E022C08091EA0183FFF5CF44 +:1019E00086EE90E01BC08091EA0185FF07C089E286 +:1019F00090E014C08091EA0185FFF9CF85E390E083 +:101A00000DC08091EA0186FF07C08AE290E006C01F +:101A10008091EA0186FFF9CF81E390E00E94F80A05 +:101A20000895089580916D0108959FB7F8941092DC +:101A30005C019FBF9091F001943009F057C09091E4 +:101A4000E9009F703091EC00232F217030FD20E8D9 +:101A5000922B24E02093E9002091EB0020FF43C06B +:101A60002091EE0027FF3FC020915A01222321F050 +:101A70002091E80025FF37C010925A0126E03091EE +:101A8000E80035FD15C03091F001343061F530913A +:101A9000EB0035FD28C0215021F481E080935A01EC +:101AA00022C0EFE9FFE03197F1F700C00000E7CF77 +:101AB0008093F1008091E80085FD0AC08091E800E4 +:101AC00080FFFCCF8091E8008E778093E80006C00D +:101AD0008FB7F89421E020935C018FBF9F709093A3 +:101AE000E90080E008959F709093E9008FEF0895DA +:101AF000CF93DF9300D01F92CDB7DEB79C018091CA +:101B0000F001843019F593E099833B832A83909305 +:101B1000E9008FEF9091E800815095FD06C095EDAA +:101B20009A95F1F700008111F5CF8091E80085FFCB +:101B30000DC040E050E063E070E0CE0101960E94ED +:101B400048108091E8008E778093E8000F900F9006 +:101B50000F90DF91CF910895CF93DF9300D01F9224 +:101B6000CDB7DEB72091F001243021F522E02983A2 +:101B70009B838A8383E08093E9008FEF9091E80054 +:101B8000815095FD06C095ED9A95F1F70000811101 +:101B9000F5CF8091E80085FF0DC040E050E063E0A4 +:101BA00070E0CE0101960E9448108091E8008E7787 +:101BB0008093E8000F900F900F90DF91CF910895E0 +:101BC0002091F0012430F1F422E02093E9002FEF7E +:101BD0003091E800215035FD06C035ED3A95F1F71A +:101BE00000002111F5CF2091E80025FF0BC040E057 +:101BF00050E065E070E00E9448108091E8008E7728 +:101C00008093E8000895CF93DF932091F001243072 +:101C100009F048C0EC0180910C018823E1F080912B +:101C20000D018823C1F085E08093E9008FEF90914A +:101C3000E800815095FD06C095E19A95F1F7000006 +:101C40008111F5CF8091E80085FF2CC040E050E085 +:101C500060E170E017C081E08093E9008FEF909120 +:101C6000E800815095FD06C095ED9A95F1F70000CA +:101C70008111F5CF8091E80085FF14C040E050E06D +:101C800068E070E0CE010E9448108091E8008E77F5 +:101C90008093E80080E1FE01ADE5B1E001900D9296 +:101CA0008A95E1F7DF91CF91089583E993E00E944F +:101CB00052078091EF01811109C00E94DD110E943D +:101CC0003A128091E20084608093E20008958FE8E8 +:101CD00093E00E9452071092EF0108958BE893E081 +:101CE0000C94520787E893E00E9452070C94ED2B66 +:101CF00083E893E00E9452070E94B7210E94F32BD1 +:101D00000E94DF140C94110D20915B012F5F822F34 +:101D100062E30E94612D992319F020935B010895DD +:101D200010925B0180915C01882371F18091F00138 +:101D3000843041F58091E9008F702091EC00922F62 +:101D4000917020FD90E8892B94E09093E9009091A8 +:101D5000EB0090FF14C09091EE0097FF10C090919F +:101D6000E80095FF03C01092F100F9CF9091E800D0 +:101D700090FF05C09091E8009E779093E8008F70E7 +:101D80008093E90010925C01089542E061EC81E0EB +:101D90000E94571142E061EC82E00E94571142E03C +:101DA00061EC83E00E94571142E261EC84E00E9402 +:101DB000571142E161EC85E00C9457118091F201DA +:101DC000833009F455C030F4813071F0823009F469 +:101DD0008EC008958A3009F47AC08B3009F460C04F +:101DE000893009F09CC020C08091F101813A09F04E +:101DF00096C08091E800877F8093E8008091F5018C +:101E00009091F601892B21F460E18DE591E003C00A +:101E100060E080E090E070E00E9493108091E80024 +:101E20008B778093E80008958091F101813209F069 +:101E300076C08091F5019091F601009719F0049712 +:101E400009F06DC08091E800877F8093E800809161 +:101E5000E80082FD05C08091F0018111F8CF5FC0DC +:101E60008091F10080936D018091E8008B7753C0E1 +:101E70008091F101813A09F052C08091F501909171 +:101E8000F601892B09F04BC08091E800877F809391 +:101E9000E8008091E80080FFFCCF80910C0136C003 +:101EA0008091F1018132D9F58091F5019091F6018F +:101EB000892BA9F58091E800877F8093E8000E9434 +:101EC0008C118091F30180930C010C94BB1A8091CA +:101ED000F101813221F58091E800877F8093E8004D +:101EE0000E948C118091F40180936E01089580917D +:101EF000F101813AA1F48091E800877F8093E800A6 +:101F00008091E80080FFFCCF80916E018093F1000A +:101F10008091E8008E778093E8000C948C110895EE +:101F200084B7877F84BF88E10FB6F8948093600000 +:101F3000109260000FBE90E080E80FB6F894809396 +:101F40006100909361000FBE0E946C150E94DD112C +:101F50000E943A128091E20084608093E20085E161 +:101F60009DE00E94F62078940E94BF140E946E1596 +:101F700082E091E00E94DA140E94DB2B82E793E07A +:101F80000E9452078091F001853089F48EE693E03B +:101F90000E9452070E947B218091EE01882391F3D9 +:101FA0000E94A321882371F30E943210EBCF0E947C +:101FB0009C15E8CF292F332723303105C9F064F46D +:101FC0002130310581F02230310509F043C08DE820 +:101FD00090E02BEC33E042C021323105F1F02232A7 +:101FE000310541F137C082E190E028E534E036C0A8 +:101FF00099278130910541F08230910541F0892B7C +:1020000049F5E7ECF3E005C0EFEAF3E002C0E7E9E9 +:10201000F3E0849190E09F0121C06530D8F4E62F71 +:10202000F0E0EE0FFF1FEB5DFE4F2081318189E074 +:1020300090E014C0653070F470E0FB01EE0FFF1FFC +:10204000E55EFE4F20813181FB01EA5EFE4F80811B +:1020500090E004C080E090E020E030E0FA013183BD +:102060002083089580E189BD82E189BD09B400FE25 +:10207000FDCF8091D8008F7D8093D8008091E000C3 +:1020800082608093E0008091E00081FDFCCF0895A4 +:10209000CF92DF92EF92FF920F931F93CF93DF9334 +:1020A000EC018B016A010E94AB11811133C0C11494 +:1020B000D10439F0F60180819181081B190BC80FFA +:1020C000D91FE12CF12C0115110519F18091E800BF +:1020D00085FD16C08091E8008E778093E800C114DA +:1020E000D10449F0F60180819181E80EF91EF18258 +:1020F000E08285E00FC00E94AB11882321F30AC063 +:1021000089918093F10001501109FFEFEF1AFF0A46 +:10211000DACF80E0DF91CF911F910F91FF90EF9088 +:10212000DF90CF9008952091F7013091F8012617A4 +:10213000370748F06115710539F42091E8002E77D2 +:102140002093E80001C0B90140E061157105A9F1D3 +:102150002091F001222309F443C0253009F442C044 +:102160002091E80023FD40C02091E80022FD32C00C +:102170002091E80020FFE9CF4091F3002091F20088 +:1021800030E0342BFC01CF016115710559F0283086 +:10219000310540F481918093F100615071092F5F06 +:1021A0003F4FF1CF41E02830310509F040E0209168 +:1021B000E8002E772093E800C8CF4111C9CF0AC0AC +:1021C0008091F001882361F0853061F08091E80012 +:1021D00083FD0AC08091E80082FFF2CF80E008957D +:1021E00082E0089583E0089581E008952091F70149 +:1021F0003091F8012617370748F06115710539F459 +:102200002091E8002E772093E80001C0B901FC017D +:1022100020E06115710591F18091F001882309F4A6 +:1022200040C0853009F43FC08091E80083FD3DC087 +:102230008091E80082FD2FC08091E80080FFE9CF07 +:102240002091F3008091F20090E0922B61157105CE +:1022500059F08830910540F424912093F100319693 +:10226000615071090196F2CF21E0089709F020E052 +:102270008091E8008E778093E800CBCF2111CCCFFE +:102280000AC08091F001882361F0853061F080916F +:10229000E80083FD0AC08091E80082FFF2CF80E071 +:1022A000089582E0089583E0089581E00895982FCD +:1022B000973058F59093E900981739F07091EC0039 +:1022C0002091ED005091F00003C0242F762F50E0B4 +:1022D00021FF19C03091EB003E7F3093EB0030912D +:1022E000ED003D7F3093ED003091EB003160309395 +:1022F000EB007093EC002093ED005093F0002091E0 +:10230000EE0027FF07C09F5FD3CF8F708093E90057 +:1023100081E0089580E008958091F10187FF11C068 +:102320008091E80082FD05C08091F0018111F8CF15 +:1023300011C08091E8008B770BC08091F001882359 +:1023400049F08091E80080FFF8CF8091E8008E7717 +:102350008093E80008952091E4003091E50095E62F +:102360004091EC00842F817040FF22C08091E800F2 +:1023700080FD1CC08091F001882391F0853091F0A0 +:102380008091EB0085FD10C04091E4005091E50084 +:102390004217530729F39A01915011F784E00895E9 +:1023A00082E0089583E0089581E0089580E0089533 +:1023B0004091E80042FFDECF08950E944B120E9438 +:1023C0005312E0EEF0E0808181608083E8EDF0E080 +:1023D00080818F77808319BCA7EDB0E08C918E7FD0 +:1023E0008C9380818F7E80831092EF0108950F93EC +:1023F0001F93CF93DF930E944B120E945312C8ED9C +:10240000D0E088818F7788838881806888838881FD +:102410008F7D888319BC1092F0011092EC0110920C +:10242000EE011092ED0100EE10E0F80180818B7F4B +:10243000808388818160888342E060E080E00E9440 +:102440005711E1EEF0E080818E7F8083E2EEF0E0D4 +:10245000808181608083808188608083F8018081B1 +:102460008E7F8083888180618883DF91CF911F91E7 +:102470000F910895E8EDF0E080818F7E8083E7ED95 +:10248000F0E080818160808384E082BF81E080937E +:10249000EF010C94F711E8EDF0E080818E7F8083EE +:1024A0001092E20008951092DA001092E10008956F +:1024B0001F920F920FB60F9211242F933F934F93B9 +:1024C0005F936F937F938F939F93AF93BF93EF939C +:1024D000FF938091E10082FF0BC08091E20082FFB8 +:1024E00007C08091E1008B7F8093E1000E94840E01 +:1024F0008091DA0080FF1FC08091D80080FF1BC050 +:102500008091DA008E7F8093DA008091D90080FF7D +:102510000DC080E189BD82E189BD09B400FEFDCF17 +:1025200081E08093F0010E94550E05C019BC109205 +:10253000F0010E94670E8091E10080FF19C0809138 +:10254000E20080FF15C08091E2008E7F8093E20060 +:102550008091E20080618093E2008091D8008062E7 +:102560008093D80019BC85E08093F0010E94720E20 +:102570008091E10084FF30C08091E20084FF2CC094 +:1025800080E189BD82E189BD09B400FEFDCF809163 +:10259000D8008F7D8093D8008091E1008F7E80935A +:1025A000E1008091E2008F7E8093E2008091E20062 +:1025B00081608093E2008091EC01882311F084E037 +:1025C00007C08091E30087FD02C081E001C083E085 +:1025D0008093F0010E94780E8091E10083FF29C072 +:1025E0008091E20083FF25C08091E100877F809386 +:1025F000E10082E08093F0011092EC018091E10013 +:102600008E7F8093E1008091E2008E7F8093E200D4 +:102610008091E20080618093E20042E060E080E02F +:102620000E9457118091F00088608093F0000E9412 +:102630006E0EFF91EF91BF91AF919F918F917F911E +:102640006F915F914F913F912F910F900FBE0F901F +:102650001F9018951F920F920FB60F9211242F936F +:102660003F934F935F936F937F938F939F93AF931A +:10267000BF93CF93DF93EF93FF93C091E900CF70A7 +:102680008091EC00D82FD17080FDD0E81092E90045 +:102690008091F000877F8093F00078940E946E1301 +:1026A0001092E9008091F00088608093F000CD2BBB +:1026B000CF70C093E900FF91EF91DF91CF91BF916F +:1026C000AF919F918F917F916F915F914F913F91CA +:1026D0002F910F900FBE0F901F9018951F93CF93BF +:1026E000DF93CDB7DEB7AA970FB6F894DEBF0FBE63 +:1026F000CDBFE1EFF1E088E08E0F9091F100919372 +:102700008E13FBCF0E94DE0E8091E80083FF1FC175 +:102710008091F1019091F201492F50E04A3051052A +:1027200008F015C1FA01EA5AFF4F0C94812D803848 +:1027300081F0823809F00BC18091F5018F70809390 +:10274000E9008091EB0085FB882780F91092E90071 +:1027500006C08091ED019091EE01911182609091FF +:10276000E800977F9093E8008093F1001092F100C9 +:10277000C8C0282F2D7F09F0EAC0882319F08230C5 +:1027800061F0E5C08091F301813009F0E0C0933041 +:1027900009F080E08093EE012BC08091F30181115C +:1027A00027C08091F5018F7009F4D1C08093E900B2 +:1027B0002091EB0020FF1CC0933021F48091EB00AE +:1027C000806214C09091EB0090619093EB0021E047 +:1027D00030E0A90102C0440F551F8A95E2F74093EB +:1027E000EA001092EA008091EB0088608093EB0091 +:1027F0001092E9008091E800877F86C08111A7C010 +:102800001091F3011F778091E3008078812B8093F2 +:10281000E3008091E800877F8093E8000E948C119C +:102820008091E80080FFFCCF8091E3008068809376 +:10283000E300111102C082E001C083E08093F00147 +:1028400086C08058823008F082C08091F301909158 +:10285000F4018C3D53E0950779F583E08A838AE2A1 +:1028600089834FB7F894DE01139620E03EE051E2F1 +:10287000E32FF0E050935700E49120FF03C0E2956E +:10288000EF703F5FEF708E2F90E0EA3010F0C79648 +:1028900001C0C0968D939D932F5F243149F74FBFA0 +:1028A0008091E800877F8093E8006AE270E0CE01C3 +:1028B00001960E94931014C0AE014F5F5F4F60916C +:1028C000F5010E94DA0FBC01892B09F440C09091F8 +:1028D000E800977F9093E80089819A810E94F61022 +:1028E0008091E8008B778093E80031C0803879F5DB +:1028F0008091E800877F8093E8008091EC018093CD +:10290000F1008091E8008E778093E8000E948C119E +:102910001EC081111CC09091F3019230C0F48091CF +:10292000E800877F8093E8009093EC010E948C116F +:102930008091EC01811106C08091E30087FD02C007 +:1029400081E001C084E08093F0010E94C50E809177 +:10295000E80083FF0AC08091E800877F8093E80049 +:102960008091EB0080628093EB00AA960FB6F894FA +:10297000DEBF0FBECDBFDF91CF911F910895CF93E2 +:102980008091F0018823A1F0C091E900CF7090916F +:10299000EC00892F817090FD80E8C82B1092E9002F +:1029A0008091E80083FD0E946E13CF70C093E90010 +:1029B000CF91089590937401809373010895E091ED +:1029C0007301F0917401309721F00190F081E02DB6 +:1029D000099480E00895EF92FF920F931F93CF9395 +:1029E000DF93E0917301F09174013097B1F18C01A4 +:1029F0000280F381E02D09958091D70182FF2DC0DF +:102A000080FF04C08DE895E00E945207E80110E1C4 +:102A100087E8E82E85E0F82E8091D70180FF0BC073 +:102A200088811F928F93FF92EF920E94EB070F9085 +:102A30000F900F900F90115021961111EDCF8091B2 +:102A4000D70180FF0AC085E895E0DF91CF911F9103 +:102A50000F91FF90EF900C945207DF91CF911F914F +:102A60000F91FF90EF900895E0917301F091740140 +:102A7000309721F00480F581E02D0994089520918C +:102A80007101309172018217930771F09093720176 +:102A900080937101E0917301F0917401309721F0FE +:102AA0000680F781E02D0994089520916F013091FF +:102AB00070018217930771F09093700180936F01FA +:102AC000E0917301F0917401309721F00084F18559 +:102AD000E02D0994089508950C946B150E94B92176 +:102AE0000E9462090C947F22CF93C82F8091D70156 +:102AF00082FF1EC080FF04C086EA95E00E94520754 +:102B00008091D70180FF0CC01F92CF9381EA95E09E +:102B10009F938F930E94EB070F900F900F900F9051 +:102B20008091D70180FF04C08FE995E00E94520791 +:102B30008C2FCF910C94110DCF92DF92EF92FF92D8 +:102B40000F931F93CF93DF93CDB7DEB72B970FB6BD +:102B5000F894DEBF0FBECDBF0E947F0986E7C82E66 +:102B600081E0D82E00E010E0E02E802F0E94AB0A1A +:102B7000F60141916F01F42EF826B1F40F5F1F4F5B +:102B80000E30110589F78FEF89838A831B820E949B +:102B9000C2218160782F9D838C8349815A816B810A +:102BA0008D810E943F1640C09091D70191FF04C0D3 +:102BB0008B870E94B10A8B8520E030E04F2D50E0DA +:102BC000922FBA01022E02C0759567950A94E2F71A +:102BD00060FF24C02E83EF8221E030E0690102C053 +:102BE000CC0CDD1C9A95E2F790E08C219D21892B7D +:102BF00009F420E028870E94C2218160782F9A87FB +:102C000089874E815F8168858A850E943F16F80119 +:102C1000EA58FE4F8081C826C08206C02F5F3F4F12 +:102C20002630310569F6AACF0E94F0251091750172 +:102C30000E94DF141817A1F00E94DF148093750121 +:102C40002B960FB6F894DEBF0FBECDBFDF91CF91AC +:102C50001F910F91FF90EF90DF90CF900C9474151F +:102C60002B960FB6F894DEBF0FBECDBFDF91CF918C +:102C70001F910F91FF90EF90DF90CF900895CF9329 +:102C8000DF93CDB7DEB72B970FB6F894DEBF0FBE3C +:102C9000CDBF4F83588769877A878B87DE0111966E +:102CA00086E0FD0111928A95E9F785E0FE013796ED +:102CB00001900D928A95E1F749815A816B817C815F +:102CC0008D819E810E94551D2B960FB6F894DEBF14 +:102CD0000FBECDBFDF91CF910895CF93882309F424 +:102CE000C2C0C82F823859F40E94DF1481FDBBC0D6 +:102CF00089E30E94F11F0E94D02089E30CC0833831 +:102D000079F40E94DF1480FDAEC083E50E94F11FBC +:102D10000E94D02083E50E944420CF910C94D020C3 +:102D2000843859F40E94DF1482FD9DC087E40E941C +:102D3000F11F0E94D02087E4EECF8CEF8C0F813AF8 +:102D400048F48C2F0E94832A81118DC08C2F0E9401 +:102D5000F11FE3CF80E28C0F883048F4C77081E028 +:102D600001C0880FCA95EAF70E949920D6CF8BE55B +:102D70008C0F833078F4C53A29F0C63A31F083E8F5 +:102D800090E005C081E890E002C082E890E0CF9139 +:102D90000C943F1588E58C0F833108F064C0C83A65 +:102DA00039F1C93A41F1CA3A49F1CB3A51F1CC3A39 +:102DB00059F1CD3A61F1C03B69F1CE3A71F1CF3AA8 +:102DC00079F1C13B81F1C23B89F1C33B91F1C43B35 +:102DD00099F1C53BA1F1C63BA9F1C73BB1F1C83B95 +:102DE000B9F1C93BC1F1CA3BC9F180E090E038C0FC +:102DF00082EE90E035C089EE90E032C08AEE90E03D +:102E00002FC085EB90E02CC086EB90E029C087EBCB +:102E100090E026C08CEC90E023C08DEC90E020C0C8 +:102E200083E891E01DC08AE891E01AC082E991E050 +:102E300017C084E991E014C081E292E011C083E2FE +:102E400092E00EC084E292E00BC085E292E008C0FE +:102E500086E292E005C087E292E002C08AE292E058 +:102E6000CF910C945515CF910895882309F44BC048 +:102E7000823859F40E94DF1481FF45C089E30E9423 +:102E8000F11F0E94D02089E30CC0833871F40E94A6 +:102E9000DF1480FF38C083E50E94F11F0E94D0201C +:102EA00083E50E9444200C94D020843859F40E9479 +:102EB000DF1482FF28C087E40E94F11F0E94D02007 +:102EC00087E4EFCF9CEF980F913A58F390E2980F78 +:102ED000983050F4877091E001C0990F8A95EAF715 +:102EE000892F0E949F20DFCF9BE5980F933020F41D +:102EF00080E090E00C943F15885A833120F480E004 +:102F000090E00C9455150895882321F00E94992093 +:102F10000C94D0200895882321F00E949F200C94C7 +:102F2000D0200895BF92CF92DF92EF92FF920F933D +:102F30001F93CF93DF9300D000D000D0CDB7DEB782 +:102F400025E0FC01DE01119601900D922A95E1F732 +:102F5000FC01408131810281258122952F7063819E +:102F60007481672B09F4E5C23F3F19F44F3F09F420 +:102F7000E0C27C0149833A8389819A812E830E9431 +:102F8000B01F182FB92E0E94AF1F0E94761EEB2D86 +:102F9000E295EF70F0E0E05AFF4F2E810C94812D06 +:102FA0008B2D807F9B2D9F70F92E882319F0F29432 +:102FB00080EFF822002349F0FF2009F467C28F2D2B +:102FC0000E94A9200E94D02061C2812F0E94351743 +:102FD000FF2009F4AEC28F2D0E94AF2026960FB6B7 +:102FE000F894DEBF0FBECDBFDF91CF911F910F913F +:102FF000FF90EF90DF90CF90BF900C94D0203B2DAE +:10300000307F8B2D8F70303211F08295807F1123AD +:1030100019F0113021F12CC00023B9F0222309F45A +:10302000A0C1213009F09DC126960FB6F894DEBFED +:103030000FBECDBFDF91CF911F910F91FF90EF9009 +:10304000DF90CF90BF900C94B920222319F021304B +:1030500009F46FC28E830E94BC208E8196C100232A +:1030600021F0223008F065C27CC1211162C28DC1FD +:10307000002321F0222309F474C108C2222309F499 +:1030800084C119C22B2D26952695237030E0211579 +:10309000310521F021303105D1F04BC2002321F060 +:1030A000812F9B2D937002C080E090E026960FB692 +:1030B000F894DEBF0FBECDBFDF91CF911F910F916E +:1030C000FF90EF90DF90CF90BF900C943F150023BE +:1030D00021F0812F9B2D937002C080E090E0269616 +:1030E0000FB6F894DEBF0FBECDBFDF91CF911F9119 +:1030F0000F91FF90EF90DF90CF90BF900C945515FB +:10310000812F002319F00E94762402C00E94DE2441 +:1031100026960FB6F894DEBF0FBECDBFDF91CF91DC +:103120001F910F91FF90EF90DF90CF90BF900C9484 +:1031300063258B2D837009F07BC00111FAC1812FAB +:10314000829586958770880F880F912F9F70C92E62 +:10315000D12CE12CF12C082E04C0CC0CDD1CEE1C73 +:10316000FF1C0A94D2F714FF12C04FE050E060E059 +:1031700070E004C0440F551F661F771F8A95D2F771 +:10318000CB01BA01609570958095909503C060E081 +:1031900070E0CB012B2D269526952370422F50E011 +:1031A00042305105D9F04330510569F16C297D2930 +:1031B0008E299F294130510551F126960FB6F8947A +:1031C000DEBF0FBECDBFDF91CF911F910F91FF905A +:1031D000EF90DF90CF90BF900C949D1E6C297D29BD +:1031E0008E299F2926960FB6F894DEBF0FBECDBF5D +:1031F000DF91CF911F910F91FF90EF90DF90CF90D3 +:10320000BF900C94B91E0E949D1EC701B601269660 +:103210000FB6F894DEBF0FBECDBFDF91CF911F91E7 +:103220000F91FF90EF90DF90CF90BF900C94811E94 +:10323000002319F08B2D817001C08695882309F435 +:1032400078C1812F829586958770880F880F912F7E +:103250009F70C92ED12CE12CF12C082E04C0CC0C6F +:10326000DD1CEE1CFF1C0A94D2F714FF12C04FE0C5 +:1032700050E060E070E004C0440F551F661F771FE8 +:103280008A95D2F7CB01BA0160957095809590959B +:1032900003C060E070E0CB012B2D269526952370AE +:1032A000422F50E042305105D9F04330510569F1C9 +:1032B0006C297D298E299F294130510551F126968F +:1032C0000FB6F894DEBF0FBECDBFDF91CF911F9137 +:1032D0000F91FF90EF90DF90CF90BF900C94771FED +:1032E0006C297D298E299F2926960FB6F894DEBF7A +:1032F0000FBECDBFDF91CF911F910F91FF90EF9047 +:10330000DF90CF90BF900C94931F0E94771FC7014E +:10331000B60126960FB6F894DEBF0FBECDBFDF9183 +:10332000CF911F910F91FF90EF90DF90CF90BF90C2 +:103330000C945B1F103FD1F118F4103E50F4A1C063 +:10334000123F09F463C008F44CC0133F09F473C082 +:1033500098C01F708B2D8F710023A1F00E94F41E66 +:10336000812F26960FB6F894DEBF0FBECDBFDF913A +:10337000CF911F910F91FF90EF90DF90CF90BF9072 +:103380000C9484170E94151F812F26960FB6F8946F +:10339000DEBF0FBECDBFDF91CF911F910F91FF9088 +:1033A000EF90DF90CF90BF900C948B170023A9F083 +:1033B0002111BFC08B2D8F7126960FB6F894DEBFFA +:1033C0000FBECDBFDF91CF911F910F91FF90EF9076 +:1033D000DF90CF90BF900C943A1F223008F0A9C024 +:1033E000E9CF0023A9F08B2D8F7126960FB6F894A4 +:1033F000DEBF0FBECDBFDF91CF911F910F91FF9028 +:10340000EF90DF90CF90BF900C94F41E002359F3FF +:103410008B2D8F7126960FB6F894DEBF0FBECDBFF1 +:10342000DF91CF911F910F91FF90EF90DF90CF90A0 +:10343000BF900C94151F002399F08B2D8F71269649 +:103440000FB6F894DEBF0FBECDBFDF91CF911F91B5 +:103450000F91FF90EF90DF90CF90BF900C94DF1E04 +:1034600026960FB6F894DEBF0FBECDBFDF91CF9189 +:103470001F910F91FF90EF90DF90CF90BF900C9431 +:10348000D51E0023A9F0222309F4ADCF812F269663 +:103490000FB6F894DEBF0FBECDBFDF91CF911F9165 +:1034A0000F91FF90EF90DF90CF90BF900C946D162E +:1034B000222309F4ADCF812F26960FB6F894DEBFF4 +:1034C0000FBECDBFDF91CF911F910F91FF90EF9075 +:1034D000DF90CF90BF900C9435174B2D4F70612F1C +:1034E000C7010E94F40726960FB6F894DEBF0FBE00 +:1034F000CDBFDF91CF911F910F91FF90EF90DF90A3 +:10350000CF90BF900C94F91D4B2D4F70612FC701C8 +:1035100026960FB6F894DEBF0FBECDBFDF91CF91D8 +:103520001F910F91FF90EF90DF90CF90BF900C9480 +:10353000B70B26960FB6F894DEBF0FBECDBFDF9156 +:10354000CF911F910F91FF90EF90DF90CF90BF90A0 +:1035500008950E94B6200E948B200E94D0200E94D5 +:1035600096260E94632580E090E00E943F1580E04F +:1035700090E00C9455150E94A6200C94A91A0E9464 +:10358000B01F292F22952F7030E02C3031054CF4DC +:103590002A3031056CF4225031092230310588F48B +:1035A00007C02C30310549F02F30310531F009C00A +:1035B000803E48F0803F29F406C093FB882780F9BD +:1035C000089580E0089581E00895CF93DF9300D0BF +:1035D00000D01F92CDB7DEB70F900F900F900F90D5 +:1035E0000F90DF91CF910895CF93DF9300D000D05B +:1035F00000D0CDB7DEB726960FB6F894DEBF0FBE6B +:10360000CDBFDF91CF9108951F93CF93DF93C091EA +:10361000840116E080918501C81799F0D0E01C9FC5 +:10362000F0011D9FF00D1124EA57FE4F408151819A +:1036300062817381848195810E94F41A2196C770FA +:10364000E9CFDF91CF911F9108954091B60150913C +:10365000B7016091B8017091B9018091BA01909160 +:10366000BB010C94F41A8091BB0182958F7009F014 +:1036700054C08091B801882309F44FC0809184011F +:10368000A09185016091B6017091B7014091B90197 +:103690005091BA01B6E08A1709F43FC090E0411595 +:1036A0005105C1F17F3F11F46F3FA1F1B89FF001C7 +:1036B000B99FF00D1124EA57FE4F218172132AC0E1 +:1036C0002081621327C02281211124C023813481EB +:1036D0002417350710F421503109241B350B283CE1 +:1036E0003105C0F42091BB012F7020612093BB01F4 +:1036F00026E0289FF001299FF00D1124E557FE4F89 +:1037000080818F708061808386EB91E00E949217A8 +:103710000C94041B01968770BECF0895CF92DF9260 +:10372000EF92FF920F931F93CF93DF93CDB7DEB746 +:1037300062970FB6F894DEBF0FBECDBF8C0185E057 +:10374000F801DE011D9601900D928A95E1F7D801EE +:103750004C9111965C91119712966C911297139659 +:10376000CD90DC9014973091B6017091B7018091A3 +:10377000B9019091BA01009709F46BC17F3F19F428 +:103780003F3F09F466C1E090B801EE2009F4C0C0E3 +:103790002091BB01C816D90628F0F601E81BF90BE9 +:1037A000CF0104C0809590958C0D9D1DFF24F3944E +:1037B000883C910578F0F12C207F09F0C6C07C2D63 +:1037C000D98AC88A89890E94E51A86EB91E00E940D +:1037D0009217B1C0822F807F09F046C0751314C0C4 +:1037E000341312C0611110C02F7020612093BB01EF +:1037F0000E94251B86EB91E00E9492178091BB01ED +:10380000D80115968C932EC0CD2819F15F3F11F485 +:103810004F3FF9F0F62E61111CC080918401209178 +:10382000850136E0821709F45AC090E0389FF00114 +:10383000399FF00D1124EA57FE4F7181571306C0CE +:103840007081471303C07281711103C001968770A4 +:10385000E9CFF62E662309F418C18091BB0181607F +:103860008093BB01F12C11C1751308C0341306C03D +:10387000611104C08091BB01D801C3C04D875E8730 +:103880008D859E856A8B0E94BF1A6A898823E1F123 +:103890006623D1F12091BB01822F82958F7090E039 +:1038A000029774F08091B6019091B70198878F8349 +:1038B0001986DB86CA862C87CE0107960E9492174E +:1038C00086E0F801A6EBB1E001900D928A95E1F750 +:1038D0000E94331B0E94251BFF24F394D6C04D8702 +:1038E0005E878D859E850E94B01F292F22952F709F +:1038F00030E0223031050CF0BCC09F7009F0B6C03A +:10390000805E883008F4C1C0C8010E949217E4CFDD +:10391000C816D90608F453C0F601E81BF90BCF010D +:10392000883C910508F450C0F12C7C2DD98AC88AB6 +:1039300089890E94E51AE6EBF1E086E0DF011D923D +:103940008A95E9F70E94251BA0C0751314C0341393 +:1039500012C0611110C08091BB01F8018583C801BC +:103960000E94921786E0E6EBF1E0DF011D928A9556 +:10397000E9F7FE2C8AC04D875E878D859E856A8B10 +:103980000E94BF1A6A89882309F4BECF662309F40E +:10399000BBCF2091BB01822F82958F7090E0029760 +:1039A0000CF48ECF8091B6019091B7019A838983F0 +:1039B0001B82DD82CC822E83CE0101967FCF809543 +:1039C00090958C0D9D1DACCFF62E662309F49CCFEF +:1039D00075132EC034132CC02091BB0120FD1FC0D5 +:1039E000822F82958F70D9F0D80115962C93159758 +:1039F0008F3049F08F5F982F9295907F822F8F7034 +:103A0000892B15968C93C8010E94921786E0F801C5 +:103A1000A6EBB1E001900D928A95E1F793CF86E095 +:103A2000F801A6EBB1E001900D928A95E1F72DC067 +:103A30004D875E878D859E850E94BF1A811140CF7C +:103A40008091BB0181608093BB01C8010E949217E5 +:103A50001CC0662309F458CF4D875E878D859E85EF +:103A60000E94BF1A882309F44FCF2ACF811148CF73 +:103A70000CC0243031050CF047CF9F7009F440CFC3 +:103A8000F8019581907F09F03BCF8F2D62960FB69C +:103A9000F894DEBF0FBECDBFDF91CF911F910F9184 +:103AA000FF90EF90DF90CF9008951F93CF93DF9317 +:103AB000CDB7DEB72C970FB6F894DEBF0FBECDBFE3 +:103AC0004F83588769877A878B879C87CE010796B3 +:103AD0000E948E1B882369F08F8198852A853B85FB +:103AE000232BF1F19F3F09F063C08F3F09F060C0C5 +:103AF00037C086E0FE013796DE01119601900D92E7 +:103B00008A95E1F76F817885EA85FB85309741F1E9 +:103B10007F3F11F46F3F21F12091850130E0C90111 +:103B20000196877099274091840150E0841795078A +:103B300009F447C069837A83FD83EC8396E0929F02 +:103B4000D001939FB00D1124AA57BE4FFE013196AC +:103B500001900D929A95E1F7809385010E94041BD4 +:103B600016E080918401909185018917C1F1189F19 +:103B7000C00111248A579E4F0E948E1B882379F121 +:103B8000E09184011E9FF0011124EA57FE4F40810D +:103B9000518162817381848195810E94F41A8091A0 +:103BA000840190E001968770992780938401D9CF92 +:103BB0004F81588569857A858B859C850E94F41A8A +:103BC000CFCF0E94BB1A1092850110928401E6EBC0 +:103BD000F1E086E0DF011D928A95E9F7C1CF2C96CE +:103BE0000FB6F894DEBF0FBECDBFDF91CF911F910E +:103BF0000895EF92FF920F931F93CF93DF938C0161 +:103C0000892B09F46CC0F12CEE24E394E801219691 +:103C1000F8018491843740F4843008F051C0813039 +:103C200081F0823019F15BC0853709F444C0A8F1F6 +:103C30009CE7980F903708F052C08F770E94351795 +:103C400041C00E5F1F4FFE01C49180E28C0F88308F +:103C500048F4C7708E2D01C0880FCA95EAF70E94FC +:103C6000A92014C08C2F0E946D162DC00E5F1F4F0F +:103C7000FE01C49180E28C0F883058F4C7708E2DFD +:103C800001C0880FCA95EAF70E94AF200E94D02099 +:103C90001AC08C2F0E94351716C00E5F1F4FFE01F1 +:103CA000C491CC2381F08FE99FE00197F1F700C028 +:103CB0000000C150F6CF0E5F1F4FFE01F49003C00D +:103CC0000E946D168E018F2D882309F49FCFEFE996 +:103CD000FFE03197F1F700C000008150F5CFDF9190 +:103CE000CF911F910F91FF90EF90089508956093E9 +:103CF000C0017093C1018093C2019093C3010C94E1 +:103D0000A91A0F931F930091C0011091C101209136 +:103D1000C2013091C301DC01CB01802B912BA22B7E +:103D2000B32B8093C0019093C101A093C201B093C3 +:103D3000C3011F910F910C94A91A0F931F93009127 +:103D4000C0011091C1012091C2013091C301DC0179 +:103D5000CB0180239123A223B3238093C0019093AE +:103D6000C101A093C201B093C3011F910F910C94A4 +:103D7000A91A0F931F930091C0011091C1012091C6 +:103D8000C2013091C301DC01CB0180279127A2271A +:103D9000B3278093C0019093C101A093C201B09357 +:103DA000C3011F910F910C94A91A1092BC0110929B +:103DB000BD011092BE011092BF010C94A91A41E0FE +:103DC00050E060E070E004C0440F551F661F771F8D +:103DD0008A95D2F74093BC015093BD016093BE0118 +:103DE0007093BF010C94A91A41E050E060E070E0CC +:103DF00004C0440F551F661F771F8A95D2F7809124 +:103E0000BC019091BD01A091BE01B091BF01482BB2 +:103E1000592B6A2B7B2B4093BC015093BD016093BF +:103E2000BE017093BF010C94A91A41E050E060E01C +:103E300070E004C0440F551F661F771F8A95D2F7A4 +:103E400040955095609570958091BC019091BD0111 +:103E5000A091BE01B091BF01482359236A237B235F +:103E60004093BC015093BD016093BE017093BF01AC +:103E70000C94A91A41E050E060E070E004C0440FE7 +:103E8000551F661F771F8A95D2F78091BC019091CC +:103E9000BD01A091BE01B091BF01482759276A27F3 +:103EA0007B274093BC015093BD016093BE0170938A +:103EB000BF010C94A91A0F931F930091BC0110919C +:103EC000BD012091BE013091BF01DC01CB01802BEF +:103ED000912BA22BB32B8093BC019093BD01A09397 +:103EE000BE01B093BF011F910F910C94A91A0F93BB +:103EF0001F930091BC011091BD012091BE01309132 +:103F0000BF01DC01CB0180239123A223B323809343 +:103F1000BC019093BD01A093BE01B093BF011F915E +:103F20000F910C94A91A0F931F930091BC0110914B +:103F3000BD012091BE013091BF01DC01CB01802782 +:103F40009127A227B3278093BC019093BD01A09332 +:103F5000BE01B093BF011F910F910C94A91A08954F +:103F6000CF92DF92EF92FF920F931F93CF93DF9345 +:103F70008C01C090C001D090C101E090C201F090CE +:103F8000C3014091BC015091BD016091BE0170918F +:103F9000BF01C42AD52AE62AF72ACFE1D0E0D7010B +:103FA000C6010C2E04C0B695A795979587950A94DF +:103FB000D2F780FF07C0B8018C2F0E94DA0B813046 +:103FC000910531F4219758F7B80180E00E94DA0B8F +:103FD000DF91CF911F910F91FF90EF90DF90CF90E5 +:103FE000089590910C01992321F090910D01911168 +:103FF00009C020910E0130910F01F90132969FEF17 +:1040000040E030C0982F9695969596959F30A0F4F5 +:10401000E0910E01F0910F01E90FF11D877021E091 +:1040200030E0A90102C0440F551F8A95E2F7CA018A +:104030009181892B818308959091D70190FF23C0AE +:104040001F928F9387ED95E09F938F930E94EB07CC +:104050000F900F900F900F9008959F3F39F04F5F92 +:104060004E3041F051915813F8CF0DC05111F7CF98 +:10407000942FF5CF9F3F39F0F901E90FF11D97FD1E +:10408000FA9582830895089590910C01992321F067 +:1040900090910D01911109C020910E0130910F01F5 +:1040A000F9013296205F3F4F30C0982F9695969534 +:1040B00096959F30A8F4E0910E01F0910F01E90F61 +:1040C000F11D877021E030E0A90102C0440F551FA7 +:1040D0008A95E2F7CA0180959181892381830895A9 +:1040E0009091D70190FF16C01F928F9389EB95E0B6 +:1040F0009F938F930E94EB070F900F900F900F905C +:1041000008953196E217F30729F090819813F9CFBB +:104110001082F7CF089581E090E0E0910E01F091D8 +:104120000F01E80FF91F1082019680319105A9F760 +:1041300008959091D601892B8093D601089580959A +:104140009091D60189238093D60108951092D601CB +:1041500008959091D501892B8093D501089580957C +:104160009091D50189238093D50108951092D501AE +:1041700008958093C40108951092C4010895809118 +:104180000E0190910F01FC0131969C01205F3F4F81 +:1041900080E0919191118F5FE217F307D1F70895B5 +:1041A000E0910E01F0910F018091D6018083E091A2 +:1041B0000E01F0910F0190818091D501892B8083B0 +:1041C0008091C401882361F0E0910E01F0910F010C +:1041D0009081892B80830E94BF2081111092C4019D +:1041E00080910E0190910F010C94EB1490933B0180 +:1041F00080933A010895CF92DF92EF92FF926C0183 +:10420000EE24FF24C114D104E104F10421F0C7011C +:10421000B60120E101C020E0C72ED82EE92EFF24F0 +:10422000C114D104E104F10419F0285FC701B601FB +:104230006B017C0154E0F694E794D794C7945A95A7 +:10424000D1F7C114D104E104F10419F02C5FC701C6 +:10425000B6016B017C0142E0F694E794D794C794D1 +:104260004A95D1F7C114D104E104F10419F02E5F8D +:10427000C701B601DC01CB01B695A7959795879547 +:10428000892B8A2B8B2B09F02F5F822FFF90EF90C9 +:10429000DF90CF9008958295982F9C7C392F36958A +:1042A0003695282F237344E0249FC0011124932FB7 +:1042B000982B292F2A7A2695892F8575880F822B8E +:1042C00008951F93CF93DF931F92CDB7DEB79983E5 +:1042D0000E944B21182F9981892F0E944B21212F59 +:1042E00030E0322F2227A901482BCA010F90DF911D +:1042F000CF911F9108958091F001843009F11092BF +:10430000D80120E488E190E00FB6F894A895809356 +:1043100060000FBE2093600083B7817F846083BFFD +:1043200083B7816083BF7894889583B78E7F83BF7E +:1043300088E10FB6F89480936000109260000FBE81 +:10434000089508950895CF930E94A1210E947F09A6 +:104350000E94A221C0E08C2F0E94AB0A811104C0F0 +:10436000CF5FCE30C1F701C081E0CF9108950C94AA +:10437000BB1A82E084BD93E095BD9AEF97BD809310 +:104380006E0008952FB7F8948091D9019091DA01C9 +:10439000A091DB01B091DC012FBF0895CF92DF9295 +:1043A000EF92FF920F931F932FB7F8944091D9018A +:1043B0005091DA016091DB017091DC012FBF6A013D +:1043C0007B01EE24FF248C0120E030E0C016D106F2 +:1043D000E206F30610F4415051099A01281B390BEB +:1043E000C9011F910F91FF90EF90DF90CF9008953A +:1043F0001F920F920FB60F9211248F939F93AF933A +:10440000BF938091D9019091DA01A091DB01B09125 +:10441000DC010196A11DB11D8093D9019093DA01B1 +:10442000A093DB01B093DC01BF91AF919F918F917D +:104430000F900FBE0F901F9018950E94DD11F894F9 +:104440002FEF87EA91E6215080409040E1F700C0CD +:10445000000087E090EBDC018093F9019093FA0172 +:10446000A093FB01B093FC019CE088E10FB6F894A7 +:10447000A895809360000FBE90936000FFCFEF92ED +:10448000FF920F931F93CF93DF93D82FC0E08C2F11 +:104490000E94AB0A00E010E0E82EF12CC701002ECC +:1044A00002C0959587950A94E2F780FD06C00F5FDC +:1044B0001F4F0630110591F709C0602F7C2F80E057 +:1044C0000E94B80BD813F3CF81E004C0CF5FCE3089 +:1044D000F1F680E0DF91CF911F910F91FF90EF9067 +:1044E0000895CF93C82F8CE20E943F22882321F0A9 +:1044F0008C2FCF910C943F2280E0CF910895CF93E1 +:104500000E94CE23811102C00E94B4238CEF95E05B +:104510000E945207C5E6C15049F00E947F098FE30F +:104520009CE90197F1F700C00000F5CF85EF95E019 +:104530000E94520789E20E947122811113C18AE20E +:104540000E94712281110E94B42385E00E94712291 +:1045500081110E941D220E94D9238093D70187E0F8 +:104560000E9471228823A9F18BE10E947122882385 +:1045700051F08091D70181FB222720F991E0922709 +:1045800090FB81F90EC08EE00E947122882361F0B9 +:104590008091D70182FB222720F991E0922790FB9E +:1045A00082F98093D70115C080E10E947122909119 +:1045B000D701882341F093FB222720F981E082274D +:1045C00080FB93F904C0892F809580FB90F990932C +:1045D000D7018091D7010E94DD230E94EB238093B5 +:1045E000EA0180EE0E947122882341F08091EA0165 +:1045F000982F909590FB80F98093EA0189E30E94BF +:104600007122882359F08091EA0181FB222720F949 +:1046100091E0922790FB81F98093EA0182EE0E945B +:104620007122882359F08091EA0182FB222720F928 +:1046300091E0922790FB82F98093EA0186EE0E9436 +:104640007122882359F08091EA0183FB222720F907 +:1046500091E0922790FB83F98093EA0183EE0E9418 +:104660007122882359F08091EA0184FB222720F9E6 +:1046700091E0922790FB84F98093EA0185E30E9400 +:104680007122882359F08091EA0185FB222720F9C5 +:1046900091E0922790FB85F98093EA0181E30E94E3 +:1046A0007122882359F08091EA0186FB222720F9A4 +:1046B00091E0922790FB86F98093EA0181E10E94C4 +:1046C0007122882359F08091EA0187FB222720F983 +:1046D00091E0922790FB87F98093EA018091EA01AB +:1046E0000E94EF238091EA0187FB882780F980935D +:1046F0000D0187E20E947122C82F8EE10E94712273 +:104700008111C2608FE10E9471228111C46080E238 +:104710000E9471228111C86081E20E947122811180 +:10472000C06182E20E9471228111C06283E20E9414 +:1047300071228111C06484E20E947122882311F0E9 +:10474000C06802C0CC2329F08C2F0E94E6236C2F76 +:1047500003C00E94E223682F70E080E090E0CF91D8 +:104760000C94771ECF9108956DEE7EEF80E090E07F +:104770000E94B72D60E082E090E00E94A92D60E0E9 +:1047800083E090E00E94A92D60E084E090E00E9428 +:10479000A92D60E085E090E00C94A92D80E090E0E8 +:1047A0000E94A32D21E08D3E9E4F09F020E0822F34 +:1047B000089582E090E00C949B2D682F82E090E0B9 +:1047C0000C94A92D83E090E00C949B2D682F83E03E +:1047D00090E00C94A92D84E090E00C949B2D682F20 +:1047E00084E090E00C94A92D8091DF0180FF0BC044 +:1047F0006091130185E0689FB0011124759567955C +:10480000759567952BC081FF09C06091130185E004 +:10481000689FB00111247595679520C082FF07C07D +:104820006091130185E0689FB001112417C0909139 +:10483000E0019923D1F060911201961788F7209139 +:10484000130185E0289F90011124929FA001939F5E +:10485000500D112470E0CA010E946D2D6038710561 +:1048600040F46115710539F002C065E070E0862FF3 +:1048700008958FE7089581E008958091DF0180FF1A +:1048800008C06091110170E0759567957595679501 +:1048900021C081FF06C06091110170E07595679598 +:1048A00019C082FF04C06091110170E010C09091A6 +:1048B000E0019923C1F0609110019617A0F7809153 +:1048C0001101899FC001112470E00E946D2D603894 +:1048D000710528F46115710521F0862F08958FE781 +:1048E000089581E0089561E070E0F4CF803F21F405 +:1048F0000E94F423819504C0813F29F40E94F4238F +:104900008093E3010895823F21F40E94F42381956E +:1049100004C0833F29F40E94F4238093E2010895A8 +:10492000893F19F40E943D2405C08A3F31F40E945A +:104930003D2481958093E40108958B3F21F40E94EA +:104940003D24819504C08C3F29F40E943D2480932E +:10495000E5010895843F21F48091E101816017C051 +:10496000853F21F48091E101826011C0863F21F4EE +:104970008091E10184600BC0873F21F48091E101C7 +:10498000886005C0883F31F48091E10180618093A7 +:10499000E10108958D3F21F48091DF0181600BC01A +:1049A0008E3F21F48091DF01826005C08F3F29F4A2 +:1049B0008091DF0184608093DF010895803F39F4A6 +:1049C0008091E30187FF6CC01092E30169C0813FD1 +:1049D00029F48091E3011816BCF362C09091E201C2 +:1049E000823F29F497FF5CC01092E20159C0833FD7 +:1049F00019F41916CCF354C0893F41F48091E401B5 +:104A000018160CF04DC01092E4014AC08A3F29F4F8 +:104A10008091E40187FF44C0F6CF8B3F39F4809149 +:104A2000E50187FF3DC01092E5013AC08C3F29F4B3 +:104A30008091E5011816BCF333C0843F21F48091C6 +:104A4000E1018E7F17C0853F21F48091E1018D7FC8 +:104A500011C0863F21F48091E1018B7F0BC0873F1D +:104A600021F48091E101877F05C0883F31F4809176 +:104A7000E1018F7E8093E10113C08D3F21F480918D +:104A8000DF018E7F0BC08E3F21F48091DF018D7F8F +:104A900005C08F3F29F48091DF018B7F8093DF0178 +:104AA0008091E20181110EC08091E30181110AC061 +:104AB0008091E401811106C08091E501811102C05D +:104AC0001092E00108958091D70183FF7EC088E3B2 +:104AD00096E00E9452078091E1011F928F9383E339 +:104AE00096E09F938F930E94EB0781E396E00E94EC +:104AF00052078091E201282F332727FD30953F93FD +:104B00008F938EE296E09F938F930E94EB078CE247 +:104B100096E00E9452078091E301282F332727FD5A +:104B200030953F938F9389E296E09F938F930E94F5 +:104B3000EB0787E296E00E9452078091E401282F5C +:104B4000332727FD30953F938F9384E296E09F9320 +:104B50008F930E94EB0782E296E00E9452078091B9 +:104B6000E501282F332727FD30953F938F938FE161 +:104B700096E09F938F930E94EB078CE196E00E9452 +:104B800052078091E0011F928F9389E196E09F93F5 +:104B90008F930E94EB0787E196E00E945207809175 +:104BA000DF011F928F9384E196E09F938F930E9481 +:104BB000EB0781E196E00E9452078DB79EB74C96B5 +:104BC0000FB6F8949EBF0FBE8DBF81EE91E00E949C +:104BD00034150E94C2219093DE018093DD01089577 +:104BE0001F93CF93DF938091DD019091DE010E94AE +:104BF000CE21AC019091E001992321F02091140184 +:104C000030E006C0209115018AE0289F9001112410 +:104C10004217530708F486C08091E201C091E30176 +:104C2000D091E4011091E501811107C0C11176C056 +:104C3000D11174C0111172C075C09F3F19F09F5FF0 +:104C40009093E001181624F40E94F4238093E2016B +:104C50008091E20187FF05C00E94F4238195809333 +:104C6000E2011C1624F40E94F4238093E301809156 +:104C7000E30187FF05C00E94F42381958093E3013F +:104C80006091E201662339F1C091E301CC2319F16F +:104C9000772767FD7095872F972F0E94722C23E34B +:104CA00033E343E35FE30E94D62C0E943F2C6093E2 +:104CB000E2016C2F772767FD7095872F972F0E9451 +:104CC000722C23E333E343E35FE30E94D62C0E947C +:104CD0003F2C6093E3011D1624F40E943D24809331 +:104CE000E4018091E40187FF05C00E943D24819585 +:104CF0008093E401111624F40E943D248093E50181 +:104D00008091E50187FF05C00E943D248195809335 +:104D1000E501DF91CF911F910C9463259F3F09F02E +:104D20008ECF96CFDF91CF911F910895E1EEF1E004 +:104D300085E0DF011D928A95E9F71092E00110925B +:104D4000DF0108958BE598E00E9452071F9281E0F1 +:104D50008F931F9285E08F938DE098E09F938F93C0 +:104D60000E94EB070F900F900F900F900F900F90F5 +:104D700008958330E9F128F4813061F0823009F13F +:104D80000895853009F462C008F449C0863009F4FA +:104D900074C0089580911501262F30E0280F311D31 +:104DA0002F3F310524F4680F6093150103C08FEF86 +:104DB00080931501809115011F928F9386E497E0EF +:104DC00072C080911401262F30E0280F311D2F3F33 +:104DD000310524F4680F6093140103C08FEF8093B2 +:104DE0001401809114011F928F9384E397E05BC0BC +:104DF00080911301262F30E0280F311D2F3F310500 +:104E000024F4680F6093130103C08FEF80931301A4 +:104E1000809113011F928F9381E297E044C08091AB +:104E20001201262F30E0280F311D2F3F310524F4C9 +:104E3000680F6093120103C08FEF8093120180917D +:104E400012011F928F938CE097E02DC08091110189 +:104E5000262F30E0280F311D2F3F310524F4680F35 +:104E60006093110103C08FEF8093110180911101B4 +:104E70001F928F9383EF96E016C080911001262F2A +:104E800030E0280F311D2F3F310524F4680F609367 +:104E9000100103C08FEF80931001809110011F92C9 +:104EA0008F9388ED96E09F938F930E94EB070F906E +:104EB0000F900F900F900895833081F128F4813086 +:104EC00059F08230D1F00895853009F449C0B8F125 +:104ED000863009F456C0089580911501681720F4B2 +:104EE000861B8093150102C0109215018091150157 +:104EF0001F928F9389EC96E054C08091140168173B +:104F000020F4861B8093140102C01092140180913A +:104F100014011F928F9387EB96E043C08091130199 +:104F2000681720F4861B8093130102C010921301AE +:104F3000809113011F928F9384EA96E032C0809192 +:104F40001201681720F4861B8093120102C0109290 +:104F50001201809112011F928F938FE896E021C079 +:104F600080911101681720F4861B8093110102C003 +:104F700010921101809111011F928F9386E796E0A4 +:104F800010C080911001681720F4861B80931001D7 +:104F900002C010921001809110011F928F938BE537 +:104FA00096E09F938F930E94EB070F900F900F90C6 +:104FB0000F900895CF93C82F1F928F9380E699E0AA +:104FC0009F938F930E94EB0781E090E0A0E0B0E018 +:104FD000BC01CD0104C0660F771F881F991FCA95B9 +:104FE000D2F70E94771E0F900F900F900F90CF91E5 +:104FF0000C94BB1ACF938D3109F465C0B0F58E3097 +:1050000009F4CCC100F5873009F49BC1A8F48630BF +:1050100009F06DC28091D701817F8E7F8093D70187 +:1050200085E699E00E94520781EA9DE00E945207BE +:1050300081E08093E70180C1883009F44FC08B3054 +:1050400009F47CC154C2863109F4F0C138F48031CE +:1050500009F4B8C1813109F430C249C2893109F477 +:10506000CEC18B3109F486C142C2853309F437C2FF +:1050700048F4873209F433C208F433C2893209F4A0 +:105080002EC235C2833438F48A3308F02CC28833F8 +:1050900009F454C12CC2833409F421C2883409F0C4 +:1050A00026C20E94BB1A80E99DE00E9452079FEF32 +:1050B00023ED80E3915020408040E1F700C00000E4 +:1050C0000E941D2239C180EB9DE00E9452070E9480 +:1050D000F92B0E94DF140E94110D2EC185EA9DE07C +:1050E0000E94520786E79BE00E9452070E94E2233B +:1050F0001F928F9383E79BE09F938F930E94EB0710 +:1051000081E79BE00E9452070E94D923C82F8EE5B9 +:105110009BE00E9452071F92CF9389E59BE09F93EB +:105120008F930E94EB0787E59BE00E9452078DE476 +:105130009BE00E9452078C2F81701F928F938AE40C +:105140009BE09F938F930E94EB0788E49BE00E9473 +:1051500052078EE39BE00E945207C1FB882780F92B +:105160001F928F938BE39BE09F938F930E94EB079B +:1051700089E39BE00E9452078DE29BE00E94520768 +:10518000C2FB882780F91F928F938AE29BE09F934E +:105190008F930E94EB0788E29BE00E9452078FE109 +:1051A0009BE00E945207C3FBCC27C0F91F92CF930C +:1051B0008CE19BE09F938F930E94EB078AE19BE039 +:1051C0000E9452070E94EB23C82F86E09BE00E94BA +:1051D00052071F92CF9381E09BE09F938F930E9491 +:1051E000EB078FEF9AE00E94520786EE9AE00E944A +:1051F00052078C2F81701F928F9383EE9AE09F93BA +:105200008F930E94EB078DB79EB780960FB6F894E8 +:105210009EBF0FBE8DBF81EE9AE00E9452078AECBE +:105220009AE00E945207C1FB882780F91F928F9352 +:1052300087EC9AE09F938F930E94EB0785EC9AE0AE +:105240000E94520783EB9AE00E945207C2FB882714 +:1052500080F91F928F9380EB9AE09F938F930E9427 +:10526000EB078EEA9AE00E9452078CE99AE00E94CE +:105270005207C3FB882780F91F928F9389E99AE030 +:105280009F938F930E94EB0787E99AE00E94520751 +:105290008DE89AE00E945207C4FB882780F91F928C +:1052A0008F938AE89AE09F938F930E94EB0788E898 +:1052B0009AE00E94520786E79AE00E945207C5FBD7 +:1052C000882780F91F928F9383E79AE09F938F93AB +:1052D0000E94EB0781E79AE00E94520785E59AE079 +:1052E0000E945207C6FB882780F91F928F9382E5A0 +:1052F0009AE09F938F930E94EB0780E59AE00E94CB +:10530000520788E49AE00E945207C7FBCC27C0F9F5 +:105310001F92CF9385E49AE09F938F930E94EB07AF +:1053200083E49AE00E9452078DB79EB74C960FB661 +:10533000F8949EBF0FBE8DBFC1E0DEC08CE899E03F +:105340005BC08091D701C82FC17080FF09C083E87E +:105350009DE00E9452078091D701817F8E7F47C0D8 +:1053600087E79DE00E9452078091D701816080937A +:10537000D701E2CF9091D70191FBCC27C0F981E012 +:10538000C827892FC0FB81F98093D701CC2319F05E +:105390008AE69DE027C08CE59DE02EC09091D70164 +:1053A00092FBCC27C0F981E0C827892FC0FB82F986 +:1053B0008093D701CC2319F08DE49DE013C08DE3D9 +:1053C0009DE01AC09091D70193FBCC27C0F981E0F2 +:1053D000C827892FC0FB83F98093D701CC2351F0D4 +:1053E00081E39DE00E9452078091D7018160809304 +:1053F000D70182C084E29DE00E9452079DCF85E1E3 +:105400009DE00E94520789EE9CE00E9452078CEAC0 +:105410009CE00E94520785E89CE00E94520781E4CC +:105420009CE00E94520786E19CE0E6CF88E09CE089 +:105430000E9452070E94DF141F928F938EEE9BE012 +:105440009F938F930E94EB0780910C011F928F9383 +:1054500087ED9BE09F938F930E94EB0780916E01F5 +:105460001F928F9384EC9BE09F938F930E94EB0796 +:1054700080910D011F928F9381EB9BE09F938F93FF +:105480000E94EB078091D9019091DA01A091DB0194 +:10549000B091DC01BF93AF939F938F938DE99BE015 +:1054A0009F938F930E94EB078DB79EB746960FB6DA +:1054B000F8949EBF0FBE8DBF3FCF0E94BB1AC09114 +:1054C0000D0181E0C827C0930D01CC2329F083E9A9 +:1054D0009BE00E94520710C088E89BE08DCF80E0DF +:1054E00003C08D5101C089530E94DA2725CF86E879 +:1054F0009BE00E945207C0E08C2FCF91089580E07E +:10550000089580E00895CF93C82F8091E7018130FE +:1055100081F020F0823009F44FC045C1E0910E01C6 +:10552000F0910F018081813169F0823209F03DC133 +:1055300009C0E0910E01F0910F018081813111F0DD +:10554000823261F48C2F0E947F2A811104C08C2F3B +:105550000E94FA272FC081E090E02CC08C2F0E947F +:10556000812A811126C0C431E1F070F4CB3081F082 +:10557000C031D1F40E94A22688E599E00E9452072A +:1055800082E08093E70115C0C93259F0C83361F455 +:1055900085E699E00E9452078CE599E00E94520747 +:1055A00008C01092E70103C186E599E00E94520706 +:1055B000FEC081E08170FDC0C43220F5CE3108F01C +:1055C000C0C0CB3099F1C8F4C73009F0D2C08AE02E +:1055D0008093150194E19093140193E0909313014B +:1055E0008093120188E08093110188E2809310017A +:1055F0008CEF97E00E945207BFC0C33149F1C4311C +:10560000C1F0B7C0CB3409F4A9C028F4C93289F07D +:10561000C83361F0AEC0C13509F49EC0C23509F48B +:1056200099C0CE3409F0A5C06AE09EC00E94A226AF +:10563000A3C08091E601882319F01092E6019CC076 +:1056400089E098E00E94520781E08093E701B1C0B1 +:1056500083EE97E00E94520781ED97E00E94520787 +:10566000809115011F928F938EEC97E09F938F93FB +:105670000E94EB078CEC97E00E9452078AEB97E0C0 +:105680000E945207809114011F928F9387EB97E03D +:105690009F938F930E94EB0785EB97E00E94520740 +:1056A00086EA97E00E945207809113011F928F9320 +:1056B00083EA97E09F938F930E94EB0781EA97E03C +:1056C0000E94520780E997E00E94520780911201E0 +:1056D0001F928F938DE897E09F938F930E94EB0723 +:1056E0008BE897E00E94520786E797E00E945207F6 +:1056F000809111011F928F9383E797E09F938F937F +:105700000E94EB0781E797E00E9452078AE597E045 +:105710000E945207809110011F928F9387E597E0B6 +:105720009F938F930E94EB0785E597E00E945207B5 +:105730008DB79EB748960FB6F8949EBF0FBE8DBF2B +:105740001BC0CE51EC2FF0E0E15DFE4F80818093D5 +:10575000E60112C061E003C061E006C06AE080912A +:10576000E6010E94B92608C08091E6010E945C27EC +:1057700003C08AEF97E013C08091E601882369F0A7 +:105780001F928F9384EF97E09F938F930E94EB0774 +:105790000F900F900F900F9004C081EF97E00E9440 +:1057A000520781E006C01092E70180E002C080E06D +:1057B00001CFCF910895E1E8F0E080818860808397 +:1057C0008081816080838FB7F89493E09093890003 +:1057D00090ED909388008FBF0895EFE6F0E0808110 +:1057E000826080830895EFE6F0E080818D7F808382 +:1057F0000895EFE6F0E0908182E0892780830895A4 +:105800001F920F920FB60F9211242F933F934F9335 +:105810005F936F937F938F939F93AF93BF93EF9318 +:10582000FF938091E8019091E90101969093E9013D +:105830008093E801811103C082E00E94110DE09184 +:10584000E901E695E695F0E0E054F24FE4918091AD +:10585000E8018E1303C080E00E94110DFF91EF91CB +:10586000BF91AF919F918F917F916F915F914F9178 +:105870003F912F910F900FBE0F901F90189504D05D +:105880006894B1118DC0089570D088F09F5790F042 +:10589000B92F9927B751A0F0D1F0660F771F881F55 +:1058A000991F1AF0BA95C9F712C0B13081F077D0BC +:1058B000B1E0089574C0672F782F8827B85F39F05A +:1058C000B93FCCF3869577956795B395D9F73EF4B4 +:1058D00090958095709561957F4F8F4F9F4F08955C +:1058E000E89409C097FB3EF490958095709561957A +:1058F0007F4F8F4F9F4F9923A9F0F92F96E9BB2730 +:105900009395F695879577956795B795F111F8CFAB +:10591000FAF4BB0F11F460FF1BC06F5F7F4F8F4F16 +:105920009F4F16C0882311F096E911C0772321F00C +:105930009EE8872F762F05C0662371F096E8862FA4 +:1059400070E060E02AF09A95660F771F881FDAF7FB +:10595000880F9695879597F9089557FD9058440FAD +:10596000551F59F05F3F71F04795880F97FB991FBE +:1059700061F09F3F79F0879508951216130614067B +:10598000551FF2CF4695F1DF08C016161706180608 +:10599000991FF1CF86957105610508940895E894E3 +:1059A000BB2766277727CB0197F908950BD078C0DE +:1059B00069D028F06ED018F0952309F05AC05FC066 +:1059C0001124EECFCADFA0F3959FD1F3950F50E0DD +:1059D000551F629FF001729FBB27F00DB11D639FA1 +:1059E000AA27F00DB11DAA1F649F6627B00DA11D47 +:1059F000661F829F2227B00DA11D621F739FB00DED +:105A0000A11D621F839FA00D611D221F749F33275C +:105A1000A00D611D231F849F600D211D822F762FF5 +:105A20006A2F11249F5750408AF0E1F088234AF0F2 +:105A3000EE0FFF1FBB1F661F771F881F915050403E +:105A4000A9F79E3F510570F014C0AACF5F3FECF359 +:105A5000983EDCF3869577956795B795F795E7952A +:105A60009F5FC1F7FE2B880F911D9695879597F93B +:105A7000089597F99F6780E870E060E008959FEFD0 +:105A800080EC089500240A941616170618060906D5 +:105A9000089500240A9412161306140605060895A4 +:105AA000092E0394000C11F4882352F0BB0F40F42C +:105AB000BF2B11F460FF04C06F5F7F4F8F4F9F4F6C +:105AC0000895991B79E004C0991F961708F0961B5A +:105AD000881F7A95C9F78095089597FB072E16F4CD +:105AE000009407D077FD09D00E94872D07FC05D0D0 +:105AF0003EF4909581959F4F0895709561957F4FE5 +:105B00000895EE0FFF1F0590F491E02D0994AA1B54 +:105B1000BB1B51E107C0AA1FBB1FA617B70710F098 +:105B2000A61BB70B881F991F5A95A9F780959095CA +:105B3000BC01CD010895F999FECF92BD81BDF89ABF +:105B4000992780B50895A8E1B0E042E050E00C94B8 +:105B5000BE2D262FF999FECF1FBA92BD81BD20BD63 +:105B60000FB6F894FA9AF99A0FBE019608950E941A +:105B7000A92D272F0C94AA2DDC01CB01FC01F9994A +:105B8000FECF06C0F2BDE1BDF89A319600B40D9289 +:0C5B900041505040B8F70895F894FFCF42 +:105B9C002002120D030EE00DAC0D780D0101C501B4 +:105BAC0028080A03140A3F4D3620394605F904C368 +:105BBC0004A3046A04DD03F6030F0428044804015B +:0A5BCC0002030405060708090000A3 +:00000001FF -- cgit v1.2.3