From 59bef40aab37f8dd4db61e601f2a0e9b5991e993 Mon Sep 17 00:00:00 2001 From: Zach Nielsen Date: Thu, 10 Nov 2016 12:14:54 -0800 Subject: [PATCH 001/181] Keep unicode's input_mode through a power cycle --- quantum/process_keycode/process_unicode.c | 6 ++++++ tmk_core/common/eeconfig.h | 1 + 2 files changed, 7 insertions(+) diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c index cd3a610b4d..f42f255389 100644 --- a/quantum/process_keycode/process_unicode.c +++ b/quantum/process_keycode/process_unicode.c @@ -1,6 +1,7 @@ #include "process_unicode.h" static uint8_t input_mode; +static uint8_t first_flag = 0; __attribute__((weak)) uint16_t hex_to_keycode(uint8_t hex) @@ -17,6 +18,7 @@ uint16_t hex_to_keycode(uint8_t hex) void set_unicode_input_mode(uint8_t os_target) { input_mode = os_target; + eeprom_update_byte(EECONFIG_UNICODEMODE, os_target); } uint8_t get_unicode_input_mode(void) { @@ -75,6 +77,10 @@ void register_hex(uint16_t hex) { bool process_unicode(uint16_t keycode, keyrecord_t *record) { if (keycode > QK_UNICODE && record->event.pressed) { + if (first_flag == 0) { + set_unicode_input_mode(eeprom_read_byte(EECONFIG_UNICODEMODE)); + first_flag = 1; + } uint16_t unicode = keycode & 0x7FFF; unicode_input_start(); register_hex(unicode); diff --git a/tmk_core/common/eeconfig.h b/tmk_core/common/eeconfig.h index d8caa346f9..280dc7ab67 100644 --- a/tmk_core/common/eeconfig.h +++ b/tmk_core/common/eeconfig.h @@ -33,6 +33,7 @@ along with this program. If not, see . #define EECONFIG_BACKLIGHT (uint8_t *)6 #define EECONFIG_AUDIO (uint8_t *)7 #define EECONFIG_RGBLIGHT (uint32_t *)8 +#define EECONFIG_UNICODEMODE (uint8_t *)12 /* debug bit */ From c07ef5c6abd7875c19c4bcbe3bcaecd123862fd3 Mon Sep 17 00:00:00 2001 From: Zach Nielsen Date: Thu, 10 Nov 2016 12:26:56 -0800 Subject: [PATCH 002/181] Adding my (zach) keymaps for planck and preonic --- keyboards/planck/keymaps/zach/Makefile | 29 + keyboards/planck/keymaps/zach/config.h | 91 +++ keyboards/planck/keymaps/zach/keymap.c | 48 ++ .../keymaps/zach/zach_common_functions.c | 538 ++++++++++++++++++ keyboards/preonic/keymaps/zach/Makefile | 29 + keyboards/preonic/keymaps/zach/config.h | 95 ++++ keyboards/preonic/keymaps/zach/keymap.c | 54 ++ .../keymaps/zach/zach_common_functions.c | 538 ++++++++++++++++++ 8 files changed, 1422 insertions(+) create mode 100644 keyboards/planck/keymaps/zach/Makefile create mode 100644 keyboards/planck/keymaps/zach/config.h create mode 100644 keyboards/planck/keymaps/zach/keymap.c create mode 100644 keyboards/planck/keymaps/zach/zach_common_functions.c create mode 100644 keyboards/preonic/keymaps/zach/Makefile create mode 100644 keyboards/preonic/keymaps/zach/config.h create mode 100644 keyboards/preonic/keymaps/zach/keymap.c create mode 100644 keyboards/preonic/keymaps/zach/zach_common_functions.c diff --git a/keyboards/planck/keymaps/zach/Makefile b/keyboards/planck/keymaps/zach/Makefile new file mode 100644 index 0000000000..b0009147ac --- /dev/null +++ b/keyboards/planck/keymaps/zach/Makefile @@ -0,0 +1,29 @@ +# Zach Planck Makefile +# Max .hex size is about 28636 bytes + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +TAP_DANCE_ENABLE = yes # Enable TapDance functionality +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +USB_6KRO_ENABLE = no # 6key Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +VARIABLE_TRACE = no # Debug changes to variable values +UNICODE_ENABLE = yes # Unicode +UNICODEMAP_ENABLE = yes # Enable extended unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/planck/keymaps/zach/config.h b/keyboards/planck/keymaps/zach/config.h new file mode 100644 index 0000000000..1be800545a --- /dev/null +++ b/keyboards/planck/keymaps/zach/config.h @@ -0,0 +1,91 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define MANUFACTURER Ortholinear Keyboards +#define PRODUCT The Planck Keyboard +#define DESCRIPTION A compact ortholinear keyboard + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 12 + +/* Planck PCB default pin-out */ +#define MATRIX_ROW_PINS { D0, D5, B5, B6 } +#define MATRIX_COL_PINS { F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 } +#define UNUSED_PINS + +#define BACKLIGHT_PIN B7 + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +//#define BACKLIGHT_BREATHING // LED breathing +/* number of backlight levels */ +#define BACKLIGHT_LEVELS 5 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +//#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +//#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +#define NO_ACTION_TAPPING +#define NO_ACTION_ONESHOT +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION +#define PREVENT_STUCK_MODIFIERS +//#define DYNAMIC_MACRO_ENABLE // Enable if you need to use the macro functionality +//#define SPACE_CADET // Parenthesis on L/R shift + +#ifdef SUBPROJECT_rev3 + #include "rev3/config.h" +#endif +#ifdef SUBPROJECT_rev4 + #include "rev4/config.h" +#endif + +#endif diff --git a/keyboards/planck/keymaps/zach/keymap.c b/keyboards/planck/keymaps/zach/keymap.c new file mode 100644 index 0000000000..d3cde5bb9d --- /dev/null +++ b/keyboards/planck/keymaps/zach/keymap.c @@ -0,0 +1,48 @@ +// Zach Nielsen Custom Planck Keyboard layout +#include "planck.h" +#define PLANCK_YES // This is the Planck +#include "zach_common_functions.c" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[_COLEMAK] = { /* Base Layer */ + {KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, KC_BSPC}, + {KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_ENT}, + {SHFT_CAP,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT}, + {CTRLB, TD(SUP), KC_LALT, KC_LCTL, TD(LOW), KC_SPC, KC_SPC, TD(RAI), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +[_SWCOLE] = { /* Software Colemak */ + {_______, CM_Q, CM_W, CM_F, CM_P, CM_G, CM_J, CM_L, CM_U, CM_Y, KC_QUOT, _______}, + {_______, CM_A, CM_R, CM_S, CM_T, CM_D, CM_H, CM_N, CM_E, CM_I, CM_O, _______}, + {_______, CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, CM_COMM, CM_DOT, CM_SLSH, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +}, + +[_RAISE] = { /* RAISE - Numpad and Unicode symbols */ + {KC_GRV, SUPA2, FACE, DISFACE, SHRUG, PLUMIN, IBANG, KC_7, KC_8, KC_9, KC_COLN, _______}, + {KC_DEL, DEGREE, MICRO, WOMEGA, OMEGA, PENGY, KC_ENT, KC_4, KC_5, KC_6, KC_SLSH, KC_ASTR}, + {_______, KC_COLN, TFLIP, LAROW, RAROW, DUCK, KC_SPC, KC_1, KC_2, KC_3, KC_MINS, KC_PLUS}, + {_______, KC_PIPE, TPUT, _______, _______, KC_TAB, KC_TAB, _______, KC_0, KC_0, KC_DOT, KC_EQL} +}, + +[_LOWER] = { /* LOWER - Symbols, Paging, CtrAltDel */ + {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_QUES, KC_DQT, KC_DEL}, + {KC_DEL, KC_LBRC, KC_RBRC, KC_MINS, KC_UNDS, KC_HOME, KC_END, KC_LPRN, KC_RPRN, KC_SLSH, KC_SCLN, KC_PGUP}, + {CPYPST, XXXXXXX, C(KC_X), KC_LABK, KC_RABK, XXXXXXX, XXXXXXX, KC_LCBR, KC_RCBR, KC_BSLS, KC_COLN, KC_PGDN}, + {_______, _______, _______, _______, _______, KC_TAB, KC_TAB, _______, _______, _______, _______, _______} +}, + +[_ADJUST] = { /* ADJUST - Macros, Layer Switching, Function Keys */ + {UNIWIN, Sil_Usr, Sil_Pas, PENGY, DUCK, KC_INS, KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX}, + {UNILIN, UltiU, UltiP, RANDIG, RANDIG, SWCOLE, COLEMAK, KC_F5, KC_F6, KC_F7, KC_F8, XXXXXXX}, + {_______, CADKEY, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX}, + {_______, _______, _______, _______, _______, RESET, RESET, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX} +}, + +[_UNICODES] = { /* UNICODES - Extra layer for unicode stuff */ + {_______, TFLIP, XXXXXXX, FINGER, IBANG, roman7, XXXXXXX, XXXXXXX, ROMAN7, TappyL, TappyR, _______}, + {KC_DEL, TPUT, FACE, DISFACE, SHRUG, roman4, roman5, roman6, ROMAN4, ROMAN5, ROMAN6, _______}, + {XXXXXXX, PENIS, BOOBS, LAROW, RAROW, roman1, roman2, roman3, ROMAN1, ROMAN2, ROMAN3, XXXXXXX}, + {_______, _______, _______, _______, _______, KC_SPC, KC_SPC, _______, _______, _______, _______, _______} +} +}; diff --git a/keyboards/planck/keymaps/zach/zach_common_functions.c b/keyboards/planck/keymaps/zach/zach_common_functions.c new file mode 100644 index 0000000000..f01929f5d7 --- /dev/null +++ b/keyboards/planck/keymaps/zach/zach_common_functions.c @@ -0,0 +1,538 @@ +#ifndef ZACH_COMMON_FUNCTIONS +#define ZACH_COMMON_FUNCTIONS +#include "eeconfig.h" +#include "action_layer.h" +#include "keymap_colemak.h" +#include "extra_functions.c" +extern keymap_config_t keymap_config; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO +#define C(n) RCTL(n) +#define CADKEY RCTL(RALT(KC_DEL)) + +void tap(uint16_t keycode){ + register_code(keycode); + unregister_code(keycode); +}; + +void persistant_default_layer_set(uint16_t default_layer){ + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +}; + +// Automatic number generation of important keywords +enum my_keycodes{ + // Layer numbers + _COLEMAK = 0, + _SWCOLE, + _RAISE, + _LOWER, + _ADJUST, + _UNICODES, + // These use process_record_user() + COLEMAK = SAFE_RANGE, + SWCOLE, + LOWER, + RAISE, + SHFT_CAP, + CTRLB, + CPYPST, + FACE, + UNIWIN, + UNILIN, + DISFACE, + TFLIP, + TPUT, + SHRUG, + PENIS, + BOOBS, + Sil_Pas, + Sil_Usr, + UltiU, + UltiP, + TappyR, + TappyL, + RANDIG, + FINGER, + // Tap_Dance nums + RAI = 0, + LOW, + SUP +}; + +#ifdef AUDIO_ENABLE +#include "audio.h" +float tone_startup[][2] = SONG(STARTUP_SOUND); +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_swcole[][2] = SONG(QWERTY_SOUND); +float tone_capslock_on[][2] = SONG(CAPS_LOCK_ON_SOUND); +float tone_capslock_off[][2] = SONG(CAPS_LOCK_OFF_SOUND); +float tone_ctrl_mod[][2] = SONG(COIN_SOUND); +float tone_copy[][2] = SONG(SCROLL_LOCK_ON_SOUND); +float tone_paste[][2] = SONG(SCROLL_LOCK_OFF_SOUND); +float uniwin[][2] = SONG(UNICODE_WINDOWS); +float unilin[][2] = SONG(UNICODE_LINUX); +#endif + +#ifdef TAP_DANCE_ENABLE +#define TAPPING_TERM 200 + +uint8_t Lstate = 0, Rstate = 0; +uint32_t Ltimer = 0, Rtimer = 0; +uint32_t Ltimes[3], Rtimes[4]; // Ratio of tap times should be about 1.335 (L/R) +void rhythm_parse(void){ + int L = Ltimes[0] + Ltimes[1] + Ltimes[2]; // Start to end time + int R = Rtimes[0] + Rtimes[1] + Rtimes[2] + Rtimes[3]; + if(abs(R-L) > 10){ + tap(KC_N); tap(KC_O); + return; + } else { + L = (L / 3)*100; // Average time per tap * 100 + R = (R / 4); + if(abs(abs(L/R)-133) > 1){ + tap(KC_N); tap(KC_O); + tap(KC_P); tap(KC_E); + return; + } else { + tap(KC_O); tap(KC_K); + return; + } + } +}; + +void dance_raise_press(qk_tap_dance_state_t *state, void *user_data){// Called on each tap + switch(state->count){ // Only turn the layer on once + case 1: + layer_off(_UNICODES); + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + break; + } +}; +void dance_raise_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on release + switch(state->count){ + case 1: // Normal action. Turn off layers + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + layer_off(_UNICODES); + break; + } +}; +///////////////////////////////////////////////////////////////////// +void dance_lower_press(qk_tap_dance_state_t *state, void *user_data){// Called on tap + switch(state->count){ + case 1: // Turn on lower + layer_off(_UNICODES); + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + break; + } +}; +void dance_lower_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on release + switch(state->count){ + case 1: // Normal action. Turn off layers + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + layer_off(_UNICODES); + break; + case 2: // Turn on _UNICODES layer + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + layer_on(_UNICODES); + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_ctrl_mod, false, 0); + #endif + break; + } +}; +///////////////////////////////////////////////////////////////////// +void dance_super_press(qk_tap_dance_state_t *state, void *user_data){ // Called on down + if(state->count == 1){ + register_code(KC_LGUI); + } +} +void dance_super_done(qk_tap_dance_state_t *state, void *user_data){ // Called on timeout + switch(state->count){ + case 2: + register_code(KC_LGUI); + tap(KC_L); + unregister_code(KC_LGUI); + break; + } +} +void dance_super_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on up + unregister_code(KC_LGUI); +} + +qk_tap_dance_action_t tap_dance_actions[] = { + [RAI] = ACTION_TAP_DANCE_FN_ADVANCED(dance_raise_press, NULL, dance_raise_lift), + [LOW] = ACTION_TAP_DANCE_FN_ADVANCED(dance_lower_press, NULL, dance_lower_lift), + [SUP] = ACTION_TAP_DANCE_FN_ADVANCED(dance_super_press, dance_super_done, dance_super_lift) +}; +#endif + +#ifdef UNICODE_ENABLE +// Unicode shortcuts +#define IBANG UC(0x203D) +#define RAROW UC(0x2192) +#define LAROW UC(0x2190) +#define DEGREE UC(0x00B0) +#define OMEGA UC(0x03A9) +#define WOMEGA UC(0x03C9) +#define MICRO UC(0x00B5) +#define PLUMIN UC(0x00B1) +#define SUPA2 UC(0x00B2) +#define ROMAN1 UC(0x2160) +#define ROMAN2 UC(0x2161) +#define ROMAN3 UC(0x2162) +#define ROMAN4 UC(0x2163) +#define ROMAN5 UC(0x2164) +#define ROMAN6 UC(0x2165) +#define ROMAN7 UC(0x2166) +#define roman1 UC(0x2170) +#define roman2 UC(0x2171) +#define roman3 UC(0x2172) +#define roman4 UC(0x2173) +#define roman5 UC(0x2174) +#define roman6 UC(0x2175) +#define roman7 UC(0x2176) + +#ifdef UNICODEMAP_ENABLE // For Unicode characters larger than 0x8000. Send with X() +enum Ext_Unicode{ + PENGUIN = 0, + BOAR, + MONKEY, + DRAGON, + CHICK, + TUMBLER +}; +const uint32_t PROGMEM unicode_map[] = { + [PENGUIN] = 0x1F427, + [BOAR] = 0x1F417, + [MONKEY] = 0x1F412, + [DRAGON] = 0x1F409, + [CHICK] = 0x1F425, + [TUMBLER] = 0x1F943 +}; +#define PENGY X(PENGUIN) +#define BOARY X(BOAR) +#define MNKY X(MONKEY) +#define DRGN X(DRAGON) +#define DUCK X(CHICK) +#define TMBL X(TUMBLER) +#endif + +#endif + +static uint16_t key_timer; +static uint8_t caps_status = 0; +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case COLEMAK: + if(record->event.pressed){ + persistant_default_layer_set(1UL<<_COLEMAK); + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + } + return false; + break; + case SWCOLE: + if(record->event.pressed){ + persistant_default_layer_set(1UL<<_SWCOLE); + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_swcole, false, 0); + #endif + } + return false; + break; + #ifndef TAP_DANCE_ENABLE + case RAISE: + if(record->event.pressed){ + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case LOWER: + if(record->event.pressed){ + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + #endif + case SHFT_CAP: + if(record->event.pressed){ + key_timer = timer_read(); // if the key is being pressed, we start the timer. + register_code(KC_LSHIFT); + } else { // this means the key was just released (tap or "held down") + if(timer_elapsed(key_timer) < 152){ // Time in ms, the threshold we pick for counting something as a tap. + tap(KC_CAPS); + if(caps_status == 0){ + caps_status = 1; + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_capslock_on, false, 0); + #endif + } else { + caps_status = 0; + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_capslock_off, false, 0); + #endif + } + } + unregister_code(KC_LSHIFT); + } + return false; + break; + case CTRLB: // Control-B on tap (bold) + if(record->event.pressed){ + key_timer = timer_read(); // if the key is being pressed, we start the timer. + register_code(KC_LCTL); + } else { // this means the key was just released (tap or "held down") + if (timer_elapsed(key_timer) < 152) { // Time in ms, the threshold we pick for counting something as a tap. + tap(KC_B); + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_ctrl_mod, false, 0); + #endif + #ifdef BACKLIGHT_BREATHING + breathing_speed_set(2); + breathing_pulse(); + #endif + } + unregister_code(KC_LCTL); + } + return false; + break; + case CPYPST: // One key copy/paste + if(record->event.pressed){ + key_timer = timer_read(); + } else { + if (timer_elapsed(key_timer) > 152) { // Hold, copy + register_code(KC_LCTL); + tap(KC_C); + unregister_code(KC_LCTL); + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_copy, false, 0); + #endif + } else { // Tap, paste + register_code(KC_LCTL); + tap(KC_V); + unregister_code(KC_LCTL); + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_paste, false, 0); + #endif + } + } + return false; + break; + #ifdef UNICODE_ENABLE + case UNIWIN: + if(record->event.pressed){ + set_unicode_input_mode(UC_WIN); + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(uniwin, false, 0); + #endif + } + return false; + break; + case UNILIN: + if(record->event.pressed){ + set_unicode_input_mode(UC_LNX); + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(unilin, false, 0); + #endif + } + return false; + break; + case DISFACE: // ಠ_ಠ + if(record->event.pressed){ + process_unicode((0x0CA0|QK_UNICODE), record); // Eye + register_code(KC_RSFT); + tap(KC_MINS); + unregister_code(KC_RSFT); + process_unicode((0x0CA0|QK_UNICODE), record); // Eye + } + return false; + break; + case TFLIP: // (╯°□°)╯ ︵ ┻━┻ + if(record->event.pressed){ + register_code(KC_RSFT); + tap(KC_9); + unregister_code(KC_RSFT); + process_unicode((0x256F|QK_UNICODE), record); // Arm + process_unicode((0x00B0|QK_UNICODE), record); // Eye + process_unicode((0x25A1|QK_UNICODE), record); // Mouth + process_unicode((0x00B0|QK_UNICODE), record); // Eye + register_code(KC_RSFT); + tap(KC_0); + unregister_code(KC_RSFT); + process_unicode((0x256F|QK_UNICODE), record); // Arm + tap(KC_SPC); + process_unicode((0x0361|QK_UNICODE), record); // Flippy + tap(KC_SPC); + process_unicode((0x253B|QK_UNICODE), record); // Table + process_unicode((0x2501|QK_UNICODE), record); // Table + process_unicode((0x253B|QK_UNICODE), record); // Table + } + return false; + break; + case TPUT: // ┬──┬ ノ( ゜-゜ノ) + if(record->event.pressed){ + process_unicode((0x252C|QK_UNICODE), record); // Table + process_unicode((0x2500|QK_UNICODE), record); // Table + process_unicode((0x2500|QK_UNICODE), record); // Table + process_unicode((0x252C|QK_UNICODE), record); // Table + tap(KC_SPC); + process_unicode((0x30CE|QK_UNICODE), record); // Arm + register_code(KC_RSFT); + tap(KC_9); + unregister_code(KC_RSFT); + tap(KC_SPC); + process_unicode((0x309C|QK_UNICODE), record); // Eye + tap(KC_MINS); + process_unicode((0x309C|QK_UNICODE), record); // Eye + process_unicode((0x30CE|QK_UNICODE), record); // Arm + register_code(KC_RSFT); + tap(KC_0); + unregister_code(KC_RSFT); + } + return false; + break; + case SHRUG: // ¯\_(ツ)_/¯ + if(record->event.pressed){ + process_unicode((0x00AF|QK_UNICODE), record); // Hand + tap(KC_BSLS); // Arm + register_code(KC_RSFT); + tap(KC_UNDS); // Arm + tap(KC_LPRN); // Head + unregister_code(KC_RSFT); + process_unicode((0x30C4|QK_UNICODE), record); // Face + register_code(KC_RSFT); + tap(KC_RPRN); // Head + tap(KC_UNDS); // Arm + unregister_code(KC_RSFT); + tap(KC_SLSH); // Arm + process_unicode((0x00AF|QK_UNICODE), record); // Hand + } + return false; + break; + #endif + case FACE: // (o_O) + if(record->event.pressed){ + register_code(KC_RSFT); + tap(KC_LPRN); + unregister_code(KC_RSFT); + tap(KC_O); + register_code(KC_RSFT); + tap(KC_UNDS); + tap(KC_O); + tap(KC_RPRN); + unregister_code(KC_RSFT); + } + return false; + break; + #ifdef TAP_DANCE_ENABLE + case TappyR: + if(record->event.pressed){ + if(timer_elapsed32(Rtimer) > 1052){ + Rstate = 0; + } + switch(Rstate){ + case 0: + Rtimer = timer_read32(); + Rstate++; + break; + case 1: + Rtimes[0] = timer_elapsed32(Rtimer); + Rtimer = timer_read32(); + Rstate++; + break; + case 2: + Rtimes[1] = timer_elapsed32(Rtimer); + Rtimer = timer_read32(); + Rstate++; + break; + case 3: + Rtimes[2] = timer_elapsed32(Rtimer); + Rstate = 0; + break; + } + if(Rstate == 0 && Lstate == 0) rhythm_parse(); + } + return false; + break; + case TappyL: + if(record->event.pressed){ + if(timer_elapsed32(Ltimer) > 1052){ + Lstate = 0; + } + switch(Lstate){ + case 0: + Ltimer = timer_read32(); + Lstate++; + break; + case 1: + Ltimes[0] = timer_elapsed32(Ltimer); + Ltimer = timer_read32(); + Lstate++; + break; + case 2: + Ltimes[1] = timer_elapsed32(Ltimer); + Lstate = 0; + break; + } + if(Rstate == 0 && Lstate == 0) rhythm_parse(); + } + return false; + break; + #endif + #endif + case RANDIG: + if (record->event.pressed) { + tap_random_base64(); + } + return false; + break; + } + return true; +}; + +#ifdef AUDIO_ENABLE +void matrix_init_user(void){ // Run once at startup + #ifdef AUDIO_ENABLE + _delay_ms(50); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); + #endif +} + +void play_goodbye_tone(void){ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); +} + +void shutdown_user(){ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void){ // Run when the music layer is turned on + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void music_off_user(void){ // Run when music is turned off + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); +} +#endif + +#endif diff --git a/keyboards/preonic/keymaps/zach/Makefile b/keyboards/preonic/keymaps/zach/Makefile new file mode 100644 index 0000000000..bd49d142c9 --- /dev/null +++ b/keyboards/preonic/keymaps/zach/Makefile @@ -0,0 +1,29 @@ +# Zach Preonic Makefile +# Max .hex size is about 28636 bytes + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +TAP_DANCE_ENABLE = yes # Enable TapDance functionality +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +USB_6KRO_ENABLE = no # 6key Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = yes # Audio output on port C6 +VARIABLE_TRACE = no # Debug changes to variable values +UNICODE_ENABLE = yes # Unicode +UNICODEMAP_ENABLE = no # Enable extended unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/preonic/keymaps/zach/config.h b/keyboards/preonic/keymaps/zach/config.h new file mode 100644 index 0000000000..59959524fa --- /dev/null +++ b/keyboards/preonic/keymaps/zach/config.h @@ -0,0 +1,95 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6061 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Ortholinear Keyboards +#define PRODUCT The Preonic Keyboard +#define DESCRIPTION A compact ortholinear keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 12 + +/* Planck PCB default pin-out */ +#define MATRIX_ROW_PINS { D2, D5, B5, B6, D3 } +#define MATRIX_COL_PINS { F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 } +#define UNUSED_PINS + +#define BACKLIGHT_PIN B7 + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + + +#define BACKLIGHT_BREATHING // LED breathing +/* number of backlight levels */ +#define BACKLIGHT_LEVELS 5 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +//#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +//#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* ws2812 RGB LED */ +//#define RGB_DI_PIN D1 +//#define RGBLIGHT_TIMER +//#define RGBLED_NUM 28 // Number of LEDs +//#define RGBLIGHT_HUE_STEP 10 +//#define RGBLIGHT_SAT_STEP 17 +//#define RGBLIGHT_VAL_STEP 17 + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +#define NO_ACTION_TAPPING +#define NO_ACTION_ONESHOT +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION +#define PREVENT_STUCK_MODIFIERS +//#define DYNAMIC_MACRO_ENABLE // Enable if you need to use the macro functionality +//#define SPACE_CADET // Parenthesis on L/R shift + + +#endif diff --git a/keyboards/preonic/keymaps/zach/keymap.c b/keyboards/preonic/keymaps/zach/keymap.c new file mode 100644 index 0000000000..423ca4b868 --- /dev/null +++ b/keyboards/preonic/keymaps/zach/keymap.c @@ -0,0 +1,54 @@ +// Zach Nielsen Custom Preonic Keyboard layout +#include "preonic.h" +#define PREONIC_YES // This is the Preonic +#include "zach_common_functions.c" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[_COLEMAK] = { /* Base Layer */ + {KC_ESC, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, + {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, KC_ENT}, + {KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_ENT}, + {SHFT_CAP, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT}, + {CTRLB, TD(SUP), KC_LALT, KC_LCTL, TD(LOW), KC_SPC, KC_SPC, TD(RAI), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +[_SWCOLE] = { /* Software Colemak */ + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + {_______, CM_Q, CM_W, CM_F, CM_P, CM_G, CM_J, CM_L, CM_U, CM_Y, KC_QUOT, _______}, + {_______, CM_A, CM_R, CM_S, CM_T, CM_D, CM_H, CM_N, CM_E, CM_I, CM_O, _______}, + {_______, CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, CM_COMM, CM_DOT, CM_SLSH, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +}, + +[_RAISE] = { /* RAISE - Numpad and Unicode symbols */ + {KC_TILD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + {KC_GRV, SUPA2, FACE, DISFACE, SHRUG, PLUMIN, IBANG, KC_7, KC_8, KC_9, KC_COLN, _______}, + {KC_DEL, DEGREE, MICRO, WOMEGA, OMEGA, XXXXXXX, KC_ENT, KC_4, KC_5, KC_6, KC_SLSH, KC_ASTR}, + {_______, KC_COLN, TFLIP, LAROW, RAROW, XXXXXXX, KC_SPC, KC_1, KC_2, KC_3, KC_MINS, KC_PLUS}, + {_______, KC_PIPE, TPUT, _______, _______, KC_TAB, KC_TAB, _______, KC_0, KC_0, KC_DOT, KC_EQL} +}, + +[_LOWER] = { /* LOWER - Symbols, Paging, CtrAltDel */ + {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_QUES, KC_DQT, KC_DEL}, + {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_QUES, KC_DQT, KC_DEL}, + {KC_DEL, KC_LBRC, KC_RBRC, KC_MINS, KC_UNDS, KC_HOME, KC_END, KC_LPRN, KC_RPRN, KC_SLSH, KC_SCLN, KC_PGUP}, + {CPYPST, XXXXXXX, C(KC_X), KC_LABK, KC_RABK, XXXXXXX, XXXXXXX, KC_LCBR, KC_RCBR, KC_BSLS, KC_COLN, KC_PGDN}, + {_______, _______, _______, _______, _______, KC_TAB, KC_TAB, _______, _______, _______, _______, _______} +}, + +[_ADJUST] = { /* ADJUST - Macros, Layer Switching, Function Keys */ + {UNIWIN, XXXXXXX, XXXXXXX, RANDIG, RANDIG, KC_INS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, AU_TOG, MU_TOG}, + {UNILIN, SUPA2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX}, + {XXXXXXX, DEGREE, IBANG, LAROW, RAROW, SWCOLE, COLEMAK, KC_F5, KC_F6, KC_F7, KC_F8, BL_INC}, + {_______, CADKEY, MICRO, WOMEGA, OMEGA, XXXXXXX, XXXXXXX, KC_F9, KC_F10, KC_F11, KC_F12, BL_DEC}, + {_______, _______, _______, _______, _______, RESET, RESET, _______, XXXXXXX, MUV_DE, MUV_IN, BL_TOGG} +}, + +[_UNICODES] = { /* UNICODES - Extra layer for unicode stuff */ + {_______, XXXXXXX, XXXXXXX, FINGER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______}, + {_______, TFLIP, XXXXXXX, XXXXXXX, IBANG, roman7, XXXXXXX, XXXXXXX, ROMAN7, XXXXXXX, XXXXXXX, _______}, + {KC_DEL, TPUT, FACE, DISFACE, SHRUG, roman4, roman5, roman6, ROMAN4, ROMAN5, ROMAN6, _______}, + {XXXXXXX, PENIS, BOOBS, LAROW, RAROW, roman1, roman2, roman3, ROMAN1, ROMAN2, ROMAN3, XXXXXXX}, + {_______, _______, _______, _______, _______, KC_SPC, KC_SPC, _______, _______, _______, _______, _______} +} +}; diff --git a/keyboards/preonic/keymaps/zach/zach_common_functions.c b/keyboards/preonic/keymaps/zach/zach_common_functions.c new file mode 100644 index 0000000000..f01929f5d7 --- /dev/null +++ b/keyboards/preonic/keymaps/zach/zach_common_functions.c @@ -0,0 +1,538 @@ +#ifndef ZACH_COMMON_FUNCTIONS +#define ZACH_COMMON_FUNCTIONS +#include "eeconfig.h" +#include "action_layer.h" +#include "keymap_colemak.h" +#include "extra_functions.c" +extern keymap_config_t keymap_config; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO +#define C(n) RCTL(n) +#define CADKEY RCTL(RALT(KC_DEL)) + +void tap(uint16_t keycode){ + register_code(keycode); + unregister_code(keycode); +}; + +void persistant_default_layer_set(uint16_t default_layer){ + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +}; + +// Automatic number generation of important keywords +enum my_keycodes{ + // Layer numbers + _COLEMAK = 0, + _SWCOLE, + _RAISE, + _LOWER, + _ADJUST, + _UNICODES, + // These use process_record_user() + COLEMAK = SAFE_RANGE, + SWCOLE, + LOWER, + RAISE, + SHFT_CAP, + CTRLB, + CPYPST, + FACE, + UNIWIN, + UNILIN, + DISFACE, + TFLIP, + TPUT, + SHRUG, + PENIS, + BOOBS, + Sil_Pas, + Sil_Usr, + UltiU, + UltiP, + TappyR, + TappyL, + RANDIG, + FINGER, + // Tap_Dance nums + RAI = 0, + LOW, + SUP +}; + +#ifdef AUDIO_ENABLE +#include "audio.h" +float tone_startup[][2] = SONG(STARTUP_SOUND); +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_swcole[][2] = SONG(QWERTY_SOUND); +float tone_capslock_on[][2] = SONG(CAPS_LOCK_ON_SOUND); +float tone_capslock_off[][2] = SONG(CAPS_LOCK_OFF_SOUND); +float tone_ctrl_mod[][2] = SONG(COIN_SOUND); +float tone_copy[][2] = SONG(SCROLL_LOCK_ON_SOUND); +float tone_paste[][2] = SONG(SCROLL_LOCK_OFF_SOUND); +float uniwin[][2] = SONG(UNICODE_WINDOWS); +float unilin[][2] = SONG(UNICODE_LINUX); +#endif + +#ifdef TAP_DANCE_ENABLE +#define TAPPING_TERM 200 + +uint8_t Lstate = 0, Rstate = 0; +uint32_t Ltimer = 0, Rtimer = 0; +uint32_t Ltimes[3], Rtimes[4]; // Ratio of tap times should be about 1.335 (L/R) +void rhythm_parse(void){ + int L = Ltimes[0] + Ltimes[1] + Ltimes[2]; // Start to end time + int R = Rtimes[0] + Rtimes[1] + Rtimes[2] + Rtimes[3]; + if(abs(R-L) > 10){ + tap(KC_N); tap(KC_O); + return; + } else { + L = (L / 3)*100; // Average time per tap * 100 + R = (R / 4); + if(abs(abs(L/R)-133) > 1){ + tap(KC_N); tap(KC_O); + tap(KC_P); tap(KC_E); + return; + } else { + tap(KC_O); tap(KC_K); + return; + } + } +}; + +void dance_raise_press(qk_tap_dance_state_t *state, void *user_data){// Called on each tap + switch(state->count){ // Only turn the layer on once + case 1: + layer_off(_UNICODES); + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + break; + } +}; +void dance_raise_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on release + switch(state->count){ + case 1: // Normal action. Turn off layers + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + layer_off(_UNICODES); + break; + } +}; +///////////////////////////////////////////////////////////////////// +void dance_lower_press(qk_tap_dance_state_t *state, void *user_data){// Called on tap + switch(state->count){ + case 1: // Turn on lower + layer_off(_UNICODES); + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + break; + } +}; +void dance_lower_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on release + switch(state->count){ + case 1: // Normal action. Turn off layers + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + layer_off(_UNICODES); + break; + case 2: // Turn on _UNICODES layer + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + layer_on(_UNICODES); + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_ctrl_mod, false, 0); + #endif + break; + } +}; +///////////////////////////////////////////////////////////////////// +void dance_super_press(qk_tap_dance_state_t *state, void *user_data){ // Called on down + if(state->count == 1){ + register_code(KC_LGUI); + } +} +void dance_super_done(qk_tap_dance_state_t *state, void *user_data){ // Called on timeout + switch(state->count){ + case 2: + register_code(KC_LGUI); + tap(KC_L); + unregister_code(KC_LGUI); + break; + } +} +void dance_super_lift(qk_tap_dance_state_t *state, void *user_data){ // Called on up + unregister_code(KC_LGUI); +} + +qk_tap_dance_action_t tap_dance_actions[] = { + [RAI] = ACTION_TAP_DANCE_FN_ADVANCED(dance_raise_press, NULL, dance_raise_lift), + [LOW] = ACTION_TAP_DANCE_FN_ADVANCED(dance_lower_press, NULL, dance_lower_lift), + [SUP] = ACTION_TAP_DANCE_FN_ADVANCED(dance_super_press, dance_super_done, dance_super_lift) +}; +#endif + +#ifdef UNICODE_ENABLE +// Unicode shortcuts +#define IBANG UC(0x203D) +#define RAROW UC(0x2192) +#define LAROW UC(0x2190) +#define DEGREE UC(0x00B0) +#define OMEGA UC(0x03A9) +#define WOMEGA UC(0x03C9) +#define MICRO UC(0x00B5) +#define PLUMIN UC(0x00B1) +#define SUPA2 UC(0x00B2) +#define ROMAN1 UC(0x2160) +#define ROMAN2 UC(0x2161) +#define ROMAN3 UC(0x2162) +#define ROMAN4 UC(0x2163) +#define ROMAN5 UC(0x2164) +#define ROMAN6 UC(0x2165) +#define ROMAN7 UC(0x2166) +#define roman1 UC(0x2170) +#define roman2 UC(0x2171) +#define roman3 UC(0x2172) +#define roman4 UC(0x2173) +#define roman5 UC(0x2174) +#define roman6 UC(0x2175) +#define roman7 UC(0x2176) + +#ifdef UNICODEMAP_ENABLE // For Unicode characters larger than 0x8000. Send with X() +enum Ext_Unicode{ + PENGUIN = 0, + BOAR, + MONKEY, + DRAGON, + CHICK, + TUMBLER +}; +const uint32_t PROGMEM unicode_map[] = { + [PENGUIN] = 0x1F427, + [BOAR] = 0x1F417, + [MONKEY] = 0x1F412, + [DRAGON] = 0x1F409, + [CHICK] = 0x1F425, + [TUMBLER] = 0x1F943 +}; +#define PENGY X(PENGUIN) +#define BOARY X(BOAR) +#define MNKY X(MONKEY) +#define DRGN X(DRAGON) +#define DUCK X(CHICK) +#define TMBL X(TUMBLER) +#endif + +#endif + +static uint16_t key_timer; +static uint8_t caps_status = 0; +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case COLEMAK: + if(record->event.pressed){ + persistant_default_layer_set(1UL<<_COLEMAK); + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + } + return false; + break; + case SWCOLE: + if(record->event.pressed){ + persistant_default_layer_set(1UL<<_SWCOLE); + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_swcole, false, 0); + #endif + } + return false; + break; + #ifndef TAP_DANCE_ENABLE + case RAISE: + if(record->event.pressed){ + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case LOWER: + if(record->event.pressed){ + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + #endif + case SHFT_CAP: + if(record->event.pressed){ + key_timer = timer_read(); // if the key is being pressed, we start the timer. + register_code(KC_LSHIFT); + } else { // this means the key was just released (tap or "held down") + if(timer_elapsed(key_timer) < 152){ // Time in ms, the threshold we pick for counting something as a tap. + tap(KC_CAPS); + if(caps_status == 0){ + caps_status = 1; + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_capslock_on, false, 0); + #endif + } else { + caps_status = 0; + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_capslock_off, false, 0); + #endif + } + } + unregister_code(KC_LSHIFT); + } + return false; + break; + case CTRLB: // Control-B on tap (bold) + if(record->event.pressed){ + key_timer = timer_read(); // if the key is being pressed, we start the timer. + register_code(KC_LCTL); + } else { // this means the key was just released (tap or "held down") + if (timer_elapsed(key_timer) < 152) { // Time in ms, the threshold we pick for counting something as a tap. + tap(KC_B); + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_ctrl_mod, false, 0); + #endif + #ifdef BACKLIGHT_BREATHING + breathing_speed_set(2); + breathing_pulse(); + #endif + } + unregister_code(KC_LCTL); + } + return false; + break; + case CPYPST: // One key copy/paste + if(record->event.pressed){ + key_timer = timer_read(); + } else { + if (timer_elapsed(key_timer) > 152) { // Hold, copy + register_code(KC_LCTL); + tap(KC_C); + unregister_code(KC_LCTL); + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_copy, false, 0); + #endif + } else { // Tap, paste + register_code(KC_LCTL); + tap(KC_V); + unregister_code(KC_LCTL); + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_paste, false, 0); + #endif + } + } + return false; + break; + #ifdef UNICODE_ENABLE + case UNIWIN: + if(record->event.pressed){ + set_unicode_input_mode(UC_WIN); + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(uniwin, false, 0); + #endif + } + return false; + break; + case UNILIN: + if(record->event.pressed){ + set_unicode_input_mode(UC_LNX); + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(unilin, false, 0); + #endif + } + return false; + break; + case DISFACE: // ಠ_ಠ + if(record->event.pressed){ + process_unicode((0x0CA0|QK_UNICODE), record); // Eye + register_code(KC_RSFT); + tap(KC_MINS); + unregister_code(KC_RSFT); + process_unicode((0x0CA0|QK_UNICODE), record); // Eye + } + return false; + break; + case TFLIP: // (╯°□°)╯ ︵ ┻━┻ + if(record->event.pressed){ + register_code(KC_RSFT); + tap(KC_9); + unregister_code(KC_RSFT); + process_unicode((0x256F|QK_UNICODE), record); // Arm + process_unicode((0x00B0|QK_UNICODE), record); // Eye + process_unicode((0x25A1|QK_UNICODE), record); // Mouth + process_unicode((0x00B0|QK_UNICODE), record); // Eye + register_code(KC_RSFT); + tap(KC_0); + unregister_code(KC_RSFT); + process_unicode((0x256F|QK_UNICODE), record); // Arm + tap(KC_SPC); + process_unicode((0x0361|QK_UNICODE), record); // Flippy + tap(KC_SPC); + process_unicode((0x253B|QK_UNICODE), record); // Table + process_unicode((0x2501|QK_UNICODE), record); // Table + process_unicode((0x253B|QK_UNICODE), record); // Table + } + return false; + break; + case TPUT: // ┬──┬ ノ( ゜-゜ノ) + if(record->event.pressed){ + process_unicode((0x252C|QK_UNICODE), record); // Table + process_unicode((0x2500|QK_UNICODE), record); // Table + process_unicode((0x2500|QK_UNICODE), record); // Table + process_unicode((0x252C|QK_UNICODE), record); // Table + tap(KC_SPC); + process_unicode((0x30CE|QK_UNICODE), record); // Arm + register_code(KC_RSFT); + tap(KC_9); + unregister_code(KC_RSFT); + tap(KC_SPC); + process_unicode((0x309C|QK_UNICODE), record); // Eye + tap(KC_MINS); + process_unicode((0x309C|QK_UNICODE), record); // Eye + process_unicode((0x30CE|QK_UNICODE), record); // Arm + register_code(KC_RSFT); + tap(KC_0); + unregister_code(KC_RSFT); + } + return false; + break; + case SHRUG: // ¯\_(ツ)_/¯ + if(record->event.pressed){ + process_unicode((0x00AF|QK_UNICODE), record); // Hand + tap(KC_BSLS); // Arm + register_code(KC_RSFT); + tap(KC_UNDS); // Arm + tap(KC_LPRN); // Head + unregister_code(KC_RSFT); + process_unicode((0x30C4|QK_UNICODE), record); // Face + register_code(KC_RSFT); + tap(KC_RPRN); // Head + tap(KC_UNDS); // Arm + unregister_code(KC_RSFT); + tap(KC_SLSH); // Arm + process_unicode((0x00AF|QK_UNICODE), record); // Hand + } + return false; + break; + #endif + case FACE: // (o_O) + if(record->event.pressed){ + register_code(KC_RSFT); + tap(KC_LPRN); + unregister_code(KC_RSFT); + tap(KC_O); + register_code(KC_RSFT); + tap(KC_UNDS); + tap(KC_O); + tap(KC_RPRN); + unregister_code(KC_RSFT); + } + return false; + break; + #ifdef TAP_DANCE_ENABLE + case TappyR: + if(record->event.pressed){ + if(timer_elapsed32(Rtimer) > 1052){ + Rstate = 0; + } + switch(Rstate){ + case 0: + Rtimer = timer_read32(); + Rstate++; + break; + case 1: + Rtimes[0] = timer_elapsed32(Rtimer); + Rtimer = timer_read32(); + Rstate++; + break; + case 2: + Rtimes[1] = timer_elapsed32(Rtimer); + Rtimer = timer_read32(); + Rstate++; + break; + case 3: + Rtimes[2] = timer_elapsed32(Rtimer); + Rstate = 0; + break; + } + if(Rstate == 0 && Lstate == 0) rhythm_parse(); + } + return false; + break; + case TappyL: + if(record->event.pressed){ + if(timer_elapsed32(Ltimer) > 1052){ + Lstate = 0; + } + switch(Lstate){ + case 0: + Ltimer = timer_read32(); + Lstate++; + break; + case 1: + Ltimes[0] = timer_elapsed32(Ltimer); + Ltimer = timer_read32(); + Lstate++; + break; + case 2: + Ltimes[1] = timer_elapsed32(Ltimer); + Lstate = 0; + break; + } + if(Rstate == 0 && Lstate == 0) rhythm_parse(); + } + return false; + break; + #endif + #endif + case RANDIG: + if (record->event.pressed) { + tap_random_base64(); + } + return false; + break; + } + return true; +}; + +#ifdef AUDIO_ENABLE +void matrix_init_user(void){ // Run once at startup + #ifdef AUDIO_ENABLE + _delay_ms(50); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); + #endif +} + +void play_goodbye_tone(void){ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); +} + +void shutdown_user(){ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void){ // Run when the music layer is turned on + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void music_off_user(void){ // Run when music is turned off + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); +} +#endif + +#endif From 4c0aa02b2e476a8f939586a0da2f28f2a44c83c3 Mon Sep 17 00:00:00 2001 From: Zach Nielsen Date: Thu, 10 Nov 2016 12:59:55 -0800 Subject: [PATCH 003/181] Missed some stuff. Added a song (stole it from reddit). --- keyboards/planck/keymaps/zach/Makefile | 2 +- keyboards/planck/keymaps/zach/config.h | 3 + .../keymaps/zach/zach_common_functions.c | 61 +------------------ keyboards/preonic/keymaps/zach/Makefile | 2 +- .../keymaps/zach/zach_common_functions.c | 61 +------------------ quantum/audio/song_list.h | 12 ++++ 6 files changed, 19 insertions(+), 122 deletions(-) diff --git a/keyboards/planck/keymaps/zach/Makefile b/keyboards/planck/keymaps/zach/Makefile index b0009147ac..977f1a9013 100644 --- a/keyboards/planck/keymaps/zach/Makefile +++ b/keyboards/planck/keymaps/zach/Makefile @@ -16,7 +16,7 @@ USB_6KRO_ENABLE = no # 6key Rollover BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 -VARIABLE_TRACE = no # Debug changes to variable values +#VARIABLE_TRACE = no # Debug changes to variable values UNICODE_ENABLE = yes # Unicode UNICODEMAP_ENABLE = yes # Enable extended unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID diff --git a/keyboards/planck/keymaps/zach/config.h b/keyboards/planck/keymaps/zach/config.h index 1be800545a..7deb9ebfe8 100644 --- a/keyboards/planck/keymaps/zach/config.h +++ b/keyboards/planck/keymaps/zach/config.h @@ -53,8 +53,10 @@ along with this program. If not, see . /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ //#define LOCKING_SUPPORT_ENABLE +#undef LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ //#define LOCKING_RESYNC_ENABLE +#undef LOCKING_RESYNC_ENABLE /* key combination for command */ #define IS_COMMAND() ( \ @@ -70,6 +72,7 @@ along with this program. If not, see . //#define NO_DEBUG /* disable print */ //#define NO_PRINT +#undef NO_PRINT /* disable action features */ //#define NO_ACTION_LAYER diff --git a/keyboards/planck/keymaps/zach/zach_common_functions.c b/keyboards/planck/keymaps/zach/zach_common_functions.c index f01929f5d7..7d14dcf3f0 100644 --- a/keyboards/planck/keymaps/zach/zach_common_functions.c +++ b/keyboards/planck/keymaps/zach/zach_common_functions.c @@ -3,7 +3,6 @@ #include "eeconfig.h" #include "action_layer.h" #include "keymap_colemak.h" -#include "extra_functions.c" extern keymap_config_t keymap_config; // Fillers to make layering more clear @@ -249,7 +248,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; - #ifndef TAP_DANCE_ENABLE case RAISE: if(record->event.pressed){ layer_on(_RAISE); @@ -270,7 +268,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; - #endif case SHFT_CAP: if(record->event.pressed){ key_timer = timer_read(); // if the key is being pressed, we start the timer. @@ -441,62 +438,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; - #ifdef TAP_DANCE_ENABLE - case TappyR: - if(record->event.pressed){ - if(timer_elapsed32(Rtimer) > 1052){ - Rstate = 0; - } - switch(Rstate){ - case 0: - Rtimer = timer_read32(); - Rstate++; - break; - case 1: - Rtimes[0] = timer_elapsed32(Rtimer); - Rtimer = timer_read32(); - Rstate++; - break; - case 2: - Rtimes[1] = timer_elapsed32(Rtimer); - Rtimer = timer_read32(); - Rstate++; - break; - case 3: - Rtimes[2] = timer_elapsed32(Rtimer); - Rstate = 0; - break; - } - if(Rstate == 0 && Lstate == 0) rhythm_parse(); - } - return false; - break; - case TappyL: - if(record->event.pressed){ - if(timer_elapsed32(Ltimer) > 1052){ - Lstate = 0; - } - switch(Lstate){ - case 0: - Ltimer = timer_read32(); - Lstate++; - break; - case 1: - Ltimes[0] = timer_elapsed32(Ltimer); - Ltimer = timer_read32(); - Lstate++; - break; - case 2: - Ltimes[1] = timer_elapsed32(Ltimer); - Lstate = 0; - break; - } - if(Rstate == 0 && Lstate == 0) rhythm_parse(); - } - return false; - break; - #endif - #endif case RANDIG: if (record->event.pressed) { tap_random_base64(); @@ -507,7 +448,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; }; -#ifdef AUDIO_ENABLE void matrix_init_user(void){ // Run once at startup #ifdef AUDIO_ENABLE _delay_ms(50); // gets rid of tick @@ -515,6 +455,7 @@ void matrix_init_user(void){ // Run once at startup #endif } +#ifdef AUDIO_ENABLE void play_goodbye_tone(void){ PLAY_NOTE_ARRAY(tone_goodbye, false, 0); _delay_ms(150); diff --git a/keyboards/preonic/keymaps/zach/Makefile b/keyboards/preonic/keymaps/zach/Makefile index bd49d142c9..f0a84abac4 100644 --- a/keyboards/preonic/keymaps/zach/Makefile +++ b/keyboards/preonic/keymaps/zach/Makefile @@ -16,7 +16,7 @@ USB_6KRO_ENABLE = no # 6key Rollover BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 -VARIABLE_TRACE = no # Debug changes to variable values +#VARIABLE_TRACE = no # Debug changes to variable values UNICODE_ENABLE = yes # Unicode UNICODEMAP_ENABLE = no # Enable extended unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID diff --git a/keyboards/preonic/keymaps/zach/zach_common_functions.c b/keyboards/preonic/keymaps/zach/zach_common_functions.c index f01929f5d7..7d14dcf3f0 100644 --- a/keyboards/preonic/keymaps/zach/zach_common_functions.c +++ b/keyboards/preonic/keymaps/zach/zach_common_functions.c @@ -3,7 +3,6 @@ #include "eeconfig.h" #include "action_layer.h" #include "keymap_colemak.h" -#include "extra_functions.c" extern keymap_config_t keymap_config; // Fillers to make layering more clear @@ -249,7 +248,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; - #ifndef TAP_DANCE_ENABLE case RAISE: if(record->event.pressed){ layer_on(_RAISE); @@ -270,7 +268,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; - #endif case SHFT_CAP: if(record->event.pressed){ key_timer = timer_read(); // if the key is being pressed, we start the timer. @@ -441,62 +438,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; - #ifdef TAP_DANCE_ENABLE - case TappyR: - if(record->event.pressed){ - if(timer_elapsed32(Rtimer) > 1052){ - Rstate = 0; - } - switch(Rstate){ - case 0: - Rtimer = timer_read32(); - Rstate++; - break; - case 1: - Rtimes[0] = timer_elapsed32(Rtimer); - Rtimer = timer_read32(); - Rstate++; - break; - case 2: - Rtimes[1] = timer_elapsed32(Rtimer); - Rtimer = timer_read32(); - Rstate++; - break; - case 3: - Rtimes[2] = timer_elapsed32(Rtimer); - Rstate = 0; - break; - } - if(Rstate == 0 && Lstate == 0) rhythm_parse(); - } - return false; - break; - case TappyL: - if(record->event.pressed){ - if(timer_elapsed32(Ltimer) > 1052){ - Lstate = 0; - } - switch(Lstate){ - case 0: - Ltimer = timer_read32(); - Lstate++; - break; - case 1: - Ltimes[0] = timer_elapsed32(Ltimer); - Ltimer = timer_read32(); - Lstate++; - break; - case 2: - Ltimes[1] = timer_elapsed32(Ltimer); - Lstate = 0; - break; - } - if(Rstate == 0 && Lstate == 0) rhythm_parse(); - } - return false; - break; - #endif - #endif case RANDIG: if (record->event.pressed) { tap_random_base64(); @@ -507,7 +448,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; }; -#ifdef AUDIO_ENABLE void matrix_init_user(void){ // Run once at startup #ifdef AUDIO_ENABLE _delay_ms(50); // gets rid of tick @@ -515,6 +455,7 @@ void matrix_init_user(void){ // Run once at startup #endif } +#ifdef AUDIO_ENABLE void play_goodbye_tone(void){ PLAY_NOTE_ARRAY(tone_goodbye, false, 0); _delay_ms(150); diff --git a/quantum/audio/song_list.h b/quantum/audio/song_list.h index 8022ca6729..623f24f324 100644 --- a/quantum/audio/song_list.h +++ b/quantum/audio/song_list.h @@ -3,6 +3,10 @@ #ifndef SONG_LIST_H #define SONG_LIST_H +#define COIN_SOUND \ + E__NOTE(_A5 ),\ + HD_NOTE(_E6 ), + #define ODE_TO_JOY \ Q__NOTE(_E4), Q__NOTE(_E4), Q__NOTE(_F4), Q__NOTE(_G4), \ Q__NOTE(_G4), Q__NOTE(_F4), Q__NOTE(_E4), Q__NOTE(_D4), \ @@ -122,4 +126,12 @@ E__NOTE(_E5), \ E__NOTE(_D5), +#define UNICODE_WINDOWS \ + E__NOTE(_B5), \ + S__NOTE(_E6), + +#define UNICODE_LINUX \ + E__NOTE(_E6), \ + S__NOTE(_B5), + #endif From f388bb5bdacb39a5309ca7594940184bbf35e84b Mon Sep 17 00:00:00 2001 From: nielsenz Date: Thu, 10 Nov 2016 13:39:46 -0800 Subject: [PATCH 004/181] Removed some common functions from my keymap --- keyboards/planck/keymaps/zach/keymap.c | 8 ++++---- keyboards/planck/keymaps/zach/zach_common_functions.c | 9 --------- keyboards/preonic/keymaps/zach/keymap.c | 4 ++-- keyboards/preonic/keymaps/zach/zach_common_functions.c | 9 --------- 4 files changed, 6 insertions(+), 24 deletions(-) diff --git a/keyboards/planck/keymaps/zach/keymap.c b/keyboards/planck/keymaps/zach/keymap.c index d3cde5bb9d..710477df54 100644 --- a/keyboards/planck/keymaps/zach/keymap.c +++ b/keyboards/planck/keymaps/zach/keymap.c @@ -33,16 +33,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }, [_ADJUST] = { /* ADJUST - Macros, Layer Switching, Function Keys */ - {UNIWIN, Sil_Usr, Sil_Pas, PENGY, DUCK, KC_INS, KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX}, - {UNILIN, UltiU, UltiP, RANDIG, RANDIG, SWCOLE, COLEMAK, KC_F5, KC_F6, KC_F7, KC_F8, XXXXXXX}, + {UNIWIN, XXXXXXX, XXXXXXX, PENGY, DUCK, KC_INS, KC_NLCK, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX}, + {UNILIN, XXXXXXX, XXXXXXX, RANDIG, RANDIG, SWCOLE, COLEMAK, KC_F5, KC_F6, KC_F7, KC_F8, XXXXXXX}, {_______, CADKEY, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX}, {_______, _______, _______, _______, _______, RESET, RESET, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX} }, [_UNICODES] = { /* UNICODES - Extra layer for unicode stuff */ - {_______, TFLIP, XXXXXXX, FINGER, IBANG, roman7, XXXXXXX, XXXXXXX, ROMAN7, TappyL, TappyR, _______}, + {_______, TFLIP, XXXXXXX, XXXXXXX, IBANG, roman7, XXXXXXX, XXXXXXX, ROMAN7, XXXXXXX, XXXXXXX, _______}, {KC_DEL, TPUT, FACE, DISFACE, SHRUG, roman4, roman5, roman6, ROMAN4, ROMAN5, ROMAN6, _______}, - {XXXXXXX, PENIS, BOOBS, LAROW, RAROW, roman1, roman2, roman3, ROMAN1, ROMAN2, ROMAN3, XXXXXXX}, + {XXXXXXX, XXXXXXX, XXXXXXX, LAROW, RAROW, roman1, roman2, roman3, ROMAN1, ROMAN2, ROMAN3, XXXXXXX}, {_______, _______, _______, _______, _______, KC_SPC, KC_SPC, _______, _______, _______, _______, _______} } }; diff --git a/keyboards/planck/keymaps/zach/zach_common_functions.c b/keyboards/planck/keymaps/zach/zach_common_functions.c index 7d14dcf3f0..1f907e6cbc 100644 --- a/keyboards/planck/keymaps/zach/zach_common_functions.c +++ b/keyboards/planck/keymaps/zach/zach_common_functions.c @@ -45,16 +45,7 @@ enum my_keycodes{ TFLIP, TPUT, SHRUG, - PENIS, - BOOBS, - Sil_Pas, - Sil_Usr, - UltiU, - UltiP, - TappyR, - TappyL, RANDIG, - FINGER, // Tap_Dance nums RAI = 0, LOW, diff --git a/keyboards/preonic/keymaps/zach/keymap.c b/keyboards/preonic/keymaps/zach/keymap.c index 423ca4b868..6ce37840b9 100644 --- a/keyboards/preonic/keymaps/zach/keymap.c +++ b/keyboards/preonic/keymaps/zach/keymap.c @@ -45,10 +45,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }, [_UNICODES] = { /* UNICODES - Extra layer for unicode stuff */ - {_______, XXXXXXX, XXXXXXX, FINGER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______}, + {_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______}, {_______, TFLIP, XXXXXXX, XXXXXXX, IBANG, roman7, XXXXXXX, XXXXXXX, ROMAN7, XXXXXXX, XXXXXXX, _______}, {KC_DEL, TPUT, FACE, DISFACE, SHRUG, roman4, roman5, roman6, ROMAN4, ROMAN5, ROMAN6, _______}, - {XXXXXXX, PENIS, BOOBS, LAROW, RAROW, roman1, roman2, roman3, ROMAN1, ROMAN2, ROMAN3, XXXXXXX}, + {XXXXXXX, XXXXXXX, XXXXXXX, LAROW, RAROW, roman1, roman2, roman3, ROMAN1, ROMAN2, ROMAN3, XXXXXXX}, {_______, _______, _______, _______, _______, KC_SPC, KC_SPC, _______, _______, _______, _______, _______} } }; diff --git a/keyboards/preonic/keymaps/zach/zach_common_functions.c b/keyboards/preonic/keymaps/zach/zach_common_functions.c index 7d14dcf3f0..1f907e6cbc 100644 --- a/keyboards/preonic/keymaps/zach/zach_common_functions.c +++ b/keyboards/preonic/keymaps/zach/zach_common_functions.c @@ -45,16 +45,7 @@ enum my_keycodes{ TFLIP, TPUT, SHRUG, - PENIS, - BOOBS, - Sil_Pas, - Sil_Usr, - UltiU, - UltiP, - TappyR, - TappyL, RANDIG, - FINGER, // Tap_Dance nums RAI = 0, LOW, From 80c5ada3394c5ad8087df00ef878eb2cbcd87d70 Mon Sep 17 00:00:00 2001 From: Zach Nielsen Date: Thu, 10 Nov 2016 13:47:07 -0800 Subject: [PATCH 005/181] Missed removing a function --- .../keymaps/zach/zach_common_functions.c | 23 ------------------- .../keymaps/zach/zach_common_functions.c | 23 ------------------- 2 files changed, 46 deletions(-) diff --git a/keyboards/planck/keymaps/zach/zach_common_functions.c b/keyboards/planck/keymaps/zach/zach_common_functions.c index 1f907e6cbc..b77f2b2418 100644 --- a/keyboards/planck/keymaps/zach/zach_common_functions.c +++ b/keyboards/planck/keymaps/zach/zach_common_functions.c @@ -70,29 +70,6 @@ float unilin[][2] = SONG(UNICODE_LINUX); #ifdef TAP_DANCE_ENABLE #define TAPPING_TERM 200 -uint8_t Lstate = 0, Rstate = 0; -uint32_t Ltimer = 0, Rtimer = 0; -uint32_t Ltimes[3], Rtimes[4]; // Ratio of tap times should be about 1.335 (L/R) -void rhythm_parse(void){ - int L = Ltimes[0] + Ltimes[1] + Ltimes[2]; // Start to end time - int R = Rtimes[0] + Rtimes[1] + Rtimes[2] + Rtimes[3]; - if(abs(R-L) > 10){ - tap(KC_N); tap(KC_O); - return; - } else { - L = (L / 3)*100; // Average time per tap * 100 - R = (R / 4); - if(abs(abs(L/R)-133) > 1){ - tap(KC_N); tap(KC_O); - tap(KC_P); tap(KC_E); - return; - } else { - tap(KC_O); tap(KC_K); - return; - } - } -}; - void dance_raise_press(qk_tap_dance_state_t *state, void *user_data){// Called on each tap switch(state->count){ // Only turn the layer on once case 1: diff --git a/keyboards/preonic/keymaps/zach/zach_common_functions.c b/keyboards/preonic/keymaps/zach/zach_common_functions.c index 1f907e6cbc..b77f2b2418 100644 --- a/keyboards/preonic/keymaps/zach/zach_common_functions.c +++ b/keyboards/preonic/keymaps/zach/zach_common_functions.c @@ -70,29 +70,6 @@ float unilin[][2] = SONG(UNICODE_LINUX); #ifdef TAP_DANCE_ENABLE #define TAPPING_TERM 200 -uint8_t Lstate = 0, Rstate = 0; -uint32_t Ltimer = 0, Rtimer = 0; -uint32_t Ltimes[3], Rtimes[4]; // Ratio of tap times should be about 1.335 (L/R) -void rhythm_parse(void){ - int L = Ltimes[0] + Ltimes[1] + Ltimes[2]; // Start to end time - int R = Rtimes[0] + Rtimes[1] + Rtimes[2] + Rtimes[3]; - if(abs(R-L) > 10){ - tap(KC_N); tap(KC_O); - return; - } else { - L = (L / 3)*100; // Average time per tap * 100 - R = (R / 4); - if(abs(abs(L/R)-133) > 1){ - tap(KC_N); tap(KC_O); - tap(KC_P); tap(KC_E); - return; - } else { - tap(KC_O); tap(KC_K); - return; - } - } -}; - void dance_raise_press(qk_tap_dance_state_t *state, void *user_data){// Called on each tap switch(state->count){ // Only turn the layer on once case 1: From 18cc05e2f7d09f9faac37ee504bd111e70a52764 Mon Sep 17 00:00:00 2001 From: Rovanion Luckey Date: Tue, 24 Jan 2017 10:02:56 +0100 Subject: [PATCH 006/181] Added instructions for how to build and flash the firmware with teensy_cli. --- keyboards/ergodox/readme.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/keyboards/ergodox/readme.md b/keyboards/ergodox/readme.md index ca3eeba59b..d7eed8f435 100644 --- a/keyboards/ergodox/readme.md +++ b/keyboards/ergodox/readme.md @@ -1,6 +1,6 @@ # The Easy Way -If you have an ErgoDox EZ, the absolute easiest way for you to customize your firmware is using the [graphical configurator](http://configure.ergodox-ez.com), which uses QMK under the hood. +If you have an ErgoDox EZ, the absolute easiest way for you to customize your firmware is using the [graphical configurator](http://configure.ergodox-ez.com), which uses QMK under the hood. If you can find firmware someone else has made that does what you want, that is the easiest way to customize your ErgoDox. It requires no programming @@ -69,12 +69,13 @@ files. Check them out with: The Ez uses the [Teensy Loader](https://www.pjrc.com/teensy/loader.html). -Linux users need to modify udev rules as described on the Teensy Linux page. -Some distributions provide a binary, maybe called `teensy-loader-cli`). +Linux users need to modify udev rules as described on the Teensy Linux page (which page?). +Some distributions provide a binary, maybe called `teensy-loader-cli`. To flash the firmware: - - Build the firmware with `make keymapname`, for example `make default` + - Build the firmware with `make keymapname`, for example `make default` + - This will result in a hex file called `ergodox_ez_keymapname.hex`, e.g. `ergodox_ez_default.hex` @@ -87,6 +88,15 @@ To flash the firmware: - Click the button in the Teensy app to download the firmware. +To flash with ´teensy-loader-cli´: + + - Build the firmware with `make keymapname`, for example `make default` + + - Run ´teensy_loader_cli --mcu=atmega32u4 -w ergodox_ez_.hex´ + + - Press the Reset button by inserting a paperclip gently into the reset hole + in the top right corder. + ## ErgoDox Infinity The Infinity is two completely independent keyboards, and needs to be flashed From d1fb51976aeef8eeea5975c5bf75b6b1aa649826 Mon Sep 17 00:00:00 2001 From: Ole Anders Date: Mon, 6 Feb 2017 11:53:48 +0100 Subject: [PATCH 007/181] Added new keymap to the Satan GH60 keyboard. Added new keymap `Admiral Strokers` to the Satan keyboard. This is an ISO based layout with tap for brackets/ curly on shft and ctl keys. Furthermore, there is added arrows and media/volume/special/f-keys layer on the TAB button when you hold. --- .../satan/keymaps/admiralStrokers/Makefile | 26 +++ .../satan/keymaps/admiralStrokers/config.h | 96 +++++++++ .../satan/keymaps/admiralStrokers/keymap.c | 189 ++++++++++++++++++ .../satan/keymaps/admiralStrokers/readme.md | 13 ++ 4 files changed, 324 insertions(+) create mode 100644 keyboards/satan/keymaps/admiralStrokers/Makefile create mode 100644 keyboards/satan/keymaps/admiralStrokers/config.h create mode 100644 keyboards/satan/keymaps/admiralStrokers/keymap.c create mode 100644 keyboards/satan/keymaps/admiralStrokers/readme.md diff --git a/keyboards/satan/keymaps/admiralStrokers/Makefile b/keyboards/satan/keymaps/admiralStrokers/Makefile new file mode 100644 index 0000000000..18d2280d69 --- /dev/null +++ b/keyboards/satan/keymaps/admiralStrokers/Makefile @@ -0,0 +1,26 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Enables your LED to breathe while your computer is sleeping. +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODEMAP_ENABLE = no # This allows sending unicode symbols using X() in your keymap. +UNICODE_ENABLE = no # Unicode +UCIS_ENABLE = no # Keep in mind that not all will work (See WinCompose for details on Windows). +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +VARIABLE_TRACE = no # Use this to debug changes to variable values +API_SYSEX_ENABLE = no # This enables using the Quantum SYSEX API to send strings +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/satan/keymaps/admiralStrokers/config.h b/keyboards/satan/keymaps/admiralStrokers/config.h new file mode 100644 index 0000000000..d0338fb7e9 --- /dev/null +++ b/keyboards/satan/keymaps/admiralStrokers/config.h @@ -0,0 +1,96 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H_ADMSTROK +#define CONFIG_H_ADMSTROK + +#include "config_common.h" +#include "../../config.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0003 +#define MANUFACTURER SATAN +#define PRODUCT GH60 +#define DESCRIPTION QMK keyboard firmware for Satan GH60 with WS2812 support + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +// ROWS: Top to bottom, COLS: Left to right + +#define MATRIX_ROW_PINS { D0, D1, D2, D3, D5 } +#define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B7, D4, B1, B0, B5, B4, D7, D6, B3 } +#define UNUSED_PINS + +#define BACKLIGHT_PIN B6 + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* Backlight configuration */ +#define BACKLIGHT_LEVELS 4 + +/* Underlight configuration */ +#define RGB_DI_PIN E2 +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 8 // Number of LEDs +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 + +#define DISABLE_SPACE_CADET_ROLLOVER + + + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/satan/keymaps/admiralStrokers/keymap.c b/keyboards/satan/keymaps/admiralStrokers/keymap.c new file mode 100644 index 0000000000..487deb0862 --- /dev/null +++ b/keyboards/satan/keymaps/admiralStrokers/keymap.c @@ -0,0 +1,189 @@ +#include "satan.h" +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +// general keydefs + #define norm 0 // Default layer + #define elev 1 // Layer directional keys + #define supr 2 // F-keys and mediakeys + #define spac 3 + #define FNO1 4 // + #define FNO2 5 // + #define FNO3 6 // + #define MAC0 M(0) // + #define MAC1 M(1) // + #define MAC2 M(2) // + #define MAC3 M(3) // + #define MAC4 M(4) // + #define MAC5 M(5) // + #define MAC6 M(6) // + #define MAC7 M(7) // + #define MAC8 M(8) // + #define MAC9 M(9) // + #define GRAV KC_GRV // + #define MEDI F(FNO1)// + +// General shortenings + #define ESCA KC_ESC + #define MINS KC_MINS + #define EQUL KC_EQL + #define BSPC KC_BSPC + #define DELE KC_DEL + #define LBRC KC_LBRC + #define RBRC KC_RBRC + #define ALTR KC_RALT + #define SCLN KC_SCLN + #define QUOT KC_QUOT + #define NUHS KC_NUHS + #define ENTE KC_ENT + #define NUBS KC_NUBS // Less/ greater sign + #define COMM KC_COMM // Comma + #define FSTO KC_DOT // Full stop + #define SLSH KC_SLSH + #define ALTL KC_LALT + #define GUIL KC_LGUI + #define GUIR KC_RGUI + #define MENO KC_MENU +// The F-row/layer: + #define FK01 KC_F1 + #define FK02 KC_F2 + #define FK03 KC_F3 + #define FK04 KC_F4 + #define FK05 KC_F5 + #define FK06 KC_F6 + #define FK07 KC_F7 + #define FK08 KC_F8 + #define FK09 KC_F9 + #define FK10 KC_F10 + #define FK11 KC_F11 + #define FK12 KC_F12 + #define FK13 KC_F13 + #define FK14 KC_F14 +// Special Actions and Media Keys + #define INSE KC_INS // Insert here + #define HOME KC_HOME // Go to beginning of line + #define ENDI KC_END // go to end of line + #define PSCR KC_PSCR // Print Screen + #define SLCK KC_SLCK // go to end of line + #define PGDN KC_PGDN // go to end of line + #define PGUP KC_PGUP // go to end of line + #define PLPS KC_MPLY // Play/Pause + #define PAUS KC_PAUS // Pause button + #define MUTE KC_MUTE // Mute sound + #define VOLU KC_VOLU // Volume increase + #define VOLD KC_VOLD // Volume decrease + #define MNXT KC_MNXT // next track + #define MPRV KC_MPRV // prev track + #define MSTP KC_MSTP // stop playing + #define MSEL KC_MSEL // Select media (Start playing it) + #define MAIL KC_MAIL // Open default mail app + #define CALC KC_CALC // Open default calculator app + #define MYCM KC_MYCM // Open default file manager + //#define LILO KC_XXXXXX // Reserved for later + //#define LIHI KC_XXXXXX // Reserved for later + + +// dual-role shortcuts + #define DUTB LT(elev, KC_TAB) // `tabs` layer on hold and tab on tap + #define DUSP LT(spac, KC_SPACE) // `spce` layer on hold and space on tap + #define LOCK LGUI(KC_L) // lock computer (win) + +// Space Admiral Strokers + #define SADL MAC0 // Hold for lshift and { on tap + #define SADR MAC1 // Hold for rshift and } on tap + #define CADL MAC2 // Hold for lctrl and [ on tap + #define CADR MAC3 // Hold for rctrl and ] on tap + +// arrow cluster duality bottom right corner + #define ARLF ALT_T(KC_LEFT) // Left arrow + #define ARRT CTL_T(KC_RIGHT)// Right arrow + #define ARUP SFT_T(KC_UP) // Up arrow + #define ARDN GUI_T(KC_DOWN) // Down arrow + +// brackets + #define NOCL RALT(KC_7) // [ + #define NOCR RALT(KC_0) // ] + #define NOPL LSFT(KC_8) // ( + #define NOPR LSFT(KC_9) // ) + #define NOAL KC_NUBS // < + #define NOAR LSFT(KC_NUBS) // > + #define NOBL RALT(KC_8) // [ + #define NOBR RALT(KC_9) // ] + +// increase readability + #define XXXX KC_TRNS + #define DEAD KC_NO + #define SCAN KC_TRNS // Scandinavian keys, the Row 5 key 5 is actually Row 1 key 15 on the PCB + +[ norm ] = KEYMAP( // Normal scandinavian mapping (danish has QUOT and SCLN wapped) + GRAV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, MINS, EQUL, BSPC, DELE,\ + DUTB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, LBRC, RBRC, DEAD,\ + ALTR, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, SCLN, QUOT, NUHS, ENTE,\ + SADL, NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, COMM, FSTO, SLSH, SADR, DEAD,\ + CADL, ALTL, GUIL, DUSP, GUIR, MEDI, MENO, CADR), + +[ elev ] = KEYMAP( // The f-Row (with f13-14), Special keys and media keys + LOCK, FK01, FK02, FK03, FK04, FK05, FK06, FK07, FK08, FK09, FK10, FK11, FK12, FK13, FK14,\ + XXXX, XXXX, XXXX, XXXX, MAIL, XXXX, XXXX, HOME, INSE, PSCR, SLCK, PAUS, PGUP, XXXX,\ + XXXX, XXXX, XXXX, XXXX, MYCM, XXXX, XXXX, MPRV, PAUS, MNXT, XXXX, XXXX, PGDN, ENDI,\ + XXXX, XXXX, XXXX, XXXX, CALC, XXXX, XXXX, XXXX, MUTE, VOLD, VOLU, XXXX, ARUP, DEAD,\ + XXXX, XXXX, XXXX, PLPS, XXXX, ARLF, ARDN, ARRT), + +[ spac ] = KEYMAP( // The space controls (by pressing space) + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX,\ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX,\ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX,\ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, DEAD,\ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX), + +[ supr ] = KEYMAP( // Additional layer for later use. + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX,\ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX,\ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX,\ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, DEAD,\ + XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX), +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function + static uint16_t key_timer; + switch(id) { + case 0: //MAC0 - Hold for lshift and { on tap + if (record->event.pressed) { + key_timer = timer_read(); + return MACRO(D(LSFT), END ); + } else { + return (timer_elapsed(key_timer) < 150) ? MACRO(U(LSFT),D(RALT),T(7),U(RALT),END): MACRO(U(LSFT),END); + }; break; + case 1: //MAC1 - Hold for rshift and } on tap + if (record->event.pressed) { + key_timer = timer_read(); + return MACRO(D(RSFT), END ); + } else { + return (timer_elapsed(key_timer) < 150) ? MACRO(U(RSFT),D(RALT),T(0),U(RALT),END): MACRO(U(RSFT),END); + }; break; + case 2: //MAC2 - Hold for lctrl and [ on tap + if (record->event.pressed) { + key_timer = timer_read(); + return MACRO(D(LCTL), END ); + } else {return (timer_elapsed(key_timer) < 150) ? MACRO(U(LCTL),D(RALT),T(8),U(RALT),END):MACRO(U(LCTL),END); + }; break; + case 3: //MAC3 - Hold for rctrl and ] on tap + if (record->event.pressed) { + key_timer = timer_read(); + return MACRO(D(RCTL), END ); + } else { + return (timer_elapsed(key_timer) < 150) ? MACRO(U(RCTL),D(RALT),T(9),U(RALT),END):MACRO(U(RCTL),END); + }; break; + case 4: //MAC4 + if (record->event.pressed) { } else { }; break; + case 5: //MAC5 + if (record->event.pressed) { } else { }; break; + case 6: //MAC6 + if (record->event.pressed) { } else { }; break; + } return MACRO_NONE; +}; +/* + Later use: + void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } + enum function_id { }; + const uint16_t PROGMEM fn_actions[] = { }; + +*/ diff --git a/keyboards/satan/keymaps/admiralStrokers/readme.md b/keyboards/satan/keymaps/admiralStrokers/readme.md new file mode 100644 index 0000000000..9b30caf349 --- /dev/null +++ b/keyboards/satan/keymaps/admiralStrokers/readme.md @@ -0,0 +1,13 @@ +# Admiral Strokers keymap +## For the Satan GH60 PCB +The Admiral STN60 is a layout for users of the satan GH60, optimized with some nice features such as mod tap for brackets (Similar to Space Cadett), space mod for F-row/ layer with easy to access media and control keys. The layout below is just as an example and is ISO based, ANSI and JIS layouts will be included later. + +`````` +[ _tmp ] = KEYMAP( // Copy this to get started. SCAN is scandinavian layout specific. +XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX,\ +XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, DEAD,\ +XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, SCAN, XXXX,\ +XXXX, SCAN, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, DEAD,\ +XXXX, XXXX, XXXX, XXXX, SCAN, XXXX, XXXX, XXXX, XXXX),\ + +``` From 5ac0e6e6aee64c9b8fade79aaf22bc839e2c6b47 Mon Sep 17 00:00:00 2001 From: milestogo Date: Thu, 9 Feb 2017 23:23:39 -0800 Subject: [PATCH 008/181] dumber sculpt build --- .../MS-sculpt-mobile/MS-sculpt-mobile.c | 1 + .../MS-sculpt-mobile/MS-sculpt-mobile.h | 48 +++++++ keyboards/handwired/MS-sculpt-mobile/Makefile | 3 + keyboards/handwired/MS-sculpt-mobile/config.h | 99 +++++++++++++ .../MS-sculpt-mobile/keymaps/default/Makefile | 21 +++ .../MS-sculpt-mobile/keymaps/default/config.h | 8 ++ .../MS-sculpt-mobile/keymaps/default/keymap.c | 64 +++++++++ .../keymaps/default/readme.md | 1 + .../keymaps/milestogo/Makefile | 21 +++ .../keymaps/milestogo/config.h | 8 ++ .../keymaps/milestogo/keymap.c | 132 ++++++++++++++++++ .../keymaps/milestogo/readme.md | 1 + .../handwired/MS-sculpt-mobile/readme.md | 58 ++++++++ keyboards/handwired/MS-sculpt-mobile/rules.mk | 43 ++++++ 14 files changed, 508 insertions(+) create mode 100644 keyboards/handwired/MS-sculpt-mobile/MS-sculpt-mobile.c create mode 100644 keyboards/handwired/MS-sculpt-mobile/MS-sculpt-mobile.h create mode 100644 keyboards/handwired/MS-sculpt-mobile/Makefile create mode 100644 keyboards/handwired/MS-sculpt-mobile/config.h create mode 100644 keyboards/handwired/MS-sculpt-mobile/keymaps/default/Makefile create mode 100644 keyboards/handwired/MS-sculpt-mobile/keymaps/default/config.h create mode 100644 keyboards/handwired/MS-sculpt-mobile/keymaps/default/keymap.c create mode 100644 keyboards/handwired/MS-sculpt-mobile/keymaps/default/readme.md create mode 100644 keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/Makefile create mode 100644 keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h create mode 100644 keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c create mode 100644 keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/readme.md create mode 100644 keyboards/handwired/MS-sculpt-mobile/readme.md create mode 100644 keyboards/handwired/MS-sculpt-mobile/rules.mk diff --git a/keyboards/handwired/MS-sculpt-mobile/MS-sculpt-mobile.c b/keyboards/handwired/MS-sculpt-mobile/MS-sculpt-mobile.c new file mode 100644 index 0000000000..4c735a6c29 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/MS-sculpt-mobile.c @@ -0,0 +1 @@ +#include "MS-sculpt-mobile.h" diff --git a/keyboards/handwired/MS-sculpt-mobile/MS-sculpt-mobile.h b/keyboards/handwired/MS-sculpt-mobile/MS-sculpt-mobile.h new file mode 100644 index 0000000000..1583dea6e8 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/MS-sculpt-mobile.h @@ -0,0 +1,48 @@ +#ifndef MICROSOFT_SCULPT_MOBILE_H +#define MICROSOFT_SCULPT_MOBILE_H + +#include "quantum.h" + + +#define KEYMAP( \ + k7Q, k6O, k6P, k6Q, k5O, k5P, k5Q, k7A, k7B, k7C, k7D, k7E, k7F, k1O, k1K, k1L, \ + k5A, k5K, k5L, k5M, k5N, k5H, k5I, k2A, k2B, k2C, k2D, k5B, k5C, k5J, k2E, \ + k6R, k6D, k6E, k6F, k7I, k7J, k4A, k4B, k4C, k4D, k3A, k3B, k3C, k3D, \ + k0J, k6A, k6B, k6C, k7H, k1A, k1B, k5D, k5E, k5F, k5G, k1C, k7P, k2G, \ + k2P, k7K, k7L, k7M, k7O, k0A, k0B, k0C, k0D, k0E, k0F, k2L, k6G, k1P,\ + k1Q, k4N, k3O,k6N, k3K, k0R, k1M, k6H, k6I, k6J \ +) \ +{ \ + {k0A, k0B, k0C, k0D, k0E, k0F, KC_NO, KC_NO, KC_NO, k0J, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,KC_NO, KC_NO, k0R},\ + {k1A, k1B, k1C, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, k1K, k1L, k1M, KC_NO, k1O, k1P, k1Q, KC_NO},\ + {k2A, k2B, k2C, k2D, k2E, KC_NO, k2G, KC_NO, KC_NO, KC_NO, KC_NO, k2L, KC_NO, KC_NO, KC_NO, k2P, KC_NO, KC_NO},\ + {k3A, k3B, k3C, k3D, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, k3K, KC_NO, KC_NO, KC_NO, k3O, KC_NO, KC_NO, KC_NO},\ + {k4A, k4B, k4C, k4D, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, k4N, KC_NO,KC_NO, KC_NO, KC_NO},\ + {k5A, k5B, k5C, k5D, k5E, k5F, k5G, k5H, k5I, k5J, k5K, k5L, k5M, k5N, k5O, k5P, k5Q, KC_NO },\ + {k6A, k6B, k6C, k6D, k6E, k6F, k6G, k6H, k6I, k6J, KC_NO, KC_NO, KC_NO, k6N, k6O, k6P, k6Q, k6R},\ + {k7A, k7B, k7C, k7D, k7E, k7F, KC_NO, k7H, k7I, k7J, k7K, k7L, k7M, KC_NO, k7O, k7P, k7Q, KC_NO},\ +} + + +#define MATRIX_TESTING_KEYMAP( \ + k0A, k0B, k0C, k0D, k0E, k0F, k0G, k0H, k0I, k0, k0J, k0K, k0L, k0M, k0N, k0O, k0P, k0Q,\ + k1A, k1B, k1C, k1D, k1E, k1F, k1G, k1H, k1I, k1, k1J, k1K, k1L, k1M, k1N, k1O, k1P, k1Q,\ + k2A, k2B, k2C, k2D, k2E, k2F, k2G, k2H, k2I, k2, k2J, k2K, k2L, k2M, k2N, k2O, k2P, k2Q,\ + k3A, k3B, k3C, k3D, k3E, k3F, k3G, k3H, k3I, k3, k3J, k3K, k3L, k3M, k3N, k3O, k3P, k3Q,\ + k4A, k4B, k4C, k4D, k4E, k4F, k4G, k4H, k4I, k4, k4J, k4K, k4L, k4M, k4N, k4O, k4P, k4Q,\ + k5A, k5B, k5C, k5D, k5E, k5F, k5G, k5H, k5I, k5, k5J, k5K, k5L, k5M, k5N, k5O, k5P, k5Q,\ + k6A, k6B, k6C, k6D, k6E, k6F, k6G, k6H, k6I, k6, k6J, k6K, k6L, k6M, k6N, k6O, k6P, k6Q,\ + k7A, k7B, k7C, k7D, k7E, k7F, k7G, k7H, k7I, k7, k7J, k7K, k7L, k7M, k7N, k7O, k7P, k7Q\ +) \ +{ \ + {k0A, k0B, k0C, k0D, k0E, k0F, k0G, k0H, k0I, k0, k0J, k0K, k0L, k0M, k0N, k0O, k0P, k0Q},\ + {k1A, k1B, k1C, k1D, k1E, k1F, k1G, k1H, k1I, k1, k1J, k1K, k1L, k1M, k1N, k1O, k1P, k1Q},\ + {k2A, k2B, k2C, k2D, k2E, k2F, k2G, k2H, k2I, k2, k2J, k2K, k2L, k2M, k2N, k2O, k2P, k2Q},\ + {k3A, k3B, k3C, k3D, k3E, k3F, k3G, k3H, k3I, k3, k3J, k3K, k3L, k3M, k3N, k3O, k3P, k3Q},\ + {k4A, k4B, k4C, k4D, k4E, k4F, k4G, k4H, k4I, k4, k4J, k4K, k4L, k4M, k4N, k4O, k4P, k4Q},\ + {k5A, k5B, k5C, k5D, k5E, k5F, k5G, k5H, k5I, k5, k5J, k5K, k5L, k5M, k5N, k5O, k5P, k5Q},\ + {k6A, k6B, k6C, k6D, k6E, k6F, k6G, k6H, k6I, k6, k6J, k6K, k6L, k6M, k6N, k6O, k6P, k6Q},\ + {k7A, k7B, k7C, k7D, k7E, k7F, k7G, k7H, k7I, k7, k7J, k7K, k7L, k7M, k7N, k7O, k7P, k7Q},\ +} + +#endif diff --git a/keyboards/handwired/MS-sculpt-mobile/Makefile b/keyboards/handwired/MS-sculpt-mobile/Makefile new file mode 100644 index 0000000000..bd09e5885d --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif diff --git a/keyboards/handwired/MS-sculpt-mobile/config.h b/keyboards/handwired/MS-sculpt-mobile/config.h new file mode 100644 index 0000000000..1ac40f9964 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/config.h @@ -0,0 +1,99 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Microsoft+abit +#define PRODUCT sculpt mobile +#define DESCRIPTION 6000 + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 18 + +#ifdef ASTAR + + /*0 1 2 3 4 5 6 7 8 */ +#define MATRIX_ROW_PINS {D7, C6, D4, D0, D1, D3, D2, E2} +/* A B C D E F G H I J K L M N O P Q R */ +#define MATRIX_COL_PINS {B4, B5, E6, B7, B6, D6, C7, F7, F6, F4,F5, F1,F0, D5, B0, B1, B2, B3} + +#else + +/* 0 1 2 3 4 5 6 7 */ +#define MATRIX_ROW_PINS { F7,F6,F4,F5,F3,F2,F1,F0} +/* A B C D E F G H I J K L M N O P Q R */ +#define MATRIX_COL_PINS { B7, D0, D1, D2, D3, D4, D5, D6, D7, E0,E1,C1, C0, C3, C2, C5, C4,C6} +#define UNUSED_PINS { B6,B5,B4,B3,B2,B1,B0 } + + +#endif + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION ROW2COL + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/default/Makefile b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/Makefile new file mode 100644 index 0000000000..9d3df5964f --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/default/config.h b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/config.h new file mode 100644 index 0000000000..8893d122e0 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/config.h @@ -0,0 +1,8 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// place overrides here + +#endif diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/default/keymap.c b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/keymap.c new file mode 100644 index 0000000000..ab09dcdd1c --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/keymap.c @@ -0,0 +1,64 @@ +#include "MS-sculpt-mobile.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* +* +* |ESC | F1 | F2 | F3 | F4 | F5 | F6 | f7 | F8 | F9 | F10| F11| F12|Vol-|Vol+|Mute| +* -------------------------------------------------------------------------------' +* | ~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Bakspace| Del | +* -------------------------------------------------------------------------- +* | tab | q | w | e | r | t | y | u | i | o | p | [ | ] | \ | | +* -------------------------------------------------------------------------------' +* | caps | a | s | d | f | g | h | j | k | l | ; | ' | enter |PgUp| +* -------------------------------------------------------------------------------- +* |Lsft | z | x | c | v | b | n | m | , | . | / | Rsft| Up| PgDn| +* --------------------------------------------------------------------------------- +* |Lctl |Lgui |Lalt | Space |Ralt | FN | Rctl |Left|Down|Rght| +* --------------------------------------------------------------------------------- +*/ + +[0] = KEYMAP( \ + KC_ESC, 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_VOLD, KC_VOLU, KC_MUTE,\ + KC_GRAVE, KC_1, KC_2, KC_3 ,KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_DEL,\ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,\ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,\ + 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_UP, KC_PGDN,\ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, RSFT(KC_1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT +) + +}; +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; +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/default/readme.md b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/readme.md new file mode 100644 index 0000000000..e67ddc6fec --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for microsoft-sculpt-mobile diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/Makefile b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/Makefile new file mode 100644 index 0000000000..9d3df5964f --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h new file mode 100644 index 0000000000..8893d122e0 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h @@ -0,0 +1,8 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// place overrides here + +#endif diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c new file mode 100644 index 0000000000..a80d5beaad --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c @@ -0,0 +1,132 @@ +#include "MS-sculpt-mobile.h" + +#define _QWR 0 +#define _CDH 1 +#define _SYM 2 +#define _MOV 3 +#define _NUM 4 +#define _TRAN 9 + +// Shorter spacing +#define XXXX KC_NO +#define ____ KC_TRNS + +// Custom macros + +/* Fn Keys */ +#define TT_SYM MO(_SYM) +#define TO_CDH TG(_CDH) +#define TO_MOV MO(_MOV) +#define TT_NUM MO(_NUM) +#define SSFT ACTION_MODS_ONESHOT(MOD_LSFT) + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* QWERTY +* +* |ESC | F1 | F2 | F3 | F4 | F5 | F6 | f7 | F8 | F9 | F10| F11| F12|Vol-|Vol+|Mute| +* -------------------------------------------------------------------------------' +* | ~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Bakspace| Del | +* -------------------------------------------------------------------------- +* | tab | q | w | e | r | t | y | u | i | o | p | [ | ] | \ | | +* -------------------------------------------------------------------------------' +* | caps | a | s | d | f | g | h | j | k | l | ; | ' | enter |PgUp| +* -------------------------------------------------------------------------------- +* |Lsft | z | x | c | v | b | n | m | , | . | / | Rsft| Up| PgDn| +* --------------------------------------------------------------------------------- +* |Lctl |Lgui |Lalt | Space |Ralt | FN | Rctl |Left|Down|Rght| +* --------------------------------------------------------------------------------- +*/ + +[_QWR] = KEYMAP( \ + KC_ESC, 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_VOLD, KC_VOLU, TO_CDH,\ + KC_ESC, KC_1, KC_2, KC_3 ,KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_DEL,\ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,\ + TT_SYM, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,\ + 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_UP, KC_PGDN,\ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RGUI,TT_SYM,KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT +), + +[_CDH] = KEYMAP (\ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + KC_ESC, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, ____, ____, ____,\ + TO_MOV, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, ____,\ + KC_LSFT, KC_Z, KC_X, KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, ____, ____,\ + ____, ____, ____ , TT_SYM, ____, ____, ____, ____, ____, ____ + +), + +[_SYM] = KEYMAP (\ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, KC_CIRC, KC_LCBR, KC_RCBR,KC_AT, KC_PERC, ____, KC_LBRC,KC_LPRN,KC_RPRN,KC_UNDS, ____, ____, ____,\ + ____, KC_EXLM, KC_HASH, KC_0, KC_EQL, ____, KC_ASTR,KC_MINS,KC_1, KC_PLUS,KC_RBRC, KC_GRV, ____, ____,\ + ____, ____, ____, ____, KC_TILDE, KC_PIPE, KC_DLR, ____, ____, ____, ____, ____, ____, ____,\ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ +), + +[_MOV] = KEYMAP (\ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, RGUI(KC_TAB), ____, ____, RCTL(KC_B), ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, RCTL(KC_A), KC_S, RCTL(KC_K), RCTL(KC_E), ____, ____, KC_LEFT,KC_DOWN, KC_UP, KC_RIGHT, ____,____,____,\ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ +), + +[_TRAN] = KEYMAP (\ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ +) +}; + + +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; + + + case KC_N: + if(keyboard_report->mods & MOD_BIT(KC_LGUI) ) { + clear_keyboard_but_mods(); + register_code(KC_V); + } + break; + + + } + return MACRO_NONE; +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/readme.md b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/readme.md new file mode 100644 index 0000000000..96ee0e77a5 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/readme.md @@ -0,0 +1 @@ +# A more programmer oriented keymap for microsoft-sculpt-mobile diff --git a/keyboards/handwired/MS-sculpt-mobile/readme.md b/keyboards/handwired/MS-sculpt-mobile/readme.md new file mode 100644 index 0000000000..58029b50db --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/readme.md @@ -0,0 +1,58 @@ + +This is a way to take a Microsoft ergonomic bluetooth keyboard, and make it +into a hard-wired keyboard running QMK. + +The keyboard is known under several different names: +Mobile Bluetooth 5000, Mobile 6000, Sculpt mobile, and Asus rebranded + +I had a stack of them,since they're cheap on ebay, travel well, and are just ergo enough. + +The ribbon cable is 1mm pitch, which is hard to hand solder. I bought a cheap set of +"pitch adapter" boards https://www.amazon.com/Double-Sided-0-4mm-1-0-Adapter-60mmx38mm/dp/B00OK42118 + +Cut the original ribbon cable sockets off the bluetooth board using a razor, they're hard to desolder. +They're also allow the cable to be inserted on top or bottom. + +If I was going to do it again, I'd make the MCU connection come out the top of the keyboard +and avoid the wires dangling out the bottom. + +As I was debugging the matrix, I started to get random failures. In desparation I tried a second MCU, +but had the same problems. It turns out that the ribbon cable connections can get worn. Shave a +half millimeter off the end of the ribbon cable & the errors go away. + +My method for discovering the matrix was to set up a KEYMAP macro that included all pins. +See MATRIX_TESTING_KEYMAP if you need it. Then set up a keymap that has all printable symbols +in the first 4 rows. test each key & record output. Then switch the printable symbols to the +bottom 4 rows & repeat. This was enough to show the matrix. + + +The full original keymap for the sculpt is + A B C D E F G H ---> +0 b n m , . / +1 g h " +2 7 8 9 0 Del PgUp +3 p [ ] \ +4 y u i o +5 ~ - += j k l ; 5 +6 a s d q w e, Up left +7 F7 F8 F9 F10 F11 F12 f + +-----> I J K L M N O P Q R +0 Caps FN +1 Vol+ mute Rctl vol- pgdn LCTL +2 Rshift LShift +3 Ralt LAlt +4 LGUI +5 6 bakspc 1 2 3 4 F4 F5 F6 +6 Down right spc F1 F2 F3 tab +7 r t z x c v enter Esc + +This works with 18 cols + 8 rows on a Teensy++, or Arm based Teensy. + +The Astar mini has all pins exposed , so you can do 18x8 +If you want a speaker, LEDs &etc, you'll need to free up a pin. I recommend joining columns +R and L to the same pin. + +Building - edit rules.mk to set ASTAR=1 or comment it out for teensy2++ + + diff --git a/keyboards/handwired/MS-sculpt-mobile/rules.mk b/keyboards/handwired/MS-sculpt-mobile/rules.mk new file mode 100644 index 0000000000..cb9d5813cf --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/rules.mk @@ -0,0 +1,43 @@ +#CFLAGS=-D ASTAR + +ifdef ASTAR + OPT_DEFS += -DBOOTLOADER_SIZE=4096 + MCU = atmega32u4 + OPT_DEFS += -DCATERINA_BOOTLOADER + SCULPT_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done ; \ + avrdude -p $(MCU) -c avr109 -U flash:w:$(TARGET).hex -P $(USB) + +else + MCU = at90usb1286 + OPT_DEFS += -DBOOTLOADER_SIZE=2048 + SCULPT_UPLOAD_COMMAND = teensy_loader_cli -w -mmcu=$(MCU) $(TARGET).hex +endif + +F_CPU = 16000000 +ARCH = AVR8 +F_USB = $(F_CPU) +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= no # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 + + +USB ?= /dev/cu.usbmodem1421 + + +upload: build + $(SCULPT_UPLOAD_COMMAND) From 274b1c53fbc8c0838305e7837c4594d67431f2b6 Mon Sep 17 00:00:00 2001 From: milestogo Date: Sat, 11 Feb 2017 22:10:44 -0800 Subject: [PATCH 009/181] keymap update --- .../keymaps/milestogo/Makefile | 2 +- .../keymaps/milestogo/keymap.c | 34 +++++++++++++------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/Makefile b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/Makefile index 9d3df5964f..a82d80deee 100644 --- a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/Makefile +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/Makefile @@ -17,5 +17,5 @@ RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR - include ../../../../Makefile + include ../../../../../Makefile endif diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c index a80d5beaad..0551fbde72 100644 --- a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c @@ -16,7 +16,7 @@ /* Fn Keys */ #define TT_SYM MO(_SYM) #define TO_CDH TG(_CDH) -#define TO_MOV MO(_MOV) +#define TT_MOV KC_FN2 #define TT_NUM MO(_NUM) #define SSFT ACTION_MODS_ONESHOT(MOD_LSFT) @@ -42,18 +42,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_ESC, 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_VOLD, KC_VOLU, TO_CDH,\ KC_ESC, KC_1, KC_2, KC_3 ,KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_DEL,\ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,\ - TT_SYM, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,\ + TT_MOV, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,\ 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_UP, KC_PGDN,\ - KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RGUI,TT_SYM,KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT + KC_LCTL, KC_LGUI, KC_LALT, KC_FN1, KC_RGUI,TT_SYM,KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT ), [_CDH] = KEYMAP (\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ KC_ESC, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, ____, ____, ____,\ - TO_MOV, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, ____,\ - KC_LSFT, KC_Z, KC_X, KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, ____, ____,\ - ____, ____, ____ , TT_SYM, ____, ____, ____, ____, ____, ____ + TT_MOV, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, ____,\ + KC_LSFT, KC_Z, KC_X, KC_C, M(1), KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, ____, ____,\ + ____, ____, ____ , KC_FN1, ____, ____, ____, ____, ____, ____ ), @@ -70,7 +70,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, RGUI(KC_TAB), ____, ____, RCTL(KC_B), ____, ____, ____, ____, ____, ____, ____, ____, \ - ____, RCTL(KC_A), KC_S, RCTL(KC_K), RCTL(KC_E), ____, ____, KC_LEFT,KC_DOWN, KC_UP, KC_RIGHT, ____,____,____,\ + ____, RCTL(KC_A), KC_S, RCTL(KC_K), RCTL(KC_E), ____, KC_LEFT,KC_DOWN, KC_UP, KC_RIGHT, ____, ____,____,____,\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ ), @@ -87,6 +87,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM fn_actions[] = { +[1] = ACTION_LAYER_TAP_KEY(_SYM,KC_SPACE), +[2] = ACTION_LAYER_TAP_KEY(_MOV,KC_BSPC), }; const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) @@ -102,11 +104,21 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) break; - case KC_N: + case 1 : if(keyboard_report->mods & MOD_BIT(KC_LGUI) ) { - clear_keyboard_but_mods(); - register_code(KC_V); - } + if (record->event.pressed) { + clear_keyboard_but_mods(); + register_code(KC_V); + } else { + unregister_code(KC_V); + } + }else { + if (record->event.pressed) { + register_code(KC_D); + } else { + unregister_code(KC_D); + } + } break; From 8d0fdf10086a0e8a1615f0521fccf1f5a2806497 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sun, 12 Feb 2017 11:29:42 -0500 Subject: [PATCH 010/181] adds soft pwm for non-timed ports --- keyboards/planck/rules.mk | 4 +-- keyboards/preonic/rules.mk | 4 +-- quantum/quantum.c | 59 +++++++++++++++++++++++++++++--------- quantum/quantum.h | 1 + 4 files changed, 50 insertions(+), 18 deletions(-) diff --git a/keyboards/planck/rules.mk b/keyboards/planck/rules.mk index 4423d422f6..6776062f6d 100644 --- a/keyboards/planck/rules.mk +++ b/keyboards/planck/rules.mk @@ -56,13 +56,13 @@ EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) CONSOLE_ENABLE ?= no # Console for debug(+400) COMMAND_ENABLE ?= no # Commands for debug and configuration NKRO_ENABLE ?= no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality +BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality MIDI_ENABLE ?= yes # MIDI controls AUDIO_ENABLE ?= yes # Audio output on port C6 UNICODE_ENABLE ?= no # Unicode BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. -API_SYSEX_ENABLE = yes +API_SYSEX_ENABLE = no # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend diff --git a/keyboards/preonic/rules.mk b/keyboards/preonic/rules.mk index 62473e3564..6be5b55bcd 100644 --- a/keyboards/preonic/rules.mk +++ b/keyboards/preonic/rules.mk @@ -58,13 +58,13 @@ EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) CONSOLE_ENABLE ?= no # Console for debug(+400) COMMAND_ENABLE ?= no # Commands for debug and configuration NKRO_ENABLE ?= no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality +BACKLIGHT_ENABLE ?= yes # Enable keyboard backlight functionality MIDI_ENABLE ?= yes # MIDI controls AUDIO_ENABLE ?= yes # Audio output on port C6 UNICODE_ENABLE ?= no # Unicode BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. -API_SYSEX_ENABLE ?= yes +API_SYSEX_ENABLE ?= no # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/quantum/quantum.c b/quantum/quantum.c index 45ea8cb73c..95f06d95d4 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -7,6 +7,9 @@ #define TAPPING_TERM 200 #endif +#include "backlight.h" +extern backlight_config_t backlight_config; + static void do_code16 (uint16_t code, void (*f) (uint8_t)) { switch (code) { case QK_MODS ... QK_MODS_MAX: @@ -577,6 +580,10 @@ void matrix_scan_quantum() { matrix_scan_combo(); #endif + #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN) + backlight_task(); + #endif + matrix_scan_kb(); } @@ -644,13 +651,13 @@ __attribute__ ((weak)) void backlight_set(uint8_t level) { // Prevent backlight blink on lowest level - #if BACKLIGHT_ON_STATE == 0 - // PORTx &= ~n - _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); - #else - // PORTx |= n - _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); - #endif + // #if BACKLIGHT_ON_STATE == 0 + // // PORTx &= ~n + // _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); + // #else + // // PORTx |= n + // _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); + // #endif if ( level == 0 ) { #ifndef NO_BACKLIGHT_CLOCK @@ -658,13 +665,13 @@ void backlight_set(uint8_t level) TCCR1A &= ~(_BV(COM1x1)); OCR1x = 0x0; #else - #if BACKLIGHT_ON_STATE == 0 - // PORTx |= n - _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); - #else - // PORTx &= ~n - _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); - #endif + // #if BACKLIGHT_ON_STATE == 0 + // // PORTx |= n + // _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); + // #else + // // PORTx &= ~n + // _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); + // #endif #endif } #ifndef NO_BACKLIGHT_CLOCK @@ -687,6 +694,30 @@ void backlight_set(uint8_t level) #endif } +uint8_t backlight_tick = 0; + +void backlight_task(void) { + #ifdef NO_BACKLIGHT_CLOCK + if ((0xFFFF >> ((BACKLIGHT_LEVELS - backlight_config.level) * ((BACKLIGHT_LEVELS + 1) / 2))) & (1 << backlight_tick)) { + #if BACKLIGHT_ON_STATE == 0 + // PORTx &= ~n + _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); + #else + // PORTx |= n + _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); + #endif + } else { + #if BACKLIGHT_ON_STATE == 0 + // PORTx |= n + _SFR_IO8((backlight_pin >> 4) + 2) |= _BV(backlight_pin & 0xF); + #else + // PORTx &= ~n + _SFR_IO8((backlight_pin >> 4) + 2) &= ~_BV(backlight_pin & 0xF); + #endif + } + backlight_tick = (backlight_tick + 1) % 16; + #endif +} #ifdef BACKLIGHT_BREATHING diff --git a/quantum/quantum.h b/quantum/quantum.h index 18f072189d..2470d8c7da 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -95,6 +95,7 @@ void unregister_code16 (uint16_t code); #ifdef BACKLIGHT_ENABLE void backlight_init_ports(void); +void backlight_task(void); #ifdef BACKLIGHT_BREATHING void breathing_enable(void); From 64f9779fe54facecdef9d1a6a7c1d893f79ca20e Mon Sep 17 00:00:00 2001 From: lambdalisue Date: Tue, 14 Feb 2017 14:12:54 +0900 Subject: [PATCH 011/181] Add TAPPING_FORCE_HOLD to regulate behaviour See #889 for the detail. --- doc/keymap.md | 3 +++ tmk_core/common/action_tapping.c | 9 +++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/doc/keymap.md b/doc/keymap.md index 6f2a663fc8..2b0d2cd959 100644 --- a/doc/keymap.md +++ b/doc/keymap.md @@ -549,6 +549,9 @@ Layer switching with tap key: [dual_role]: http://en.wikipedia.org/wiki/Modifier_key#Dual-role_keys +When user hold a key after tap, it repeat the tapped key rather to hold a modifier key. +If you prefer to hold a modifier instead, define `TAPPING_FORCE_HOLD` in `config.h`. +See https://github.com/qmk/qmk_firmware/issues/889 for the detail. ### 4.2 Tap Toggle This is a feature to assign both toggle layer and momentary switch layer action to just same one physical key. It works as momentary layer switch when holding a key but toggle switch with several taps. diff --git a/tmk_core/common/action_tapping.c b/tmk_core/common/action_tapping.c index e16e11be7f..66044d8bce 100644 --- a/tmk_core/common/action_tapping.c +++ b/tmk_core/common/action_tapping.c @@ -228,6 +228,7 @@ bool process_tapping(keyrecord_t *keyp) if (WITHIN_TAPPING_TERM(event)) { if (event.pressed) { if (IS_TAPPING_KEY(event.key)) { +#ifndef TAPPING_FORCE_HOLD if (!tapping_key.tap.interrupted && tapping_key.tap.count > 0) { // sequential tap. keyp->tap = tapping_key.tap; @@ -237,11 +238,11 @@ bool process_tapping(keyrecord_t *keyp) tapping_key = *keyp; debug_tapping_key(); return true; - } else { - // FIX: start new tap again - tapping_key = *keyp; - return true; } +#endif + // FIX: start new tap again + tapping_key = *keyp; + return true; } else if (is_tap_key(event.key)) { // Sequential tap can be interfered with other tap key. debug("Tapping: Start with interfering other tap.\n"); From 334edc3c7d594674a44bc66e70fb08e45b27e644 Mon Sep 17 00:00:00 2001 From: Stephen Tudor Date: Thu, 16 Feb 2017 14:32:24 -0500 Subject: [PATCH 012/181] Add smt keymap for Let's Split (based on serial) --- keyboards/lets_split/keymaps/smt/config.h | 34 ++++ keyboards/lets_split/keymaps/smt/keymap.c | 213 ++++++++++++++++++++++ 2 files changed, 247 insertions(+) create mode 100644 keyboards/lets_split/keymaps/smt/config.h create mode 100644 keyboards/lets_split/keymaps/smt/keymap.c diff --git a/keyboards/lets_split/keymaps/smt/config.h b/keyboards/lets_split/keymaps/smt/config.h new file mode 100644 index 0000000000..ba271d1ac6 --- /dev/null +++ b/keyboards/lets_split/keymaps/smt/config.h @@ -0,0 +1,34 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + + +#define USE_SERIAL + +#define MASTER_LEFT +// #define _MASTER_RIGHT +// #define EE_HANDS + + +#ifdef SUBPROJECT_rev1 + #include "../../rev1/config.h" +#endif +#ifdef SUBPROJECT_rev2 + #include "../../rev2/config.h" +#endif +#ifdef SUBPROJECT_rev2fliphalf + #include "../../rev2fliphalf/config.h" +#endif diff --git a/keyboards/lets_split/keymaps/smt/keymap.c b/keyboards/lets_split/keymaps/smt/keymap.c new file mode 100644 index 0000000000..5ba5417a96 --- /dev/null +++ b/keyboards/lets_split/keymaps/smt/keymap.c @@ -0,0 +1,213 @@ +#include "lets_split.h" +#include "action_layer.h" +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST, +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = KEYMAP( \ + ALL_T(KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + SFT_T(KC_ESC), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), \ + MEH_T(KC_GRV), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = KEYMAP( \ + ALL_T(KC_TAB), KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + CTL_T(KC_ESC), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + SFT_T(KC_ESC), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), \ + MEH_T(KC_GRV), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +), + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | - | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = KEYMAP( \ + ALL_T(KC_TAB), KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + CTL_T(KC_ESC), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, \ + SFT_T(KC_ESC), KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_T(KC_ENT), \ + MEH_T(KC_GRV), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | $ | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | Home |PageUp| + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | End |PageDn| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = KEYMAP( \ + KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + KC_DLR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_4, KC_5, KC_6, KC_HOME, KC_PGUP, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_1, KC_2, KC_3, KC_END, KC_PGDN, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | _ | ? | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | - | / | = | [ | ] | \ | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = KEYMAP( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + _______, _______, _______, _______, _______, _______, KC_UNDS, KC_QUES, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, _______, _______, _______, _______, _______, KC_MINS, KC_SLSH, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Reset| + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = KEYMAP( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} From 33bc4c070c2d592ba706ba89ff6786699bc9133f Mon Sep 17 00:00:00 2001 From: Stephen Tudor Date: Thu, 16 Feb 2017 14:32:46 -0500 Subject: [PATCH 013/181] Update smt Planck keymap --- keyboards/planck/keymaps/smt/keymap.c | 110 ++++++++++++++++---------- 1 file changed, 70 insertions(+), 40 deletions(-) diff --git a/keyboards/planck/keymaps/smt/keymap.c b/keyboards/planck/keymaps/smt/keymap.c index 51e5a40bfe..afc82b49f9 100644 --- a/keyboards/planck/keymaps/smt/keymap.c +++ b/keyboards/planck/keymaps/smt/keymap.c @@ -11,15 +11,17 @@ extern keymap_config_t keymap_config; // 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 _DVORAK 0 -#define _QWERTY 1 -#define _LOWER 2 -#define _RAISE 3 +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 #define _ADJUST 16 enum planck_keycodes { - DVORAK = SAFE_RANGE, - QWERTY, + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, LOWER, RAISE, BACKLIT @@ -31,24 +33,6 @@ enum planck_keycodes { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Dvorak - * ,-----------------------------------------------------------------------------------. - * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | O | E | U | I | D | H | T | N | S | - | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_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_MINS}, - {SFT_T(KC_ESC), KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_T(KC_ENT)}, - {ALL_T(KC_GRV), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, - /* Qwerty * ,-----------------------------------------------------------------------------------. * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | @@ -57,14 +41,50 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ [_QWERTY] = { - {_______, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, 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_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} + {ALL_T(KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {SFT_T(KC_ESC), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT)}, + {MEH_T(KC_GRV), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = { + {ALL_T(KC_TAB), KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {CTL_T(KC_ESC), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, + {SFT_T(KC_ESC), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT)}, + {MEH_T(KC_GRV), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | - | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = { + {ALL_T(KC_TAB), KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, + {CTL_T(KC_ESC), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS}, + {SFT_T(KC_ESC), KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_T(KC_ENT)}, + {MEH_T(KC_GRV), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, /* Lower @@ -107,7 +127,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------------------------------------------------. * | | Reset| | | | | | | | | | Del | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Dvorak|Qwerty| | | | + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | * |------+------+------+------+------+------|------+------+------+------+------+------| * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -116,7 +136,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_ADJUST] = { {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, - {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, DVORAK, QWERTY, _______, _______, _______}, + {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} } @@ -128,6 +148,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { float tone_startup[][2] = SONG(STARTUP_SOUND); float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); float tone_dvorak[][2] = SONG(DVORAK_SOUND); float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); @@ -142,15 +163,6 @@ void persistant_default_layer_set(uint16_t default_layer) { bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { - case DVORAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_dvorak, false, 0); - #endif - persistant_default_layer_set(1UL<<_DVORAK); - } - return false; - break; case QWERTY: if (record->event.pressed) { #ifdef AUDIO_ENABLE @@ -160,6 +172,24 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; case LOWER: if (record->event.pressed) { layer_on(_LOWER); From db1e9a469a8dda068a913fe570c86a1fefc1b4cd Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sun, 19 Feb 2017 00:11:55 -0500 Subject: [PATCH 014/181] helps to save before committing --- quantum/quantum.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/quantum/quantum.c b/quantum/quantum.c index 761ba37f37..582f8920b1 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -7,14 +7,12 @@ #define TAPPING_TERM 200 #endif -<<<<<<< HEAD #include "backlight.h" extern backlight_config_t backlight_config; -======= + #ifdef FAUXCLICKY_ENABLE #include "fauxclicky.h" #endif ->>>>>>> 49e72632d2200fc3bf71d5ced2aa43058da3b2e0 static void do_code16 (uint16_t code, void (*f) (uint8_t)) { switch (code) { From 5ae1411fc387a682d3e22f5cddfe1102e3312af5 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Thu, 16 Feb 2017 20:49:02 -0800 Subject: [PATCH 015/181] Expand MIDI key codes --- quantum/quantum_keycodes.h | 114 ++++++++++++++++++++++++++++++++++++- 1 file changed, 113 insertions(+), 1 deletion(-) diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 63b626926d..3728fa3664 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -107,10 +107,122 @@ enum quantum_keycodes { MUV_IN, MUV_DE, - // Midi mode on/off +#ifdef MIDI_ENABLE + // Midi MIDI_ON, MIDI_OFF, + MIDI_TONE_MIN, + + MI_C = MIDI_TONE_MIN, + MI_Cs, + MI_Db = MI_Cs, + MI_D, + MI_Ds, + MI_Eb = MI_Ds, + MI_E, + MI_F, + MI_Fs, + MI_Gb = MI_Fs, + MI_G, + MI_Gs, + MI_Ab = MI_Gs, + MI_A, + MI_As, + MI_Bb = MI_As, + MI_B, + + MI_C_1, + MI_Cs_1, + MI_Db_1 = MI_Cs_1, + MI_D_1, + MI_Ds_1, + MI_Eb_1 = MI_Ds_1, + MI_E_1, + MI_F_1, + MI_Fs_1, + MI_Gb_1 = MI_Fs_1, + MI_G_1, + MI_Gs_1, + MI_Ab_1 = MI_Gs_1, + MI_A_1, + MI_As_1, + MI_Bb_1 = MI_As_1, + MI_B_1, + + MI_C_2, + MI_Cs_2, + MI_Db_2 = MI_Cs_2, + MI_D_2, + MI_Ds_2, + MI_Eb_2 = MI_Ds_2, + MI_E_2, + MI_F_2, + MI_Fs_2, + MI_Gb_2 = MI_Fs_2, + MI_G_2, + MI_Gs_2, + MI_Ab_2 = MI_Gs_2, + MI_A_2, + MI_As_2, + MI_Bb_2 = MI_As_2, + MI_B_2, + + MIDI_TONE_MAX = MI_B_2, + + MIDI_OCTAVE_MIN, + MI_OCT_N2 = MIDI_OCTAVE_MIN, + MI_OCT_N1, + MI_OCT_0, + MI_OCT_1, + MI_OCT_2, + MI_OCT_3, + MI_OCT_4, + MI_OCT_5, + MI_OCT_6, + MI_OCT_7, + MIDI_OCTAVE_MAX = MI_OCT_7, + MI_OCTD, // octave down + MI_OCTU, // octave up + + MIDI_VELOCITY_MIN, + MI_VEL_1 = MIDI_VELOCITY_MIN, + MI_VEL_2, + MI_VEL_3, + MI_VEL_5, + MI_VEL_6, + MI_VEL_7, + MI_VEL_8, + MI_VEL_9, + MI_VEL_10, + MIDI_VELOCITY_MAX = MI_VEL_10, + MI_VELD, // velocity down + MI_VELU, // velocity up + + MIDI_CHANNEL_MIN, + MI_CH1 = MIDI_CHANNEL_MIN, + MI_CH2, + MI_CH3, + MI_CH4, + MI_CH5, + MI_CH6, + MI_CH7, + MI_CH8, + MI_CH9, + MI_CH10, + MI_CH11, + MI_CH12, + MI_CH13, + MI_CH14, + MI_CH15, + MI_CH16, + MIDI_CHANNEL_MAX = MI_CH16, + MI_CHD, // previous channel + MI_CHU, // next channel + + MI_SUS, // sustain +#endif + // Backlight functionality BL_0, BL_1, From e405ab4bc6ff47d189d99c4d51aadf60a642d82a Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sat, 18 Feb 2017 03:12:13 -0800 Subject: [PATCH 016/181] initial implementation of polyphony using variable length array of notes on --- quantum/process_keycode/process_midi.c | 199 ++++++++++++++++++++++++- quantum/process_keycode/process_midi.h | 3 + quantum/quantum_keycodes.h | 1 + tmk_core/protocol/lufa/lufa.c | 13 +- tmk_core/protocol/lufa/lufa.h | 2 +- 5 files changed, 211 insertions(+), 7 deletions(-) diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index 577dad43ac..bc48b39059 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -1,10 +1,204 @@ #include "process_midi.h" +#if 0 bool midi_activated = false; uint8_t midi_starting_note = 0x0C; int midi_offset = 7; +#endif -bool process_midi(uint16_t keycode, keyrecord_t *record) { +typedef union { + uint16_t raw; + struct { + uint8_t octave :4; + uint8_t velocity :4; + uint8_t channel :4; + }; +} midi_config_t; + +midi_config_t midi_config; + +#define MIDI_INVALID_NOTE 0xFF + +#if 0 +typedef struct { + uint64_t low; + uint64_t high; +} uint128_t; + +#if 0 +static void right_shift_uint128_t(uint128_t* val, uint8_t shift) +{ + uint64_t high_mask = ~0 >> (64 - shift); + uint64_t high_bits = (val->high & high_mask) << (64 - shift); + val->high = val->high >> shift; + val->low = (val->low >> shift) | high_bits; +} +#endif + +static uint64_t left_shift_uint64_t(uint64_t val, uint8_t shift) +{ + dprintf("left_shift_uint64_t(val, %c) ...\n", val, shift); + while (shift > 16u) { + dprintf(" left_shift_uint64_t: val=?, shift=%c\n", val, shift); + val <<= 16; + shift -= 16; + } + dprintf(" left_shift_uint64_t: val=?, shift=%c\n", val, shift); + val <<= shift; + return val; +} + +static void set_bit_uint128_t(uint128_t* val, uint8_t shift) +{ + uint64_t x = 1u; + + if (shift < 64) + { + x = left_shift_uint64_t(x, shift); + dprintf("x: %d\n", x); + dprintf("set_bit_uint128_t (%d): 0x%016X%016X\n", shift, 0, x); + val->low = val->low | left_shift_uint64_t(1u, shift); + } + else + { + x = left_shift_uint64_t(x, shift - 64); + dprintf("set_bit_uint128_t (%d): 0x%016X%016X\n", shift, x, 0); + val->high = val->high | left_shift_uint64_t(1u, shift - 64); + } +} + +static void clear_bit_uint128_t(uint128_t* val, uint8_t shift) +{ + if (shift < 64) + { + val->low = val->low & ~left_shift_uint64_t(1u, shift); + } + else + { + val->high = val->high & ~left_shift_uint64_t(1u, shift - 64); + } +} + +static bool is_bit_set_uint128_t(const uint128_t* val, uint8_t shift) +{ + if (shift < 64) + { + return !!(val->low & (1u << shift)); + } + else + { + return !!(val->high & (1u << (shift - 64))); + } +} + +uint128_t note_status = { 0, 0 }; +#endif + + +#define MIDI_MAX_NOTES_ON 10 + +typedef struct { + uint8_t note; + uint8_t tone; +} midi_notes_on_array_entry_t; + +typedef struct { + uint8_t length; + midi_notes_on_array_entry_t values[MIDI_MAX_NOTES_ON]; +} midi_notes_on_array_t; + +static midi_notes_on_array_t notes_on; + +inline uint8_t compute_velocity(uint8_t setting) +{ + return (setting + 1) * (128 / (MIDI_VELOCITY_MAX - MIDI_VELOCITY_MIN + 1)); +} + +void midi_init(void) +{ + midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN; + midi_config.velocity = (MIDI_VELOCITY_MAX - MIDI_VELOCITY_MIN); + midi_config.channel = 0; + notes_on.length = 0; +} + +bool process_midi(uint16_t keycode, keyrecord_t *record) +{ + switch (keycode) { + case MIDI_TONE_MIN ... MIDI_TONE_MAX: + { + uint8_t channel = midi_config.channel; + uint8_t tone = keycode - MIDI_TONE_MIN; + uint8_t velocity = compute_velocity(midi_config.velocity); + if (record->event.pressed && notes_on.length < MIDI_MAX_NOTES_ON) { + uint8_t note = 12 * midi_config.octave + tone; + midi_send_noteon(&midi_device, channel, note, velocity); + dprintf("midi noteon channel:%d note:%d velocity:%d\n", channel, note, velocity); + notes_on.values[notes_on.length].note = note; + notes_on.values[notes_on.length].tone = tone; + notes_on.length++; + } + else { + for (uint8_t i = 0; i < notes_on.length; i++) { + uint8_t note = notes_on.values[i].note; + if (tone == notes_on.values[i].tone) { + midi_send_noteoff(&midi_device, channel, note, velocity); + dprintf("midi noteoff channel:%d note:%d velocity:%d\n", channel, note, velocity); + + for (uint8_t j=i; j < notes_on.length - 1; j++) + { + notes_on.values[j] = notes_on.values[j + 1]; + } + + notes_on.length--; + break; + } + } + } + return false; + } + case MIDI_OCTAVE_MIN ... MIDI_OCTAVE_MAX: + if (record->event.pressed) + midi_config.octave = keycode - MIDI_OCTAVE_MIN; + return false; + case MI_OCTD: + if (record->event.pressed && midi_config.octave > 0) + midi_config.octave--; + return false; + case MI_OCTU: + if (record->event.pressed && midi_config.octave < (MIDI_OCTAVE_MAX - MIDI_OCTAVE_MIN)) + midi_config.octave++; + return false; + case MIDI_VELOCITY_MIN ... MIDI_VELOCITY_MAX: + if (record->event.pressed) + midi_config.velocity = keycode - MIDI_VELOCITY_MIN; + return false; + case MI_VELD: + if (record->event.pressed && midi_config.velocity > 0) + midi_config.velocity--; + return false; + case MI_VELU: + if (record->event.pressed) + midi_config.velocity++; + return false; + case MIDI_CHANNEL_MIN ... MIDI_CHANNEL_MAX: + if (record->event.pressed) + midi_config.channel = keycode - MIDI_CHANNEL_MIN; + return false; + case MI_CHD: + if (record->event.pressed) + midi_config.channel--; + return false; + case MI_CHU: + if (record->event.pressed) + midi_config.channel++; + return false; + case MI_SUS: + //TODO + return false; + }; + +#if 0 if (keycode == MI_ON && record->event.pressed) { midi_activated = true; #ifdef AUDIO_ENABLE @@ -64,5 +258,6 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) { if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through return false; } - return true; +#endif + return true; } diff --git a/quantum/process_keycode/process_midi.h b/quantum/process_keycode/process_midi.h index acd4fc1b16..b0e0aeb832 100644 --- a/quantum/process_keycode/process_midi.h +++ b/quantum/process_keycode/process_midi.h @@ -2,6 +2,9 @@ #define PROCESS_MIDI_H #include "quantum.h" +#include "midi.h" + +void midi_init(void); bool process_midi(uint16_t keycode, keyrecord_t *record); diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 3728fa3664..a024a96395 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -189,6 +189,7 @@ enum quantum_keycodes { MI_VEL_1 = MIDI_VELOCITY_MIN, MI_VEL_2, MI_VEL_3, + MI_VEL_4, MI_VEL_5, MI_VEL_6, MI_VEL_7, diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index ba49284c9b..fb60658df7 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -1101,16 +1101,21 @@ void cc_callback(MidiDevice * device, uint8_t chan, uint8_t num, uint8_t val); void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t * data); + +void setup_midi(void) +{ + midi_init(); + midi_device_init(&midi_device); + midi_device_set_send_func(&midi_device, usb_send_func); + midi_device_set_pre_input_process_func(&midi_device, usb_get_midi); +} #endif int main(void) __attribute__ ((weak)); int main(void) { - #ifdef MIDI_ENABLE - midi_device_init(&midi_device); - midi_device_set_send_func(&midi_device, usb_send_func); - midi_device_set_pre_input_process_func(&midi_device, usb_get_midi); + setup_midi(); #endif setup_mcu(); diff --git a/tmk_core/protocol/lufa/lufa.h b/tmk_core/protocol/lufa/lufa.h index a049fd43c9..a515737862 100644 --- a/tmk_core/protocol/lufa/lufa.h +++ b/tmk_core/protocol/lufa/lufa.h @@ -49,7 +49,7 @@ #include #include "host.h" #ifdef MIDI_ENABLE - #include "midi.h" + #include "process_midi.h" #endif #ifdef __cplusplus extern "C" { From f2b2e05f126403c8a6f0fc3d542beddac7974e9b Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sat, 18 Feb 2017 03:13:43 -0800 Subject: [PATCH 017/181] clean up commented code --- quantum/process_keycode/process_midi.c | 137 ------------------------- 1 file changed, 137 deletions(-) diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index bc48b39059..acaae7c30a 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -19,82 +19,6 @@ midi_config_t midi_config; #define MIDI_INVALID_NOTE 0xFF -#if 0 -typedef struct { - uint64_t low; - uint64_t high; -} uint128_t; - -#if 0 -static void right_shift_uint128_t(uint128_t* val, uint8_t shift) -{ - uint64_t high_mask = ~0 >> (64 - shift); - uint64_t high_bits = (val->high & high_mask) << (64 - shift); - val->high = val->high >> shift; - val->low = (val->low >> shift) | high_bits; -} -#endif - -static uint64_t left_shift_uint64_t(uint64_t val, uint8_t shift) -{ - dprintf("left_shift_uint64_t(val, %c) ...\n", val, shift); - while (shift > 16u) { - dprintf(" left_shift_uint64_t: val=?, shift=%c\n", val, shift); - val <<= 16; - shift -= 16; - } - dprintf(" left_shift_uint64_t: val=?, shift=%c\n", val, shift); - val <<= shift; - return val; -} - -static void set_bit_uint128_t(uint128_t* val, uint8_t shift) -{ - uint64_t x = 1u; - - if (shift < 64) - { - x = left_shift_uint64_t(x, shift); - dprintf("x: %d\n", x); - dprintf("set_bit_uint128_t (%d): 0x%016X%016X\n", shift, 0, x); - val->low = val->low | left_shift_uint64_t(1u, shift); - } - else - { - x = left_shift_uint64_t(x, shift - 64); - dprintf("set_bit_uint128_t (%d): 0x%016X%016X\n", shift, x, 0); - val->high = val->high | left_shift_uint64_t(1u, shift - 64); - } -} - -static void clear_bit_uint128_t(uint128_t* val, uint8_t shift) -{ - if (shift < 64) - { - val->low = val->low & ~left_shift_uint64_t(1u, shift); - } - else - { - val->high = val->high & ~left_shift_uint64_t(1u, shift - 64); - } -} - -static bool is_bit_set_uint128_t(const uint128_t* val, uint8_t shift) -{ - if (shift < 64) - { - return !!(val->low & (1u << shift)); - } - else - { - return !!(val->high & (1u << (shift - 64))); - } -} - -uint128_t note_status = { 0, 0 }; -#endif - - #define MIDI_MAX_NOTES_ON 10 typedef struct { @@ -198,66 +122,5 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) return false; }; -#if 0 - if (keycode == MI_ON && record->event.pressed) { - midi_activated = true; -#ifdef AUDIO_ENABLE - music_scale_user(); -#endif - return false; - } - - if (keycode == MI_OFF && record->event.pressed) { - midi_activated = false; - midi_send_cc(&midi_device, 0, 0x7B, 0); - return false; - } - - if (midi_activated) { - if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) { - if (record->event.pressed) { - midi_starting_note++; // Change key - midi_send_cc(&midi_device, 0, 0x7B, 0); - } - return false; - } - if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) { - if (record->event.pressed) { - midi_starting_note--; // Change key - midi_send_cc(&midi_device, 0, 0x7B, 0); - } - return false; - } - if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { - midi_offset++; // Change scale - midi_send_cc(&midi_device, 0, 0x7B, 0); - return false; - } - if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { - midi_offset--; // Change scale - midi_send_cc(&midi_device, 0, 0x7B, 0); - return false; - } - // basic - // uint8_t note = (midi_starting_note + SCALE[record->event.key.col + midi_offset])+12*(MATRIX_ROWS - record->event.key.row); - // advanced - // uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+12*(MATRIX_ROWS - record->event.key.row); - // guitar - uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+5*(MATRIX_ROWS - record->event.key.row); - // violin - // uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+7*(MATRIX_ROWS - record->event.key.row); - - if (record->event.pressed) { - // midi_send_noteon(&midi_device, record->event.key.row, midi_starting_note + SCALE[record->event.key.col], 127); - midi_send_noteon(&midi_device, 0, note, 127); - } else { - // midi_send_noteoff(&midi_device, record->event.key.row, midi_starting_note + SCALE[record->event.key.col], 127); - midi_send_noteoff(&midi_device, 0, note, 127); - } - - if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through - return false; - } -#endif return true; } From a4163466cb09144a96e2ea7bc697af1af8a5e770 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sat, 18 Feb 2017 03:40:49 -0800 Subject: [PATCH 018/181] Alternative version with a tone array tone array: text data bss dec hex filename 0 25698 0 25698 6462 satan_newsboytko.hex 0x6480 bytes written into 0x7000 bytes memory (89.73%). note on array: text data bss dec hex filename 0 25802 0 25802 64ca satan_newsboytko.hex 0x6500 bytes written into 0x7000 bytes memory (90.18%). --- quantum/process_keycode/process_midi.c | 109 +++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index acaae7c30a..4fbb288162 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -19,6 +19,10 @@ midi_config_t midi_config; #define MIDI_INVALID_NOTE 0xFF +#define MIDI_USE_NOTE_ON_ARRAY + +#ifdef MIDI_USE_NOTE_ON_ARRAY + #define MIDI_MAX_NOTES_ON 10 typedef struct { @@ -33,6 +37,15 @@ typedef struct { static midi_notes_on_array_t notes_on; +#else + +#define MIDI_TONE_COUNT (MIDI_TONE_MAX - MIDI_TONE_MIN + 1) +static uint8_t tone_status[MIDI_TONE_COUNT]; + +#endif + + + inline uint8_t compute_velocity(uint8_t setting) { return (setting + 1) * (128 / (MIDI_VELOCITY_MAX - MIDI_VELOCITY_MIN + 1)); @@ -43,7 +56,14 @@ void midi_init(void) midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN; midi_config.velocity = (MIDI_VELOCITY_MAX - MIDI_VELOCITY_MIN); midi_config.channel = 0; + #ifdef MIDI_USE_NOTE_ON_ARRAY notes_on.length = 0; + #else + for (uint8_t i = 0; i < MIDI_TONE_COUNT; i++) + { + tone_status[i] = MIDI_INVALID_NOTE; + } + #endif } bool process_midi(uint16_t keycode, keyrecord_t *record) @@ -54,15 +74,31 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) uint8_t channel = midi_config.channel; uint8_t tone = keycode - MIDI_TONE_MIN; uint8_t velocity = compute_velocity(midi_config.velocity); + #ifdef MIDI_USE_NOTE_ON_ARRAY if (record->event.pressed && notes_on.length < MIDI_MAX_NOTES_ON) { + #else + if (record->event.pressed) { + #endif uint8_t note = 12 * midi_config.octave + tone; midi_send_noteon(&midi_device, channel, note, velocity); dprintf("midi noteon channel:%d note:%d velocity:%d\n", channel, note, velocity); + + #ifdef MIDI_USE_NOTE_ON_ARRAY + notes_on.values[notes_on.length].note = note; notes_on.values[notes_on.length].tone = tone; notes_on.length++; + + #else + + tone_status[tone] = note; + + #endif } else { + + #ifdef MIDI_USE_NOTE_ON_ARRAY + for (uint8_t i = 0; i < notes_on.length; i++) { uint8_t note = notes_on.values[i].note; if (tone == notes_on.values[i].tone) { @@ -78,6 +114,18 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) break; } } + + #else + + uint8_t note = tone_status[tone]; + if (note != MIDI_INVALID_NOTE) + { + midi_send_noteoff(&midi_device, channel, note, velocity); + dprintf("midi noteoff channel:%d note:%d velocity:%d\n", channel, note, velocity); + } + tone_status[tone] = MIDI_INVALID_NOTE; + + #endif } return false; } @@ -122,5 +170,66 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) return false; }; +#if 0 + if (keycode == MI_ON && record->event.pressed) { + midi_activated = true; +#ifdef AUDIO_ENABLE + music_scale_user(); +#endif + return false; + } + + if (keycode == MI_OFF && record->event.pressed) { + midi_activated = false; + midi_send_cc(&midi_device, 0, 0x7B, 0); + return false; + } + + if (midi_activated) { + if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) { + if (record->event.pressed) { + midi_starting_note++; // Change key + midi_send_cc(&midi_device, 0, 0x7B, 0); + } + return false; + } + if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) { + if (record->event.pressed) { + midi_starting_note--; // Change key + midi_send_cc(&midi_device, 0, 0x7B, 0); + } + return false; + } + if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { + midi_offset++; // Change scale + midi_send_cc(&midi_device, 0, 0x7B, 0); + return false; + } + if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { + midi_offset--; // Change scale + midi_send_cc(&midi_device, 0, 0x7B, 0); + return false; + } + // basic + // uint8_t note = (midi_starting_note + SCALE[record->event.key.col + midi_offset])+12*(MATRIX_ROWS - record->event.key.row); + // advanced + // uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+12*(MATRIX_ROWS - record->event.key.row); + // guitar + uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+5*(MATRIX_ROWS - record->event.key.row); + // violin + // uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+7*(MATRIX_ROWS - record->event.key.row); + + if (record->event.pressed) { + // midi_send_noteon(&midi_device, record->event.key.row, midi_starting_note + SCALE[record->event.key.col], 127); + midi_send_noteon(&midi_device, 0, note, 127); + } else { + // midi_send_noteoff(&midi_device, record->event.key.row, midi_starting_note + SCALE[record->event.key.col], 127); + midi_send_noteoff(&midi_device, 0, note, 127); + } + + if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through + return false; + } +#endif return true; } From f67aefc522dd8b72711e7fc5280e1cae1470d1c5 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sat, 18 Feb 2017 03:43:30 -0800 Subject: [PATCH 019/181] remove disabled code --- quantum/process_keycode/process_midi.c | 129 ------------------------- 1 file changed, 129 deletions(-) diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index 4fbb288162..2ce7418ea7 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -1,11 +1,5 @@ #include "process_midi.h" -#if 0 -bool midi_activated = false; -uint8_t midi_starting_note = 0x0C; -int midi_offset = 7; -#endif - typedef union { uint16_t raw; struct { @@ -19,33 +13,9 @@ midi_config_t midi_config; #define MIDI_INVALID_NOTE 0xFF -#define MIDI_USE_NOTE_ON_ARRAY - -#ifdef MIDI_USE_NOTE_ON_ARRAY - -#define MIDI_MAX_NOTES_ON 10 - -typedef struct { - uint8_t note; - uint8_t tone; -} midi_notes_on_array_entry_t; - -typedef struct { - uint8_t length; - midi_notes_on_array_entry_t values[MIDI_MAX_NOTES_ON]; -} midi_notes_on_array_t; - -static midi_notes_on_array_t notes_on; - -#else - #define MIDI_TONE_COUNT (MIDI_TONE_MAX - MIDI_TONE_MIN + 1) static uint8_t tone_status[MIDI_TONE_COUNT]; -#endif - - - inline uint8_t compute_velocity(uint8_t setting) { return (setting + 1) * (128 / (MIDI_VELOCITY_MAX - MIDI_VELOCITY_MIN + 1)); @@ -74,49 +44,13 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) uint8_t channel = midi_config.channel; uint8_t tone = keycode - MIDI_TONE_MIN; uint8_t velocity = compute_velocity(midi_config.velocity); - #ifdef MIDI_USE_NOTE_ON_ARRAY - if (record->event.pressed && notes_on.length < MIDI_MAX_NOTES_ON) { - #else if (record->event.pressed) { - #endif uint8_t note = 12 * midi_config.octave + tone; midi_send_noteon(&midi_device, channel, note, velocity); dprintf("midi noteon channel:%d note:%d velocity:%d\n", channel, note, velocity); - - #ifdef MIDI_USE_NOTE_ON_ARRAY - - notes_on.values[notes_on.length].note = note; - notes_on.values[notes_on.length].tone = tone; - notes_on.length++; - - #else - tone_status[tone] = note; - - #endif } else { - - #ifdef MIDI_USE_NOTE_ON_ARRAY - - for (uint8_t i = 0; i < notes_on.length; i++) { - uint8_t note = notes_on.values[i].note; - if (tone == notes_on.values[i].tone) { - midi_send_noteoff(&midi_device, channel, note, velocity); - dprintf("midi noteoff channel:%d note:%d velocity:%d\n", channel, note, velocity); - - for (uint8_t j=i; j < notes_on.length - 1; j++) - { - notes_on.values[j] = notes_on.values[j + 1]; - } - - notes_on.length--; - break; - } - } - - #else - uint8_t note = tone_status[tone]; if (note != MIDI_INVALID_NOTE) { @@ -124,8 +58,6 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) dprintf("midi noteoff channel:%d note:%d velocity:%d\n", channel, note, velocity); } tone_status[tone] = MIDI_INVALID_NOTE; - - #endif } return false; } @@ -170,66 +102,5 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) return false; }; -#if 0 - if (keycode == MI_ON && record->event.pressed) { - midi_activated = true; -#ifdef AUDIO_ENABLE - music_scale_user(); -#endif - return false; - } - - if (keycode == MI_OFF && record->event.pressed) { - midi_activated = false; - midi_send_cc(&midi_device, 0, 0x7B, 0); - return false; - } - - if (midi_activated) { - if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) { - if (record->event.pressed) { - midi_starting_note++; // Change key - midi_send_cc(&midi_device, 0, 0x7B, 0); - } - return false; - } - if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) { - if (record->event.pressed) { - midi_starting_note--; // Change key - midi_send_cc(&midi_device, 0, 0x7B, 0); - } - return false; - } - if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { - midi_offset++; // Change scale - midi_send_cc(&midi_device, 0, 0x7B, 0); - return false; - } - if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) { - midi_offset--; // Change scale - midi_send_cc(&midi_device, 0, 0x7B, 0); - return false; - } - // basic - // uint8_t note = (midi_starting_note + SCALE[record->event.key.col + midi_offset])+12*(MATRIX_ROWS - record->event.key.row); - // advanced - // uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+12*(MATRIX_ROWS - record->event.key.row); - // guitar - uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+5*(MATRIX_ROWS - record->event.key.row); - // violin - // uint8_t note = (midi_starting_note + record->event.key.col + midi_offset)+7*(MATRIX_ROWS - record->event.key.row); - - if (record->event.pressed) { - // midi_send_noteon(&midi_device, record->event.key.row, midi_starting_note + SCALE[record->event.key.col], 127); - midi_send_noteon(&midi_device, 0, note, 127); - } else { - // midi_send_noteoff(&midi_device, record->event.key.row, midi_starting_note + SCALE[record->event.key.col], 127); - midi_send_noteoff(&midi_device, 0, note, 127); - } - - if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through - return false; - } -#endif return true; } From 7c5e510fe2e57d1b3c0f98612f1f89d413c07525 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sat, 18 Feb 2017 04:25:17 -0800 Subject: [PATCH 020/181] add support for pedal cc messages --- quantum/process_keycode/process_midi.c | 61 +++++++++++++++++++++----- quantum/quantum_keycodes.h | 11 ++--- 2 files changed, 57 insertions(+), 15 deletions(-) diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index 2ce7418ea7..f7a8b6650f 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -62,43 +62,84 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) return false; } case MIDI_OCTAVE_MIN ... MIDI_OCTAVE_MAX: - if (record->event.pressed) + if (record->event.pressed) { midi_config.octave = keycode - MIDI_OCTAVE_MIN; + dprintf("midi octave %d\n", midi_config.octave); + } return false; case MI_OCTD: - if (record->event.pressed && midi_config.octave > 0) + if (record->event.pressed && midi_config.octave > 0) { midi_config.octave--; + dprintf("midi octave %d\n", midi_config.octave); + } return false; case MI_OCTU: - if (record->event.pressed && midi_config.octave < (MIDI_OCTAVE_MAX - MIDI_OCTAVE_MIN)) + if (record->event.pressed && midi_config.octave < (MIDI_OCTAVE_MAX - MIDI_OCTAVE_MIN)) { midi_config.octave++; + dprintf("midi octave %d\n", midi_config.octave); + } return false; case MIDI_VELOCITY_MIN ... MIDI_VELOCITY_MAX: - if (record->event.pressed) + if (record->event.pressed) { midi_config.velocity = keycode - MIDI_VELOCITY_MIN; + dprintf("midi velocity %d\n", midi_config.velocity); + } return false; case MI_VELD: - if (record->event.pressed && midi_config.velocity > 0) + if (record->event.pressed && midi_config.velocity > 0) { midi_config.velocity--; + dprintf("midi velocity %d\n", midi_config.velocity); + } return false; case MI_VELU: - if (record->event.pressed) + if (record->event.pressed) { midi_config.velocity++; + dprintf("midi velocity %d\n", midi_config.velocity); + } return false; case MIDI_CHANNEL_MIN ... MIDI_CHANNEL_MAX: - if (record->event.pressed) + if (record->event.pressed) { midi_config.channel = keycode - MIDI_CHANNEL_MIN; + dprintf("midi channel %d\n", midi_config.channel); + } return false; case MI_CHD: - if (record->event.pressed) + if (record->event.pressed) { midi_config.channel--; + dprintf("midi channel %d\n", midi_config.channel); + } return false; case MI_CHU: - if (record->event.pressed) + if (record->event.pressed) { midi_config.channel++; + dprintf("midi channel %d\n", midi_config.channel); + } + return false; + case MI_OFF: + if (record->event.pressed) { + midi_send_cc(&midi_device, midi_config.channel, 0x7B, 0); + dprintf("midi off\n"); + } return false; case MI_SUS: - //TODO + midi_send_cc(&midi_device, midi_config.channel, 0x40, record->event.pressed ? 127 : 0); + dprintf("midi sustain %d\n", record->event.pressed); + return false; + case MI_PORT: + midi_send_cc(&midi_device, midi_config.channel, 0x41, record->event.pressed ? 127 : 0); + dprintf("midi portamento %d\n", record->event.pressed); + return false; + case MI_SOST: + midi_send_cc(&midi_device, midi_config.channel, 0x42, record->event.pressed ? 127 : 0); + dprintf("midi sostenuto %d\n", record->event.pressed); + return false; + case MI_SOFT: + midi_send_cc(&midi_device, midi_config.channel, 0x43, record->event.pressed ? 127 : 0); + dprintf("midi soft %d\n", record->event.pressed); + return false; + case MI_LEG: + midi_send_cc(&midi_device, midi_config.channel, 0x43, record->event.pressed ? 127 : 0); + dprintf("midi legato %d\n", record->event.pressed); return false; }; diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index a024a96395..f2b9509b56 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -109,8 +109,6 @@ enum quantum_keycodes { #ifdef MIDI_ENABLE // Midi - MIDI_ON, - MIDI_OFF, MIDI_TONE_MIN, @@ -221,7 +219,13 @@ enum quantum_keycodes { MI_CHD, // previous channel MI_CHU, // next channel + MI_OFF, // all notes off + MI_SUS, // sustain + MI_PORT, // portamento + MI_SOST, // sostenuto + MI_SOFT, // soft + MI_LEG, // legato #endif // Backlight functionality @@ -394,9 +398,6 @@ enum quantum_keycodes { #define BL_ON BL_9 #define BL_OFF BL_0 -#define MI_ON MIDI_ON -#define MI_OFF MIDI_OFF - // GOTO layer - 16 layers max // when: // ON_PRESS = 1 From dd8f8e6baeb1549735403edf2a2f04f07edb4bf2 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sat, 18 Feb 2017 05:32:55 -0800 Subject: [PATCH 021/181] implement modulation --- quantum/process_keycode/process_midi.c | 58 ++++++- quantum/process_keycode/process_midi.h | 201 +------------------------ quantum/quantum_keycodes.h | 6 +- tmk_core/protocol/lufa/lufa.c | 2 +- 4 files changed, 61 insertions(+), 206 deletions(-) diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index f7a8b6650f..d09aa0b382 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -1,4 +1,5 @@ #include "process_midi.h" +#include "timer.h" typedef union { uint16_t raw; @@ -6,6 +7,7 @@ typedef union { uint8_t octave :4; uint8_t velocity :4; uint8_t channel :4; + uint8_t modulation_interval :4; }; } midi_config_t; @@ -16,6 +18,10 @@ midi_config_t midi_config; #define MIDI_TONE_COUNT (MIDI_TONE_MAX - MIDI_TONE_MIN + 1) static uint8_t tone_status[MIDI_TONE_COUNT]; +static uint8_t midi_modulation; +static int8_t midi_modulation_step; +static uint16_t midi_modulation_timer; + inline uint8_t compute_velocity(uint8_t setting) { return (setting + 1) * (128 / (MIDI_VELOCITY_MAX - MIDI_VELOCITY_MIN + 1)); @@ -26,14 +32,40 @@ void midi_init(void) midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN; midi_config.velocity = (MIDI_VELOCITY_MAX - MIDI_VELOCITY_MIN); midi_config.channel = 0; - #ifdef MIDI_USE_NOTE_ON_ARRAY - notes_on.length = 0; - #else + midi_config.modulation_interval = 8; + for (uint8_t i = 0; i < MIDI_TONE_COUNT; i++) { tone_status[i] = MIDI_INVALID_NOTE; } - #endif + + midi_modulation = 0; + midi_modulation_step = 0; + midi_modulation_timer = 0; +} + +void midi_task(void) +{ + if (timer_elapsed(midi_modulation_timer) < midi_config.modulation_interval) + return; + midi_modulation_timer = timer_read(); + + if (midi_modulation_step != 0) + { + dprintf("midi modulation %d\n", midi_modulation); + midi_send_cc(&midi_device, midi_config.channel, 0x1, midi_modulation); + + if (midi_modulation_step < 0 && midi_modulation < -midi_modulation_step) { + midi_modulation = 0; + midi_modulation_step = 0; + return; + } + + midi_modulation += midi_modulation_step; + + if (midi_modulation > 127) + midi_modulation = 127; + } } bool process_midi(uint16_t keycode, keyrecord_t *record) @@ -141,6 +173,24 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) midi_send_cc(&midi_device, midi_config.channel, 0x43, record->event.pressed ? 127 : 0); dprintf("midi legato %d\n", record->event.pressed); return false; + case MI_MOD: + midi_modulation_step = record->event.pressed ? 1 : -1; + return false; + case MI_MODSD: + if (record->event.pressed) { + midi_config.modulation_interval++; + // prevent overflow + if (midi_config.modulation_interval == 0) + midi_config.modulation_interval--; + dprintf("midi modulation interval %d\n", midi_config.modulation_interval); + } + return false; + case MI_MODSU: + if (record->event.pressed && midi_config.modulation_interval > 0) { + midi_config.modulation_interval--; + dprintf("midi modulation interval %d\n", midi_config.modulation_interval); + } + return false; }; return true; diff --git a/quantum/process_keycode/process_midi.h b/quantum/process_keycode/process_midi.h index b0e0aeb832..66ce60b0e5 100644 --- a/quantum/process_keycode/process_midi.h +++ b/quantum/process_keycode/process_midi.h @@ -5,206 +5,7 @@ #include "midi.h" void midi_init(void); - +void midi_task(void); bool process_midi(uint16_t keycode, keyrecord_t *record); -#define MIDI(n) ((n) | 0x6000) -#define MIDI12 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000 - -#define CHNL(note, channel) (note + (channel << 8)) - -#define SCALE (int8_t []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \ - 0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \ - 0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \ - 0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \ - 0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), } - -#define N_CN1 (0x600C + (12 * -1) + 0 ) -#define N_CN1S (0x600C + (12 * -1) + 1 ) -#define N_DN1F (0x600C + (12 * -1) + 1 ) -#define N_DN1 (0x600C + (12 * -1) + 2 ) -#define N_DN1S (0x600C + (12 * -1) + 3 ) -#define N_EN1F (0x600C + (12 * -1) + 3 ) -#define N_EN1 (0x600C + (12 * -1) + 4 ) -#define N_FN1 (0x600C + (12 * -1) + 5 ) -#define N_FN1S (0x600C + (12 * -1) + 6 ) -#define N_GN1F (0x600C + (12 * -1) + 6 ) -#define N_GN1 (0x600C + (12 * -1) + 7 ) -#define N_GN1S (0x600C + (12 * -1) + 8 ) -#define N_AN1F (0x600C + (12 * -1) + 8 ) -#define N_AN1 (0x600C + (12 * -1) + 9 ) -#define N_AN1S (0x600C + (12 * -1) + 10) -#define N_BN1F (0x600C + (12 * -1) + 10) -#define N_BN1 (0x600C + (12 * -1) + 11) -#define N_C0 (0x600C + (12 * 0) + 0 ) -#define N_C0S (0x600C + (12 * 0) + 1 ) -#define N_D0F (0x600C + (12 * 0) + 1 ) -#define N_D0 (0x600C + (12 * 0) + 2 ) -#define N_D0S (0x600C + (12 * 0) + 3 ) -#define N_E0F (0x600C + (12 * 0) + 3 ) -#define N_E0 (0x600C + (12 * 0) + 4 ) -#define N_F0 (0x600C + (12 * 0) + 5 ) -#define N_F0S (0x600C + (12 * 0) + 6 ) -#define N_G0F (0x600C + (12 * 0) + 6 ) -#define N_G0 (0x600C + (12 * 0) + 7 ) -#define N_G0S (0x600C + (12 * 0) + 8 ) -#define N_A0F (0x600C + (12 * 0) + 8 ) -#define N_A0 (0x600C + (12 * 0) + 9 ) -#define N_A0S (0x600C + (12 * 0) + 10) -#define N_B0F (0x600C + (12 * 0) + 10) -#define N_B0 (0x600C + (12 * 0) + 11) -#define N_C1 (0x600C + (12 * 1) + 0 ) -#define N_C1S (0x600C + (12 * 1) + 1 ) -#define N_D1F (0x600C + (12 * 1) + 1 ) -#define N_D1 (0x600C + (12 * 1) + 2 ) -#define N_D1S (0x600C + (12 * 1) + 3 ) -#define N_E1F (0x600C + (12 * 1) + 3 ) -#define N_E1 (0x600C + (12 * 1) + 4 ) -#define N_F1 (0x600C + (12 * 1) + 5 ) -#define N_F1S (0x600C + (12 * 1) + 6 ) -#define N_G1F (0x600C + (12 * 1) + 6 ) -#define N_G1 (0x600C + (12 * 1) + 7 ) -#define N_G1S (0x600C + (12 * 1) + 8 ) -#define N_A1F (0x600C + (12 * 1) + 8 ) -#define N_A1 (0x600C + (12 * 1) + 9 ) -#define N_A1S (0x600C + (12 * 1) + 10) -#define N_B1F (0x600C + (12 * 1) + 10) -#define N_B1 (0x600C + (12 * 1) + 11) -#define N_C2 (0x600C + (12 * 2) + 0 ) -#define N_C2S (0x600C + (12 * 2) + 1 ) -#define N_D2F (0x600C + (12 * 2) + 1 ) -#define N_D2 (0x600C + (12 * 2) + 2 ) -#define N_D2S (0x600C + (12 * 2) + 3 ) -#define N_E2F (0x600C + (12 * 2) + 3 ) -#define N_E2 (0x600C + (12 * 2) + 4 ) -#define N_F2 (0x600C + (12 * 2) + 5 ) -#define N_F2S (0x600C + (12 * 2) + 6 ) -#define N_G2F (0x600C + (12 * 2) + 6 ) -#define N_G2 (0x600C + (12 * 2) + 7 ) -#define N_G2S (0x600C + (12 * 2) + 8 ) -#define N_A2F (0x600C + (12 * 2) + 8 ) -#define N_A2 (0x600C + (12 * 2) + 9 ) -#define N_A2S (0x600C + (12 * 2) + 10) -#define N_B2F (0x600C + (12 * 2) + 10) -#define N_B2 (0x600C + (12 * 2) + 11) -#define N_C3 (0x600C + (12 * 3) + 0 ) -#define N_C3S (0x600C + (12 * 3) + 1 ) -#define N_D3F (0x600C + (12 * 3) + 1 ) -#define N_D3 (0x600C + (12 * 3) + 2 ) -#define N_D3S (0x600C + (12 * 3) + 3 ) -#define N_E3F (0x600C + (12 * 3) + 3 ) -#define N_E3 (0x600C + (12 * 3) + 4 ) -#define N_F3 (0x600C + (12 * 3) + 5 ) -#define N_F3S (0x600C + (12 * 3) + 6 ) -#define N_G3F (0x600C + (12 * 3) + 6 ) -#define N_G3 (0x600C + (12 * 3) + 7 ) -#define N_G3S (0x600C + (12 * 3) + 8 ) -#define N_A3F (0x600C + (12 * 3) + 8 ) -#define N_A3 (0x600C + (12 * 3) + 9 ) -#define N_A3S (0x600C + (12 * 3) + 10) -#define N_B3F (0x600C + (12 * 3) + 10) -#define N_B3 (0x600C + (12 * 3) + 11) -#define N_C4 (0x600C + (12 * 4) + 0 ) -#define N_C4S (0x600C + (12 * 4) + 1 ) -#define N_D4F (0x600C + (12 * 4) + 1 ) -#define N_D4 (0x600C + (12 * 4) + 2 ) -#define N_D4S (0x600C + (12 * 4) + 3 ) -#define N_E4F (0x600C + (12 * 4) + 3 ) -#define N_E4 (0x600C + (12 * 4) + 4 ) -#define N_F4 (0x600C + (12 * 4) + 5 ) -#define N_F4S (0x600C + (12 * 4) + 6 ) -#define N_G4F (0x600C + (12 * 4) + 6 ) -#define N_G4 (0x600C + (12 * 4) + 7 ) -#define N_G4S (0x600C + (12 * 4) + 8 ) -#define N_A4F (0x600C + (12 * 4) + 8 ) -#define N_A4 (0x600C + (12 * 4) + 9 ) -#define N_A4S (0x600C + (12 * 4) + 10) -#define N_B4F (0x600C + (12 * 4) + 10) -#define N_B4 (0x600C + (12 * 4) + 11) -#define N_C5 (0x600C + (12 * 5) + 0 ) -#define N_C5S (0x600C + (12 * 5) + 1 ) -#define N_D5F (0x600C + (12 * 5) + 1 ) -#define N_D5 (0x600C + (12 * 5) + 2 ) -#define N_D5S (0x600C + (12 * 5) + 3 ) -#define N_E5F (0x600C + (12 * 5) + 3 ) -#define N_E5 (0x600C + (12 * 5) + 4 ) -#define N_F5 (0x600C + (12 * 5) + 5 ) -#define N_F5S (0x600C + (12 * 5) + 6 ) -#define N_G5F (0x600C + (12 * 5) + 6 ) -#define N_G5 (0x600C + (12 * 5) + 7 ) -#define N_G5S (0x600C + (12 * 5) + 8 ) -#define N_A5F (0x600C + (12 * 5) + 8 ) -#define N_A5 (0x600C + (12 * 5) + 9 ) -#define N_A5S (0x600C + (12 * 5) + 10) -#define N_B5F (0x600C + (12 * 5) + 10) -#define N_B5 (0x600C + (12 * 5) + 11) -#define N_C6 (0x600C + (12 * 6) + 0 ) -#define N_C6S (0x600C + (12 * 6) + 1 ) -#define N_D6F (0x600C + (12 * 6) + 1 ) -#define N_D6 (0x600C + (12 * 6) + 2 ) -#define N_D6S (0x600C + (12 * 6) + 3 ) -#define N_E6F (0x600C + (12 * 6) + 3 ) -#define N_E6 (0x600C + (12 * 6) + 4 ) -#define N_F6 (0x600C + (12 * 6) + 5 ) -#define N_F6S (0x600C + (12 * 6) + 6 ) -#define N_G6F (0x600C + (12 * 6) + 6 ) -#define N_G6 (0x600C + (12 * 6) + 7 ) -#define N_G6S (0x600C + (12 * 6) + 8 ) -#define N_A6F (0x600C + (12 * 6) + 8 ) -#define N_A6 (0x600C + (12 * 6) + 9 ) -#define N_A6S (0x600C + (12 * 6) + 10) -#define N_B6F (0x600C + (12 * 6) + 10) -#define N_B6 (0x600C + (12 * 6) + 11) -#define N_C7 (0x600C + (12 * 7) + 0 ) -#define N_C7S (0x600C + (12 * 7) + 1 ) -#define N_D7F (0x600C + (12 * 7) + 1 ) -#define N_D7 (0x600C + (12 * 7) + 2 ) -#define N_D7S (0x600C + (12 * 7) + 3 ) -#define N_E7F (0x600C + (12 * 7) + 3 ) -#define N_E7 (0x600C + (12 * 7) + 4 ) -#define N_F7 (0x600C + (12 * 7) + 5 ) -#define N_F7S (0x600C + (12 * 7) + 6 ) -#define N_G7F (0x600C + (12 * 7) + 6 ) -#define N_G7 (0x600C + (12 * 7) + 7 ) -#define N_G7S (0x600C + (12 * 7) + 8 ) -#define N_A7F (0x600C + (12 * 7) + 8 ) -#define N_A7 (0x600C + (12 * 7) + 9 ) -#define N_A7S (0x600C + (12 * 7) + 10) -#define N_B7F (0x600C + (12 * 7) + 10) -#define N_B7 (0x600C + (12 * 7) + 11) -#define N_C8 (0x600C + (12 * 8) + 0 ) -#define N_C8S (0x600C + (12 * 8) + 1 ) -#define N_D8F (0x600C + (12 * 8) + 1 ) -#define N_D8 (0x600C + (12 * 8) + 2 ) -#define N_D8S (0x600C + (12 * 8) + 3 ) -#define N_E8F (0x600C + (12 * 8) + 3 ) -#define N_E8 (0x600C + (12 * 8) + 4 ) -#define N_F8 (0x600C + (12 * 8) + 5 ) -#define N_F8S (0x600C + (12 * 8) + 6 ) -#define N_G8F (0x600C + (12 * 8) + 6 ) -#define N_G8 (0x600C + (12 * 8) + 7 ) -#define N_G8S (0x600C + (12 * 8) + 8 ) -#define N_A8F (0x600C + (12 * 8) + 8 ) -#define N_A8 (0x600C + (12 * 8) + 9 ) -#define N_A8S (0x600C + (12 * 8) + 10) -#define N_B8F (0x600C + (12 * 8) + 10) -#define N_B8 (0x600C + (12 * 8) + 11) -#define N_C8 (0x600C + (12 * 8) + 0 ) -#define N_C8S (0x600C + (12 * 8) + 1 ) -#define N_D8F (0x600C + (12 * 8) + 1 ) -#define N_D8 (0x600C + (12 * 8) + 2 ) -#define N_D8S (0x600C + (12 * 8) + 3 ) -#define N_E8F (0x600C + (12 * 8) + 3 ) -#define N_E8 (0x600C + (12 * 8) + 4 ) -#define N_F8 (0x600C + (12 * 8) + 5 ) -#define N_F8S (0x600C + (12 * 8) + 6 ) -#define N_G8F (0x600C + (12 * 8) + 6 ) -#define N_G8 (0x600C + (12 * 8) + 7 ) -#define N_G8S (0x600C + (12 * 8) + 8 ) -#define N_A8F (0x600C + (12 * 8) + 8 ) -#define N_A8 (0x600C + (12 * 8) + 9 ) -#define N_A8S (0x600C + (12 * 8) + 10) -#define N_B8F (0x600C + (12 * 8) + 10) -#define N_B8 (0x600C + (12 * 8) + 11) - #endif \ No newline at end of file diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index f2b9509b56..4423d25eff 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -224,8 +224,12 @@ enum quantum_keycodes { MI_SUS, // sustain MI_PORT, // portamento MI_SOST, // sostenuto - MI_SOFT, // soft + MI_SOFT, // soft pedal MI_LEG, // legato + + MI_MOD, // modulation + MI_MODSD, // decrease modulation speed + MI_MODSU, // increase modulation speed #endif // Backlight functionality diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index fb60658df7..bd24980573 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -1180,7 +1180,7 @@ int main(void) #ifdef MIDI_ENABLE midi_device_process(&midi_device); - // MIDI_Task(); + midi_task(); #endif #if defined(RGBLIGHT_ANIMATIONS) & defined(RGBLIGHT_ENABLE) From 5e6097f0154403dccb9b5658390c84441aa509bc Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sat, 18 Feb 2017 06:19:48 -0800 Subject: [PATCH 022/181] add keycodes for transpose range --- quantum/process_keycode/process_midi.c | 37 +++++++++++++++++++++----- quantum/quantum_keycodes.h | 18 +++++++++++++ 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index d09aa0b382..4d60aefb1c 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -2,12 +2,13 @@ #include "timer.h" typedef union { - uint16_t raw; + uint32_t raw; struct { - uint8_t octave :4; - uint8_t velocity :4; - uint8_t channel :4; - uint8_t modulation_interval :4; + uint8_t octave :4; + int8_t transpose :4; + uint8_t velocity :4; + uint8_t channel :4; + uint8_t modulation_interval :4; }; } midi_config_t; @@ -29,7 +30,8 @@ inline uint8_t compute_velocity(uint8_t setting) void midi_init(void) { - midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN; + midi_config.octave = MI_OCT_2 - MIDI_OCTAVE_MIN; + midi_config.transpose = 0; midi_config.velocity = (MIDI_VELOCITY_MAX - MIDI_VELOCITY_MIN); midi_config.channel = 0; midi_config.modulation_interval = 8; @@ -77,7 +79,7 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) uint8_t tone = keycode - MIDI_TONE_MIN; uint8_t velocity = compute_velocity(midi_config.velocity); if (record->event.pressed) { - uint8_t note = 12 * midi_config.octave + tone; + uint8_t note = 12 * midi_config.octave + tone + midi_config.transpose; midi_send_noteon(&midi_device, channel, note, velocity); dprintf("midi noteon channel:%d note:%d velocity:%d\n", channel, note, velocity); tone_status[tone] = note; @@ -111,6 +113,27 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) dprintf("midi octave %d\n", midi_config.octave); } return false; + case MIDI_TRANSPOSE_MIN ... MIDI_TRANSPOSE_MAX: + if (record->event.pressed) { + midi_config.transpose = keycode - MI_TRNS_0; + dprintf("midi transpose %d\n", midi_config.transpose); + } + return false; + case MI_TRNSD: + if (record->event.pressed && midi_config.transpose > (MIDI_TRANSPOSE_MIN - MI_TRNS_0)) { + midi_config.transpose--; + dprintf("midi transpose %d\n", midi_config.transpose); + } + return false; + case MI_TRNSU: + if (record->event.pressed && midi_config.transpose < (MIDI_TRANSPOSE_MAX - MI_TRNS_0)) { + const bool positive = midi_config.transpose > 0; + midi_config.transpose++; + if (positive && midi_config.transpose < 0) + midi_config.transpose--; + dprintf("midi transpose %d\n", midi_config.transpose); + } + return false; case MIDI_VELOCITY_MIN ... MIDI_VELOCITY_MAX: if (record->event.pressed) { midi_config.velocity = keycode - MIDI_VELOCITY_MIN; diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 4423d25eff..30cc9abdb4 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -183,6 +183,24 @@ enum quantum_keycodes { MI_OCTD, // octave down MI_OCTU, // octave up + MIDI_TRANSPOSE_MIN, + MI_TRNS_N6 = MIDI_TRANSPOSE_MIN, + MI_TRNS_N5, + MI_TRNS_N4, + MI_TRNS_N3, + MI_TRNS_N2, + MI_TRNS_N1, + MI_TRNS_0, + MI_TRNS_1, + MI_TRNS_2, + MI_TRNS_3, + MI_TRNS_4, + MI_TRNS_5, + MI_TRNS_6, + MIDI_TRANSPOSE_MAX = MI_TRNS_6, + MI_TRNSD, // transpose down + MI_TRNSU, // transpose up + MIDI_VELOCITY_MIN, MI_VEL_1 = MIDI_VELOCITY_MIN, MI_VEL_2, From ae0752dff552a07fb52e08c7057979959959d247 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sat, 18 Feb 2017 21:07:07 -0800 Subject: [PATCH 023/181] expose midi_config --- quantum/process_keycode/process_midi.c | 23 ++++++----------------- quantum/process_keycode/process_midi.h | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index 4d60aefb1c..9190fa0471 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -1,22 +1,6 @@ #include "process_midi.h" #include "timer.h" -typedef union { - uint32_t raw; - struct { - uint8_t octave :4; - int8_t transpose :4; - uint8_t velocity :4; - uint8_t channel :4; - uint8_t modulation_interval :4; - }; -} midi_config_t; - -midi_config_t midi_config; - -#define MIDI_INVALID_NOTE 0xFF - -#define MIDI_TONE_COUNT (MIDI_TONE_MAX - MIDI_TONE_MIN + 1) static uint8_t tone_status[MIDI_TONE_COUNT]; static uint8_t midi_modulation; @@ -70,6 +54,11 @@ void midi_task(void) } } +uint8_t midi_compute_note(uint16_t keycode) +{ + return 12 * midi_config.octave + (keycode - MIDI_TONE_MIN) + midi_config.transpose; +} + bool process_midi(uint16_t keycode, keyrecord_t *record) { switch (keycode) { @@ -79,7 +68,7 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) uint8_t tone = keycode - MIDI_TONE_MIN; uint8_t velocity = compute_velocity(midi_config.velocity); if (record->event.pressed) { - uint8_t note = 12 * midi_config.octave + tone + midi_config.transpose; + uint8_t note = midi_compute_note(keycode); midi_send_noteon(&midi_device, channel, note, velocity); dprintf("midi noteon channel:%d note:%d velocity:%d\n", channel, note, velocity); tone_status[tone] = note; diff --git a/quantum/process_keycode/process_midi.h b/quantum/process_keycode/process_midi.h index 66ce60b0e5..ffd41579f2 100644 --- a/quantum/process_keycode/process_midi.h +++ b/quantum/process_keycode/process_midi.h @@ -4,8 +4,26 @@ #include "quantum.h" #include "midi.h" +typedef union { + uint32_t raw; + struct { + uint8_t octave :4; + int8_t transpose :4; + uint8_t velocity :4; + uint8_t channel :4; + uint8_t modulation_interval :4; + }; +} midi_config_t; + +midi_config_t midi_config; + void midi_init(void); void midi_task(void); bool process_midi(uint16_t keycode, keyrecord_t *record); +#define MIDI_INVALID_NOTE 0xFF +#define MIDI_TONE_COUNT (MIDI_TONE_MAX - MIDI_TONE_MIN + 1) + +uint8_t midi_compute_note(uint16_t keycode); + #endif \ No newline at end of file From d1fe24ad9f85768774ae50465c71f3757a33cc00 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sun, 19 Feb 2017 17:18:05 -0800 Subject: [PATCH 024/181] Allow customization of the number of tone keycodes and add example keymap --- keyboards/satan/keymaps/midi/Makefile | 21 +++++++ keyboards/satan/keymaps/midi/config.h | 11 ++++ keyboards/satan/keymaps/midi/keymap.c | 60 ++++++++++++++++++ keyboards/satan/keymaps/midi/readme.md | 1 + quantum/quantum_keycodes.h | 84 ++++++++++++++++++++++++++ quantum/template/config.h | 3 + 6 files changed, 180 insertions(+) create mode 100644 keyboards/satan/keymaps/midi/Makefile create mode 100644 keyboards/satan/keymaps/midi/config.h create mode 100644 keyboards/satan/keymaps/midi/keymap.c create mode 100644 keyboards/satan/keymaps/midi/readme.md diff --git a/keyboards/satan/keymaps/midi/Makefile b/keyboards/satan/keymaps/midi/Makefile new file mode 100644 index 0000000000..5cbda96cee --- /dev/null +++ b/keyboards/satan/keymaps/midi/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = yes # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/satan/keymaps/midi/config.h b/keyboards/satan/keymaps/midi/config.h new file mode 100644 index 0000000000..e345d40c96 --- /dev/null +++ b/keyboards/satan/keymaps/midi/config.h @@ -0,0 +1,11 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// place overrides here + +/* override number of MIDI tone keycodes (each octave adds 12 bytes) */ +#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/satan/keymaps/midi/keymap.c b/keyboards/satan/keymaps/midi/keymap.c new file mode 100644 index 0000000000..ac97259331 --- /dev/null +++ b/keyboards/satan/keymaps/midi/keymap.c @@ -0,0 +1,60 @@ +#include "satan.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 _BL 0 +#define _ML 1 + +// readability +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: (Base Layer) Default Layer + * ,-----------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | + * |-----------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Alt |Gui |FN |Ctrl | + * `-----------------------------------------------------------' + */ +[_BL] = KEYMAP_ANSI( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ + 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_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, TG(_ML), KC_RCTL), + +/* Keymap _ML: MIDI Layer + * ,------------------------------------------------------------------------. + * | Exit | | | | | | | | | | | | | | + * |------------------------------------------------------------------------| + * | Ch+ | | C# | D# | | F# | G# | A# | | C# | D# | | | | + * |------------------------------------------------------------------------| + * | Mod | C | D | E | F | G | A | B | C | D | E | F |>>OnStage| + * |------------------------------------------------------------------------| + * | Sustain |Oct-|Oct+|Mod-|Mod+| | | |Tns-|Tns+|Tns0| Sustain | + * |------------------------------------------------------------------------| + * | | | | All notes off | | | | | + * `------------------------------------------------------------------------' + * + * Foot switches: + * ,--------. ,--------. + * | | | | + * | | | | + * `--------' `--------' + */ +[_ML] = KEYMAP_ANSI( + TG(_ML), MI_VEL_1, MI_VEL_2, MI_VEL_3, MI_VEL_4, MI_VEL_5, MI_VEL_6, MI_VEL_7, MI_VEL_8, MI_VEL_9, MI_VEL_10, XXXXXXX, XXXXXXX, XXXXXXX, \ + MI_CHU, XXXXXXX, MI_Cs, MI_Ds, XXXXXXX, MI_Fs, MI_Gs, MI_As, XXXXXXX, MI_Cs_1, MI_Ds_1, XXXXXXX, XXXXXXX, XXXXXXX, \ + MI_MOD, MI_C, MI_D, MI_E, MI_F, MI_G, MI_A, MI_B, MI_C_1, MI_D_1, MI_E_1, MI_F_1, _______, \ + MI_SUS, MI_OCTD, MI_OCTU, MI_MODSD, MI_MODSU, XXXXXXX, XXXXXXX, XXXXXXX, MI_TRNSD, MI_TRNSU, MI_TRNS_0, MI_SUS, \ + _______, _______, _______, MI_OFF, _______, _______, _______, _______), +}; \ No newline at end of file diff --git a/keyboards/satan/keymaps/midi/readme.md b/keyboards/satan/keymaps/midi/readme.md new file mode 100644 index 0000000000..87844a854b --- /dev/null +++ b/keyboards/satan/keymaps/midi/readme.md @@ -0,0 +1 @@ +# Satan GH60 layout demonstrating MIDI key mapping diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 30cc9abdb4..6d1438051e 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -2,6 +2,12 @@ #ifndef QUANTUM_KEYCODES_H #define QUANTUM_KEYCODES_H +#ifdef MIDI_ENABLE +#ifndef MIDI_TONE_KEYCODE_OCTAVES +#define MIDI_TONE_KEYCODE_OCTAVES 3 +#endif +#endif + enum quantum_keycodes { // Ranges used in shortucuts - not to be used directly QK_TMK = 0x0000, @@ -112,6 +118,7 @@ enum quantum_keycodes { MIDI_TONE_MIN, +#if MIDI_TONE_KEYCODE_OCTAVES > 0 MI_C = MIDI_TONE_MIN, MI_Cs, MI_Db = MI_Cs, @@ -129,7 +136,9 @@ enum quantum_keycodes { MI_As, MI_Bb = MI_As, MI_B, +#endif +#if MIDI_TONE_KEYCODE_OCTAVES > 1 MI_C_1, MI_Cs_1, MI_Db_1 = MI_Cs_1, @@ -147,7 +156,9 @@ enum quantum_keycodes { MI_As_1, MI_Bb_1 = MI_As_1, MI_B_1, +#endif +#if MIDI_TONE_KEYCODE_OCTAVES > 2 MI_C_2, MI_Cs_2, MI_Db_2 = MI_Cs_2, @@ -165,8 +176,81 @@ enum quantum_keycodes { MI_As_2, MI_Bb_2 = MI_As_2, MI_B_2, +#endif +#if MIDI_TONE_KEYCODE_OCTAVES > 3 + MI_C_3, + MI_Cs_3, + MI_Db_3 = MI_Cs_3, + MI_D_3, + MI_Ds_3, + MI_Eb_3 = MI_Ds_3, + MI_E_3, + MI_F_3, + MI_Fs_3, + MI_Gb_3 = MI_Fs_3, + MI_G_3, + MI_Gs_3, + MI_Ab_3 = MI_Gs_3, + MI_A_3, + MI_As_3, + MI_Bb_3 = MI_As_3, + MI_B_3, +#endif + +#if MIDI_TONE_KEYCODE_OCTAVES > 4 + MI_C_4, + MI_Cs_4, + MI_Db_4 = MI_Cs_4, + MI_D_4, + MI_Ds_4, + MI_Eb_4 = MI_Ds_4, + MI_E_4, + MI_F_4, + MI_Fs_4, + MI_Gb_4 = MI_Fs_4, + MI_G_4, + MI_Gs_4, + MI_Ab_4 = MI_Gs_4, + MI_A_4, + MI_As_4, + MI_Bb_4 = MI_As_4, + MI_B_4, +#endif + +#if MIDI_TONE_KEYCODE_OCTAVES > 5 + MI_C_5, + MI_Cs_5, + MI_Db_5 = MI_Cs_5, + MI_D_5, + MI_Ds_5, + MI_Eb_5 = MI_Ds_5, + MI_E_5, + MI_F_5, + MI_Fs_5, + MI_Gb_5 = MI_Fs_5, + MI_G_5, + MI_Gs_5, + MI_Ab_5 = MI_Gs_5, + MI_A_5, + MI_As_5, + MI_Bb_5 = MI_As_5, + MI_B_5, +#endif + +#if MIDI_TONE_KEYCODE_OCTAVES > 5 + MIDI_TONE_MAX = MI_B_5, +#elif MIDI_TONE_KEYCODE_OCTAVES > 4 + MIDI_TONE_MAX = MI_B_4, +#elif MIDI_TONE_KEYCODE_OCTAVES > 3 + MIDI_TONE_MAX = MI_B_3, +#elif MIDI_TONE_KEYCODE_OCTAVES > 2 MIDI_TONE_MAX = MI_B_2, +#elif MIDI_TONE_KEYCODE_OCTAVES > 1 + MIDI_TONE_MAX = MI_B_1, +#elif MIDI_TONE_KEYCODE_OCTAVES > 0 + MIDI_TONE_MAX = MI_B, +#endif MIDI_OCTAVE_MIN, MI_OCT_N2 = MIDI_OCTAVE_MIN, diff --git a/quantum/template/config.h b/quantum/template/config.h index c61c4a6181..d0bee0d89a 100644 --- a/quantum/template/config.h +++ b/quantum/template/config.h @@ -159,4 +159,7 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION +/* override number of MIDI tone keycodes (each octave adds 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 1 + #endif From ed15973a3ffff6e18e62f81654632b97961f18d2 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sun, 19 Feb 2017 17:45:08 -0800 Subject: [PATCH 025/181] Document size added by MIDI_ENABLE (~3800 bytes according to my experiments) satan/keymaps/midi MIDI_ENABLE = no text data bss dec hex filename 0 17080 0 17080 42b8 satan_midi.hex MIDI_ENABLE = yes #define MIDI_TONE_KEYCODE_OCTAVES 3 // default text data bss dec hex filename 0 20846 0 20846 516e satan_midi.hex MIDI_ENABLE = yes #define MIDI_TONE_KEYCODE_OCTAVES 2 // fewer octaves text data bss dec hex filename 0 20846 0 20846 516e satan_midi.hex --- keyboards/satan/keymaps/midi/Makefile | 2 +- keyboards/satan/keymaps/midi/config.h | 2 +- keyboards/satan/keymaps/midi/keymap.c | 2 ++ quantum/process_keycode/process_midi.c | 2 ++ quantum/template/config.h | 2 +- quantum/template/keymaps/default/Makefile | 2 +- 6 files changed, 8 insertions(+), 4 deletions(-) diff --git a/keyboards/satan/keymaps/midi/Makefile b/keyboards/satan/keymaps/midi/Makefile index 5cbda96cee..4e2d9d2f7c 100644 --- a/keyboards/satan/keymaps/midi/Makefile +++ b/keyboards/satan/keymaps/midi/Makefile @@ -9,7 +9,7 @@ CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -MIDI_ENABLE = yes # MIDI controls +MIDI_ENABLE = yes # MIDI support (+3800) AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID diff --git a/keyboards/satan/keymaps/midi/config.h b/keyboards/satan/keymaps/midi/config.h index e345d40c96..0dbdb5cbcd 100644 --- a/keyboards/satan/keymaps/midi/config.h +++ b/keyboards/satan/keymaps/midi/config.h @@ -5,7 +5,7 @@ // place overrides here -/* override number of MIDI tone keycodes (each octave adds 12 bytes) */ +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ #define MIDI_TONE_KEYCODE_OCTAVES 2 #endif \ No newline at end of file diff --git a/keyboards/satan/keymaps/midi/keymap.c b/keyboards/satan/keymaps/midi/keymap.c index ac97259331..004690f413 100644 --- a/keyboards/satan/keymaps/midi/keymap.c +++ b/keyboards/satan/keymaps/midi/keymap.c @@ -32,6 +32,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, TG(_ML), KC_RCTL), +#ifdef MIDI_ENABLE /* Keymap _ML: MIDI Layer * ,------------------------------------------------------------------------. * | Exit | | | | | | | | | | | | | | @@ -57,4 +58,5 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { MI_MOD, MI_C, MI_D, MI_E, MI_F, MI_G, MI_A, MI_B, MI_C_1, MI_D_1, MI_E_1, MI_F_1, _______, \ MI_SUS, MI_OCTD, MI_OCTU, MI_MODSD, MI_MODSU, XXXXXXX, XXXXXXX, XXXXXXX, MI_TRNSD, MI_TRNSU, MI_TRNS_0, MI_SUS, \ _______, _______, _______, MI_OFF, _______, _______, _______, _______), +#endif }; \ No newline at end of file diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index 9190fa0471..5530ea97c4 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -1,3 +1,5 @@ +#define MIDI_TONE_KEYCODE_OCTAVES 2 + #include "process_midi.h" #include "timer.h" diff --git a/quantum/template/config.h b/quantum/template/config.h index d0bee0d89a..cd6dfa2c6a 100644 --- a/quantum/template/config.h +++ b/quantum/template/config.h @@ -159,7 +159,7 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION -/* override number of MIDI tone keycodes (each octave adds 12 bytes) */ +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 #endif diff --git a/quantum/template/keymaps/default/Makefile b/quantum/template/keymaps/default/Makefile index f4671a9d11..24442db37d 100644 --- a/quantum/template/keymaps/default/Makefile +++ b/quantum/template/keymaps/default/Makefile @@ -9,7 +9,7 @@ CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls +MIDI_ENABLE = no # MIDI support (+3800) AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID From 64eecfc5303788bd82bf2fb466ec4a6f1bd0c028 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sun, 19 Feb 2017 22:23:06 -0800 Subject: [PATCH 026/181] fix typos in keymap --- keyboards/satan/keymaps/midi/keymap.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/keyboards/satan/keymaps/midi/keymap.c b/keyboards/satan/keymaps/midi/keymap.c index 004690f413..397fe097bd 100644 --- a/keyboards/satan/keymaps/midi/keymap.c +++ b/keyboards/satan/keymaps/midi/keymap.c @@ -22,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----------------------------------------------------------| * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | * |-----------------------------------------------------------| - * |Ctrl|Gui |Alt | Space |Alt |Gui |FN |Ctrl | + * |Ctrl|Gui |Alt | Space |Alt |Gui |Midi|Ctrl | * `-----------------------------------------------------------' */ [_BL] = KEYMAP_ANSI( @@ -39,18 +39,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------------------------------------------------------------------------| * | Ch+ | | C# | D# | | F# | G# | A# | | C# | D# | | | | * |------------------------------------------------------------------------| - * | Mod | C | D | E | F | G | A | B | C | D | E | F |>>OnStage| + * | Mod | C | D | E | F | G | A | B | C | D | E | F | | * |------------------------------------------------------------------------| * | Sustain |Oct-|Oct+|Mod-|Mod+| | | |Tns-|Tns+|Tns0| Sustain | * |------------------------------------------------------------------------| * | | | | All notes off | | | | | * `------------------------------------------------------------------------' - * - * Foot switches: - * ,--------. ,--------. - * | | | | - * | | | | - * `--------' `--------' */ [_ML] = KEYMAP_ANSI( TG(_ML), MI_VEL_1, MI_VEL_2, MI_VEL_3, MI_VEL_4, MI_VEL_5, MI_VEL_6, MI_VEL_7, MI_VEL_8, MI_VEL_9, MI_VEL_10, XXXXXXX, XXXXXXX, XXXXXXX, \ From 525be99ee938aa6e48448d7dd6ea6e6fe50bb36d Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sat, 25 Feb 2017 15:02:43 -0800 Subject: [PATCH 027/181] Split MIDI functionality into MIDI_BASIC and MIDI_ADVANCED MIDI_ENABLE = no text data bss dec hex filename 0 17080 0 17080 42b8 satan_midi.hex MIDI_ENABLE = yes MIDI_BASIC undefined MIDI_ADVANCED undefined text data bss dec hex filename 0 19494 0 19494 4c26 satan_midi.hex MIDI_ENABLE = yes #define MIDI_BASIC MIDI_ADVANCED undefined text data bss dec hex filename 0 19788 0 19788 4d4c satan_midi.hex MIDI_ENABLE = yes MIDI_BASIC undefined #define MIDI_ADVANCED text data bss dec hex filename 0 20846 0 20846 516e satan_midi.hex MIDI_ENABLE = yes #define MIDI_BASIC #define MIDI_ADVANCED text data bss dec hex filename 0 21140 0 21140 5294 satan_midi.hex --- build_keyboard.mk | 1 + keyboards/satan/keymaps/midi/config.h | 17 ++++++++++++++++- keyboards/satan/keymaps/midi/keymap.c | 4 ++-- quantum/process_keycode/process_midi.c | 9 ++++++--- quantum/process_keycode/process_music.c | 22 ++++++++++++++++++++++ quantum/quantum.c | 4 ++-- quantum/quantum_keycodes.h | 13 ++++++++++--- quantum/template/config.h | 17 +++++++++++++++++ tmk_core/protocol/lufa/lufa.c | 4 ++++ 9 files changed, 80 insertions(+), 11 deletions(-) diff --git a/build_keyboard.mk b/build_keyboard.mk index 4a6fc0980f..eea8d5919a 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -141,6 +141,7 @@ endif ifeq ($(strip $(MIDI_ENABLE)), yes) OPT_DEFS += -DMIDI_ENABLE + SRC += $(QUANTUM_DIR)/process_keycode/process_music.c SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c endif diff --git a/keyboards/satan/keymaps/midi/config.h b/keyboards/satan/keymaps/midi/config.h index 0dbdb5cbcd..59250b49e2 100644 --- a/keyboards/satan/keymaps/midi/config.h +++ b/keyboards/satan/keymaps/midi/config.h @@ -3,7 +3,22 @@ #include "../../config.h" -// place overrides here +/* + * MIDI options + */ + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +#define MIDI_ADVANCED /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ #define MIDI_TONE_KEYCODE_OCTAVES 2 diff --git a/keyboards/satan/keymaps/midi/keymap.c b/keyboards/satan/keymaps/midi/keymap.c index 397fe097bd..349391c3bf 100644 --- a/keyboards/satan/keymaps/midi/keymap.c +++ b/keyboards/satan/keymaps/midi/keymap.c @@ -32,7 +32,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, TG(_ML), KC_RCTL), -#ifdef MIDI_ENABLE +#if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED) /* Keymap _ML: MIDI Layer * ,------------------------------------------------------------------------. * | Exit | | | | | | | | | | | | | | @@ -51,6 +51,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { MI_CHU, XXXXXXX, MI_Cs, MI_Ds, XXXXXXX, MI_Fs, MI_Gs, MI_As, XXXXXXX, MI_Cs_1, MI_Ds_1, XXXXXXX, XXXXXXX, XXXXXXX, \ MI_MOD, MI_C, MI_D, MI_E, MI_F, MI_G, MI_A, MI_B, MI_C_1, MI_D_1, MI_E_1, MI_F_1, _______, \ MI_SUS, MI_OCTD, MI_OCTU, MI_MODSD, MI_MODSU, XXXXXXX, XXXXXXX, XXXXXXX, MI_TRNSD, MI_TRNSU, MI_TRNS_0, MI_SUS, \ - _______, _______, _______, MI_OFF, _______, _______, _______, _______), + _______, _______, _______, MI_ALLOFF, _______, _______, _______, _______), #endif }; \ No newline at end of file diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index 5530ea97c4..161f04a245 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -1,6 +1,7 @@ -#define MIDI_TONE_KEYCODE_OCTAVES 2 - #include "process_midi.h" + +#if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED) + #include "timer.h" static uint8_t tone_status[MIDI_TONE_COUNT]; @@ -161,7 +162,7 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) dprintf("midi channel %d\n", midi_config.channel); } return false; - case MI_OFF: + case MI_ALLOFF: if (record->event.pressed) { midi_send_cc(&midi_device, midi_config.channel, 0x7B, 0); dprintf("midi off\n"); @@ -209,3 +210,5 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) return true; } + +#endif // MIDI_ADVANCED diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c index 1e2648bff5..ac906b6281 100644 --- a/quantum/process_keycode/process_music.c +++ b/quantum/process_keycode/process_music.c @@ -17,6 +17,7 @@ static uint16_t music_sequence_interval = 100; bool process_music(uint16_t keycode, keyrecord_t *record) { + #ifdef AUDIO_ENABLE if (keycode == AU_ON && record->event.pressed) { audio_on(); return false; @@ -38,6 +39,7 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { } return false; } + #endif // AUDIO_ENABLE if (keycode == MU_ON && record->event.pressed) { music_on(); @@ -61,6 +63,7 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { return false; } + #ifdef AUDIO_ENABLE if (keycode == MUV_IN && record->event.pressed) { voice_iterate(); music_scale_user(); @@ -72,11 +75,14 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { music_scale_user(); return false; } + #endif // AUDIO_ENABLE if (music_activated) { if (keycode == KC_LCTL && record->event.pressed) { // Start recording + #ifdef AUDIO_ENABLE stop_all_notes(); + #endif music_sequence_recording = true; music_sequence_recorded = false; music_sequence_playing = false; @@ -85,7 +91,9 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { } if (keycode == KC_LALT && record->event.pressed) { // Stop recording/playing + #ifdef AUDIO_ENABLE stop_all_notes(); + #endif if (music_sequence_recording) { // was recording music_sequence_recorded = true; } @@ -95,7 +103,9 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { } if (keycode == KC_LGUI && record->event.pressed && music_sequence_recorded) { // Start playing + #ifdef AUDIO_ENABLE stop_all_notes(); + #endif music_sequence_recording = false; music_sequence_playing = true; music_sequence_position = 0; @@ -116,6 +126,7 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { } #define MUSIC_MODE_GUITAR + #ifdef AUDIO_ENABLE #ifdef MUSIC_MODE_CHROMATIC float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + record->event.key.col + music_offset)/12.0+(MATRIX_ROWS - record->event.key.row)); #elif defined(MUSIC_MODE_GUITAR) @@ -125,15 +136,20 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { #else float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + SCALE[record->event.key.col + music_offset])/12.0+(MATRIX_ROWS - record->event.key.row)); #endif + #endif // AUDIO_ENABLE if (record->event.pressed) { + #ifdef AUDIO_ENABLE play_note(freq, 0xF); if (music_sequence_recording) { music_sequence[music_sequence_count] = freq; music_sequence_count++; } + #endif } else { + #ifdef AUDIO_ENABLE stop_note(freq); + #endif } if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through @@ -161,15 +177,19 @@ void music_on(void) { void music_off(void) { music_activated = 0; + #ifdef AUDIO_ENABLE stop_all_notes(); + #endif } __attribute__ ((weak)) void music_on_user() {} +#ifdef AUDIO_ENABLE __attribute__ ((weak)) void audio_on_user() {} +#endif __attribute__ ((weak)) void music_scale_user() {} @@ -178,8 +198,10 @@ void matrix_scan_music(void) { if (music_sequence_playing) { if ((music_sequence_timer == 0) || (timer_elapsed(music_sequence_timer) > music_sequence_interval)) { music_sequence_timer = timer_read(); + #ifdef AUDIO_ENABLE stop_note(music_sequence[(music_sequence_position - 1 < 0)?(music_sequence_position - 1 + music_sequence_count):(music_sequence_position - 1)]); play_note(music_sequence[music_sequence_position], 0xF); + #endif music_sequence_position = (music_sequence_position + 1) % music_sequence_count; } } diff --git a/quantum/quantum.c b/quantum/quantum.c index 4a6d0355fa..83fa877088 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -150,10 +150,10 @@ bool process_record_quantum(keyrecord_t *record) { if (!( process_record_kb(keycode, record) && - #ifdef MIDI_ENABLE + #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED) process_midi(keycode, record) && #endif - #ifdef AUDIO_ENABLE + #if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) process_music(keycode, record) && #endif #ifdef TAP_DANCE_ENABLE diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 6d1438051e..3b82b7208c 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -2,7 +2,7 @@ #ifndef QUANTUM_KEYCODES_H #define QUANTUM_KEYCODES_H -#ifdef MIDI_ENABLE +#if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED) #ifndef MIDI_TONE_KEYCODE_OCTAVES #define MIDI_TONE_KEYCODE_OCTAVES 3 #endif @@ -116,6 +116,12 @@ enum quantum_keycodes { #ifdef MIDI_ENABLE // Midi +#ifdef MIDI_BASIC + MI_ON, // send midi notes when music mode is enabled + MI_OFF, // don't send midi notes when music mode is enabled +#endif + +#ifdef MIDI_ADVANCED MIDI_TONE_MIN, #if MIDI_TONE_KEYCODE_OCTAVES > 0 @@ -321,7 +327,7 @@ enum quantum_keycodes { MI_CHD, // previous channel MI_CHU, // next channel - MI_OFF, // all notes off + MI_ALLOFF, // all notes off MI_SUS, // sustain MI_PORT, // portamento @@ -332,7 +338,8 @@ enum quantum_keycodes { MI_MOD, // modulation MI_MODSD, // decrease modulation speed MI_MODSU, // increase modulation speed -#endif +#endif // MIDI_ADVANCED +#endif // MIDI_ENABLE // Backlight functionality BL_0, diff --git a/quantum/template/config.h b/quantum/template/config.h index cd6dfa2c6a..54db4f242f 100644 --- a/quantum/template/config.h +++ b/quantum/template/config.h @@ -159,6 +159,23 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION +/* + * MIDI options + */ + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +//#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index bd24980573..651a0f3477 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -1104,7 +1104,9 @@ void sysex_callback(MidiDevice * device, void setup_midi(void) { +#ifdef MIDI_ADVANCED midi_init(); +#endif midi_device_init(&midi_device); midi_device_set_send_func(&midi_device, usb_send_func); midi_device_set_pre_input_process_func(&midi_device, usb_get_midi); @@ -1180,8 +1182,10 @@ int main(void) #ifdef MIDI_ENABLE midi_device_process(&midi_device); +#ifdef MIDI_ADVANCED midi_task(); #endif +#endif #if defined(RGBLIGHT_ANIMATIONS) & defined(RGBLIGHT_ENABLE) rgblight_task(); From 1000799d1ef594bf9f48076986ec300ef9e536db Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sat, 25 Feb 2017 19:25:33 -0800 Subject: [PATCH 028/181] Factor basic note processing into respective processors --- build_keyboard.mk | 1 + quantum/process_keycode/process_audio.c | 62 +++++++++++ quantum/process_keycode/process_audio.h | 11 ++ quantum/process_keycode/process_midi.c | 28 ++++- quantum/process_keycode/process_midi.h | 13 ++- quantum/process_keycode/process_music.c | 141 ++++++++++-------------- quantum/process_keycode/process_music.h | 5 +- quantum/quantum.c | 3 + quantum/quantum.h | 7 +- 9 files changed, 186 insertions(+), 85 deletions(-) create mode 100644 quantum/process_keycode/process_audio.c create mode 100644 quantum/process_keycode/process_audio.h diff --git a/build_keyboard.mk b/build_keyboard.mk index eea8d5919a..07dfe85b45 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -157,6 +157,7 @@ endif ifeq ($(strip $(AUDIO_ENABLE)), yes) OPT_DEFS += -DAUDIO_ENABLE SRC += $(QUANTUM_DIR)/process_keycode/process_music.c + SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c SRC += $(QUANTUM_DIR)/audio/audio.c SRC += $(QUANTUM_DIR)/audio/voices.c SRC += $(QUANTUM_DIR)/audio/luts.c diff --git a/quantum/process_keycode/process_audio.c b/quantum/process_keycode/process_audio.c new file mode 100644 index 0000000000..5b5da546ea --- /dev/null +++ b/quantum/process_keycode/process_audio.c @@ -0,0 +1,62 @@ +#include "process_audio.h" +#include "audio.h" + +static float compute_freq_for_midi_note(uint8_t note) +{ + // https://en.wikipedia.org/wiki/MIDI_tuning_standard + return pow(2.0, (note - 69) / 12.0) * 440.0f; +} + +bool process_audio(uint16_t keycode, keyrecord_t *record) { + + if (keycode == AU_ON && record->event.pressed) { + audio_on(); + return false; + } + + if (keycode == AU_OFF && record->event.pressed) { + audio_off(); + return false; + } + + if (keycode == AU_TOG && record->event.pressed) { + if (is_audio_on()) + { + audio_off(); + } + else + { + audio_on(); + } + return false; + } + + if (keycode == MUV_IN && record->event.pressed) { + voice_iterate(); + music_scale_user(); + return false; + } + + if (keycode == MUV_DE && record->event.pressed) { + voice_deiterate(); + music_scale_user(); + return false; + } + + return true +} + +void process_audio_noteon(uint8_t note) { + play_note(compute_freq_for_midi_note(note), 0xF); +} + +void process_audio_noteoff(uint8_t note) { + stop_note(compute_freq_for_midi_note(note)); +} + +void process_audio_stop_all_notes(void) { + stop_all_notes(); +} + +__attribute__ ((weak)) +void audio_on_user() {} \ No newline at end of file diff --git a/quantum/process_keycode/process_audio.h b/quantum/process_keycode/process_audio.h new file mode 100644 index 0000000000..59a17725a7 --- /dev/null +++ b/quantum/process_keycode/process_audio.h @@ -0,0 +1,11 @@ +#ifndef PROCESS_AUDIO_H +#define PROCESS_AUDIO_H + +bool process_audio(uint16_t keycode, keyrecord_t *record); +void process_audio_noteon(uint8_t note); +void process_audio_noteoff(uint8_t note); +void process_audio_stop_all_notes(void); + +void audio_on_user(void); + +#endif \ No newline at end of file diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index 161f04a245..214bba9020 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -1,6 +1,28 @@ #include "process_midi.h" -#if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED) +#ifdef MIDI_ENABLE +#include "midi.h" + +#ifdef MIDI_BASIC + +void process_midi_basic_noteon(uint8_t note) +{ + midi_send_noteon(&midi_device, 0, note, 128); +} + +void process_midi_basic_noteoff(uint8_t note) +{ + midi_send_noteoff(&midi_device, 0, note, 0); +} + +void process_midi_basic_stop_all_notes(void) +{ + midi_send_cc(&midi_device, 0, 0x7B, 0); +} + +#endif // MIDI_BASIC + +#ifdef MIDI_ADVANCED #include "timer.h" @@ -165,7 +187,7 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) case MI_ALLOFF: if (record->event.pressed) { midi_send_cc(&midi_device, midi_config.channel, 0x7B, 0); - dprintf("midi off\n"); + dprintf("midi all notes off\n"); } return false; case MI_SUS: @@ -212,3 +234,5 @@ bool process_midi(uint16_t keycode, keyrecord_t *record) } #endif // MIDI_ADVANCED + +#endif // MIDI_ENABLE diff --git a/quantum/process_keycode/process_midi.h b/quantum/process_keycode/process_midi.h index ffd41579f2..0f559ec23a 100644 --- a/quantum/process_keycode/process_midi.h +++ b/quantum/process_keycode/process_midi.h @@ -2,8 +2,16 @@ #define PROCESS_MIDI_H #include "quantum.h" -#include "midi.h" +#ifdef MIDI_ENABLE + +#ifdef MIDI_BASIC +void process_midi_basic_noteon(uint8_t note); +void process_midi_basic_noteoff(uint8_t note); +void process_midi_basic_stop_all_notes(void); +#endif + +#ifdef MIDI_ADVANCED typedef union { uint32_t raw; struct { @@ -25,5 +33,8 @@ bool process_midi(uint16_t keycode, keyrecord_t *record); #define MIDI_TONE_COUNT (MIDI_TONE_MAX - MIDI_TONE_MIN + 1) uint8_t midi_compute_note(uint16_t keycode); +#endif // MIDI_ADVANCED + +#endif // MIDI_ENABLE #endif \ No newline at end of file diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c index ac906b6281..a1e270df17 100644 --- a/quantum/process_keycode/process_music.c +++ b/quantum/process_keycode/process_music.c @@ -1,5 +1,14 @@ #include "process_music.h" +#ifdef AUDIO_ENABLE +#include "process_audio.h" +#endif +#if defined(MIDI_ENABLE) && defined(MIDI_BASIC) +#include "process_midi.h" +#endif + +#if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) + bool music_activated = false; uint8_t music_starting_note = 0x0C; int music_offset = 7; @@ -8,39 +17,42 @@ int music_offset = 7; static bool music_sequence_recording = false; static bool music_sequence_recorded = false; static bool music_sequence_playing = false; -static float music_sequence[16] = {0}; +static uint8_t music_sequence[16] = {0}; static uint8_t music_sequence_count = 0; static uint8_t music_sequence_position = 0; static uint16_t music_sequence_timer = 0; static uint16_t music_sequence_interval = 100; +static void music_noteon(uint8_t note) { + #ifdef AUDIO_ENABLE + process_audio_noteon(note); + #endif + #if defined(MIDI_ENABLE) && defined(MIDI_BASIC) + process_midi_basic_noteon(note); + #endif +} + +static void music_noteoff(uint8_t note) { + #ifdef AUDIO_ENABLE + process_audio_noteoff(note); + #endif + #if defined(MIDI_ENABLE) && defined(MIDI_BASIC) + process_midi_basic_noteoff(note); + #endif +} + +static void music_all_notes_off(void) { + #ifdef AUDIO_ENABLE + process_audio_stop_all_notes(); + #endif + #if defined(MIDI_ENABLE) && defined(MIDI_BASIC) + process_midi_basic_stop_all_notes(); + #endif +} + bool process_music(uint16_t keycode, keyrecord_t *record) { - #ifdef AUDIO_ENABLE - if (keycode == AU_ON && record->event.pressed) { - audio_on(); - return false; - } - - if (keycode == AU_OFF && record->event.pressed) { - audio_off(); - return false; - } - - if (keycode == AU_TOG && record->event.pressed) { - if (is_audio_on()) - { - audio_off(); - } - else - { - audio_on(); - } - return false; - } - #endif // AUDIO_ENABLE - if (keycode == MU_ON && record->event.pressed) { music_on(); return false; @@ -63,26 +75,10 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { return false; } - #ifdef AUDIO_ENABLE - if (keycode == MUV_IN && record->event.pressed) { - voice_iterate(); - music_scale_user(); - return false; - } - - if (keycode == MUV_DE && record->event.pressed) { - voice_deiterate(); - music_scale_user(); - return false; - } - #endif // AUDIO_ENABLE - if (music_activated) { if (keycode == KC_LCTL && record->event.pressed) { // Start recording - #ifdef AUDIO_ENABLE - stop_all_notes(); - #endif + music_all_notes_off(); music_sequence_recording = true; music_sequence_recorded = false; music_sequence_playing = false; @@ -91,9 +87,7 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { } if (keycode == KC_LALT && record->event.pressed) { // Stop recording/playing - #ifdef AUDIO_ENABLE - stop_all_notes(); - #endif + music_all_notes_off(); if (music_sequence_recording) { // was recording music_sequence_recorded = true; } @@ -103,9 +97,7 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { } if (keycode == KC_LGUI && record->event.pressed && music_sequence_recorded) { // Start playing - #ifdef AUDIO_ENABLE - stop_all_notes(); - #endif + music_all_notes_off(); music_sequence_recording = false; music_sequence_playing = true; music_sequence_position = 0; @@ -124,32 +116,27 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { music_sequence_interval+=10; return false; } + #define MUSIC_MODE_GUITAR - #ifdef AUDIO_ENABLE #ifdef MUSIC_MODE_CHROMATIC - float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + record->event.key.col + music_offset)/12.0+(MATRIX_ROWS - record->event.key.row)); + uint8_t note = (music_starting_note + record->event.key.col + music_offset - 3)+12*(MATRIX_ROWS - record->event.key.row); #elif defined(MUSIC_MODE_GUITAR) - float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + record->event.key.col + music_offset)/12.0+(float)(MATRIX_ROWS - record->event.key.row + 7)*5.0/12); + uint8_t note = (music_starting_note + record->event.key.col + music_offset + 32)+5*(MATRIX_ROWS - record->event.key.row); #elif defined(MUSIC_MODE_VIOLIN) - float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + record->event.key.col + music_offset)/12.0+(float)(MATRIX_ROWS - record->event.key.row + 5)*7.0/12); + uint8_t note = (music_starting_note + record->event.key.col + music_offset + 32)+7*(MATRIX_ROWS - record->event.key.row); #else - float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(music_starting_note + SCALE[record->event.key.col + music_offset])/12.0+(MATRIX_ROWS - record->event.key.row)); + uint8_t note = (music_starting_note + SCALE[record->event.key.col + music_offset] - 3)+12*(MATRIX_ROWS - record->event.key.row); #endif - #endif // AUDIO_ENABLE if (record->event.pressed) { - #ifdef AUDIO_ENABLE - play_note(freq, 0xF); + music_noteon(note); if (music_sequence_recording) { - music_sequence[music_sequence_count] = freq; + music_sequence[music_sequence_count] = note; music_sequence_count++; } - #endif } else { - #ifdef AUDIO_ENABLE - stop_note(freq); - #endif + music_noteoff(note); } if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through @@ -177,32 +164,26 @@ void music_on(void) { void music_off(void) { music_activated = 0; - #ifdef AUDIO_ENABLE - stop_all_notes(); - #endif + music_all_notes_off(); } - -__attribute__ ((weak)) -void music_on_user() {} - -#ifdef AUDIO_ENABLE -__attribute__ ((weak)) -void audio_on_user() {} -#endif - -__attribute__ ((weak)) -void music_scale_user() {} - void matrix_scan_music(void) { if (music_sequence_playing) { if ((music_sequence_timer == 0) || (timer_elapsed(music_sequence_timer) > music_sequence_interval)) { music_sequence_timer = timer_read(); - #ifdef AUDIO_ENABLE - stop_note(music_sequence[(music_sequence_position - 1 < 0)?(music_sequence_position - 1 + music_sequence_count):(music_sequence_position - 1)]); - play_note(music_sequence[music_sequence_position], 0xF); - #endif + uint8_t prev_note = music_sequence[(music_sequence_position - 1 < 0)?(music_sequence_position - 1 + music_sequence_count):(music_sequence_position - 1)]; + uint8_t next_note = music_sequence[music_sequence_position]; + music_noteoff(prev_note); + music_noteon(next_note); music_sequence_position = (music_sequence_position + 1) % music_sequence_count; } } } + +__attribute__ ((weak)) +void music_on_user() {} + +__attribute__ ((weak)) +void music_scale_user() {} + +#endif // defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) \ No newline at end of file diff --git a/quantum/process_keycode/process_music.h b/quantum/process_keycode/process_music.h index 318b3e3875..69913b2761 100644 --- a/quantum/process_keycode/process_music.h +++ b/quantum/process_keycode/process_music.h @@ -3,6 +3,8 @@ #include "quantum.h" +#if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) + bool process_music(uint16_t keycode, keyrecord_t *record); bool is_music_on(void); @@ -10,7 +12,6 @@ void music_toggle(void); void music_on(void); void music_off(void); -void audio_on_user(void); void music_on_user(void); void music_scale_user(void); @@ -24,4 +25,6 @@ void matrix_scan_music(void); 0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), } #endif +#endif // defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) + #endif \ No newline at end of file diff --git a/quantum/quantum.c b/quantum/quantum.c index 83fa877088..7a27a568ac 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -153,6 +153,9 @@ bool process_record_quantum(keyrecord_t *record) { #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED) process_midi(keycode, record) && #endif + #ifdef AUDIO_ENABLE + process_audio(keycode, record) && + #endif #if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) process_music(keycode, record) && #endif diff --git a/quantum/quantum.h b/quantum/quantum.h index 580d51202a..77732d43f2 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -35,11 +35,16 @@ extern uint32_t default_layer_state; #ifdef MIDI_ENABLE #include +#ifdef MIDI_ADVANCED #include "process_midi.h" #endif +#endif // MIDI_ENABLE #ifdef AUDIO_ENABLE - #include "audio.h" + #include "process_audio.h" +#endif + +#if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) #include "process_music.h" #endif From ea14ed122fb5c1b3be5f5d6edda9b39b151692e5 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sat, 25 Feb 2017 19:37:33 -0800 Subject: [PATCH 029/181] Add basic layer to sample MIDI keycap --- keyboards/satan/keymaps/midi/keymap.c | 23 ++++++++++++++++++++++- quantum/process_keycode/process_audio.c | 2 +- quantum/process_keycode/process_music.c | 3 ++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/keyboards/satan/keymaps/midi/keymap.c b/keyboards/satan/keymaps/midi/keymap.c index 349391c3bf..8378b4e4b9 100644 --- a/keyboards/satan/keymaps/midi/keymap.c +++ b/keyboards/satan/keymaps/midi/keymap.c @@ -33,7 +33,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, TG(_ML), KC_RCTL), #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED) -/* Keymap _ML: MIDI Layer +/* Keymap _ML: MIDI Layer (Advanced) * ,------------------------------------------------------------------------. * | Exit | | | | | | | | | | | | | | * |------------------------------------------------------------------------| @@ -52,5 +52,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { MI_MOD, MI_C, MI_D, MI_E, MI_F, MI_G, MI_A, MI_B, MI_C_1, MI_D_1, MI_E_1, MI_F_1, _______, \ MI_SUS, MI_OCTD, MI_OCTU, MI_MODSD, MI_MODSU, XXXXXXX, XXXXXXX, XXXXXXX, MI_TRNSD, MI_TRNSU, MI_TRNS_0, MI_SUS, \ _______, _______, _______, MI_ALLOFF, _______, _______, _______, _______), +#elif defined(MIDI_ENABLE) && defined(MIDI_BASIC) +/* Keymap _ML: MIDI Layer (Advanced) + * ,------------------------------------------------------------------------. + * | Exit | | | | | | | | | | | | | | + * |------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | + * |------------------------------------------------------------------------| + * | | | | | | | | | | | | | | + * |------------------------------------------------------------------------| + * | |MuOn|MuOf|MiOn|MiOf| | | | | | | | + * |------------------------------------------------------------------------| + * | | | | | | | | | + * `------------------------------------------------------------------------' + */ + +[_ML] = KEYMAP_ANSI( + TG(_ML), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______), #endif }; \ No newline at end of file diff --git a/quantum/process_keycode/process_audio.c b/quantum/process_keycode/process_audio.c index 5b5da546ea..d45242c9e0 100644 --- a/quantum/process_keycode/process_audio.c +++ b/quantum/process_keycode/process_audio.c @@ -28,7 +28,7 @@ bool process_audio(uint16_t keycode, keyrecord_t *record) { { audio_on(); } - return false; + return false; } if (keycode == MUV_IN && record->event.pressed) { diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c index a1e270df17..43bcf973e9 100644 --- a/quantum/process_keycode/process_music.c +++ b/quantum/process_keycode/process_music.c @@ -142,7 +142,8 @@ bool process_music(uint16_t keycode, keyrecord_t *record) { if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through return false; } - return true; + + return true; } bool is_music_on(void) { From a64ae1066250d3aafb6e9670bf617237ec4338e7 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sat, 25 Feb 2017 20:41:13 -0800 Subject: [PATCH 030/181] Update existing keymaps Update existing keymaps to enable MIDI_BASIC functionality. Also added an option MIDI_ENABLE_STRICT to be strict about keycode use (which also reduces memory footprint at runtime) --- keyboards/planck/keymaps/dbroqua/config.h | 29 +++++++++++++++++++ keyboards/planck/keymaps/default/config.h | 29 +++++++++++++++++++ .../planck/keymaps/experimental/config.h | 23 +++++++++++++++ keyboards/planck/keymaps/impossible/config.h | 29 +++++++++++++++++++ keyboards/planck/keymaps/jeebak/config.h | 29 +++++++++++++++++++ keyboards/planck/keymaps/jhenahan/config.h | 23 +++++++++++++++ keyboards/planck/keymaps/premek/config.h | 29 +++++++++++++++++++ keyboards/planck/keymaps/sgoodwin/config.h | 29 +++++++++++++++++++ keyboards/planck/keymaps/smt/config.h | 29 +++++++++++++++++++ .../planck/keymaps/thermal_printer/config.h | 23 +++++++++++++++ keyboards/planck/keymaps/unicode/config.h | 29 +++++++++++++++++++ keyboards/planck/keymaps/xyverz/config.h | 29 +++++++++++++++++++ .../preonic/keymaps/CMD-Preonic/config.h | 29 +++++++++++++++++++ keyboards/preonic/keymaps/default/config.h | 29 +++++++++++++++++++ keyboards/preonic/keymaps/smt/config.h | 29 +++++++++++++++++++ keyboards/satan/keymaps/midi/config.h | 3 ++ keyboards/subatomic/keymaps/default/config.h | 29 +++++++++++++++++++ quantum/process_keycode/process_audio.c | 4 +-- quantum/process_keycode/process_music.c | 2 +- quantum/process_keycode/process_music.h | 1 + quantum/quantum.c | 4 +-- quantum/quantum_keycodes.h | 28 +++++++++--------- quantum/template/config.h | 3 ++ 23 files changed, 472 insertions(+), 19 deletions(-) create mode 100644 keyboards/planck/keymaps/dbroqua/config.h create mode 100644 keyboards/planck/keymaps/default/config.h create mode 100644 keyboards/planck/keymaps/impossible/config.h create mode 100644 keyboards/planck/keymaps/jeebak/config.h create mode 100644 keyboards/planck/keymaps/premek/config.h create mode 100644 keyboards/planck/keymaps/sgoodwin/config.h create mode 100644 keyboards/planck/keymaps/smt/config.h create mode 100644 keyboards/planck/keymaps/unicode/config.h create mode 100644 keyboards/planck/keymaps/xyverz/config.h create mode 100644 keyboards/preonic/keymaps/CMD-Preonic/config.h create mode 100644 keyboards/preonic/keymaps/default/config.h create mode 100644 keyboards/preonic/keymaps/smt/config.h create mode 100644 keyboards/subatomic/keymaps/default/config.h diff --git a/keyboards/planck/keymaps/dbroqua/config.h b/keyboards/planck/keymaps/dbroqua/config.h new file mode 100644 index 0000000000..4c61581993 --- /dev/null +++ b/keyboards/planck/keymaps/dbroqua/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/default/config.h b/keyboards/planck/keymaps/default/config.h new file mode 100644 index 0000000000..4c61581993 --- /dev/null +++ b/keyboards/planck/keymaps/default/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/experimental/config.h b/keyboards/planck/keymaps/experimental/config.h index cc093bee49..492490ca1c 100644 --- a/keyboards/planck/keymaps/experimental/config.h +++ b/keyboards/planck/keymaps/experimental/config.h @@ -14,4 +14,27 @@ #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + #endif diff --git a/keyboards/planck/keymaps/impossible/config.h b/keyboards/planck/keymaps/impossible/config.h new file mode 100644 index 0000000000..4c61581993 --- /dev/null +++ b/keyboards/planck/keymaps/impossible/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/jeebak/config.h b/keyboards/planck/keymaps/jeebak/config.h new file mode 100644 index 0000000000..4c61581993 --- /dev/null +++ b/keyboards/planck/keymaps/jeebak/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/jhenahan/config.h b/keyboards/planck/keymaps/jhenahan/config.h index cd3adc41cc..1e42b92b9c 100644 --- a/keyboards/planck/keymaps/jhenahan/config.h +++ b/keyboards/planck/keymaps/jhenahan/config.h @@ -6,4 +6,27 @@ #define FORCE_NKRO #define WORKMAN_SOUND COLEMAK_SOUND +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + #endif diff --git a/keyboards/planck/keymaps/premek/config.h b/keyboards/planck/keymaps/premek/config.h new file mode 100644 index 0000000000..4c61581993 --- /dev/null +++ b/keyboards/planck/keymaps/premek/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/sgoodwin/config.h b/keyboards/planck/keymaps/sgoodwin/config.h new file mode 100644 index 0000000000..4c61581993 --- /dev/null +++ b/keyboards/planck/keymaps/sgoodwin/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/smt/config.h b/keyboards/planck/keymaps/smt/config.h new file mode 100644 index 0000000000..4c61581993 --- /dev/null +++ b/keyboards/planck/keymaps/smt/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/thermal_printer/config.h b/keyboards/planck/keymaps/thermal_printer/config.h index 430b6493cf..bcd0989306 100644 --- a/keyboards/planck/keymaps/thermal_printer/config.h +++ b/keyboards/planck/keymaps/thermal_printer/config.h @@ -20,4 +20,27 @@ sei(); \ } while(0) +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + #endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/unicode/config.h b/keyboards/planck/keymaps/unicode/config.h new file mode 100644 index 0000000000..4c61581993 --- /dev/null +++ b/keyboards/planck/keymaps/unicode/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/xyverz/config.h b/keyboards/planck/keymaps/xyverz/config.h new file mode 100644 index 0000000000..4c61581993 --- /dev/null +++ b/keyboards/planck/keymaps/xyverz/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/preonic/keymaps/CMD-Preonic/config.h b/keyboards/preonic/keymaps/CMD-Preonic/config.h new file mode 100644 index 0000000000..4c61581993 --- /dev/null +++ b/keyboards/preonic/keymaps/CMD-Preonic/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/preonic/keymaps/default/config.h b/keyboards/preonic/keymaps/default/config.h new file mode 100644 index 0000000000..4c61581993 --- /dev/null +++ b/keyboards/preonic/keymaps/default/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/preonic/keymaps/smt/config.h b/keyboards/preonic/keymaps/smt/config.h new file mode 100644 index 0000000000..4c61581993 --- /dev/null +++ b/keyboards/preonic/keymaps/smt/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/keyboards/satan/keymaps/midi/config.h b/keyboards/satan/keymaps/midi/config.h index 59250b49e2..8e10b04ec2 100644 --- a/keyboards/satan/keymaps/midi/config.h +++ b/keyboards/satan/keymaps/midi/config.h @@ -7,6 +7,9 @@ * MIDI options */ +/* Prevent use of disabled MIDI features in the keymap */ +#define MIDI_ENABLE_STRICT 1 + /* enable basic MIDI features: - MIDI notes can be sent when in Music mode is on */ diff --git a/keyboards/subatomic/keymaps/default/config.h b/keyboards/subatomic/keymaps/default/config.h new file mode 100644 index 0000000000..4c61581993 --- /dev/null +++ b/keyboards/subatomic/keymaps/default/config.h @@ -0,0 +1,29 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +/* + * MIDI options + */ + +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + +/* enable basic MIDI features: + - MIDI notes can be sent when in Music mode is on +*/ +#define MIDI_BASIC + +/* enable advanced MIDI features: + - MIDI notes can be added to the keymap + - Octave shift and transpose + - Virtual sustain, portamento, and modulation wheel + - etc. +*/ +//#define MIDI_ADVANCED + +/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ +//#define MIDI_TONE_KEYCODE_OCTAVES 2 + +#endif \ No newline at end of file diff --git a/quantum/process_keycode/process_audio.c b/quantum/process_keycode/process_audio.c index d45242c9e0..71c0297ee2 100644 --- a/quantum/process_keycode/process_audio.c +++ b/quantum/process_keycode/process_audio.c @@ -1,5 +1,5 @@ -#include "process_audio.h" #include "audio.h" +#include "process_audio.h" static float compute_freq_for_midi_note(uint8_t note) { @@ -43,7 +43,7 @@ bool process_audio(uint16_t keycode, keyrecord_t *record) { return false; } - return true + return true; } void process_audio_noteon(uint8_t note) { diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c index 43bcf973e9..4b86b91f00 100644 --- a/quantum/process_keycode/process_music.c +++ b/quantum/process_keycode/process_music.c @@ -42,7 +42,7 @@ static void music_noteoff(uint8_t note) { #endif } -static void music_all_notes_off(void) { +void music_all_notes_off(void) { #ifdef AUDIO_ENABLE process_audio_stop_all_notes(); #endif diff --git a/quantum/process_keycode/process_music.h b/quantum/process_keycode/process_music.h index 69913b2761..a36514a44f 100644 --- a/quantum/process_keycode/process_music.h +++ b/quantum/process_keycode/process_music.h @@ -14,6 +14,7 @@ void music_off(void); void music_on_user(void); void music_scale_user(void); +void music_all_notes_off(void); void matrix_scan_music(void); diff --git a/quantum/quantum.c b/quantum/quantum.c index 7a27a568ac..a4a12061b3 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -95,8 +95,8 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { void reset_keyboard(void) { clear_keyboard(); -#ifdef AUDIO_ENABLE - stop_all_notes(); +#if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_ENABLE_BASIC)) + music_all_notes_off(); shutdown_user(); #endif wait_ms(250); diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 3b82b7208c..56228f2767 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -1,8 +1,11 @@ - #ifndef QUANTUM_KEYCODES_H #define QUANTUM_KEYCODES_H -#if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED) +#ifndef MIDI_ENABLE_STRICT +#define MIDI_ENABLE_STRICT 0 +#endif + +#if !MIDI_ENABLE_STRICT || (defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)) #ifndef MIDI_TONE_KEYCODE_OCTAVES #define MIDI_TONE_KEYCODE_OCTAVES 3 #endif @@ -113,18 +116,16 @@ enum quantum_keycodes { MUV_IN, MUV_DE, -#ifdef MIDI_ENABLE // Midi - -#ifdef MIDI_BASIC +#if !MIDI_ENABLE_STRICT || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) MI_ON, // send midi notes when music mode is enabled MI_OFF, // don't send midi notes when music mode is enabled #endif -#ifdef MIDI_ADVANCED +#if !MIDI_ENABLE_STRICT || (defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)) MIDI_TONE_MIN, -#if MIDI_TONE_KEYCODE_OCTAVES > 0 +#if !MIDI_ENABLE_STRICT || MIDI_TONE_KEYCODE_OCTAVES > 0 MI_C = MIDI_TONE_MIN, MI_Cs, MI_Db = MI_Cs, @@ -144,7 +145,7 @@ enum quantum_keycodes { MI_B, #endif -#if MIDI_TONE_KEYCODE_OCTAVES > 1 +#if !MIDI_ENABLE_STRICT || MIDI_TONE_KEYCODE_OCTAVES > 1 MI_C_1, MI_Cs_1, MI_Db_1 = MI_Cs_1, @@ -164,7 +165,7 @@ enum quantum_keycodes { MI_B_1, #endif -#if MIDI_TONE_KEYCODE_OCTAVES > 2 +#if !MIDI_ENABLE_STRICT || MIDI_TONE_KEYCODE_OCTAVES > 2 MI_C_2, MI_Cs_2, MI_Db_2 = MI_Cs_2, @@ -184,7 +185,7 @@ enum quantum_keycodes { MI_B_2, #endif -#if MIDI_TONE_KEYCODE_OCTAVES > 3 +#if !MIDI_ENABLE_STRICT || MIDI_TONE_KEYCODE_OCTAVES > 3 MI_C_3, MI_Cs_3, MI_Db_3 = MI_Cs_3, @@ -204,7 +205,7 @@ enum quantum_keycodes { MI_B_3, #endif -#if MIDI_TONE_KEYCODE_OCTAVES > 4 +#if !MIDI_ENABLE_STRICT || MIDI_TONE_KEYCODE_OCTAVES > 4 MI_C_4, MI_Cs_4, MI_Db_4 = MI_Cs_4, @@ -224,7 +225,7 @@ enum quantum_keycodes { MI_B_4, #endif -#if MIDI_TONE_KEYCODE_OCTAVES > 5 +#if !MIDI_ENABLE_STRICT || MIDI_TONE_KEYCODE_OCTAVES > 5 MI_C_5, MI_Cs_5, MI_Db_5 = MI_Cs_5, @@ -244,7 +245,7 @@ enum quantum_keycodes { MI_B_5, #endif -#if MIDI_TONE_KEYCODE_OCTAVES > 5 +#if !MIDI_ENABLE_STRICT || MIDI_TONE_KEYCODE_OCTAVES > 5 MIDI_TONE_MAX = MI_B_5, #elif MIDI_TONE_KEYCODE_OCTAVES > 4 MIDI_TONE_MAX = MI_B_4, @@ -339,7 +340,6 @@ enum quantum_keycodes { MI_MODSD, // decrease modulation speed MI_MODSU, // increase modulation speed #endif // MIDI_ADVANCED -#endif // MIDI_ENABLE // Backlight functionality BL_0, diff --git a/quantum/template/config.h b/quantum/template/config.h index 54db4f242f..7393097e1e 100644 --- a/quantum/template/config.h +++ b/quantum/template/config.h @@ -163,6 +163,9 @@ along with this program. If not, see . * MIDI options */ +/* Prevent use of disabled MIDI features in the keymap */ +//#define MIDI_ENABLE_STRICT 1 + /* enable basic MIDI features: - MIDI notes can be sent when in Music mode is on */ From b911e1966f6e9077df01c01d77b4e2018b582eb0 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sat, 25 Feb 2017 21:13:47 -0800 Subject: [PATCH 031/181] Fix redundant process_music.c in sources --- build_keyboard.mk | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/build_keyboard.mk b/build_keyboard.mk index 07dfe85b45..82464d5830 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -23,9 +23,9 @@ ifdef master MASTER = $(master) endif -ifeq ($(MASTER),right) +ifeq ($(MASTER),right) OPT_DEFS += -DMASTER_IS_ON_RIGHT -else +else ifneq ($(MASTER),left) $(error MASTER does not have a valid value(left/right)) endif @@ -38,7 +38,7 @@ KEYBOARD_C := $(KEYBOARD_PATH)/$(KEYBOARD).c ifneq ("$(wildcard $(KEYBOARD_C))","") include $(KEYBOARD_PATH)/rules.mk -else +else $(error "$(KEYBOARD_C)" does not exist) endif @@ -49,7 +49,7 @@ ifneq ($(SUBPROJECT),) ifneq ("$(wildcard $(SUBPROJECT_C))","") OPT_DEFS += -DSUBPROJECT_$(SUBPROJECT) include $(SUBPROJECT_PATH)/rules.mk - else + else $(error "$(SUBPROJECT_PATH)/$(SUBPROJECT).c" does not exist) endif endif @@ -83,7 +83,7 @@ ifneq ($(SUBPROJECT),) endif endif -# Save the defines and includes here, so we don't include any keymap specific ones +# Save the defines and includes here, so we don't include any keymap specific ones PROJECT_DEFS := $(OPT_DEFS) PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(SUBPROJECT_PATH) $(KEYBOARD_PATH) PROJECT_CONFIG := $(CONFIG_H) @@ -139,12 +139,27 @@ ifeq ($(strip $(API_SYSEX_ENABLE)), yes) MIDI_ENABLE=yes endif +MUSIC_ENABLE := 0 + +ifeq ($(strip $(AUDIO_ENABLE)), yes) + OPT_DEFS += -DAUDIO_ENABLE + MUSIC_ENABLE := 1 + SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c + SRC += $(QUANTUM_DIR)/audio/audio.c + SRC += $(QUANTUM_DIR)/audio/voices.c + SRC += $(QUANTUM_DIR)/audio/luts.c +endif + ifeq ($(strip $(MIDI_ENABLE)), yes) OPT_DEFS += -DMIDI_ENABLE - SRC += $(QUANTUM_DIR)/process_keycode/process_music.c + MUSIC_ENABLE := 1 SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c endif +ifeq ($(MUSIC_ENABLE), 1) + SRC += $(QUANTUM_DIR)/process_keycode/process_music.c +endif + ifeq ($(strip $(COMBO_ENABLE)), yes) OPT_DEFS += -DCOMBO_ENABLE SRC += $(QUANTUM_DIR)/process_keycode/process_combo.c @@ -154,15 +169,6 @@ ifeq ($(strip $(VIRTSER_ENABLE)), yes) OPT_DEFS += -DVIRTSER_ENABLE endif -ifeq ($(strip $(AUDIO_ENABLE)), yes) - OPT_DEFS += -DAUDIO_ENABLE - SRC += $(QUANTUM_DIR)/process_keycode/process_music.c - SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c - SRC += $(QUANTUM_DIR)/audio/audio.c - SRC += $(QUANTUM_DIR)/audio/voices.c - SRC += $(QUANTUM_DIR)/audio/luts.c -endif - ifeq ($(strip $(FAUXCLICKY_ENABLE)), yes) OPT_DEFS += -DFAUXCLICKY_ENABLE SRC += $(QUANTUM_DIR)/fauxclicky.c @@ -252,7 +258,7 @@ endif OUTPUTS := $(KEYMAP_OUTPUT) $(KEYBOARD_OUTPUT) $(KEYMAP_OUTPUT)_SRC := $(SRC) -$(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) -DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYMAP=\"$(KEYMAP)\" +$(KEYMAP_OUTPUT)_DEFS := $(OPT_DEFS) -DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYMAP=\"$(KEYMAP)\" $(KEYMAP_OUTPUT)_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYMAP_OUTPUT)_CONFIG := $(CONFIG_H) $(KEYBOARD_OUTPUT)_SRC := $(CHIBISRC) From 976c856966841cd0be6e514c6365c73164f5b96d Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sat, 25 Feb 2017 21:38:35 -0800 Subject: [PATCH 032/181] Update size estimates in the Makefile MIDI_ENABLE = no text data bss dec hex filename 0 17080 0 17080 42b8 satan_midi.hex MIDI_ENABLE = yes MIDI_BASIC undefined MIDI_ADVANCED undefined text data bss dec hex filename 0 19494 0 19494 4c26 satan_midi.hex +2414 bytes (vs. MIDI_ENABLE = no) MIDI_ENABLE = yes 0 20846 0 20846 516e satan_midi.hex +1352 bytes (vs. MIDI_ENABLE = yes, MIDI_BASIC off, MIDI_ADVANCED off) MIDI_ENABLE = yes #define MIDI_BASIC #define MIDI_ADVANCED text data bss dec hex filename 0 21292 0 21292 532c satan_midi.hex +1798 bytes (vs. MIDI_ENABLE = yes, MIDI_BASIC off, MIDI_ADVANCED off) Conclusion: +2400 to 4200, depending on config --- keyboards/satan/keymaps/midi/Makefile | 2 +- quantum/template/rules.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/satan/keymaps/midi/Makefile b/keyboards/satan/keymaps/midi/Makefile index 4e2d9d2f7c..89c34b3946 100644 --- a/keyboards/satan/keymaps/midi/Makefile +++ b/keyboards/satan/keymaps/midi/Makefile @@ -9,7 +9,7 @@ CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality -MIDI_ENABLE = yes # MIDI support (+3800) +MIDI_ENABLE = yes # MIDI support (+2400 to 4200, depending on config) AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID diff --git a/quantum/template/rules.mk b/quantum/template/rules.mk index bad3387bf4..a1f9377d87 100644 --- a/quantum/template/rules.mk +++ b/quantum/template/rules.mk @@ -61,7 +61,7 @@ SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work NKRO_ENABLE ?= no # USB Nkey Rollover BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default -MIDI_ENABLE ?= no # MIDI controls +MIDI_ENABLE ?= no # MIDI support (+2400 to 4200, depending on config) UNICODE_ENABLE ?= no # Unicode BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE ?= no # Audio output on port C6 From c370c1e1f3c27027c0a6513d34a749a1a88603fc Mon Sep 17 00:00:00 2001 From: Gunther Gruber Date: Mon, 27 Feb 2017 09:48:58 +0100 Subject: [PATCH 033/181] guni keymap --- keyboard/ergodox_ez/keymaps/guni/keymap.c | 176 ++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 keyboard/ergodox_ez/keymaps/guni/keymap.c diff --git a/keyboard/ergodox_ez/keymaps/guni/keymap.c b/keyboard/ergodox_ez/keymaps/guni/keymap.c new file mode 100644 index 0000000000..fc8567e68c --- /dev/null +++ b/keyboard/ergodox_ez/keymaps/guni/keymap.c @@ -0,0 +1,176 @@ +#include "ergodox_ez.h" +#include "debug.h" +#include "action_layer.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + KEYMAP( // layer 0 : default + // left hand + KC_EQL , KC_1, KC_2, KC_3, KC_4, KC_5, KC_LBRC, + KC_FN25 , KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, + KC_FN27 , KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_PGUP, + KC_LGUI , KC_GRV,KC_LEFT,KC_RGHT,KC_LALT, + KC_NO , KC_NO , + KC_NO , + KC_BSPC,KC_DEL ,KC_FN23, + // right hand + KC_RBRC , KC_6, KC_7 , KC_8, KC_9, KC_0, KC_MINS, + KC_END , KC_Y, KC_U , KC_I, KC_O, KC_P, KC_FN28, + KC_H , KC_J, KC_K , KC_L, KC_SCLN,KC_FN30, + KC_PGDN , KC_N, KC_M , KC_COMM,KC_DOT, KC_SLSH,KC_FN29, + KC_RALT , KC_DOWN,KC_UP, KC_NO ,KC_RGUI, + KC_NO , KC_NO, + KC_NO , + KC_FN29,KC_ENT ,KC_SPC + ), + + KEYMAP( // layer 1 : function and symbol keys + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, + KC_TRNS,KC_AT,KC_UNDS ,KC_LBRC,KC_RBRC,KC_CIRC ,KC_TRNS, + KC_TRNS,KC_BSLS,KC_SLSH,KC_LCBR ,KC_RCBR ,KC_ASTR, + KC_TRNS,KC_HASH ,KC_DLR ,KC_PIPE ,KC_TILD ,KC_GRV ,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1, + // right hand + KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_TRNS,KC_EXLM,LSFT(KC_COMM),LSFT(KC_DOT),KC_EQL,KC_AMPR, KC_TRNS, + LSFT(KC_SLSH),KC_LPRN,KC_RPRN,KC_MINS,LSFT(KC_SCLN),KC_TRNS, + KC_TRNS,KC_PLUS,LSFT(KC_5),LSFT(KC_QUOT),KC_QUOT,KC_SCLN,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + + KEYMAP( // layer 2: navigation + // left hand + KC_NO,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_PGUP,KC_HOME,KC_UP ,KC_END,KC_NO ,KC_TRNS, + KC_TRNS,KC_PGDN,KC_LEFT,KC_DOWN,KC_RGHT,KC_NO, + KC_TRNS,KC_NO, KC_NO, KC_NO, KC_NO,KC_NO,KC_NO, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1 , + // right hand + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS ,KC_TRNS, KC_HOME, KC_TRNS, KC_TRNS, KC_END ,KC_TRNS, + KC_NO, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT,KC_TRNS, + KC_TRNS,KC_TRNS, KC_HOME, KC_UP, KC_END, KC_PGUP,KC_TRNS, + KC_LEFT, KC_DOWN,KC_RGHT,KC_PGDN,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + KEYMAP( // layer 3 : teensy bootloader functions + // left hand + KC_FN0, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1 , + // 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_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + + + KEYMAP( // layer 4: numpad + // left 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_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,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_NLCK,KC_PSLS,KC_PAST,KC_PAST,KC_PMNS,KC_BSPC, + KC_TRNS,KC_NO, KC_P7, KC_P8, KC_P9, KC_PMNS,KC_BSPC, + KC_NO, KC_P4, KC_P5, KC_P6, KC_PPLS,KC_PENT, + KC_TRNS,KC_NO, KC_P1, KC_P2, KC_P3, KC_PPLS,KC_PENT, + KC_P0, KC_PDOT,KC_SLSH,KC_PENT,KC_PENT, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + +}; + +/* id for user defined functions */ +enum function_id { + TEENSY_KEY, +}; + +/* + * Fn action definition + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key + [1] = ACTION_LAYER_SET(0, ON_PRESS), + //[11] = ACTION_MODS_KEY(MOD_LSFT, KC_COMM), + //[12] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), + + //[14] = ACTION_MODS_KEY(MOD_LSFT, KC_SLSH), + //[17] = ACTION_MODS_KEY(MOD_LSFT, KC_SCLN), + //[20] = ACTION_MODS_KEY(MOD_LSFT, KC_5), + //[21] = ACTION_MODS_KEY(MOD_LSFT, KC_QUOT), + [23] = ACTION_LAYER_SET(3, ON_PRESS), + [24] = ACTION_LAYER_SET(2, ON_PRESS), + [25] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_TAB), + [26] = ACTION_LAYER_SET(1, ON_PRESS), + [27] = ACTION_LAYER_TAP_KEY(1, KC_CAPS), + [28] = ACTION_MODS_TAP_KEY(MOD_RCTL,KC_BSLS), + //[29] = ACTION_LAYER_TOGGLE(4), + [29] = ACTION_MODS_TAP_KEY(MOD_RSFT,KC_ESC), + [30] = ACTION_LAYER_TAP_KEY(1, KC_QUOT), + [31] = ACTION_LAYER_MOMENTARY(2), + //[] = ACTION_LAYER_TAP_KEY(4, KC_S), +}; + + +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) { + +}; + + +void action_function(keyrecord_t *event, uint8_t id, uint8_t opt) +{ + + if (id == TEENSY_KEY) { + clear_keyboard(); + print("\n\nJump to bootloader... "); + _delay_ms(250); + bootloader_jump(); // should not return + print("not supported.\n"); + } +} From 38cf08697b571e5efd55428a4682e248295091fb Mon Sep 17 00:00:00 2001 From: Gunther Gruber Date: Mon, 27 Feb 2017 09:55:24 +0100 Subject: [PATCH 034/181] small changes in guni.c keymap to work with new qmk_firmware packet --- .../ergodox_ez => keyboards/ergodox}/keymaps/guni/keymap.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) rename {keyboard/ergodox_ez => keyboards/ergodox}/keymaps/guni/keymap.c (98%) diff --git a/keyboard/ergodox_ez/keymaps/guni/keymap.c b/keyboards/ergodox/keymaps/guni/keymap.c similarity index 98% rename from keyboard/ergodox_ez/keymaps/guni/keymap.c rename to keyboards/ergodox/keymaps/guni/keymap.c index fc8567e68c..f33829b8a4 100644 --- a/keyboard/ergodox_ez/keymaps/guni/keymap.c +++ b/keyboards/ergodox/keymaps/guni/keymap.c @@ -1,6 +1,7 @@ -#include "ergodox_ez.h" +#include "ergodox.h" #include "debug.h" #include "action_layer.h" +#include "bootloader.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KEYMAP( // layer 0 : default @@ -158,7 +159,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) }; // Runs just one time when the keyboard initializes. -void * matrix_init_user(void) { +void matrix_init_user(void) { }; From 748401e5c180e91181bc10a80491d7d5568c008a Mon Sep 17 00:00:00 2001 From: milestogo Date: Tue, 28 Feb 2017 21:53:42 -0800 Subject: [PATCH 035/181] keymap and C6 audio testing --- .../keymaps/milestogo/Makefile | 2 +- .../keymaps/milestogo/config.h | 1 - .../keymaps/milestogo/keymap.c | 150 +++++++++++++++--- 3 files changed, 125 insertions(+), 28 deletions(-) diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/Makefile b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/Makefile index a82d80deee..1209ad7814 100644 --- a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/Makefile +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/Makefile @@ -10,7 +10,7 @@ COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 +AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h index 8893d122e0..aaf0077b14 100644 --- a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h @@ -4,5 +4,4 @@ #include "../../config.h" // place overrides here - #endif diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c index 0551fbde72..244d52dc56 100644 --- a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c @@ -1,11 +1,26 @@ #include "MS-sculpt-mobile.h" +#include "action_layer.h" + +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif #define _QWR 0 -#define _CDH 1 -#define _SYM 2 -#define _MOV 3 -#define _NUM 4 -#define _TRAN 9 +#define _CDH 2 +#define _SYM 3 +#define _MOV 4 +#define _TRAN 5 + + +enum layer_keycodes { +QWR, +CDH, +SYM, +MOV, +NUM, +TRAN +}; + // Shorter spacing #define XXXX KC_NO @@ -15,31 +30,36 @@ /* Fn Keys */ #define TT_SYM MO(_SYM) -#define TO_CDH TG(_CDH) #define TT_MOV KC_FN2 #define TT_NUM MO(_NUM) #define SSFT ACTION_MODS_ONESHOT(MOD_LSFT) +enum macro_keycodes { +DHPASTE=1, +VIBRK, +TO_CDH, +}; + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* QWERTY * -* |ESC | F1 | F2 | F3 | F4 | F5 | F6 | f7 | F8 | F9 | F10| F11| F12|Vol-|Vol+|Mute| +* |ESC | F1 | F2 | F3 | F4 | F5 | F6 | f7 | F8 | F9 | F10| F11| F12|Vol-|Vol+|_CDH| * -------------------------------------------------------------------------------' -* | ~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Bakspace| Del | -* -------------------------------------------------------------------------- -* | tab | q | w | e | r | t | y | u | i | o | p | [ | ] | \ | | +* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Bakspace| Del| +* --------------------------------------------------------------------------- +* | tab | q | w | e | r | t | y | u | i | o | p | [ | ] | \ | | * -------------------------------------------------------------------------------' -* | caps | a | s | d | f | g | h | j | k | l | ; | ' | enter |PgUp| +* |Bak/Mov| a | s | d | f | g | h | j | k | l | ; | ' | enter |PgUp| * -------------------------------------------------------------------------------- * |Lsft | z | x | c | v | b | n | m | , | . | / | Rsft| Up| PgDn| * --------------------------------------------------------------------------------- -* |Lctl |Lgui |Lalt | Space |Ralt | FN | Rctl |Left|Down|Rght| +* |Lctl |Lgui |Lalt | Space/Sym | GUI | Sym | Rctl |Left|Down|Rght| * --------------------------------------------------------------------------------- */ [_QWR] = KEYMAP( \ - KC_ESC, 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_VOLD, KC_VOLU, TO_CDH,\ + KC_ESC, 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_VOLD, KC_VOLU, CDH,\ KC_ESC, KC_1, KC_2, KC_3 ,KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_DEL,\ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,\ TT_MOV, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,\ @@ -48,29 +68,46 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_CDH] = KEYMAP (\ - ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, QWR, \ KC_ESC, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, ____, ____, ____,\ TT_MOV, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, ____,\ - KC_LSFT, KC_Z, KC_X, KC_C, M(1), KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, ____, ____,\ + KC_LSFT, KC_Z, KC_X, KC_C, M(DHPASTE), KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, ____, ____,\ ____, ____, ____ , KC_FN1, ____, ____, ____, ____, ____, ____ ), + +/* SYM +* +* |ESC | F1 | F2 | F3 | F4 | F5 | F6 | f7 | F8 | F9 | F10| F11| F12|Vol-|Vol+|_CDH| +* -------------------------------------------------------------------------------' +* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Bakspace|Del | +* -------------------------------------------------------------------------- +* | ESC: | ^ | { | } | @ | % | | [ | ( | ) | _ | [ | ] | \ | | +* -------------------------------------------------------------------------------' +* |Bak/Mov| ! | # | 0 | = | | * | - | 1 | + | ] | ` | enter |PgUp| +* -------------------------------------------------------------------------------- +* |Lsft | ; | ~ | : | ~ | "|"| $ | ~ | | | / | Rsft| Up| PgDn| +* --------------------------------------------------------------------------------- +* |Lctl |Lgui |Lalt | Space/Sym | GUI | Sym | Rctl |Left|Down|Rght| +* --------------------------------------------------------------------------------- +*/ + [_SYM] = KEYMAP (\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ - ____, KC_CIRC, KC_LCBR, KC_RCBR,KC_AT, KC_PERC, ____, KC_LBRC,KC_LPRN,KC_RPRN,KC_UNDS, ____, ____, ____,\ - ____, KC_EXLM, KC_HASH, KC_0, KC_EQL, ____, KC_ASTR,KC_MINS,KC_1, KC_PLUS,KC_RBRC, KC_GRV, ____, ____,\ - ____, ____, ____, ____, KC_TILDE, KC_PIPE, KC_DLR, ____, ____, ____, ____, ____, ____, ____,\ + M(VIBRK), KC_CIRC, KC_LCBR, KC_RCBR,KC_AT, KC_PERC, ____, KC_LBRC,KC_LPRN,KC_RPRN,KC_UNDS, ____, ____, ____,\ + ____, KC_EXLM, KC_HASH, KC_0, KC_EQL, ____, KC_ASTR,KC_MINS,KC_1, KC_PLUS,KC_RBRC, KC_GRV, ____, ____,\ + ____, KC_SCLN, KC_TILDE, KC_COLN, KC_TILDE, KC_PIPE, KC_DLR, KC_TILDE,____, ____, KC_SLSH, ____, ____, ____,\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ ), [_MOV] = KEYMAP (\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ - ____, ____, RGUI(KC_TAB), ____, ____, RCTL(KC_B), ____, ____, ____, ____, ____, ____, ____, ____, \ - ____, RCTL(KC_A), KC_S, RCTL(KC_K), RCTL(KC_E), ____, KC_LEFT,KC_DOWN, KC_UP, KC_RIGHT, ____, ____,____,____,\ + ____, ____,RGUI(KC_TAB), ____, ____, RCTL(KC_B), ____, ____, KC_UP, ____, ____, ____, ____, ____, \ + ____, RCTL(KC_A), KC_S, RCTL(KC_K), RCTL(KC_E), ____, ____, KC_LEFT,KC_DOWN, KC_RIGHT, ____, ____,____,____,\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ ), @@ -88,9 +125,54 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const uint16_t PROGMEM fn_actions[] = { [1] = ACTION_LAYER_TAP_KEY(_SYM,KC_SPACE), -[2] = ACTION_LAYER_TAP_KEY(_MOV,KC_BSPC), +[2] = ACTION_LAYER_TAP_KEY(_MOV,KC_BSPC) }; +#ifdef AUDIO_ENABLE + +float tone_startup[][2] = SONG(STARTUP_SOUND); +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWR: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + layer_off(_CDH); + } + return false; + break; + + case CDH: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + layer_on(_CDH); + } + return false; + break; + + case SYM: + if (record->event.pressed) { + layer_on(_SYM); + } else { + layer_off(_SYM); + } + return false; + break; + + } + return true; + +} + + const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function @@ -104,7 +186,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) break; - case 1 : + case DHPASTE: if(keyboard_report->mods & MOD_BIT(KC_LGUI) ) { if (record->event.pressed) { clear_keyboard_but_mods(); @@ -121,12 +203,29 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } break; - + case VIBRK: // vi esc: + if (record->event.pressed) { + return MACRO( T(E),D(LSFT),T(SCLN),U(LSFT), END ); + } + break; } + + return MACRO_NONE; }; +#ifdef AUDIO_ENABLE + + +void startup_user() +{ + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} +#endif + + void matrix_init_user(void) { } @@ -135,10 +234,9 @@ void matrix_scan_user(void) { } -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - return true; -} void led_set_user(uint8_t usb_led) { } + + From 0834c520c0c4adf0d4f59f4b149116b95726aec6 Mon Sep 17 00:00:00 2001 From: milestogo Date: Tue, 28 Feb 2017 21:54:35 -0800 Subject: [PATCH 036/181] missed config.h stuck modifiers change --- keyboards/handwired/MS-sculpt-mobile/config.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/keyboards/handwired/MS-sculpt-mobile/config.h b/keyboards/handwired/MS-sculpt-mobile/config.h index 1ac40f9964..d85c5c6233 100644 --- a/keyboards/handwired/MS-sculpt-mobile/config.h +++ b/keyboards/handwired/MS-sculpt-mobile/config.h @@ -24,7 +24,7 @@ along with this program. If not, see . #define VENDOR_ID 0xFEED #define PRODUCT_ID 0x6060 #define DEVICE_VER 0x0001 -#define MANUFACTURER Microsoft+abit +#define MANUFACTURER Microsoftplus #define PRODUCT sculpt mobile #define DESCRIPTION 6000 @@ -44,7 +44,7 @@ along with this program. If not, see . /* 0 1 2 3 4 5 6 7 */ #define MATRIX_ROW_PINS { F7,F6,F4,F5,F3,F2,F1,F0} /* A B C D E F G H I J K L M N O P Q R */ -#define MATRIX_COL_PINS { B7, D0, D1, D2, D3, D4, D5, D6, D7, E0,E1,C1, C0, C3, C2, C5, C4,C6} +#define MATRIX_COL_PINS { B7, D0, D1, D2, D3, D4, D5, D6, D7, E0,E1,C1, C0, C3, C2, C5, C4,C7} #define UNUSED_PINS { B6,B5,B4,B3,B2,B1,B0 } @@ -96,4 +96,6 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION +#define PREVENT_STUCK_MODIFIERS + #endif From b80c97b712de41871be1a25a30d6ec838ea9eda3 Mon Sep 17 00:00:00 2001 From: milestogo Date: Tue, 28 Feb 2017 23:27:49 -0800 Subject: [PATCH 037/181] clean up babblepaste --- .../handwired/MS-sculpt-mobile/babblePaste.c | 468 +++++++++++++++++ .../handwired/MS-sculpt-mobile/babblePaste.h | 72 +++ .../MS-sculpt-mobile/babblePaste.txt | 489 ++++++++++++++++++ 3 files changed, 1029 insertions(+) create mode 100644 keyboards/handwired/MS-sculpt-mobile/babblePaste.c create mode 100644 keyboards/handwired/MS-sculpt-mobile/babblePaste.h create mode 100644 keyboards/handwired/MS-sculpt-mobile/babblePaste.txt diff --git a/keyboards/handwired/MS-sculpt-mobile/babblePaste.c b/keyboards/handwired/MS-sculpt-mobile/babblePaste.c new file mode 100644 index 0000000000..00e8416f41 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/babblePaste.c @@ -0,0 +1,468 @@ +/* A library to output the right key shortcut in any common app. +Given a global variable babble_mode to show the environment and a +key that calls the paste macro, do the right type of paste. +Setting the context is done by another macro, or TBD interaction with the host. + +Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts +and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c +*/ + +#include "babblePaste.h" +#include "action_layer.h" + +// GLOBAL variable. Sets startup default if no eeppom +char babble_mode = MAC_MODE ; + + +const static macro_t *babblePaste (keyrecord_t *record, uint16_t shortcut) { + + switch(babble_mode) { + +#ifdef MS_MODE + case MS_MODE: + switch(shortcut) { + + case BABL_DEL_RIGHT_1C: + return (static macro_t *) MACRO( D(DEL), END ); + case BABL_DEL_LEFT_WORD: + return MACRO( D(LCTRL), T(BSPACE), U(LCTRL), END ); + case BABL_DEL_RIGHT_WORD: + return MACRO( D(LCTRL), T(DEL), U(LCTRL), END ); + case BABL_GO_LEFT_1C: + return MACRO( T(LEFT), END ); + case BABL_GO_RIGHT_1C: + return MACRO( T(RIGHT), END ); + case BABL_GO_LEFT_WORD: + return MACRO( D(LCTRL), T(LEFT), U(LCTRL), END ); + case BABL_GO_RIGHT_WORD: + return MACRO( D(LCTRL), T(RIGHT), U(LCTRL), END ); + case BABL_GO_START_LINE: + return MACRO( T(HOME), END ); + case BABL_GO_START_DOC: + return MACRO( D(LCTRL),T(HOME), U(LCTRL),END ); + case BABL_GO_END_LINE: + return MACRO( T(END), END ); + case BABL_GO_END_DOC: + return MACRO( D(LCTRL),T(END), U(LCTRL),END ); + case BABL_GO_NEXT_LINE: + return MACRO( T(DOWN), END ); + case BABL_GO_PREV_LINE: + return MACRO( T(UP), END ); + case BABL_PGDN: + return MACRO( T(PGDN), END ); + case BABL_PGUP: + return MACRO( T(PGUP), END ); +#ifndef BABL_MOVEMENTONLY + case BABL_UNDO: + return MACRO( D(LCTRL), T(Z), U(LCTRL), END ); + case BABL_REDO: + return MACRO( D(LCTRL), T(Y), U(LCTRL), END ); + case BABL_CUT: + return MACRO( D(LCTRL), T(X), U(LCTRL), END ); + case BABL_COPY: + return MACRO( D(LCTRL), T(C), U(LCTRL), END ); + case BABL_PASTE: + return MACRO( D(LCTRL), T(V), U(LCTRL), END ); + case BABL_SELECT_ALL: + return MACRO( D(LCTRL), T(A), U(LCTRL), END ); + case BABL_UNDO: + return MACRO( D(LCTRL), T(Z), U(LCTRL), END ); + case BABL_REDO: + return MACRO( D(LCTRL), T(Y), U(LCTRL), END ); + case BABL_CUT: + return MACRO( D(LCTRL), T(X), U(LCTRL), END ); + case BABL_COPY: + return MACRO( D(LCTRL), T(C), U(LCTRL), END ); + case BABL_PASTE: + return MACRO( D(LCTRL), T(V), U(LCTRL), END ); + case BABL_SELECT_ALL: + return MACRO( D(LCTRL), T(A), U(LCTRL), END ); + case BABL_FIND: + return MACRO( D(LCTRL),T(F), U(LCTRL),END ); + case BABL_FIND_NEXT: + return MACRO( T(F3),END ); + case BABL_FIND_REPLACE: + return MACRO( D(LCTRL),T(H), U(LCTRL),END ); + case BABL_RUNAPP: + return MACRO( D(LGUI),T(R), U(LGUI),END ); + case BABL_SWITCH_APP_NEXT: + return MACRO( D(LALT),T(TAB), U(LALT),END ); + case BABL_SWITCH_APP_LAST: + return MACRO( D(LSFT),D(LALT),T(TAB), U(LALT), U(LSFT),END ); + case BABL_CLOSE_APP: + return MACRO( D(LALT),T(F4), U(LALT),END ); + case BABL_HELP: + return MACRO( T(F1),END ); +#endif + break; + + return MACRO_NONE; + } + +#endif +#ifdef LINUX_MODE + case LINUX_MODE: + switch(shortcut) { + + case BABL_DEL_RIGHT_1C: + return MACRO( D(DEL), END ); + case BABL_DEL_LEFT_WORD: + return MACRO( D(LCTRL), T(BSPACE), U(LCTRL), END ); + case BABL_DEL_RIGHT_WORD: + return MACRO( D(LCTRL), T(DEL), U(LCTRL), END ); + case BABL_GO_LEFT_1C: + return MACRO( T(LEFT), END ); + case BABL_GO_RIGHT_1C: + return MACRO( T(RIGHT), END ); + case BABL_GO_LEFT_WORD: + return MACRO( D(LCTRL), T(LEFT), U(LCTRL), END ); + case BABL_GO_RIGHT_WORD: + return MACRO( D(LCTRL), T(RIGHT), U(LCTRL), END ); + case BABL_GO_START_LINE: + return MACRO( T(HOME), END ); + case BABL_GO_START_DOC: + return MACRO( D(LCTRL),T(HOME), U(LCTRL),END ); + case BABL_GO_END_LINE: + return MACRO( T(END), END ); + case BABL_GO_END_DOC: + return MACRO( D(LCTRL),T(END), U(LCTRL),END ); + case BABL_GO_NEXT_LINE: + return MACRO( T(DOWN), END ); + case BABL_GO_PREV_LINE: + return MACRO( T(UP), END ); + case BABL_PGDN: + return MACRO( T(PGDN), END ); + case BABL_PGUP: + return MACRO( T(PGUP), END ); +#ifndef BABL_MOVEMENTONLY + case BABL_UNDO: + return MACRO( D(LCTRL), T(Z), U(LCTRL), END ); + case BABL_REDO: + return MACRO( D(LCTRL), T(Y), U(LCTRL), END ); + case BABL_CUT: + return MACRO( D(LCTRL), T(X), U(LCTRL), END ); + case BABL_COPY: + return MACRO( D(LCTRL), T(C), U(LCTRL), END ); + case BABL_PASTE: + return MACRO( D(LCTRL), T(V), U(LCTRL), END ); + case BABL_SELECT_ALL: + return MACRO( D(LCTRL), T(A), U(LCTRL), END ); + + case BABL_FIND: + return MACRO( D(LCTRL),T(F), U(LCTRL),END ); + case BABL_FIND_NEXT: + /* return MACRO( T(F3),END ); KDE */ + return MACRO( D(LCTRL),T(G), U(LCTRL),END ); // Gnome*/ + case BABL_FIND_REPLACE: + /* return MACRO( D(LCTRL),T(R), U(LCTRL),END ); KDE */ + return MACRO( D(LCTRL),T(H), U(LCTRL),END ); // Gnome*/ + case BABL_RUNAPP: + return MACRO( D(LALT),T(F2), U(LALT),END ); + case BABL_SWITCH_APP_NEXT: + return MACRO( D(LCTL),T(TAB), U(LCTL),END ); + case BABL_SWITCH_APP_LAST: + return MACRO( D(LSFT),D(LCTL),T(TAB), U(LCTL), U(LSFT),END ); + case BABL_CLOSE_APP: + return MACRO( D(LALT),T(F4), U(LALT),END ); + case BABL_HELP: + return MACRO_NONE; +#endif + break; + + return MACRO_NONE; + } + +#endif + +#ifdef MAC_MODE + case MAC_MODE: + switch(shortcut) { + + + case BABL_DEL_RIGHT_1C: + return MACRO( D(DEL), END ); + case BABL_DEL_LEFT_WORD: + return MACRO( D(LALT), T(BSPACE), U(LALT), END ); + case BABL_DEL_RIGHT_WORD: + return MACRO( D(LALT), T(DEL), U(LALT), END ); + case BABL_GO_LEFT_1C: + return MACRO( T(LEFT), END ); + case BABL_GO_RIGHT_1C: + return MACRO( T(RIGHT), END ); + case BABL_GO_LEFT_WORD: + return MACRO( D(LALT), T(LEFT), U(LALT), END ); + case BABL_GO_RIGHT_WORD: + return MACRO( D(LALT), T(RIGHT), U(LALT), END ); + case BABL_GO_START_LINE: + return MACRO( D(LGUI), T(LEFT), U(LGUI), END ); + case BABL_GO_START_DOC: + return MACRO( D(LGUI),T(UP), U(LGUI),END ); + case BABL_GO_END_LINE: + return MACRO( D(LGUI), T(RIGHT), U(LGUI), END ); + case BABL_GO_END_DOC: + return MACRO( D(LGUI),T(DOWN), U(LGUI),END ); + case BABL_GO_NEXT_LINE: + return MACRO( T(DOWN), END ); + case BABL_GO_PREV_LINE: + return MACRO( T(UP), END ); + case BABL_PGDN: + return MACRO( D(LALT), T(DOWN), U(LALT), END ); + case BABL_PGUP: + return MACRO( D(LALT), T(UP), U(LALT), END ); +#ifndef BABL_MOVEMENTONLY + case BABL_UNDO: + return MACRO( D(LGUI), T(Z), U(LGUI), END ); + case BABL_REDO: + return MACRO( D(LSFT),D(LGUI), T(Z), U(LSFT),U(LGUI), END ); + case BABL_CUT: + return MACRO( D(LGUI), T(X), U(LGUI), END ); + case BABL_COPY: + return MACRO( D(LGUI), T(C), U(LGUI), END ); + case BABL_PASTE: + return MACRO( D(LGUI), T(V), U(LGUI), END ); + case BABL_SELECT_ALL: + return MACRO( D(LGUI), T(A), U(LGUI), END ); + case BABL_FIND: + return MACRO( D(LGUI),T(F), U(LGUI),END ); + case BABL_FIND_NEXT: + return MACRO( D(LGUI),T(G), U(LGUI),END ); + case BABL_FIND_REPLACE: + return MACRO( D(LGUI),T(F), U(LGUI),END ); + case BABL_RUNAPP: + return MACRO( D(LGUI),T(R), U(LGUI),END ); + case BABL_SWITCH_APP_NEXT: + return MACRO( D(LGUI),T(TAB), U(LGUI),END ); + case BABL_SWITCH_APP_LAST: + return MACRO( D(LSFT),D(LGUI),T(TAB), U(LGUI), U(LSFT),END ); + case BABL_CLOSE_APP: + return MACRO( D(LGUI),T(Q), U(LGUI),END ); + case BABL_HELP: + return MACRO( D(LSFT),D(LGUI),T(SLASH), U(LGUI), U(LSFT),END ); +#endif + break; + + return MACRO_NONE; + } + +#endif + +#ifdef EMACS_MODE + case EMACS_MODE: + switch(shortcut) { +//probably should allow meta to not be ALT + + case BABL_DEL_RIGHT_1C: + return MACRO( D(LCTL), T(D), U(LCTL),END ); + case BABL_DEL_LEFT_WORD: + return MACRO( D(LCTL), T(BSPACE), U(LCTL), END ); + case BABL_DEL_RIGHT_WORD: + return MACRO( D(LALT), T(D), U(LALT), END ); + case BABL_GO_LEFT_1C: + return MACRO( T(LEFT), END ); + case BABL_GO_RIGHT_1C: + return MACRO( T(RIGHT), END ); + case BABL_GO_LEFT_WORD: + return MACRO( D(LALT), T(B), U(LALT), END ); + case BABL_GO_RIGHT_WORD: + return MACRO( D(LALT), T(F), U(LALT), END ); + case BABL_GO_START_LINE: + return MACRO( D(LCTRL), T(A), U(LCTRL), END ); + case BABL_GO_START_DOC: + return MACRO( D(LALT), D(LSFT), T(COMM),U(LSFT), U(LALT) ,END ); + case BABL_GO_END_LINE: + return MACRO( D(LCTRL), T(E), U(LCTRL), END ); + case BABL_GO_END_DOC: + return MACRO( D(LALT), D(LSFT), T(DOT),U(LSFT), U(LALT) ,END ); + case BABL_GO_NEXT_LINE: + return MACRO( D(LCTRL), T(N), U(LCTRL), END ); + case BABL_GO_PREV_LINE: + return MACRO( D(LCTRL), T(P), U(LCTRL), END ); + case BABL_PGDN: + return MACRO(D(LCTRL), T(V), U(LCTRL), END ); + case BABL_PGUP: + return MACRO( D(LALT), T(V), U(LALT), END ); +#ifndef BABL_MOVEMENTONLY + case BABL_UNDO: + return MACRO( D(LCTL), T(X), U(LCTL),T(C), END ); + case BABL_REDO: + return MACRO( D(LCTL), T(X), U(LCTL),T(C), END ); // arguably + case BABL_CUT: + return MACRO( D(LCTL), T(W), U(LCTL), END ); + case BABL_COPY: + return MACRO( D(LALT), T(W), U(LALT), END ); //really? + case BABL_PASTE: + return MACRO( D(LCTL), T(Y), U(LCTL), END ); + case BABL_SELECT_ALL: + return MACRO(D(LCTL), T(X), U(LCTL),T(H), END ); + case BABL_FIND: + return MACRO( D(LCTRL), T(S), U(LCTRL),END ); + case BABL_FIND_NEXT: + return MACRO( D(LCTRL), T(S), U(LCTRL),END ); + case BABL_FIND_REPLACE: + return MACRO( D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END ); + case BABL_RUNAPP: + return MACRO( D(LALT), T(X), U(LALT),T(S),T(H),T(E),T(L),T(L),END );// arguably + case BABL_SWITCH_APP_NEXT: + return MACRO( D(LCTL), T(X), U(LCTL),T(RIGHT), END ); // arguably + case BABL_SWITCH_APP_LAST: + return MACRO( D(LCTL), T(X), U(LCTL),T(LEFT), END ); // arguably + case BABL_CLOSE_APP: + return MACRO(D(LCTL), T(X), U(LCTL),T(C),END ); + case BABL_HELP: + return MACRO( D(LCTL),T(H), U(LCTL),T(A),END); // start search in help +#endif + break; + + return MACRO_NONE; + } + +#endif +#ifdef VI_MODE + case VI_MODE: + switch(shortcut) { +//assume esc is already called + + case BABL_DEL_RIGHT_1C: + return MACRO( T(X),END ); + case BABL_DEL_LEFT_WORD: + return MACRO( T(D),T(G),T(E),END ); + case BABL_DEL_RIGHT_WORD: + return MACRO( T(D),T(W),END ); + case BABL_GO_LEFT_1C: + return MACRO( T(H), END ); + case BABL_GO_RIGHT_1C: + return MACRO( T(L), END ); + case BABL_GO_LEFT_WORD: + return MACRO( T(B),END ); + case BABL_GO_RIGHT_WORD: + return MACRO( T(W), END ); + case BABL_GO_START_LINE: + return MACRO( D(LSFT), T(6),U(LSFT), END ); //^ + case BABL_GO_START_DOC: + return MACRO( T(G),T(G) ,END ); + case BABL_GO_END_LINE: + return MACRO( D(LSFT), T(4),U(LSFT) , END ); //$ + case BABL_GO_END_DOC: + return MACRO( D(LSFT), T(G),U(LSFT),END ); + case BABL_GO_NEXT_LINE: + return MACRO( T(J), END ); + case BABL_GO_PREV_LINE: + return MACRO( T(K), END ); + case BABL_PGDN: + return MACRO(D(LCTRL), T(F), U(LCTRL), END ); + case BABL_PGUP: + return MACRO( D(LCTRL), T(B), U(LCTRL), END ); +#ifndef BABL_MOVEMENTONLY + case BABL_UNDO: + return MACRO( T(U), END ); + case BABL_REDO: + return MACRO( D(LCTL), T(R), U(LCTL), END ); + case BABL_CUT: + return MACRO( T(X), END ); + case BABL_COPY: + return MACRO( T(Y),END ); + case BABL_PASTE: + return MACRO( T(P), END ); + case BABL_SELECT_ALL: + return MACRO( D(LSFT), T(SCLN),U(LSFT),D(LSFT), T(5),U(LSFT),T(Y), END ); // wrong but helpful? + case BABL_FIND: + return MACRO( T(SLASH),END ); + case BABL_FIND_NEXT: + return MACRO( T(N),END ); + case BABL_FIND_REPLACE: + return MACRO( D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END ); + case BABL_RUNAPP: + return MACRO_NONE; + case BABL_SWITCH_APP_NEXT: + return MACRO_NONE; + case BABL_SWITCH_APP_LAST: + return MACRO_NONE; + case BABL_CLOSE_APP: + return MACRO(D(LSFT), T(SCLN),U(LSFT), T(Q), D(RSFT), T(1),U(RSFT), END ); + case BABL_HELP: + return MACRO(D(LSFT), T(SCLN),U(LSFT),T(H),END); // start search in help + break; +#endif + return MACRO_NONE; + } + +#endif +#ifdef READMUX_MODE +// Readline command line editing + tmux windowing +// I havent decided how much to do readline and how much tmux + case READMUX_MODE: + switch(shortcut) { + + case BABL_DEL_RIGHT_1C: + return MACRO( D(LCTL), T(D), U(LCTL),END ); + case BABL_DEL_LEFT_WORD: + return MACRO( D(LCTL), T(W), U(LCTL), END ); + case BABL_DEL_RIGHT_WORD: + return MACRO( D(LALT), T(D), U(LALT), END ); + case BABL_GO_LEFT_1C: + return MACRO( T(LEFT), END ); + case BABL_GO_RIGHT_1C: + return MACRO( T(RIGHT), END ); + case BABL_GO_LEFT_WORD: + return MACRO( D(LALT), T(B), U(LALT), END ); + case BABL_GO_RIGHT_WORD: + return MACRO( D(LALT), T(F), U(LALT), END ); + case BABL_GO_START_LINE: + return MACRO( D(LCTRL), T(A), U(LCTRL), END ); + case BABL_GO_START_DOC: + return MACRO_NONE; // tmux? + case BABL_GO_END_LINE: + return MACRO( D(LCTRL), T(E), U(LCTRL), END ); + case BABL_GO_END_DOC: + return MACRO_NONE; // tmux? + case BABL_GO_NEXT_LINE: + return MACRO( D(LCTRL), T(N), U(LCTRL), END ); + case BABL_GO_PREV_LINE: + return MACRO( D(LCTRL), T(P), U(LCTRL), END ); + case BABL_PGDN: + return MACRO( T(PGDN), END ); + case BABL_PGUP: + return MACRO( T(PGUP), END ); +#ifndef BABL_MOVEMENTONLY + case BABL_UNDO: + return MACRO( D(LALT), T(R), U(LALT) , END ); + case BABL_REDO: + return MACRO( D(LCTL), T(X), U(LCTL),T(C), END ); // arguably + case BABL_CUT: + return MACRO( D(LCTL), T(K), U(LCTL), END ); // wrong half the time + case BABL_COPY: + return MACRO_NONE; + case BABL_PASTE: + return MACRO( D(LCTL), T(Y), U(LCTL), END ); + case BABL_SELECT_ALL: + return MACRO(D(LCTL), T(A), T(K), T(Y), U(LCTL) , END ); + case BABL_FIND: + return MACRO( D(LCTRL), T(R), U(LCTRL), END ); // search history + case BABL_FIND_NEXT: + eturn MACRO( D(LCTRL), T(S), U(LCTRL), END ); + case BABL_FIND_REPLACE: + return MACRO_NONE; // tmux? + case BABL_RUNAPP: + return MACRO( D(LCTRL), T(B), U(LCTRL), T(C),END ); //tmux + case BABL_SWITCH_APP_NEXT: + return MACRO( D(LCTRL), T(B), U(LCTRL), T(N),END ); //tmux + case BABL_SWITCH_APP_LAST: + return MACRO( D(LCTRL), T(B), U(LCTRL), T(P),END ); //tmux + case BABL_CLOSE_APP: + return MACRO( D(LCTRL), T(B), U(LCTRL), T(D),END); // usually what I want + break; + case BABL_HELP: + return MACRO_NONE; +#endif + break; + + return MACRO_NONE; + } + +#endif + return MACRO_NONE; + } + + +} + diff --git a/keyboards/handwired/MS-sculpt-mobile/babblePaste.h b/keyboards/handwired/MS-sculpt-mobile/babblePaste.h new file mode 100644 index 0000000000..63b79a2055 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/babblePaste.h @@ -0,0 +1,72 @@ +/* A library to output the right key shortcut in any common app. +Given a global variable babble_mode to show the environment and a +key that calls the paste macro, do the right type of paste. + +Setting the bable_mode is done by another macro, or TBD interaction with the host. + +Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts +and jeebak & algernon's keymap +*/ +#ifndef _babblePaste_h_included__ +#define _babblePaste_h_included__ + + +/* Add this to your config.h +// Uncomment any modes you want. +// Windows. +//#define MS_MODE 0 +//#define MAC_MODE 1 +//aka gnome+KDE +//#define LINUX_MODE 2 +//#define EMACS_MODE 3 +//#define VI_MODE 4 +//#define WORDSTAR_MODE 5 +// Readline and tmux +//#define READMUX 6 +*/ + +/* Macros handled by babblepaste. Most should be available for all platforms. */ +enum { + + // Movement + BABL_DEL_RIGHT_1C=200, + BABL_DEL_LEFT_WORD, + BABL_DEL_RIGHT_WORD, + BABL_GO_LEFT_1C, + BABL_GO_RIGHT_1C, + BABL_GO_LEFT_WORD, + BABL_GO_RIGHT_WORD, + BABL_GO_START_LINE, + BABL_GO_END_LINE, + BABL_GO_START_DOC, + BABL_GO_END_DOC, + BABL_GO_NEXT_LINE, + BABL_GO_PREV_LINE, + BABL_PGDN, + BABL_PGUP, +#ifndef BABL_MOVEMENTONLY + // Cut & Paste + BABL_UNDO, + BABL_REDO, + BABL_CUT, + BABL_COPY, + BABL_PASTE, + BABL_SELECT_ALL, + // GUI or app + BABL_FIND, + BABL_FIND_NEXT, + BABL_FIND_REPLACE, + BABL_RUNAPP, + BABL_SWITCH_APP_NEXT, + BABL_SWITCH_APP_LAST, // previous + BABL_CLOSE_APP, + BABL_HELP +#endif +}; + + + + +//static macro_t *babblePaste(keyrecord_t *record, uint16_t shortcut) + + #endif \ No newline at end of file diff --git a/keyboards/handwired/MS-sculpt-mobile/babblePaste.txt b/keyboards/handwired/MS-sculpt-mobile/babblePaste.txt new file mode 100644 index 0000000000..6170ec7af5 --- /dev/null +++ b/keyboards/handwired/MS-sculpt-mobile/babblePaste.txt @@ -0,0 +1,489 @@ +/* A library to output the right key shortcut in any common app. +Given a global variable babble_mode to show the environment and a +key that calls the paste macro, do the right type of paste. +Setting the context is done by another macro, or TBD interaction with the host. + +Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts +and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c +*/ + +#include "eeconfig.h" + + +// Comment out anything you will never use. +// Windows. +#define MS_MODE 0 +#define MAC_MODE 1 +//aka gnome+KDE +#define LINUX_MODE 2 +#define EMACS_MODE 3 +#define VI_MODE 4 +//#define WORDSTAR_MODE 5 +// Readline and tmux +#define READMUX 6 + +// GLOBAL variable. Sets startup default if no eeppom +char babble_mode = MAC_MODE ; + + +/* minimum set required for babble: + // Cut & Paste + BABL_UNDO + BABL_REDO + BABL_CUT + BABL_COPY + BABL_PASTE + BABL_SELECT_ALL + + // Movement + BABL_DEL_RIGHT_1C + BABL_DEL_RIGHT_1C + BABL_DEL_LEFT_WORD + BABL_DEL_RIGHT_WORD + BABL_GO_LEFT_1C + BABL_GO_LEFT_WORD + BABL_GO_RIGHT_WORD + BABL_GOTO_START_LINE + BABL_GOTO_START_DOC + BABL_GOTO_END_LINE + BABL_GOTO_END_DOC + BABL_GOTO_NEXT_LINE // down arrow will do. + BABL_GOTO_PREV_LINE // up arrow will do. + BABL_PGDN + BABL_PGUP + + // GUI + BABL_FIND + BABL_FIND_NEXT + BABL_FIND_REPLACE + BABL_RUNAPP + BABL_SWITCH_NEXT + BABL_SWITCH_LAST // previous + BABL_CLOSE_APP + BABL_HELP +*/ + + + + +static macro_t *babblePaste (keyrecord_t *record, uint16_t shortcut) { + + switch(babble_mode) { + +#ifdef MS_MODE + case MS_MODE: + switch(shortcut) { + + case BABL_UNDO: + return MACRO( D(LCTRL), T(Z), U(LCTRL), END ); + case BABL_REDO: + return MACRO( D(LCTRL), T(Y), U(LCTRL), END ); + case BABL_CUT: + return MACRO( D(LCTRL), T(X), U(LCTRL), END ); + case BABL_COPY: + return MACRO( D(LCTRL), T(C), U(LCTRL), END ); + case BABL_PASTE: + return MACRO( D(LCTRL), T(V), U(LCTRL), END ); + case BABL_SELECT_ALL: + return MACRO( D(LCTRL), T(A), U(LCTRL), END ); + case BABL_DEL_RIGHT_1C: + return MACRO( D(DEL), END ); + case BABL_DEL_LEFT_WORD: + return MACRO( D(LCTRL), T(BSPACE), U(LCTRL), END ); + case BABL_DEL_RIGHT_WORD: + return MACRO( D(LCTRL), T(DEL), U(LCTRL), END ); + case BABL_GO_LEFT_1C: + return MACRO( T(LEFT), END ); + case BABL_GO_RIGHT_1C: + return MACRO( T(RIGHT), END ); + case BABL_GO_LEFT_WORD: + return MACRO( D(LCTRL), T(LEFT), U(LCTRL), END ); + case BABL_GO_RIGHT_WORD: + return MACRO( D(LCTRL), T(RIGHT), U(LCTRL), END ); + case BABL_GOTO_START_LINE: + return MACRO( T(HOME), END ); + case BABL_GOTO_START_DOC: + return MACRO( D(LCTRL),T(HOME), U(LCTRL),END ); + case BABL_GOTO_END_LINE: + return MACRO( T(END), END ); + case BABL_GOTO_END_DOC: + return MACRO( D(LCTRL),T(END), U(LCTRL),END ); + case BABL_GOTO_NEXT_LINE: + return MACRO( T(DOWN), END ); + case BABL_GOTO_PREV_LINE: + return MACRO( T(UP), END ); + case BABL_PGDN: + return MACRO( T(PGDN), END ); + case BABL_PGUP: + return MACRO( T(PGUP), END ); + case BABL_FIND: + return MACRO( D(LCTRL),T(F), U(LCTRL),END ); + case BABL_FIND_NEXT: + return MACRO( T(F3),END ); + case BABL_FIND_REPLACE: + return MACRO( D(LCTRL),T(H), U(LCTRL),END ); + case BABL_RUNAPP: + return MACRO( D(LGUI),T(R), U(LGUI),END ); + case BABL_SWITCH_APP_NEXT: + return MACRO( D(LALT),T(TAB), U(LALT),END ); + case BABL_SWITCH_APP_LAST: + return MACRO( D(LSFT),D(LALT),T(TAB), U(LALT), U(LSFT),END ); + case BABL_CLOSE_APP: + return MACRO( D(LALT),T(F4), U(LALT),END ); + case BABL_HELP: + return MACRO( T(F1),END ); + break; + + return MACRO_NONE; + } + +#endif +#ifdef LINUX_MODE + case LINUX_MODE: + switch(shortcut) { + + case BABL_UNDO: + return MACRO( D(LCTRL), T(Z), U(LCTRL), END ); + case BABL_REDO: + return MACRO( D(LCTRL), T(Y), U(LCTRL), END ); + case BABL_CUT: + return MACRO( D(LCTRL), T(X), U(LCTRL), END ); + case BABL_COPY: + return MACRO( D(LCTRL), T(C), U(LCTRL), END ); + case BABL_PASTE: + return MACRO( D(LCTRL), T(V), U(LCTRL), END ); + case BABL_SELECT_ALL: + return MACRO( D(LCTRL), T(A), U(LCTRL), END ); + case BABL_DEL_RIGHT_1C: + return MACRO( D(DEL), END ); + case BABL_DEL_LEFT_WORD: + return MACRO( D(LCTRL), T(BSPACE), U(LCTRL), END ); + case BABL_DEL_RIGHT_WORD: + return MACRO( D(LCTRL), T(DEL), U(LCTRL), END ); + case BABL_GO_LEFT_1C: + return MACRO( T(LEFT), END ); + case BABL_GO_RIGHT_1C: + return MACRO( T(RIGHT), END ); + case BABL_GO_LEFT_WORD: + return MACRO( D(LCTRL), T(LEFT), U(LCTRL), END ); + case BABL_GO_RIGHT_WORD: + return MACRO( D(LCTRL), T(RIGHT), U(LCTRL), END ); + case BABL_GOTO_START_LINE: + return MACRO( T(HOME), END ); + case BABL_GOTO_START_DOC: + return MACRO( D(LCTRL),T(HOME), U(LCTRL),END ); + case BABL_GOTO_END_LINE: + return MACRO( T(END), END ); + case BABL_GOTO_END_DOC: + return MACRO( D(LCTRL),T(END), U(LCTRL),END ); + case BABL_GOTO_NEXT_LINE: + return MACRO( T(DOWN), END ); + case BABL_GOTO_PREV_LINE: + return MACRO( T(UP), END ); + case BABL_PGDN: + return MACRO( T(PGDN), END ); + case BABL_PGUP: + return MACRO( T(PGUP), END ); + case BABL_FIND: + return MACRO( D(LCTRL),T(F), U(LCTRL),END ); + case BABL_FIND_NEXT: + /* return MACRO( T(F3),END ); KDE */ + return MACRO( D(LCTRL),T(G), U(LCTRL),END ); // Gnome*/ + case BABL_FIND_REPLACE: + /* return MACRO( D(LCTRL),T(R), U(LCTRL),END ); KDE */ + return MACRO( D(LCTRL),T(H), U(LCTRL),END ); // Gnome*/ + case BABL_RUNAPP: + return MACRO( D(LALT),T(F2), U(LALT),END ); + case BABL_SWITCH_APP_NEXT: + return MACRO( D(LCTL),T(TAB), U(LCTL),END ); + case BABL_SWITCH_APP_LAST: + return MACRO( D(LSFT),D(LCTL),T(TAB), U(LCTL), U(LSFT),END ); + case BABL_CLOSE_APP: + return MACRO( D(LALT),T(F4), U(LALT),END ); + case BABL_HELP: + return MACRO_NONE; + break; + + return MACRO_NONE; + } + +#endif + + + +#ifdef MAC_MODE + case MAC_MODE: + switch(shortcut) { + + case BABL_UNDO: + return MACRO( D(LGUI), T(Z), U(LGUI), END ); + case BABL_REDO: + return MACRO( D(LSFT),D(LGUI), T(Z), U(LSFT),U(LGUI), END ); + case BABL_CUT: + return MACRO( D(LGUI), T(X), U(LGUI), END ); + case BABL_COPY: + return MACRO( D(LGUI), T(C), U(LGUI), END ); + case BABL_PASTE: + return MACRO( D(LGUI), T(V), U(LGUI), END ); + case BABL_SELECT_ALL: + return MACRO( D(LGUI), T(A), U(LGUI), END ); + case BABL_DEL_RIGHT_1C: + return MACRO( D(DEL), END ); + case BABL_DEL_LEFT_WORD: + return MACRO( D(LALT), T(BSPACE), U(LALT), END ); + case BABL_DEL_RIGHT_WORD: + return MACRO( D(LALT), T(DEL), U(LALT), END ); + case BABL_GO_LEFT_1C: + return MACRO( T(LEFT), END ); + case BABL_GO_RIGHT_1C: + return MACRO( T(RIGHT), END ); + case BABL_GO_LEFT_WORD: + return MACRO( D(LALT), T(LEFT), U(LALT), END ); + case BABL_GO_RIGHT_WORD: + return MACRO( D(LALT), T(RIGHT), U(LALT), END ); + case BABL_GOTO_START_LINE: + return MACRO( D(LGUI), T(LEFT), U(LGUI), END ); + case BABL_GOTO_START_DOC: + return MACRO( D(LGUI),T(UP), U(LGUI),END ); + case BABL_GOTO_END_LINE: + return MACRO( D(LGUI), T(RIGHT), U(LGUI), END ); + case BABL_GOTO_END_DOC: + return MACRO( D(LGUI),T(DOWN), U(LGUI),END ); + case BABL_GOTO_NEXT_LINE: + return MACRO( T(DOWN), END ); + case BABL_GOTO_PREV_LINE: + return MACRO( T(UP), END ); + case BABL_PGDN: + return MACRO( D(LALT), T(DOWN), U(LALT), END ); + case BABL_PGUP: + return MACRO( D(LALT), T(UP), U(LALT), END ); + case BABL_FIND: + return MACRO( D(LGUI),T(F), U(LGUI),END ); + case BABL_FIND_NEXT: + return MACRO( D(LGUI),T(G), U(LGUI),END ); + case BABL_FIND_REPLACE: + return MACRO( D(LGUI),T(F), U(LGUI),END ); + case BABL_RUNAPP: + return MACRO( D(LGUI),T(R), U(LGUI),END ); + case BABL_SWITCH_APP_NEXT: + return MACRO( D(LGUI),T(TAB), U(LGUI),END ); + case BABL_SWITCH_APP_LAST: + return MACRO( D(LSFT),D(LGUI),T(TAB), U(LGUI), U(LSFT),END ); + case BABL_CLOSE_APP: + return MACRO( D(LGUI),T(Q), U(LGUI),END ); + case BABL_HELP: + return MACRO( D(LSFT),D(LGUI),T(SLASH), U(LGUI), U(LSFT),END ); + break; + + return MACRO_NONE; + } + +#endif + +#ifdef EMACS_MODE + case EMACS_MODE: + switch(shortcut) { +//probably should allow meta to not be ALT + case BABL_UNDO: + return MACRO( D(LCTL), T(X), U(LCTL),T(C), END ); + case BABL_REDO: + return MACRO( D(LCTL), T(X), U(LCTL),T(C), END ); // arguably + case BABL_CUT: + return MACRO( D(LCTL), T(W), U(LCTL), END ); + case BABL_COPY: + return MACRO( D(LALT), T(W), U(LALT), END ); + case BABL_PASTE: + return MACRO( D(LCTL), T(Y), U(LCTL), END ); + case BABL_SELECT_ALL: + return MACRO(D(LCTL), T(X), U(LCTL),T(H), END ); + case BABL_DEL_RIGHT_1C: + return MACRO( D(LCTL), T(D), U(LCTL),END ); + case BABL_DEL_LEFT_WORD: + return MACRO( D(LCTL), T(BSPACE), U(LCTL), END ); + case BABL_DEL_RIGHT_WORD: + return MACRO( D(LALT), T(D), U(LALT), END ); + case BABL_GO_LEFT_1C: + return MACRO( T(LEFT), END ); + case BABL_GO_RIGHT_1C: + return MACRO( T(RIGHT), END ); + case BABL_GO_LEFT_WORD: + return MACRO( D(LALT), T(B), U(LALT), END ); + case BABL_GO_RIGHT_WORD: + return MACRO( D(LALT), T(F), U(LALT), END ); + case BABL_GOTO_START_LINE: + return MACRO( D(LCTRL), T(A), U(LCTRL), END ); + case BABL_GOTO_START_DOC: + return MACRO( D(LALT), D(LSFT), T(COMM),U(LSFT), U(LALT) ,END ); + case BABL_GOTO_END_LINE: + return MACRO( D(LCTRL), T(E), U(LCTRL), END ); + case BABL_GOTO_END_DOC: + return MACRO( D(LALT), D(LSFT), T(DOT),U(LSFT), U(LALT) ,END ); + case BABL_GOTO_NEXT_LINE: + return MACRO( D(LCTRL), T(N), U(LCTRL), END ); + case BABL_GOTO_PREV_LINE: + rreturn MACRO( D(LCTRL), T(P), U(LCTRL), END ); + case BABL_PGDN: + return MACRO(D(LCTRL), T(V), U(LCTRL), END ); + case BABL_PGUP: + return MACRO( D(LALT), T(V), U(LALT), END ); + case BABL_FIND: + return MACRO( D(LCTRL), T(S), U(LCTRL),END ); + case BABL_FIND_NEXT: + return MACRO( D(LCTRL), T(S), U(LCTRL),END ); + case BABL_FIND_REPLACE: + return MACRO( D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END ); + case BABL_RUNAPP: + return MACRO( D(LALT), T(X), U(LALT),T(S),T(H),T(E),T(L),T(L),END );// arguably + case BABL_SWITCH_APP_NEXT: + return MACRO( D(LCTL), T(X), U(LCTL),T(RIGHT), END ); // arguably + case BABL_SWITCH_APP_LAST: + return MACRO( D(LCTL), T(X), U(LCTL),T(LEFT), END ); // arguably + case BABL_CLOSE_APP: + return MACRO(D(LCTL), T(X), U(LCTL),T(C),END ); + case BABL_HELP: + return MACRO( D(LCTL),T(H), U(LCTL),T(A),END); // start search in help + break; + + return MACRO_NONE; + } + +#endif +#ifdef VI_MODE + case VI_MODE: + switch(shortcut) { +//assume esc is already called + case BABL_UNDO: + return MACRO( T(U), END ); + case BABL_REDO: + return MACRO( D(LCTL), T(R), U(LCTL), END ); + case BABL_CUT: + return MACRO( T(X), END ); + case BABL_COPY: + return MACRO( T(Y),END ); + case BABL_PASTE: + return MACRO( T(P), END ); + case BABL_SELECT_ALL: + return MACRO( T(COLN),T(PERC),T(Y), END ); // wrong but helpful? + case BABL_DEL_RIGHT_1C: + return MACRO( T(X),END ); + case BABL_DEL_LEFT_WORD: + return MACRO( T(D),T(G),T(E),END ); + case BABL_DEL_RIGHT_WORD: + return MACRO( T(D),T(W),END ); + case BABL_GO_LEFT_1C: + return MACRO( T(H), END ); + case BABL_GO_RIGHT_1C: + return MACRO( T(L), END ); + case BABL_GO_LEFT_WORD: + return MACRO( T(B),END ); + case BABL_GO_RIGHT_WORD: + return MACRO( T(W), END ); + case BABL_GOTO_START_LINE: + return MACRO( T(CIRC), END ); + case BABL_GOTO_START_DOC: + return MACRO( T(G),T(G) ,END ); + case BABL_GOTO_END_LINE: + return MACRO( T(DLR), END ); + case BABL_GOTO_END_DOC: + return MACRO( D(LSFT), T(G),U(LSFT), ,END ); + case BABL_GOTO_NEXT_LINE: + return MACRO( T(J), END ); + case BABL_GOTO_PREV_LINE: + rreturn MACRO( T(K), END ); + case BABL_PGDN: + return MACRO(D(LCTRL), T(F), U(LCTRL), END ); + case BABL_PGUP: + return MACRO( D(LCTRL), T(B), U(LCTRL), END ); + case BABL_FIND: + return MACRO( T(SLASH),END ); + case BABL_FIND_NEXT: + return MACRO( T(N),END ); + case BABL_FIND_REPLACE: + return MACRO( D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END ); + case BABL_RUNAPP: + return MACRO_NONE; + case BABL_SWITCH_APP_NEXT: + return MACRO_NONE; + case BABL_SWITCH_APP_LAST: + return MACRO_NONE; + case BABL_CLOSE_APP: + return MACRO(T(COLN), T(Q), T(EXLM),END ); + case BABL_HELP: + return MACRO(T(COLN),T(H),END); // start search in help + break; + + return MACRO_NONE; + } + +#endif +#ifdef READMUX_MODE +// I havent decided how much to do bash and how much tmux + case READMUX_MODE: + switch(shortcut) { + case BABL_UNDO: + return MACRO( D(LALT), T(R), U(LALT) , END ); + case BABL_REDO: + return MACRO( D(LCTL), T(X), U(LCTL),T(C), END ); // arguably + case BABL_CUT: + return MACRO( D(LCTL), T(K), U(LCTL), END ); // wrong half the time + case BABL_COPY: + return MACRO_NONE; + case BABL_PASTE: + return MACRO( D(LCTL), T(Y), U(LCTL), END ); + case BABL_SELECT_ALL: + return MACRO(D(LCTL), T(A), T(K), T(Y), U(LCTL) , END ); // should this be tmux all? + case BABL_DEL_RIGHT_1C: + return MACRO( D(LCTL), T(D), U(LCTL),END ); + case BABL_DEL_LEFT_WORD: + return MACRO( D(LCTL), T(W), U(LCTL), END ); + case BABL_DEL_RIGHT_WORD: + return MACRO( D(LALT), T(D), U(LALT), END ); + case BABL_GO_LEFT_1C: + return MACRO( T(LEFT), END ); + case BABL_GO_RIGHT_1C: + return MACRO( T(RIGHT), END ); + case BABL_GO_LEFT_WORD: + return MACRO( D(LALT), T(B), U(LALT), END ); + case BABL_GO_RIGHT_WORD: + return MACRO( D(LALT), T(F), U(LALT), END ); + case BABL_GOTO_START_LINE: + return MACRO( D(LCTRL), T(A), U(LCTRL), END ); + case BABL_GOTO_START_DOC: + return MACRO_NONE; // tmux? + case BABL_GOTO_END_LINE: + return MACRO( D(LCTRL), T(E), U(LCTRL), END ); + case BABL_GOTO_END_DOC: + return MACRO_NONE; // tmux? + case BABL_GOTO_NEXT_LINE: + return MACRO( D(LCTRL), T(N), U(LCTRL), END ); + case BABL_GOTO_PREV_LINE: + return MACRO( D(LCTRL), T(P), U(LCTRL), END ); + case BABL_PGDN: + return MACRO( T(PGDN), END ); + case BABL_PGUP: + return MACRO( T(PGUP), END ); + case BABL_FIND: + return MACRO( D(LCTRL), T(R), U(LCTRL), END ); // search history + case BABL_FIND_NEXT: + eturn MACRO( D(LCTRL), T(S), U(LCTRL), END ); + case BABL_FIND_REPLACE: + return MACRO_NONE; // tmux? + case BABL_RUNAPP: + return MACRO( D(LCTRL), T(B), U(LCTRL), T(C),END ); //tmux + case BABL_SWITCH_APP_NEXT: + return MACRO( D(LCTRL), T(B), U(LCTRL), T(N),END ); //tmux + case BABL_SWITCH_APP_LAST: + return MACRO( D(LCTRL), T(B), U(LCTRL), T(P),END ); //tmux + case BABL_CLOSE_APP: + return MACRO( D(LCTRL), T(B), U(LCTRL), T(D),END); // usually what I want + break; + case BABL_HELP: + return MACRO_NONE; + break; + + return MACRO_NONE; + } + +#endif + return MACRO_NONE; +} \ No newline at end of file From d11962aeb27c73b87f8154d7f2cee747c8858d09 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Thu, 2 Mar 2017 11:40:06 -0800 Subject: [PATCH 038/181] fix 'stop_all_notes' naming to be more consistent --- quantum/process_keycode/process_audio.c | 2 +- quantum/process_keycode/process_audio.h | 2 +- quantum/process_keycode/process_midi.c | 2 +- quantum/process_keycode/process_midi.h | 2 +- quantum/process_keycode/process_music.c | 4 ++-- quantum/template/keymaps/default/Makefile | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/quantum/process_keycode/process_audio.c b/quantum/process_keycode/process_audio.c index 71c0297ee2..0b6380ed39 100644 --- a/quantum/process_keycode/process_audio.c +++ b/quantum/process_keycode/process_audio.c @@ -54,7 +54,7 @@ void process_audio_noteoff(uint8_t note) { stop_note(compute_freq_for_midi_note(note)); } -void process_audio_stop_all_notes(void) { +void process_audio_all_notes_off(void) { stop_all_notes(); } diff --git a/quantum/process_keycode/process_audio.h b/quantum/process_keycode/process_audio.h index 59a17725a7..7ac15b7330 100644 --- a/quantum/process_keycode/process_audio.h +++ b/quantum/process_keycode/process_audio.h @@ -4,7 +4,7 @@ bool process_audio(uint16_t keycode, keyrecord_t *record); void process_audio_noteon(uint8_t note); void process_audio_noteoff(uint8_t note); -void process_audio_stop_all_notes(void); +void process_audio_all_notes_off(void); void audio_on_user(void); diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index 214bba9020..700c6ce8e6 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -15,7 +15,7 @@ void process_midi_basic_noteoff(uint8_t note) midi_send_noteoff(&midi_device, 0, note, 0); } -void process_midi_basic_stop_all_notes(void) +void process_midi_all_notes_off(void) { midi_send_cc(&midi_device, 0, 0x7B, 0); } diff --git a/quantum/process_keycode/process_midi.h b/quantum/process_keycode/process_midi.h index 0f559ec23a..58b7650c67 100644 --- a/quantum/process_keycode/process_midi.h +++ b/quantum/process_keycode/process_midi.h @@ -8,7 +8,7 @@ #ifdef MIDI_BASIC void process_midi_basic_noteon(uint8_t note); void process_midi_basic_noteoff(uint8_t note); -void process_midi_basic_stop_all_notes(void); +void process_midi_all_notes_off(void); #endif #ifdef MIDI_ADVANCED diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c index 4b86b91f00..f89a04ee31 100644 --- a/quantum/process_keycode/process_music.c +++ b/quantum/process_keycode/process_music.c @@ -44,10 +44,10 @@ static void music_noteoff(uint8_t note) { void music_all_notes_off(void) { #ifdef AUDIO_ENABLE - process_audio_stop_all_notes(); + process_audio_all_notes_off(); #endif #if defined(MIDI_ENABLE) && defined(MIDI_BASIC) - process_midi_basic_stop_all_notes(); + process_midi_all_notes_off(); #endif } diff --git a/quantum/template/keymaps/default/Makefile b/quantum/template/keymaps/default/Makefile index 24442db37d..29f11bbc77 100644 --- a/quantum/template/keymaps/default/Makefile +++ b/quantum/template/keymaps/default/Makefile @@ -9,7 +9,7 @@ CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI support (+3800) +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID From 0734f569409974624b40735fcd498dac9adba2d2 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Thu, 2 Mar 2017 12:28:12 -0800 Subject: [PATCH 039/181] add debug messages to audio --- quantum/audio/audio.c | 294 +++++++++++++++++++++--------------------- 1 file changed, 150 insertions(+), 144 deletions(-) diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c index 2a315fd168..e1e81fd2b8 100644 --- a/quantum/audio/audio.c +++ b/quantum/audio/audio.c @@ -89,15 +89,15 @@ void audio_init() } audio_config.raw = eeconfig_read_audio(); - // Set port PC6 (OC3A and /OC4A) as output + // Set port PC6 (OC3A and /OC4A) as output DDRC |= _BV(PORTC6); DISABLE_AUDIO_COUNTER_3_ISR; - // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers - // Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6 - // Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14 (Period = ICR3, Duty Cycle = OCR3A) - // Clock Select (CS3n) = 0b010 = Clock / 8 + // TCCR3A / TCCR3B: Timer/Counter #3 Control Registers + // Compare Output Mode (COM3An) = 0b00 = Normal port operation, OC3A disconnected from PC6 + // Waveform Generation Mode (WGM3n) = 0b1110 = Fast PWM Mode 14 (Period = ICR3, Duty Cycle = OCR3A) + // Clock Select (CS3n) = 0b010 = Clock / 8 TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30); TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30); @@ -106,6 +106,8 @@ void audio_init() void stop_all_notes() { + dprintf("audio stop all notes"); + if (!audio_initialized) { audio_init(); } @@ -128,6 +130,8 @@ void stop_all_notes() void stop_note(float freq) { + dprintf("audio stop note freq=%d", (int)freq); + if (playing_note) { if (!audio_initialized) { audio_init(); @@ -183,159 +187,161 @@ float vibrato(float average_freq) { ISR(TIMER3_COMPA_vect) { - float freq; + float freq; - if (playing_note) { - if (voices > 0) { - if (polyphony_rate > 0) { - if (voices > 1) { - voice_place %= voices; - if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) { - voice_place = (voice_place + 1) % voices; - place = 0.0; - } - } + if (playing_note) { + if (voices > 0) { + if (polyphony_rate > 0) { + if (voices > 1) { + voice_place %= voices; + if (place++ > (frequencies[voice_place] / polyphony_rate / CPU_PRESCALER)) { + voice_place = (voice_place + 1) % voices; + place = 0.0; + } + } - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(frequencies[voice_place]); - } else { - freq = frequencies[voice_place]; - } - #else - freq = frequencies[voice_place]; - #endif - } else { - if (glissando) { - if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { - frequency = frequency * pow(2, 440/frequency/12/2); - } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { - frequency = frequency * pow(2, -440/frequency/12/2); - } else { - frequency = frequencies[voices - 1]; - } - } else { - frequency = frequencies[voices - 1]; - } + #ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequencies[voice_place]); + } else { + freq = frequencies[voice_place]; + } + #else + freq = frequencies[voice_place]; + #endif + } else { + if (glissando) { + if (frequency != 0 && frequency < frequencies[voices - 1] && frequency < frequencies[voices - 1] * pow(2, -440/frequencies[voices - 1]/12/2)) { + frequency = frequency * pow(2, 440/frequency/12/2); + } else if (frequency != 0 && frequency > frequencies[voices - 1] && frequency > frequencies[voices - 1] * pow(2, 440/frequencies[voices - 1]/12/2)) { + frequency = frequency * pow(2, -440/frequency/12/2); + } else { + frequency = frequencies[voices - 1]; + } + } else { + frequency = frequencies[voices - 1]; + } - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(frequency); - } else { - freq = frequency; - } - #else - freq = frequency; - #endif - } + #ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(frequency); + } else { + freq = frequency; + } + #else + freq = frequency; + #endif + } - if (envelope_index < 65535) { - envelope_index++; - } + if (envelope_index < 65535) { + envelope_index++; + } - freq = voice_envelope(freq); + freq = voice_envelope(freq); - if (freq < 30.517578125) { - freq = 30.52; - } + if (freq < 30.517578125) { + freq = 30.52; + } - TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); - TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); - } - } + TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); + TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); + } + } - if (playing_notes) { - if (note_frequency > 0) { - #ifdef VIBRATO_ENABLE - if (vibrato_strength > 0) { - freq = vibrato(note_frequency); - } else { - freq = note_frequency; - } - #else - freq = note_frequency; - #endif + if (playing_notes) { + if (note_frequency > 0) { + #ifdef VIBRATO_ENABLE + if (vibrato_strength > 0) { + freq = vibrato(note_frequency); + } else { + freq = note_frequency; + } + #else + freq = note_frequency; + #endif - if (envelope_index < 65535) { - envelope_index++; - } - freq = voice_envelope(freq); + if (envelope_index < 65535) { + envelope_index++; + } + freq = voice_envelope(freq); - TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); - TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); - } else { - TIMER_3_PERIOD = 0; - TIMER_3_DUTY_CYCLE = 0; - } + TIMER_3_PERIOD = (uint16_t)(((float)F_CPU) / (freq * CPU_PRESCALER)); + TIMER_3_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (freq * CPU_PRESCALER)) * note_timbre); + } else { + TIMER_3_PERIOD = 0; + TIMER_3_DUTY_CYCLE = 0; + } - note_position++; - bool end_of_note = false; - if (TIMER_3_PERIOD > 0) { - end_of_note = (note_position >= (note_length / TIMER_3_PERIOD * 0xFFFF)); - } else { - end_of_note = (note_position >= (note_length * 0x7FF)); - } + note_position++; + bool end_of_note = false; + if (TIMER_3_PERIOD > 0) { + end_of_note = (note_position >= (note_length / TIMER_3_PERIOD * 0xFFFF)); + } else { + end_of_note = (note_position >= (note_length * 0x7FF)); + } - if (end_of_note) { - current_note++; - if (current_note >= notes_count) { - if (notes_repeat) { - current_note = 0; - } else { - DISABLE_AUDIO_COUNTER_3_ISR; - DISABLE_AUDIO_COUNTER_3_OUTPUT; - playing_notes = false; - return; - } - } - if (!note_resting && (notes_rest > 0)) { - note_resting = true; - note_frequency = 0; - note_length = notes_rest; - current_note--; - } else { - note_resting = false; - envelope_index = 0; - note_frequency = (*notes_pointer)[current_note][0]; - note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); - } + if (end_of_note) { + current_note++; + if (current_note >= notes_count) { + if (notes_repeat) { + current_note = 0; + } else { + DISABLE_AUDIO_COUNTER_3_ISR; + DISABLE_AUDIO_COUNTER_3_OUTPUT; + playing_notes = false; + return; + } + } + if (!note_resting && (notes_rest > 0)) { + note_resting = true; + note_frequency = 0; + note_length = notes_rest; + current_note--; + } else { + note_resting = false; + envelope_index = 0; + note_frequency = (*notes_pointer)[current_note][0]; + note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); + } - note_position = 0; - } - } + note_position = 0; + } + } - if (!audio_config.enable) { - playing_notes = false; - playing_note = false; - } + if (!audio_config.enable) { + playing_notes = false; + playing_note = false; + } } void play_note(float freq, int vol) { + dprintf("audio play note freq=%d vol=%d", (int)freq, vol); + if (!audio_initialized) { audio_init(); } - if (audio_config.enable && voices < 8) { - DISABLE_AUDIO_COUNTER_3_ISR; + if (audio_config.enable && voices < 8) { + DISABLE_AUDIO_COUNTER_3_ISR; - // Cancel notes if notes are playing - if (playing_notes) - stop_all_notes(); + // Cancel notes if notes are playing + if (playing_notes) + stop_all_notes(); - playing_note = true; + playing_note = true; - envelope_index = 0; + envelope_index = 0; - if (freq > 0) { - frequencies[voices] = freq; - volumes[voices] = vol; - voices++; - } + if (freq > 0) { + frequencies[voices] = freq; + volumes[voices] = vol; + voices++; + } ENABLE_AUDIO_COUNTER_3_ISR; ENABLE_AUDIO_COUNTER_3_OUTPUT; - } + } } @@ -346,37 +352,37 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) audio_init(); } - if (audio_config.enable) { + if (audio_config.enable) { - DISABLE_AUDIO_COUNTER_3_ISR; + DISABLE_AUDIO_COUNTER_3_ISR; - // Cancel note if a note is playing - if (playing_note) - stop_all_notes(); + // Cancel note if a note is playing + if (playing_note) + stop_all_notes(); - playing_notes = true; + playing_notes = true; - notes_pointer = np; - notes_count = n_count; - notes_repeat = n_repeat; - notes_rest = n_rest; + notes_pointer = np; + notes_count = n_count; + notes_repeat = n_repeat; + notes_rest = n_rest; - place = 0; - current_note = 0; + place = 0; + current_note = 0; note_frequency = (*notes_pointer)[current_note][0]; note_length = ((*notes_pointer)[current_note][1] / 4) * (((float)note_tempo) / 100); - note_position = 0; + note_position = 0; ENABLE_AUDIO_COUNTER_3_ISR; ENABLE_AUDIO_COUNTER_3_OUTPUT; - } + } } bool is_playing_notes(void) { - return playing_notes; + return playing_notes; } bool is_audio_on(void) { From 515b4dd1f7c941f9e96790f7433015fc9bd385bf Mon Sep 17 00:00:00 2001 From: "Trevor Joynson (trevorj)" Date: Thu, 2 Mar 2017 18:21:45 -0800 Subject: [PATCH 040/181] Allow to specify serial to dfu-util flash --- tmk_core/chibios.mk | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tmk_core/chibios.mk b/tmk_core/chibios.mk index 062a712bd1..eb0c40138a 100644 --- a/tmk_core/chibios.mk +++ b/tmk_core/chibios.mk @@ -143,8 +143,13 @@ MCUFLAGS = -mcpu=$(MCU) DEBUG = gdb +DFU_ARGS = +ifneq ("$(SERIAL)","") + DFU_ARGS += -S $(SERIAL) +endif + # List any extra directories to look for libraries here. EXTRALIBDIRS = $(RULESPATH)/ld dfu-util: $(BUILD_DIR)/$(TARGET).bin sizeafter - dfu-util -D $(BUILD_DIR)/$(TARGET).bin \ No newline at end of file + dfu-util $(DFU_ARGS) -D $(BUILD_DIR)/$(TARGET).bin From 2f677c24a8fcf936e92a0a5acfbbf95b5f47fdb7 Mon Sep 17 00:00:00 2001 From: milestogo Date: Mon, 6 Mar 2017 00:16:44 -0800 Subject: [PATCH 041/181] working with preprocessor macros for babblepaste --- .../handwired/MS-sculpt-mobile/babblePaste.c | 609 +++++++----------- .../handwired/MS-sculpt-mobile/babblePaste.h | 57 +- .../keymaps/milestogo/config.h | 20 + .../keymaps/milestogo/keymap.c | 138 ++-- keyboards/handwired/MS-sculpt-mobile/rules.mk | 4 + 5 files changed, 396 insertions(+), 432 deletions(-) diff --git a/keyboards/handwired/MS-sculpt-mobile/babblePaste.c b/keyboards/handwired/MS-sculpt-mobile/babblePaste.c index 00e8416f41..93ff486e0d 100644 --- a/keyboards/handwired/MS-sculpt-mobile/babblePaste.c +++ b/keyboards/handwired/MS-sculpt-mobile/babblePaste.c @@ -8,242 +8,159 @@ and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jee */ #include "babblePaste.h" -#include "action_layer.h" +#include "action_macro.h" -// GLOBAL variable. Sets startup default if no eeppom -char babble_mode = MAC_MODE ; +#ifdef USE_BABLPASTE + +// GLOBAL variable to determine mode. Sets startup default if no eeppom +uint8_t babble_mode =0 ; + + +// Today I learned that the preprocessor can not create a switch statement label from an argument +// And else statements have problems, see https://gcc.gnu.org/onlinedocs/gcc-3.0.1/cpp_3.html#SEC15 +#define BABLM(ent, macro...) \ + if ( ent == shortcut ) \ + { action_macro_play( MACRO(macro)); return MACRO_NONE; } -const static macro_t *babblePaste (keyrecord_t *record, uint16_t shortcut) { +const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { +/* this function runs the appropriate babblepaste macro, given +the global babble_mode, and a shortcut from the ENUM in babblePaste.h +TODO, the pointers in this function should be stored in a PROGMEM array, not ram. +But that requires even more clever preprocessor foo. +*/ - switch(babble_mode) { - + if ( shortcut < BABL_START_NUM || \ + shortcut >= (BABL_START_NUM + BABL_NUM_MACROS ) ) { + return MACRO_NONE; + } + + + switch(babble_mode) { + #ifdef MS_MODE - case MS_MODE: - switch(shortcut) { - - case BABL_DEL_RIGHT_1C: - return (static macro_t *) MACRO( D(DEL), END ); - case BABL_DEL_LEFT_WORD: - return MACRO( D(LCTRL), T(BSPACE), U(LCTRL), END ); - case BABL_DEL_RIGHT_WORD: - return MACRO( D(LCTRL), T(DEL), U(LCTRL), END ); - case BABL_GO_LEFT_1C: - return MACRO( T(LEFT), END ); - case BABL_GO_RIGHT_1C: - return MACRO( T(RIGHT), END ); - case BABL_GO_LEFT_WORD: - return MACRO( D(LCTRL), T(LEFT), U(LCTRL), END ); - case BABL_GO_RIGHT_WORD: - return MACRO( D(LCTRL), T(RIGHT), U(LCTRL), END ); - case BABL_GO_START_LINE: - return MACRO( T(HOME), END ); - case BABL_GO_START_DOC: - return MACRO( D(LCTRL),T(HOME), U(LCTRL),END ); - case BABL_GO_END_LINE: - return MACRO( T(END), END ); - case BABL_GO_END_DOC: - return MACRO( D(LCTRL),T(END), U(LCTRL),END ); - case BABL_GO_NEXT_LINE: - return MACRO( T(DOWN), END ); - case BABL_GO_PREV_LINE: - return MACRO( T(UP), END ); - case BABL_PGDN: - return MACRO( T(PGDN), END ); - case BABL_PGUP: - return MACRO( T(PGUP), END ); + + case MS_MODE: + BABLM( BABL_DEL_RIGHT_1C, T(DEL), END ); + BABLM( BABL_DEL_LEFT_WORD, D(LCTRL), T(BSPACE), U(LCTRL), END ); + BABLM( BABL_DEL_RIGHT_WORD,D(LCTRL), T(DEL), U(LCTRL), END ); + BABLM( BABL_GO_LEFT_1C, T(LEFT), END ); + BABLM( BABL_GO_RIGHT_1C , T(RIGHT), END ); + BABLM( BABL_GO_LEFT_WORD, D(LCTRL), T(LEFT), U(LCTRL), END ); + BABLM( BABL_GO_RIGHT_WORD, D(LCTRL), T(RIGHT), U(LCTRL), END ); + BABLM( BABL_GO_START_LINE, T(HOME), END ); + BABLM( BABL_GO_START_DOC, D(LCTRL),T(HOME), U(LCTRL),END ); + BABLM( BABL_GO_END_LINE, T(END), END ); + BABLM( BABL_GO_END_DOC, D(LCTRL),T(END), U(LCTRL),END ); + BABLM( BABL_GO_NEXT_LINE, T(DOWN), END ); + BABLM( BABL_GO_PREV_LINE, T(UP), END ); + BABLM( BABL_PGDN, T(PGDN), END ); + BABLM( BABL_PGUP, T(PGUP), END ); #ifndef BABL_MOVEMENTONLY - case BABL_UNDO: - return MACRO( D(LCTRL), T(Z), U(LCTRL), END ); - case BABL_REDO: - return MACRO( D(LCTRL), T(Y), U(LCTRL), END ); - case BABL_CUT: - return MACRO( D(LCTRL), T(X), U(LCTRL), END ); - case BABL_COPY: - return MACRO( D(LCTRL), T(C), U(LCTRL), END ); - case BABL_PASTE: - return MACRO( D(LCTRL), T(V), U(LCTRL), END ); - case BABL_SELECT_ALL: - return MACRO( D(LCTRL), T(A), U(LCTRL), END ); - case BABL_UNDO: - return MACRO( D(LCTRL), T(Z), U(LCTRL), END ); - case BABL_REDO: - return MACRO( D(LCTRL), T(Y), U(LCTRL), END ); - case BABL_CUT: - return MACRO( D(LCTRL), T(X), U(LCTRL), END ); - case BABL_COPY: - return MACRO( D(LCTRL), T(C), U(LCTRL), END ); - case BABL_PASTE: - return MACRO( D(LCTRL), T(V), U(LCTRL), END ); - case BABL_SELECT_ALL: - return MACRO( D(LCTRL), T(A), U(LCTRL), END ); - case BABL_FIND: - return MACRO( D(LCTRL),T(F), U(LCTRL),END ); - case BABL_FIND_NEXT: - return MACRO( T(F3),END ); - case BABL_FIND_REPLACE: - return MACRO( D(LCTRL),T(H), U(LCTRL),END ); - case BABL_RUNAPP: - return MACRO( D(LGUI),T(R), U(LGUI),END ); - case BABL_SWITCH_APP_NEXT: - return MACRO( D(LALT),T(TAB), U(LALT),END ); - case BABL_SWITCH_APP_LAST: - return MACRO( D(LSFT),D(LALT),T(TAB), U(LALT), U(LSFT),END ); - case BABL_CLOSE_APP: - return MACRO( D(LALT),T(F4), U(LALT),END ); - case BABL_HELP: - return MACRO( T(F1),END ); + BABLM( BABL_UNDO, D(LCTRL), T(Z), U(LCTRL), END ); + BABLM( BABL_REDO, D(LCTRL), T(Y), U(LCTRL), END ); + BABLM( BABL_CUT, D(LCTRL), T(X), U(LCTRL), END ); + BABLM( BABL_COPY, D(LCTRL), T(C), U(LCTRL), END ); + BABLM( BABL_PASTE, D(LCTRL), T(V), U(LCTRL), END ); + BABLM( BABL_SELECT_ALL, D(LCTRL), T(A), U(LCTRL), END ); + BABLM( BABL_UNDO, D(LCTRL), T(Z), U(LCTRL), END ); + BABLM( BABL_REDO, D(LCTRL), T(Y), U(LCTRL), END ); + BABLM( BABL_CUT, D(LCTRL), T(X), U(LCTRL), END ); + BABLM( BABL_COPY, D(LCTRL), T(C), U(LCTRL), END ); + BABLM( BABL_PASTE, D(LCTRL), T(V), U(LCTRL), END ); + BABLM( BABL_SELECT_ALL, D(LCTRL), T(A), U(LCTRL), END ); + BABLM( BABL_FIND, D(LCTRL),T(F), U(LCTRL),END ); + BABLM( BABL_FIND_NEXT, T(F3),END ); + BABLM( BABL_FIND_REPLACE, D(LCTRL),T(H), U(LCTRL),END ); + BABLM( BABL_RUNAPP, D(LGUI),T(R), U(LGUI),END ); + BABLM( BABL_SWITCH_APP_NEXT, D(LALT),T(TAB), U(LALT),END ); + BABLM( BABL_SWITCH_APP_LAST, D(LSFT),D(LALT),T(TAB), U(LALT), U(LSFT),END ); + BABLM( BABL_CLOSE_APP, D(LALT),T(F4), U(LALT),END ); + BABLM( BABL_HELP, T(F1),END ); #endif - break; - - return MACRO_NONE; - } - -#endif + + + return MACRO_NONE; + + +#endif /* MS_MODE*/ + + #ifdef LINUX_MODE case LINUX_MODE: - switch(shortcut) { - - case BABL_DEL_RIGHT_1C: - return MACRO( D(DEL), END ); - case BABL_DEL_LEFT_WORD: - return MACRO( D(LCTRL), T(BSPACE), U(LCTRL), END ); - case BABL_DEL_RIGHT_WORD: - return MACRO( D(LCTRL), T(DEL), U(LCTRL), END ); - case BABL_GO_LEFT_1C: - return MACRO( T(LEFT), END ); - case BABL_GO_RIGHT_1C: - return MACRO( T(RIGHT), END ); - case BABL_GO_LEFT_WORD: - return MACRO( D(LCTRL), T(LEFT), U(LCTRL), END ); - case BABL_GO_RIGHT_WORD: - return MACRO( D(LCTRL), T(RIGHT), U(LCTRL), END ); - case BABL_GO_START_LINE: - return MACRO( T(HOME), END ); - case BABL_GO_START_DOC: - return MACRO( D(LCTRL),T(HOME), U(LCTRL),END ); - case BABL_GO_END_LINE: - return MACRO( T(END), END ); - case BABL_GO_END_DOC: - return MACRO( D(LCTRL),T(END), U(LCTRL),END ); - case BABL_GO_NEXT_LINE: - return MACRO( T(DOWN), END ); - case BABL_GO_PREV_LINE: - return MACRO( T(UP), END ); - case BABL_PGDN: - return MACRO( T(PGDN), END ); - case BABL_PGUP: - return MACRO( T(PGUP), END ); + + BABLM( BABL_DEL_RIGHT_1C , D(DEL), END ); + BABLM( BABL_DEL_LEFT_WORD , D(LCTRL), T(BSPACE), U(LCTRL), END ); + BABLM( BABL_DEL_RIGHT_WORD , D(LCTRL), T(DEL), U(LCTRL), END ); + BABLM( BABL_GO_LEFT_1C , T(LEFT), END ); + BABLM( BABL_GO_RIGHT_1C , T(RIGHT), END ); + BABLM( BABL_GO_LEFT_WORD , D(LCTRL), T(LEFT), U(LCTRL), END ); + BABLM( BABL_GO_RIGHT_WORD , D(LCTRL), T(RIGHT), U(LCTRL), END ); + BABLM( BABL_GO_START_LINE , T(HOME), END ); + BABLM( BABL_GO_START_DOC , D(LCTRL),T(HOME), U(LCTRL),END ); + BABLM( BABL_GO_END_LINE , T(END), END ); + BABLM( BABL_GO_END_DOC , D(LCTRL),T(END), U(LCTRL),END ); + BABLM( BABL_GO_NEXT_LINE , T(DOWN), END ); + BABLM( BABL_GO_PREV_LINE , T(UP), END ); + BABLM( BABL_PGDN , T(PGDN), END ); + BABLM( BABL_PGUP , T(PGUP), END ); #ifndef BABL_MOVEMENTONLY - case BABL_UNDO: - return MACRO( D(LCTRL), T(Z), U(LCTRL), END ); - case BABL_REDO: - return MACRO( D(LCTRL), T(Y), U(LCTRL), END ); - case BABL_CUT: - return MACRO( D(LCTRL), T(X), U(LCTRL), END ); - case BABL_COPY: - return MACRO( D(LCTRL), T(C), U(LCTRL), END ); - case BABL_PASTE: - return MACRO( D(LCTRL), T(V), U(LCTRL), END ); - case BABL_SELECT_ALL: - return MACRO( D(LCTRL), T(A), U(LCTRL), END ); - - case BABL_FIND: - return MACRO( D(LCTRL),T(F), U(LCTRL),END ); - case BABL_FIND_NEXT: - /* return MACRO( T(F3),END ); KDE */ - return MACRO( D(LCTRL),T(G), U(LCTRL),END ); // Gnome*/ - case BABL_FIND_REPLACE: - /* return MACRO( D(LCTRL),T(R), U(LCTRL),END ); KDE */ - return MACRO( D(LCTRL),T(H), U(LCTRL),END ); // Gnome*/ - case BABL_RUNAPP: - return MACRO( D(LALT),T(F2), U(LALT),END ); - case BABL_SWITCH_APP_NEXT: - return MACRO( D(LCTL),T(TAB), U(LCTL),END ); - case BABL_SWITCH_APP_LAST: - return MACRO( D(LSFT),D(LCTL),T(TAB), U(LCTL), U(LSFT),END ); - case BABL_CLOSE_APP: - return MACRO( D(LALT),T(F4), U(LALT),END ); - case BABL_HELP: - return MACRO_NONE; + BABLM( BABL_UNDO , D(LCTRL), T(Z), U(LCTRL), END ); + BABLM( BABL_REDO , D(LCTRL), T(Y), U(LCTRL), END ); + BABLM( BABL_CUT , D(LCTRL), T(X), U(LCTRL), END ); + BABLM( BABL_COPY , D(LCTRL), T(C), U(LCTRL), END ); + BABLM( BABL_PASTE , D(LCTRL), T(V), U(LCTRL), END ); + BABLM( BABL_SELECT_ALL, D(LCTRL), T(A), U(LCTRL), END ); + BABLM( BABL_FIND, D(LCTRL),T(F), U(LCTRL),END ); + /* BABLM(BABL_FIND_NEXT , T(F3),END ); KDE */ + BABLM( BABL_FIND_NEXT, D(LCTRL),T(G), U(LCTRL),END ); // Gnome*/ + /* BABLM( , D(LCTRL),T(R), U(LCTRL),END ); KDE */ + BABLM( BABL_FIND_REPLACE, D(LCTRL),T(H), U(LCTRL),END ); // Gnome*/ + BABLM( BABL_RUNAPP, D(LALT),T(F2), U(LALT),END ); + BABLM( BABL_SWITCH_APP_NEXT, D(LCTL),T(TAB), U(LCTL),END ); + BABLM( BABL_SWITCH_APP_LAST, D(LSFT),D(LCTL),T(TAB), U(LCTL), U(LSFT),END ); + BABLM( BABL_CLOSE_APP, D(LALT),T(F4), U(LALT),END ); + BABLM( BABL_HELP, END ); #endif - break; - return MACRO_NONE; - } #endif #ifdef MAC_MODE case MAC_MODE: - switch(shortcut) { - - - case BABL_DEL_RIGHT_1C: - return MACRO( D(DEL), END ); - case BABL_DEL_LEFT_WORD: - return MACRO( D(LALT), T(BSPACE), U(LALT), END ); - case BABL_DEL_RIGHT_WORD: - return MACRO( D(LALT), T(DEL), U(LALT), END ); - case BABL_GO_LEFT_1C: - return MACRO( T(LEFT), END ); - case BABL_GO_RIGHT_1C: - return MACRO( T(RIGHT), END ); - case BABL_GO_LEFT_WORD: - return MACRO( D(LALT), T(LEFT), U(LALT), END ); - case BABL_GO_RIGHT_WORD: - return MACRO( D(LALT), T(RIGHT), U(LALT), END ); - case BABL_GO_START_LINE: - return MACRO( D(LGUI), T(LEFT), U(LGUI), END ); - case BABL_GO_START_DOC: - return MACRO( D(LGUI),T(UP), U(LGUI),END ); - case BABL_GO_END_LINE: - return MACRO( D(LGUI), T(RIGHT), U(LGUI), END ); - case BABL_GO_END_DOC: - return MACRO( D(LGUI),T(DOWN), U(LGUI),END ); - case BABL_GO_NEXT_LINE: - return MACRO( T(DOWN), END ); - case BABL_GO_PREV_LINE: - return MACRO( T(UP), END ); - case BABL_PGDN: - return MACRO( D(LALT), T(DOWN), U(LALT), END ); - case BABL_PGUP: - return MACRO( D(LALT), T(UP), U(LALT), END ); + BABLM( BABL_DEL_RIGHT_1C , D(DEL), END ); + BABLM( BABL_DEL_LEFT_WORD , D(LALT), T(BSPACE), U(LALT), END ); + BABLM( BABL_DEL_RIGHT_WORD, D(LALT), T(DEL), U(LALT), END ); + BABLM( BABL_GO_LEFT_1C , T(LEFT), END ); + BABLM( BABL_GO_RIGHT_1C, T(RIGHT), END ); + BABLM( BABL_GO_LEFT_WORD , D(LALT), T(LEFT), U(LALT), END ); + BABLM( BABL_GO_RIGHT_WORD , D(LALT), T(RIGHT), U(LALT), END ); + BABLM( BABL_GO_START_LINE , D(LGUI), T(LEFT), U(LGUI), END ); + BABLM( BABL_GO_START_DOC , D(LGUI),T(UP), U(LGUI),END ); + BABLM( BABL_GO_END_LINE , D(LGUI), T(RIGHT), U(LGUI), END ); + BABLM( BABL_GO_END_DOC , D(LGUI),T(DOWN), U(LGUI),END ); + BABLM( BABL_GO_NEXT_LINE , T(DOWN), END ); + BABLM( BABL_GO_PREV_LINE , T(UP), END ); + BABLM( BABL_PGDN , D(LALT),T(DOWN), U(LALT), END ); + BABLM( BABL_PGUP , D(LALT),T(UP), U(LALT), END ); #ifndef BABL_MOVEMENTONLY - case BABL_UNDO: - return MACRO( D(LGUI), T(Z), U(LGUI), END ); - case BABL_REDO: - return MACRO( D(LSFT),D(LGUI), T(Z), U(LSFT),U(LGUI), END ); - case BABL_CUT: - return MACRO( D(LGUI), T(X), U(LGUI), END ); - case BABL_COPY: - return MACRO( D(LGUI), T(C), U(LGUI), END ); - case BABL_PASTE: - return MACRO( D(LGUI), T(V), U(LGUI), END ); - case BABL_SELECT_ALL: - return MACRO( D(LGUI), T(A), U(LGUI), END ); - case BABL_FIND: - return MACRO( D(LGUI),T(F), U(LGUI),END ); - case BABL_FIND_NEXT: - return MACRO( D(LGUI),T(G), U(LGUI),END ); - case BABL_FIND_REPLACE: - return MACRO( D(LGUI),T(F), U(LGUI),END ); - case BABL_RUNAPP: - return MACRO( D(LGUI),T(R), U(LGUI),END ); - case BABL_SWITCH_APP_NEXT: - return MACRO( D(LGUI),T(TAB), U(LGUI),END ); - case BABL_SWITCH_APP_LAST: - return MACRO( D(LSFT),D(LGUI),T(TAB), U(LGUI), U(LSFT),END ); - case BABL_CLOSE_APP: - return MACRO( D(LGUI),T(Q), U(LGUI),END ); - case BABL_HELP: - return MACRO( D(LSFT),D(LGUI),T(SLASH), U(LGUI), U(LSFT),END ); + BABLM( BABL_UNDO , D(1), D(LGUI), T(Z), U(LGUI), END ); + BABLM( BABL_REDO , D(LSFT),D(LGUI), T(Z), U(LSFT),U(LGUI), END ); + BABLM( BABL_CUT , D(LGUI), T(X), U(LGUI), END ); + BABLM( BABL_COPY , D(LGUI), T(C), U(LGUI), END ); + BABLM( BABL_PASTE , D(LGUI), T(V), U(LGUI), END ); + BABLM( BABL_SELECT_ALL , D(LGUI), T(A), U(LGUI), END ); + BABLM( BABL_FIND , D(LGUI),T(F), U(LGUI),END ); + BABLM( BABL_FIND_NEXT, D(LGUI),T(G), U(LGUI),END ); + BABLM( BABL_FIND_REPLACE, D(LGUI),T(F), U(LGUI),END ); + BABLM( BABL_RUNAPP , D(LGUI),T(R), U(LGUI),END ); + BABLM( BABL_SWITCH_APP_NEXT , D(LGUI),T(TAB), U(LGUI),END ); + BABLM( BABL_SWITCH_APP_LAST , D(LSFT),D(LGUI),T(TAB), U(LGUI), U(LSFT),END ); + BABLM( BABL_CLOSE_APP , D(LGUI),T(Q), U(LGUI),END ); + BABLM( BABL_HELP , D(LSFT),D(LGUI),T(SLASH), U(LGUI), U(LSFT),END ); #endif - break; - + return MACRO_NONE; - } - #endif #ifdef EMACS_MODE @@ -252,64 +169,64 @@ const static macro_t *babblePaste (keyrecord_t *record, uint16_t shortcut) { //probably should allow meta to not be ALT case BABL_DEL_RIGHT_1C: - return MACRO( D(LCTL), T(D), U(LCTL),END ); + BABLM( , D(LCTL), T(D), U(LCTL),END ); case BABL_DEL_LEFT_WORD: - return MACRO( D(LCTL), T(BSPACE), U(LCTL), END ); + BABLM( , D(LCTL), T(BSPACE), U(LCTL), END ); case BABL_DEL_RIGHT_WORD: - return MACRO( D(LALT), T(D), U(LALT), END ); + BABLM( , D(LALT), T(D), U(LALT), END ); case BABL_GO_LEFT_1C: - return MACRO( T(LEFT), END ); + BABLM( , T(LEFT), END ); case BABL_GO_RIGHT_1C: - return MACRO( T(RIGHT), END ); + BABLM( , T(RIGHT), END ); case BABL_GO_LEFT_WORD: - return MACRO( D(LALT), T(B), U(LALT), END ); + BABLM( , D(LALT), T(B), U(LALT), END ); case BABL_GO_RIGHT_WORD: - return MACRO( D(LALT), T(F), U(LALT), END ); + BABLM( , D(LALT), T(F), U(LALT), END ); case BABL_GO_START_LINE: - return MACRO( D(LCTRL), T(A), U(LCTRL), END ); + BABLM( , D(LCTRL), T(A), U(LCTRL), END ); case BABL_GO_START_DOC: - return MACRO( D(LALT), D(LSFT), T(COMM),U(LSFT), U(LALT) ,END ); + BABLM( , D(LALT), D(LSFT), T(COMM),U(LSFT), U(LALT) ,END ); case BABL_GO_END_LINE: - return MACRO( D(LCTRL), T(E), U(LCTRL), END ); + BABLM( , D(LCTRL), T(E), U(LCTRL), END ); case BABL_GO_END_DOC: - return MACRO( D(LALT), D(LSFT), T(DOT),U(LSFT), U(LALT) ,END ); + BABLM( , D(LALT), D(LSFT), T(DOT),U(LSFT), U(LALT) ,END ); case BABL_GO_NEXT_LINE: - return MACRO( D(LCTRL), T(N), U(LCTRL), END ); + BABLM( , D(LCTRL), T(N), U(LCTRL), END ); case BABL_GO_PREV_LINE: - return MACRO( D(LCTRL), T(P), U(LCTRL), END ); + BABLM( , D(LCTRL), T(P), U(LCTRL), END ); case BABL_PGDN: - return MACRO(D(LCTRL), T(V), U(LCTRL), END ); + BABLM( ,D(LCTRL), T(V), U(LCTRL), END ); case BABL_PGUP: - return MACRO( D(LALT), T(V), U(LALT), END ); + BABLM( , D(LALT), T(V), U(LALT), END ); #ifndef BABL_MOVEMENTONLY case BABL_UNDO: - return MACRO( D(LCTL), T(X), U(LCTL),T(C), END ); + BABLM( , D(LCTL), T(X), U(LCTL),T(C), END ); case BABL_REDO: - return MACRO( D(LCTL), T(X), U(LCTL),T(C), END ); // arguably + BABLM( , D(LCTL), T(X), U(LCTL),T(C), END ); // arguably case BABL_CUT: - return MACRO( D(LCTL), T(W), U(LCTL), END ); + BABLM( , D(LCTL), T(W), U(LCTL), END ); case BABL_COPY: - return MACRO( D(LALT), T(W), U(LALT), END ); //really? + BABLM( , D(LALT), T(W), U(LALT), END ); //really? case BABL_PASTE: - return MACRO( D(LCTL), T(Y), U(LCTL), END ); + BABLM( , D(LCTL), T(Y), U(LCTL), END ); case BABL_SELECT_ALL: - return MACRO(D(LCTL), T(X), U(LCTL),T(H), END ); + BABLM( ,D(LCTL), T(X), U(LCTL),T(H), END ); case BABL_FIND: - return MACRO( D(LCTRL), T(S), U(LCTRL),END ); + BABLM( , D(LCTRL), T(S), U(LCTRL),END ); case BABL_FIND_NEXT: - return MACRO( D(LCTRL), T(S), U(LCTRL),END ); + BABLM( , D(LCTRL), T(S), U(LCTRL),END ); case BABL_FIND_REPLACE: - return MACRO( D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END ); + BABLM( , D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END ); case BABL_RUNAPP: - return MACRO( D(LALT), T(X), U(LALT),T(S),T(H),T(E),T(L),T(L),END );// arguably + BABLM( , D(LALT), T(X), U(LALT),T(S),T(H),T(E),T(L),T(L),END );// arguably case BABL_SWITCH_APP_NEXT: - return MACRO( D(LCTL), T(X), U(LCTL),T(RIGHT), END ); // arguably + BABLM( , D(LCTL), T(X), U(LCTL),T(RIGHT), END ); // arguably case BABL_SWITCH_APP_LAST: - return MACRO( D(LCTL), T(X), U(LCTL),T(LEFT), END ); // arguably + BABLM( , D(LCTL), T(X), U(LCTL),T(LEFT), END ); // arguably case BABL_CLOSE_APP: - return MACRO(D(LCTL), T(X), U(LCTL),T(C),END ); + BABLM( ,D(LCTL), T(X), U(LCTL),T(C),END ); case BABL_HELP: - return MACRO( D(LCTL),T(H), U(LCTL),T(A),END); // start search in help + BABLM( , D(LCTL),T(H), U(LCTL),T(A),END); // start search in help #endif break; @@ -319,150 +236,90 @@ const static macro_t *babblePaste (keyrecord_t *record, uint16_t shortcut) { #endif #ifdef VI_MODE case VI_MODE: - switch(shortcut) { //assume esc is already called - case BABL_DEL_RIGHT_1C: - return MACRO( T(X),END ); - case BABL_DEL_LEFT_WORD: - return MACRO( T(D),T(G),T(E),END ); - case BABL_DEL_RIGHT_WORD: - return MACRO( T(D),T(W),END ); - case BABL_GO_LEFT_1C: - return MACRO( T(H), END ); - case BABL_GO_RIGHT_1C: - return MACRO( T(L), END ); - case BABL_GO_LEFT_WORD: - return MACRO( T(B),END ); - case BABL_GO_RIGHT_WORD: - return MACRO( T(W), END ); - case BABL_GO_START_LINE: - return MACRO( D(LSFT), T(6),U(LSFT), END ); //^ - case BABL_GO_START_DOC: - return MACRO( T(G),T(G) ,END ); - case BABL_GO_END_LINE: - return MACRO( D(LSFT), T(4),U(LSFT) , END ); //$ - case BABL_GO_END_DOC: - return MACRO( D(LSFT), T(G),U(LSFT),END ); - case BABL_GO_NEXT_LINE: - return MACRO( T(J), END ); - case BABL_GO_PREV_LINE: - return MACRO( T(K), END ); - case BABL_PGDN: - return MACRO(D(LCTRL), T(F), U(LCTRL), END ); - case BABL_PGUP: - return MACRO( D(LCTRL), T(B), U(LCTRL), END ); + BABLM( BABL_DEL_RIGHT_1C , T(X),END ); + BABLM( BABL_DEL_LEFT_WORD , T(D),T(G),T(E),END ); + BABLM( BABL_DEL_RIGHT_WORD , T(D),T(W),END ); + BABLM( BABL_GO_LEFT_1C , T(H), END ); + BABLM( BABL_GO_RIGHT_1C , T(L), END ); + BABLM( BABL_GO_LEFT_WORD , T(B),END ); + BABLM( BABL_GO_RIGHT_WORD , T(W), END ); + BABLM( BABL_GO_START_LINE , D(LSFT), T(6),U(LSFT), END ); //^ + BABLM( BABL_GO_START_DOC , T(G),T(G) ,END ); + BABLM( BABL_GO_END_LINE , D(LSFT), T(4),U(LSFT) , END ); //$ + BABLM( BABL_GO_END_DOC , D(LSFT), T(G),U(LSFT),END ); + BABLM( BABL_GO_NEXT_LINE , T(J), END ); + BABLM( BABL_GO_PREV_LINE, T(K), END ); + BABLM( BABL_PGDN ,D(LCTRL), T(F), U(LCTRL), END ); + BABLM( BABL_PGUP , D(LCTRL), T(B), U(LCTRL), END ); #ifndef BABL_MOVEMENTONLY - case BABL_UNDO: - return MACRO( T(U), END ); - case BABL_REDO: - return MACRO( D(LCTL), T(R), U(LCTL), END ); - case BABL_CUT: - return MACRO( T(X), END ); - case BABL_COPY: - return MACRO( T(Y),END ); - case BABL_PASTE: - return MACRO( T(P), END ); - case BABL_SELECT_ALL: - return MACRO( D(LSFT), T(SCLN),U(LSFT),D(LSFT), T(5),U(LSFT),T(Y), END ); // wrong but helpful? - case BABL_FIND: - return MACRO( T(SLASH),END ); - case BABL_FIND_NEXT: - return MACRO( T(N),END ); - case BABL_FIND_REPLACE: - return MACRO( D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END ); - case BABL_RUNAPP: - return MACRO_NONE; - case BABL_SWITCH_APP_NEXT: - return MACRO_NONE; - case BABL_SWITCH_APP_LAST: - return MACRO_NONE; - case BABL_CLOSE_APP: - return MACRO(D(LSFT), T(SCLN),U(LSFT), T(Q), D(RSFT), T(1),U(RSFT), END ); - case BABL_HELP: - return MACRO(D(LSFT), T(SCLN),U(LSFT),T(H),END); // start search in help - break; + BABLM( BABL_UNDO , T(U), END ); + BABLM( BABL_REDO , D(LCTL), T(R), U(LCTL), END ); + BABLM( BABL_CUT , T(X), END ); + BABLM( BABL_COPY , T(Y),END ); + BABLM( BABL_PASTE , T(P), END ); + BABLM( BABL_SELECT_ALL , D(LSFT), T(SCLN),U(LSFT),D(LSFT), T(5),U(LSFT),T(Y), END ); // wrong but helpful? + BABLM( BABL_FIND , T(SLASH),END ); + BABLM( BABL_FIND_NEXT , T(N),END ); + BABLM( BABL_FIND_REPLACE , D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END ); + BABLM( BABL_RUNAPP,END ); + BABLM( BABL_SWITCH_APP_NEXT ,END ); + BABLM( BABL_SWITCH_APP_LAST ,END ); + BABLM(BABL_CLOSE_APP, D(LSFT), T(SCLN),U(LSFT), T(Q), D(RSFT), T(1),U(RSFT), END ); + BABLM(BABL_HELP, D(LSFT), T(SCLN),U(LSFT),T(H),END); // start search in help #endif - return MACRO_NONE; - } - + return MACRO_NONE; #endif + + + + #ifdef READMUX_MODE // Readline command line editing + tmux windowing // I havent decided how much to do readline and how much tmux - case READMUX_MODE: - switch(shortcut) { - - case BABL_DEL_RIGHT_1C: - return MACRO( D(LCTL), T(D), U(LCTL),END ); - case BABL_DEL_LEFT_WORD: - return MACRO( D(LCTL), T(W), U(LCTL), END ); - case BABL_DEL_RIGHT_WORD: - return MACRO( D(LALT), T(D), U(LALT), END ); - case BABL_GO_LEFT_1C: - return MACRO( T(LEFT), END ); - case BABL_GO_RIGHT_1C: - return MACRO( T(RIGHT), END ); - case BABL_GO_LEFT_WORD: - return MACRO( D(LALT), T(B), U(LALT), END ); - case BABL_GO_RIGHT_WORD: - return MACRO( D(LALT), T(F), U(LALT), END ); - case BABL_GO_START_LINE: - return MACRO( D(LCTRL), T(A), U(LCTRL), END ); - case BABL_GO_START_DOC: - return MACRO_NONE; // tmux? - case BABL_GO_END_LINE: - return MACRO( D(LCTRL), T(E), U(LCTRL), END ); - case BABL_GO_END_DOC: - return MACRO_NONE; // tmux? - case BABL_GO_NEXT_LINE: - return MACRO( D(LCTRL), T(N), U(LCTRL), END ); - case BABL_GO_PREV_LINE: - return MACRO( D(LCTRL), T(P), U(LCTRL), END ); - case BABL_PGDN: - return MACRO( T(PGDN), END ); - case BABL_PGUP: - return MACRO( T(PGUP), END ); + case READMUX_MODE: + BABLM( BABL_DEL_RIGHT_1C , D(LCTL), T(D), U(LCTL),END ); + BABLM( BABL_DEL_LEFT_WORD , D(LCTL), T(W), U(LCTL), END ); + BABLM( BABL_DEL_RIGHT_WORD , D(LALT), T(D), U(LALT), END ); + BABLM( BABL_GO_LEFT_1C , T(LEFT), END ); + BABLM( BABL_GO_RIGHT_1C , T(RIGHT), END ); + BABLM( BABL_GO_LEFT_WORD , D(LALT), T(B), U(LALT), END ); + BABLM( BABL_GO_RIGHT_WORD , D(LALT), T(F), U(LALT), END ); + BABLM( BABL_GO_START_LINE , D(LCTRL), T(A), U(LCTRL), END ); + BABLM( BABL_GO_START_DOC ,END );// tmux? + BABLM( BABL_GO_END_LINE , D(LCTRL), T(E), U(LCTRL), END ); + BABLM( BABL_GO_END_DOC ,END ); // tmux? + BABLM( BABL_GO_NEXT_LINE , D(LCTRL), T(N), U(LCTRL), END ); + BABLM( BABL_GO_PREV_LINE , D(LCTRL), T(P), U(LCTRL), END ); + BABLM( BABL_PGDN , T(PGDN), END ); + BABLM( BABL_PGUP , T(PGUP), END ); #ifndef BABL_MOVEMENTONLY - case BABL_UNDO: - return MACRO( D(LALT), T(R), U(LALT) , END ); - case BABL_REDO: - return MACRO( D(LCTL), T(X), U(LCTL),T(C), END ); // arguably - case BABL_CUT: - return MACRO( D(LCTL), T(K), U(LCTL), END ); // wrong half the time - case BABL_COPY: - return MACRO_NONE; - case BABL_PASTE: - return MACRO( D(LCTL), T(Y), U(LCTL), END ); - case BABL_SELECT_ALL: - return MACRO(D(LCTL), T(A), T(K), T(Y), U(LCTL) , END ); - case BABL_FIND: - return MACRO( D(LCTRL), T(R), U(LCTRL), END ); // search history - case BABL_FIND_NEXT: - eturn MACRO( D(LCTRL), T(S), U(LCTRL), END ); - case BABL_FIND_REPLACE: - return MACRO_NONE; // tmux? - case BABL_RUNAPP: - return MACRO( D(LCTRL), T(B), U(LCTRL), T(C),END ); //tmux - case BABL_SWITCH_APP_NEXT: - return MACRO( D(LCTRL), T(B), U(LCTRL), T(N),END ); //tmux - case BABL_SWITCH_APP_LAST: - return MACRO( D(LCTRL), T(B), U(LCTRL), T(P),END ); //tmux - case BABL_CLOSE_APP: - return MACRO( D(LCTRL), T(B), U(LCTRL), T(D),END); // usually what I want - break; - case BABL_HELP: - return MACRO_NONE; + BABLM( BABL_UNDO , D(LALT), T(R), U(LALT) , END ); + BABLM( BABL_REDO , D(LCTL), T(X), U(LCTL),T(C), END ); // arguably + BABLM( BABL_CUT , D(LCTL), T(K), U(LCTL), END ); // wrong half the time + BABLM( BABL_COPY ,END ); + BABLM( BABL_PASTE , D(LCTL), T(Y), U(LCTL), END ); + BABLM( BABL_SELECT_ALL ,D(LCTL), T(A), T(K), T(Y), U(LCTL) , END ); + BABLM( BABL_FIND , D(LCTRL), T(R), U(LCTRL), END ); // search history + BABLM(BABL_FIND_NEXT, D(LCTRL), T(S), U(LCTRL), END ); + BABLM( BABL_FIND_REPLACE ,END ); + BABLM( BABL_RUNAPP , D(LCTRL), T(B), U(LCTRL), T(C),END ); //tmux + BABLM( BABL_SWITCH_APP_NEXT , D(LCTRL), T(B), U(LCTRL), T(N),END ); //tmux + BABLM( BABL_SWITCH_APP_LAST , D(LCTRL), T(B), U(LCTRL), T(P),END ); //tmux + BABLM( BABL_CLOSE_APP , D(LCTRL), T(B), U(LCTRL), T(D),END); // usually what I want + BABLM( BABL_HELP ,END ); #endif - break; - - return MACRO_NONE; - } + + return MACRO_NONE; #endif - return MACRO_NONE; - } + default: + return MACRO_NONE; + } } + +#endif \ No newline at end of file diff --git a/keyboards/handwired/MS-sculpt-mobile/babblePaste.h b/keyboards/handwired/MS-sculpt-mobile/babblePaste.h index 63b79a2055..313fa80ec4 100644 --- a/keyboards/handwired/MS-sculpt-mobile/babblePaste.h +++ b/keyboards/handwired/MS-sculpt-mobile/babblePaste.h @@ -9,27 +9,39 @@ and jeebak & algernon's keymap */ #ifndef _babblePaste_h_included__ #define _babblePaste_h_included__ +#include "action_layer.h" +#ifdef USE_BABLPASTE -/* Add this to your config.h -// Uncomment any modes you want. -// Windows. -//#define MS_MODE 0 +/* *************************** + +// Uncomment any modes you want. Whatever mode = 0 will be the default on boot + +//#define MS_MODE 0 // Windows. //#define MAC_MODE 1 -//aka gnome+KDE -//#define LINUX_MODE 2 +//#define LINUX_MODE 2 //aka gnome+KDE //#define EMACS_MODE 3 //#define VI_MODE 4 //#define WORDSTAR_MODE 5 -// Readline and tmux -//#define READMUX 6 -*/ +//#define READMUX 6 // Readline and tmux +****************************/ -/* Macros handled by babblepaste. Most should be available for all platforms. */ + +// Uncomment if you need more free flash space +// It removes everything but cursor movement +//#define BABL_MOVEMENTONLY + + +// Define starting number for BABL macros in the macro range. +// Probably can start the default even lower +#define BABL_START_NUM 50 + +/* Macros handled by babblepaste. Most should be available for all platforms. +Whatever isn't defined will NOP */ enum { // Movement - BABL_DEL_RIGHT_1C=200, + BABL_DEL_RIGHT_1C= BABL_START_NUM, BABL_DEL_LEFT_WORD, BABL_DEL_RIGHT_WORD, BABL_GO_LEFT_1C, @@ -64,9 +76,26 @@ enum { #endif }; +// How many macros/ how many array elements? +#define BABL_NUM_MACROS 28 +/* from action_macro.h +typedef uint8_t macro_t; + +#define MACRO_NONE (macro_t*)0 +#define MACRO(...) ({ static const macro_t __m[] PROGMEM = { __VA_ARGS__ }; &__m[0]; }) +#define MACRO_GET(p) pgm_read_byte(p) + +#define BABL_MSTART (entry, os, macro...) ( const macro_t bablDict[entry][os] PROGMEM = { macro... }; ) + +*/ + +const macro_t *babblePaste(keyrecord_t *record, uint8_t shortcut); + +macro_t* switch_babble_mode( uint8_t id); + + +#endif +#endif -//static macro_t *babblePaste(keyrecord_t *record, uint16_t shortcut) - - #endif \ No newline at end of file diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h index aaf0077b14..7ad1b0f0f5 100644 --- a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h @@ -3,5 +3,25 @@ #include "../../config.h" +#define USE_BABLPASTE + +#ifdef USE_BABLPASTE +//define BabblePaste maps +// Windows. +//#define MS_MODE 1 +#define MAC_MODE 0 +//aka gnome+KDE +//#define LINUX_MODE 2 +//#define EMACS_MODE 3 +//#define VI_MODE 4 +//#define WORDSTAR_MODE 5 +// Readline and tmux +#define READMUX_MODE 6 +#endif + +// Uncomment if you need more free flash space +// It removes everything but cursor movement +//#define BABL_MOVEMENTONLY + // place overrides here #endif diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c index 244d52dc56..3a162db864 100644 --- a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c @@ -1,5 +1,7 @@ #include "MS-sculpt-mobile.h" #include "action_layer.h" +#include "action_util.h" +#include "babblePaste.h" #ifdef AUDIO_ENABLE #include "audio.h" @@ -12,6 +14,13 @@ #define _TRAN 5 + + +// adjust babblemode default +extern uint8_t babble_mode; + + + enum layer_keycodes { QWR, CDH, @@ -37,7 +46,11 @@ TRAN enum macro_keycodes { DHPASTE=1, VIBRK, -TO_CDH, +B_LNX, +B_WIN, +B_MAC, +B_VI, +B_READ , }; @@ -71,8 +84,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, QWR, \ KC_ESC, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, ____, ____, ____,\ - TT_MOV, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, ____,\ - KC_LSFT, KC_Z, KC_X, KC_C, M(DHPASTE), KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, ____, ____,\ + TT_MOV, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_2,\ + KC_LSFT, KC_Z, KC_X, KC_C, M(DHPASTE), KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, ____, KC_1,\ ____, ____, ____ , KC_FN1, ____, ____, ____, ____, ____, ____ ), @@ -86,9 +99,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * -------------------------------------------------------------------------- * | ESC: | ^ | { | } | @ | % | | [ | ( | ) | _ | [ | ] | \ | | * -------------------------------------------------------------------------------' -* |Bak/Mov| ! | # | 0 | = | | * | - | 1 | + | ] | ` | enter |PgUp| +* |Bak/Mov| ! | # | 0 | = | { | } | - | 1 | + | ] | ` | enter |PgUp| * -------------------------------------------------------------------------------- -* |Lsft | ; | ~ | : | ~ | "|"| $ | ~ | | | / | Rsft| Up| PgDn| +* |Lsft | ; | ~ | : | ~ | "|"| $ | * | | . | / | Rsft| Up| PgDn| * --------------------------------------------------------------------------------- * |Lctl |Lgui |Lalt | Space/Sym | GUI | Sym | Rctl |Left|Down|Rght| * --------------------------------------------------------------------------------- @@ -98,16 +111,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ M(VIBRK), KC_CIRC, KC_LCBR, KC_RCBR,KC_AT, KC_PERC, ____, KC_LBRC,KC_LPRN,KC_RPRN,KC_UNDS, ____, ____, ____,\ - ____, KC_EXLM, KC_HASH, KC_0, KC_EQL, ____, KC_ASTR,KC_MINS,KC_1, KC_PLUS,KC_RBRC, KC_GRV, ____, ____,\ - ____, KC_SCLN, KC_TILDE, KC_COLN, KC_TILDE, KC_PIPE, KC_DLR, KC_TILDE,____, ____, KC_SLSH, ____, ____, ____,\ + ____, KC_EXLM, KC_HASH, KC_0, KC_EQL, KC_LCBR, KC_RCBR,KC_MINS,KC_1, KC_PLUS,KC_RBRC, KC_GRV, ____, ____,\ + ____, KC_SCLN, KC_TILDE, KC_COLN, KC_TILDE, KC_PIPE, KC_DLR, KC_ASTR, ____, KC_DOT , KC_SLSH, ____, ____, ____,\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ ), [_MOV] = KEYMAP (\ - ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ - ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ - ____, ____,RGUI(KC_TAB), ____, ____, RCTL(KC_B), ____, ____, KC_UP, ____, ____, ____, ____, ____, \ - ____, RCTL(KC_A), KC_S, RCTL(KC_K), RCTL(KC_E), ____, ____, KC_LEFT,KC_DOWN, KC_RIGHT, ____, ____,____,____,\ + ____, M(B_WIN),M(B_MAC),M(B_READ), M(B_VI), ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, M(BABL_UNDO), ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____,RGUI(KC_TAB), ____, ____, RCTL(KC_B), ____, M(BABL_DEL_LEFT_WORD), KC_UP, M(BABL_DEL_RIGHT_WORD), ____, ____, ____, ____, \ + ____, RCTL(KC_A), KC_S, RCTL(KC_K), RCTL(KC_E), ____, M(BABL_GO_START_LINE), KC_LEFT,KC_DOWN, KC_RIGHT, M(BABL_GO_END_LINE), ____,____,____,\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ ), @@ -122,7 +135,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ) }; - const uint16_t PROGMEM fn_actions[] = { [1] = ACTION_LAYER_TAP_KEY(_SYM,KC_SPACE), [2] = ACTION_LAYER_TAP_KEY(_MOV,KC_BSPC) @@ -171,10 +183,21 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; } - - + const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + +/* If this is in the range of BABL macros, call a separate function */ +#ifdef USE_BABLPASTE + if( id >= BABL_START_NUM && id < (BABL_START_NUM + BABL_NUM_MACROS ) ) { + if (record->event.pressed) { // is there a case where this isn't desired? + + babblePaste ( record, id ); + return MACRO_NONE; + } + } +#endif + // MACRODOWN only works in this function switch(id) { case 0: @@ -185,49 +208,72 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } break; - - case DHPASTE: - if(keyboard_report->mods & MOD_BIT(KC_LGUI) ) { - if (record->event.pressed) { - clear_keyboard_but_mods(); - register_code(KC_V); - } else { - unregister_code(KC_V); - } - }else { - if (record->event.pressed) { - register_code(KC_D); + /* Colemak mod-dh moves the D key to the qwerty V position + This hack makes apple-V_position do what I mean */ + case DHPASTE: + if(keyboard_report->mods & MOD_BIT(KC_LGUI) ) { + if (record->event.pressed) { + clear_keyboard_but_mods(); + register_code(KC_V); + } else { + unregister_code(KC_V); + } + } else { + if (record->event.pressed) { + register_code(KC_D); } else { - unregister_code(KC_D); - } - } + unregister_code(KC_D); + } + } break; case VIBRK: // vi esc: if (record->event.pressed) { - return MACRO( T(E),D(LSFT),T(SCLN),U(LSFT), END ); + return MACRO( T(ESC),D(LSFT),T(SCLN),U(LSFT), END ); } break; - } - return MACRO_NONE; -}; + +#ifdef USE_BABLPASTE -#ifdef AUDIO_ENABLE - - -void startup_user() -{ - _delay_ms(20); // gets rid of tick - PLAY_NOTE_ARRAY(tone_startup, false, 0); -} +#ifdef LINUX_MODE + case B_LNX: + return switch_babble_mode(LINUX_MODE); +#endif +#ifdef MS_MODE + case B_WIN: + return switch_babble_mode(MS_MODE); +#endif +#ifdef MAC_MODE + case B_MAC: + return switch_babble_mode(MAC_MODE); +#endif +#ifdef VI_MODE + case B_VI: + return switch_babble_mode(VI_MODE); +#endif +#ifdef READMUX_MODE + case B_READ: + return switch_babble_mode(READMUX_MODE); +#endif #endif -void matrix_init_user(void) { + default: + return MACRO_NONE; + } + +return MACRO_NONE; +}; + + + + + +void matrix_init_user(void) { } void matrix_scan_user(void) { @@ -240,3 +286,11 @@ void led_set_user(uint8_t usb_led) { } +macro_t* switch_babble_mode( uint8_t id) { + babble_mode= id; + return MACRO_NONE; //less typing above +} + + + + diff --git a/keyboards/handwired/MS-sculpt-mobile/rules.mk b/keyboards/handwired/MS-sculpt-mobile/rules.mk index cb9d5813cf..34ac78da81 100644 --- a/keyboards/handwired/MS-sculpt-mobile/rules.mk +++ b/keyboards/handwired/MS-sculpt-mobile/rules.mk @@ -1,5 +1,9 @@ #CFLAGS=-D ASTAR +## Project specific files +SRC= babblePaste.c + + ifdef ASTAR OPT_DEFS += -DBOOTLOADER_SIZE=4096 MCU = atmega32u4 From 08cba6c09b505340ec6c1932df4b17aab1816d97 Mon Sep 17 00:00:00 2001 From: Joshua Colbeck Date: Tue, 7 Mar 2017 09:43:08 -0600 Subject: [PATCH 042/181] Fixed minor error in ergodox infinity section. --- keyboards/ergodox/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/ergodox/readme.md b/keyboards/ergodox/readme.md index 45b3354c1c..5e50548be3 100644 --- a/keyboards/ergodox/readme.md +++ b/keyboards/ergodox/readme.md @@ -100,7 +100,7 @@ for the left and right halves seperately. To flash them: - Install the firmware with `sudo make infinity-keymapname-dfu-util` - - Build left hand firmware with `make infinity-keymapname MASTER=right` + - Build right hand firmware with `make infinity-keymapname MASTER=right` - Plug in the right hand keyboard only. From 1023a47be6b91282b92b9a44f4492aa88375bf8e Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Wed, 22 Feb 2017 16:51:25 -0500 Subject: [PATCH 043/181] Copy CMD60 as starting point and rename files --- keyboards/handwired/magicforce68/README.md | 35 ++++ keyboards/handwired/magicforce68/config.h | 162 ++++++++++++++++++ .../magicforce68/keymaps/default/keymap.c | 66 +++++++ .../handwired/magicforce68/magicforce68.c | 8 + .../handwired/magicforce68/magicforce68.h | 20 +++ keyboards/handwired/magicforce68/rules.mk | 73 ++++++++ 6 files changed, 364 insertions(+) create mode 100644 keyboards/handwired/magicforce68/README.md create mode 100644 keyboards/handwired/magicforce68/config.h create mode 100644 keyboards/handwired/magicforce68/keymaps/default/keymap.c create mode 100644 keyboards/handwired/magicforce68/magicforce68.c create mode 100644 keyboards/handwired/magicforce68/magicforce68.h create mode 100644 keyboards/handwired/magicforce68/rules.mk diff --git a/keyboards/handwired/magicforce68/README.md b/keyboards/handwired/magicforce68/README.md new file mode 100644 index 0000000000..83e371543e --- /dev/null +++ b/keyboards/handwired/magicforce68/README.md @@ -0,0 +1,35 @@ +CMD60 keyboard firmware +====================== + +##CMD60 + +This layout has been designed to optimize use of the left-hand, and it focussed specifically on programmers who work +with text editors like SublimeText and Atom. It utilizes the power of Space_fn, and features a caps lock swap for Fn2 +and enter key on tap. These features allow you to keep your right hand on the mouse more and should enable you to +achieve a higher level of productivity if you take the time to learn its function layers. + +## Quantum MK Firmware + +For the full Quantum feature list, see [the parent readme.md](/doc/readme.md). + +## Building + +Download or clone the whole firmware and navigate to the keyboards/handwired/CMD60 folder. +Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use +the Teensy Loader to program your .hex file. + +Depending on which keymap you would like to use, you will have to compile slightly differently. + +### Default + +To build with the default keymap, simply run `make`. + +### Other Keymaps + +To build the firmware binary hex file with a keymap just do `make` with `keymap` option like: + +``` +$ make keymap=[default|jack|] +``` + +Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/` diff --git a/keyboards/handwired/magicforce68/config.h b/keyboards/handwired/magicforce68/config.h new file mode 100644 index 0000000000..9671b66bad --- /dev/null +++ b/keyboards/handwired/magicforce68/config.h @@ -0,0 +1,162 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Hexwire +#define PRODUCT Magicforce 68 +#define DESCRIPTION Advanced Programming Keeb Layout + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { F0, F4, F5, F6, F7 } +#define MATRIX_COL_PINS { B0, B1, B2, B3, B7, D0, D1, D2, D3, C6, D7, B4, B5, B6 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/handwired/magicforce68/keymaps/default/keymap.c b/keyboards/handwired/magicforce68/keymaps/default/keymap.c new file mode 100644 index 0000000000..9f9cbcd661 --- /dev/null +++ b/keyboards/handwired/magicforce68/keymaps/default/keymap.c @@ -0,0 +1,66 @@ +#include "CMD60.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = KEYMAP( /* CMD60 - QWERTY */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + LT(3, KC_ENT), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, KC_NO, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, LT(2, KC_SPC), MO(3), MO(4), MO(5), TG(1) \ + ), + [1] = KEYMAP( /* CMD60 - GameMode */ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \ + KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_RSFT, \ + KC_TRNS, KC_NO, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + [2] = KEYMAP( /* CMD60 - Arrows */ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ + KC_TRNS, KC_BSPC, KC_UP, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_UP, KC_DEL, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, \ + KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + [3] = KEYMAP( /* CMD60 - Functions */ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ + KC_AUDIO_MUTE, KC_BSPC, KC_PGUP, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_UP, KC_PGDN, KC_TRNS, KC_PAUSE, KC_SLCK, KC_PSCREEN, \ + KC_TRNS, KC_HOME, KC_PGDN, KC_END, KC_TRNS, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_INSERT, KC_NO, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + [4] = KEYMAP( /* CMD60 - Mouse */ + KC_SYSTEM_SLEEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRNS, KC_NO, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_WH_UP, KC_MS_BTN3, KC_MS_WH_DOWN, KC_NO, KC_NO, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + [5] = KEYMAP( /* CMD60 - Media */ + KC_SYSTEM_WAKE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_AUDIO_MUTE, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK, KC_MEDIA_PLAY_PAUSE, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WWW_BACK, KC_WWW_FORWARD, KC_NO, KC_NO, KC_WWW_REFRESH, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; diff --git a/keyboards/handwired/magicforce68/magicforce68.c b/keyboards/handwired/magicforce68/magicforce68.c new file mode 100644 index 0000000000..84b1007e2c --- /dev/null +++ b/keyboards/handwired/magicforce68/magicforce68.c @@ -0,0 +1,8 @@ +#include "magicforce68.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} diff --git a/keyboards/handwired/magicforce68/magicforce68.h b/keyboards/handwired/magicforce68/magicforce68.h new file mode 100644 index 0000000000..de465a828f --- /dev/null +++ b/keyboards/handwired/magicforce68/magicforce68.h @@ -0,0 +1,20 @@ +#ifndef MAGICFORCE68_H +#define MAGICFORCE68_H + +#include "quantum.h" + +#define KEYMAP( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K45, K4A, K4B, K4C, K4D \ + ) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \ + { K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, KC_NO,K4A, K4B, K4C, K4D } \ +} + +#endif \ No newline at end of file diff --git a/keyboards/handwired/magicforce68/rules.mk b/keyboards/handwired/magicforce68/rules.mk new file mode 100644 index 0000000000..7117599173 --- /dev/null +++ b/keyboards/handwired/magicforce68/rules.mk @@ -0,0 +1,73 @@ + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=512 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 + +ifndef QUANTUM_DIR + include ../../../Makefile +endif + + From 6ee823a821d9c89a67c53f65ecf4d745223694a0 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Sun, 26 Feb 2017 10:16:24 -0500 Subject: [PATCH 044/181] Add rule for flashing microcontroller using avrdude --- keyboards/handwired/magicforce68/rules.mk | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/keyboards/handwired/magicforce68/rules.mk b/keyboards/handwired/magicforce68/rules.mk index 7117599173..e897ef2523 100644 --- a/keyboards/handwired/magicforce68/rules.mk +++ b/keyboards/handwired/magicforce68/rules.mk @@ -70,4 +70,14 @@ ifndef QUANTUM_DIR include ../../../Makefile endif +avrdude: build + ls /dev/tty* > /tmp/1; \ + echo "Reset your Pro Micro now"; \ + while [[ -z $$USB ]]; do \ + sleep 1; \ + ls /dev/tty* > /tmp/2; \ + USB=`diff /tmp/1 /tmp/2 | grep -o '/dev/tty.*'`; \ + done; \ + avrdude -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex +.PHONY: avrdude From f3aef727e174279e69d8d5831d859d00802eb8c4 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Tue, 7 Mar 2017 11:41:10 -0500 Subject: [PATCH 045/181] Set pinout and layout --- keyboards/handwired/magicforce68/config.h | 6 +- .../magicforce68/keymaps/default/keymap.c | 90 ++++++++++--------- .../handwired/magicforce68/magicforce68.h | 20 ++--- 3 files changed, 61 insertions(+), 55 deletions(-) diff --git a/keyboards/handwired/magicforce68/config.h b/keyboards/handwired/magicforce68/config.h index 9671b66bad..8a49b09353 100644 --- a/keyboards/handwired/magicforce68/config.h +++ b/keyboards/handwired/magicforce68/config.h @@ -30,7 +30,7 @@ along with this program. If not, see . /* key matrix size */ #define MATRIX_ROWS 5 -#define MATRIX_COLS 14 +#define MATRIX_COLS 15 /* * Keyboard Matrix Assignments @@ -42,8 +42,8 @@ along with this program. If not, see . * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) * */ -#define MATRIX_ROW_PINS { F0, F4, F5, F6, F7 } -#define MATRIX_COL_PINS { B0, B1, B2, B3, B7, D0, D1, D2, D3, C6, D7, B4, B5, B6 } +#define MATRIX_ROW_PINS { F0, F1, F4, F5, F6 } +#define MATRIX_COL_PINS { B2, B0, D3, D2, D1, D0, D4, C6, D7, E6, B4, B5, B6, B7, D6 } #define UNUSED_PINS /* COL2ROW or ROW2COL */ diff --git a/keyboards/handwired/magicforce68/keymaps/default/keymap.c b/keyboards/handwired/magicforce68/keymaps/default/keymap.c index 9f9cbcd661..628249c2d8 100644 --- a/keyboards/handwired/magicforce68/keymaps/default/keymap.c +++ b/keyboards/handwired/magicforce68/keymaps/default/keymap.c @@ -1,52 +1,58 @@ -#include "CMD60.h" +#include "magicforce68.h" + +#define _QWERTY 0 +#define _FN1 1 +#define _FN2 2 +#define KC_ KC_TRNS const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = KEYMAP( /* CMD60 - QWERTY */ - KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ - LT(3, KC_ENT), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, KC_NO, KC_RSFT, \ - KC_LCTL, KC_LGUI, KC_LALT, LT(2, KC_SPC), MO(3), MO(4), MO(5), TG(1) \ + [_QWERTY] = KEYMAP( + /*,----+----+----+----+----+----+----+----+----+----+----+----+----+--------. ,----+----. */ + ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,MINS,EQL , BSPC , INS ,PGUP, + /*|----`----`----`----`----`----`----`----`----`----`----`----`----`--------| |----`----| */ + TAB , Q , W , E , R , T , Y , U , I , O , P ,LBRC,RBRC, BSLS , DEL ,PGDN, + /*|------`----`----`----`----`----`----`----`----`----`----`----`----`------| `----`----' */ + FN0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, ENTER , + /*|-------`----`----`----`----`----`----`----`----`----`----`----`----------| ,----. */ + LSFT , Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, RSFT , UP , + /*|---------`----`----`----`----`----`----`----`----`----`----`-------------.--|----|----. */ + LCTL ,LGUI ,LALT , SPACE , FN1 ,RALT ,RCTL , LEFT,DOWN,RGHT + /*`-----+-----+-----+------------------------------+------+-----+-----' `----+----+----' */ ), - [1] = KEYMAP( /* CMD60 - GameMode */ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \ - KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_RSFT, \ - KC_TRNS, KC_NO, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ - ), - [2] = KEYMAP( /* CMD60 - Arrows */ - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ - KC_TRNS, KC_BSPC, KC_UP, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_UP, KC_DEL, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, \ - KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ - ), - [3] = KEYMAP( /* CMD60 - Functions */ - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \ - KC_AUDIO_MUTE, KC_BSPC, KC_PGUP, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_UP, KC_PGDN, KC_TRNS, KC_PAUSE, KC_SLCK, KC_PSCREEN, \ - KC_TRNS, KC_HOME, KC_PGDN, KC_END, KC_TRNS, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_INSERT, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ - ), - [4] = KEYMAP( /* CMD60 - Mouse */ - KC_SYSTEM_SLEEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRNS, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_WH_UP, KC_MS_BTN3, KC_MS_WH_DOWN, KC_NO, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ - ), - [5] = KEYMAP( /* CMD60 - Media */ - KC_SYSTEM_WAKE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_AUDIO_MUTE, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK, KC_MEDIA_PLAY_PAUSE, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WWW_BACK, KC_WWW_FORWARD, KC_NO, KC_NO, KC_WWW_REFRESH, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + + [_FN1] = KEYMAP( + /*,----+----+----+----+----+----+----+----+----+----+----+----+----+--------. ,----+----. */ + GRV , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 ,F12 , BSPC , VOLU,HOME, + /*|esc-`-1--`-2--`-3--`-4--`-5--`-6--`-7--`-8--`-9--`-0--`mnus`plus`--bksp--| |ins-`pgup| */ + , , , UP , , , , , , , , , , , VOLD,END, + /*|tab---`-q--`-w--`-e--`-r--`-t--`-y--`-u--`-i--`-o--`-p--`-{--`-}--`--|---| `del-`pgdn' */ + , ,LEFT,DOWN,RGHT, , , , , , , , , + /*|caps---`-a--`-s--`-d--`-f--`-g--`-h--`-j--`-k--`-l--`-;--`-'--`----enter-| ,----. */ + , , , , , , ,MUTE, , , , , MUTE, + /*|shift----`-z--`-x--`-c--`-v--`-b--`-n--`-m--`-,--`-.--`-/--`-------shift-.--|-up-|----. */ + , , , , , , , MPRV,MPLY,MNXT + /*`ctrl-+-gui-+-alt-+----------space---------------+-fn---+-alt-+ctrl-' `left+down+rght' */ ), + + [_FN2] = KEYMAP( + /*,----+----+----+----+----+----+----+----+----+----+----+----+----+--------. ,----+----. */ + GRV , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 ,F12 , BSPC , VOLU,HOME, + /*|esc-`-1--`-2--`-3--`-4--`-5--`-6--`-7--`-8--`-9--`-0--`mnus`plus`--bksp--| |ins-`pgup| */ + , , , UP , , , , 7 , 8 , 9 , , , , , VOLD,END, + /*|tab---`-q--`-w--`-e--`-r--`-t--`-y--`-u--`-i--`-o--`-p--`-{--`-}--`--|---| `del-`pgdn' */ + , ,LEFT,DOWN,RGHT, , , 4 , 5 , 6 , , , , + /*|caps---`-a--`-s--`-d--`-f--`-g--`-h--`-j--`-k--`-l--`-;--`-'--`----enter-| ,----. */ + , , , , , , 0 , 1 , 2 , 3 , , , MUTE, + /*|shift----`-z--`-x--`-c--`-v--`-b--`-n--`-m--`-,--`-.--`-/--`-------shift-.--|-up-|----. */ + , , , , , , , MPRV,MPLY,MNXT + /*`ctrl-+-gui-+-alt-+----------space---------------+-fn---+-alt-+ctrl-' `left+down+rght' */ + ) }; const uint16_t PROGMEM fn_actions[] = { - + [0] = LT(KC_FN2, KC_GRV), + [1] = MO(_FN1), + [2] = MO(_FN2), }; diff --git a/keyboards/handwired/magicforce68/magicforce68.h b/keyboards/handwired/magicforce68/magicforce68.h index de465a828f..cfcdce38d5 100644 --- a/keyboards/handwired/magicforce68/magicforce68.h +++ b/keyboards/handwired/magicforce68/magicforce68.h @@ -4,17 +4,17 @@ #include "quantum.h" #define KEYMAP( \ - K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \ - K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ - K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \ - K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ - K40, K41, K42, K45, K4A, K4B, K4C, K4D \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K2E, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K3E, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3C, K3D, \ + K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D, K4E \ ) { \ - { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ - { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ - { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \ - { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \ - { K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, KC_NO,K4A, K4B, K4C, K4D } \ + { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E }, \ + { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E }, \ + { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_NO, KC_##K2E }, \ + { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_NO, KC_##K3C, KC_##K3D, KC_##K3E }, \ + { KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_NO, KC_##K45, KC_NO, KC_NO, KC_NO, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E } \ } #endif \ No newline at end of file From 2cd2ac02d1c215167a1d82d675dc7cab1d5d90be Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Tue, 7 Mar 2017 12:19:29 -0500 Subject: [PATCH 046/181] Add readme file --- keyboards/handwired/magicforce68/README.md | 39 ++++++------------ .../handwired/magicforce68/wiring-layout.png | Bin 0 -> 73739 bytes 2 files changed, 12 insertions(+), 27 deletions(-) create mode 100644 keyboards/handwired/magicforce68/wiring-layout.png diff --git a/keyboards/handwired/magicforce68/README.md b/keyboards/handwired/magicforce68/README.md index 83e371543e..4f0ccecf99 100644 --- a/keyboards/handwired/magicforce68/README.md +++ b/keyboards/handwired/magicforce68/README.md @@ -1,35 +1,20 @@ -CMD60 keyboard firmware -====================== +Magicforce 68 Handwired +======================= -##CMD60 +This firmware is for a Magicforce 68 that's had its PCB removed and is handwired with an Arduino Micro. NOTE: The Arduino Micro is different than the Arduino *Pro* Micro. -This layout has been designed to optimize use of the left-hand, and it focussed specifically on programmers who work -with text editors like SublimeText and Atom. It utilizes the power of Space_fn, and features a caps lock swap for Fn2 -and enter key on tap. These features allow you to keep your right hand on the mouse more and should enable you to -achieve a higher level of productivity if you take the time to learn its function layers. +## Wiring Layout -## Quantum MK Firmware +![Wiring Layout](wiring-layout.png) -For the full Quantum feature list, see [the parent readme.md](/doc/readme.md). +## Pinout -## Building +The following pins are used: +- Columns 1-15: B2, B0, D3, D2, D1, D0, D4, C6, D7, E6, B4, B5, B6, B7, D6 +- Rows 1-5: F0, F1, F4, F5, F6 -Download or clone the whole firmware and navigate to the keyboards/handwired/CMD60 folder. -Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use -the Teensy Loader to program your .hex file. +## Compiling and loading the firmware -Depending on which keymap you would like to use, you will have to compile slightly differently. +To build the firmware, run `make`. -### Default - -To build with the default keymap, simply run `make`. - -### Other Keymaps - -To build the firmware binary hex file with a keymap just do `make` with `keymap` option like: - -``` -$ make keymap=[default|jack|] -``` - -Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/` +To flash the firemware onto the microcontroller, run `make avrdude`, and press the reset button. diff --git a/keyboards/handwired/magicforce68/wiring-layout.png b/keyboards/handwired/magicforce68/wiring-layout.png new file mode 100644 index 0000000000000000000000000000000000000000..816b10b2b5394e95cc1b78b64a505f39878bc64a GIT binary patch literal 73739 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 literal 0 HcmV?d00001 From 38a83700c3c21326e691452c4dc002d398812679 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Tue, 7 Mar 2017 12:29:48 -0500 Subject: [PATCH 047/181] Update description --- keyboards/handwired/magicforce68/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/handwired/magicforce68/config.h b/keyboards/handwired/magicforce68/config.h index 8a49b09353..1e2b7d3e73 100644 --- a/keyboards/handwired/magicforce68/config.h +++ b/keyboards/handwired/magicforce68/config.h @@ -26,7 +26,7 @@ along with this program. If not, see . #define DEVICE_VER 0x0001 #define MANUFACTURER Hexwire #define PRODUCT Magicforce 68 -#define DESCRIPTION Advanced Programming Keeb Layout +#define DESCRIPTION Handwired Magicforce 68 /* key matrix size */ #define MATRIX_ROWS 5 From a9959783c0a190410307e3e6cc1be4c024e9cddd Mon Sep 17 00:00:00 2001 From: stites Date: Tue, 7 Mar 2017 11:45:47 -0500 Subject: [PATCH 048/181] Add freebsd support in "util/install_dependencies.sh" A simple addition to the `install_dependencies` script which remaps the debian dependencies to their freebsd package-names. After a recursive clone and using gmake, I can successfully build all firmware from the root directory (minus some warnings generated by gcc-4.9.4 which I can procure on request). however there is a problem running tests. --- util/install_dependencies.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/util/install_dependencies.sh b/util/install_dependencies.sh index 936a865938..1b73a8b3bf 100755 --- a/util/install_dependencies.sh +++ b/util/install_dependencies.sh @@ -92,4 +92,23 @@ elif [[ -n "$(type -P zypper)" ]]; then # TODO: The avr and eabi tools are not available as default packages, so we need # another way to install them +elif [[ -n "$(type -P pkg)" ]]; then + # FreeBSD + pkg update + pkg install -y \ + git \ + wget \ + gmake \ + gcc \ + zip \ + unzip \ + avr-binutils \ + avr-gcc \ + avr-libc \ + dfu-programmer \ + dfu-util \ + arm-none-eabi-gcc \ + arm-none-eabi-binutils \ + arm-none-eabi-newlib \ + diffutils fi From 1968ec4c24137eb413a80ae5031e09c09bad4138 Mon Sep 17 00:00:00 2001 From: Ole Anders Date: Tue, 7 Mar 2017 19:40:18 +0100 Subject: [PATCH 049/181] changed definitions on keymap.c in admiral strokers Made a few changes to my own keymaps. (organisation) --- .../satan/keymaps/admiralStrokers/keymap.c | 213 +++++++++--------- 1 file changed, 109 insertions(+), 104 deletions(-) diff --git a/keyboards/satan/keymaps/admiralStrokers/keymap.c b/keyboards/satan/keymaps/admiralStrokers/keymap.c index 487deb0862..97a0f225da 100644 --- a/keyboards/satan/keymaps/admiralStrokers/keymap.c +++ b/keyboards/satan/keymaps/admiralStrokers/keymap.c @@ -1,117 +1,117 @@ #include "satan.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // general keydefs - #define norm 0 // Default layer - #define elev 1 // Layer directional keys - #define supr 2 // F-keys and mediakeys - #define spac 3 - #define FNO1 4 // - #define FNO2 5 // - #define FNO3 6 // - #define MAC0 M(0) // - #define MAC1 M(1) // - #define MAC2 M(2) // - #define MAC3 M(3) // - #define MAC4 M(4) // - #define MAC5 M(5) // - #define MAC6 M(6) // - #define MAC7 M(7) // - #define MAC8 M(8) // - #define MAC9 M(9) // - #define GRAV KC_GRV // - #define MEDI F(FNO1)// +#define norm 0 // Default layer +#define elev 1 // Layer directional keys +#define supr 2 // F-keys and mediakeys +#define spac 3 +#define FNO1 4 // +#define FNO2 5 // +#define FNO3 6 // +#define MAC0 M(0) // +#define MAC1 M(1) // +#define MAC2 M(2) // +#define MAC3 M(3) // +#define MAC4 M(4) // +#define MAC5 M(5) // +#define MAC6 M(6) // +#define MAC7 M(7) // +#define MAC8 M(8) // +#define MAC9 M(9) // +#define GRAV KC_GRV // +#define MEDI F(FNO1)// // General shortenings - #define ESCA KC_ESC - #define MINS KC_MINS - #define EQUL KC_EQL - #define BSPC KC_BSPC - #define DELE KC_DEL - #define LBRC KC_LBRC - #define RBRC KC_RBRC - #define ALTR KC_RALT - #define SCLN KC_SCLN - #define QUOT KC_QUOT - #define NUHS KC_NUHS - #define ENTE KC_ENT - #define NUBS KC_NUBS // Less/ greater sign - #define COMM KC_COMM // Comma - #define FSTO KC_DOT // Full stop - #define SLSH KC_SLSH - #define ALTL KC_LALT - #define GUIL KC_LGUI - #define GUIR KC_RGUI - #define MENO KC_MENU +#define ESCA KC_ESC +#define MINS KC_MINS +#define EQUL KC_EQL +#define BSPC KC_BSPC +#define DELE KC_DEL +#define LBRC KC_LBRC +#define RBRC KC_RBRC +#define ALTR KC_RALT +#define SCLN KC_SCLN +#define QUOT KC_QUOT +#define NUHS KC_NUHS +#define ENTE KC_ENT +#define NUBS KC_NUBS // Less/ greater sign +#define COMM KC_COMM // Comma +#define FSTO KC_DOT // Full stop +#define SLSH KC_SLSH +#define ALTL KC_LALT +#define GUIL KC_LGUI +#define GUIR KC_RGUI +#define MENO KC_MENU // The F-row/layer: - #define FK01 KC_F1 - #define FK02 KC_F2 - #define FK03 KC_F3 - #define FK04 KC_F4 - #define FK05 KC_F5 - #define FK06 KC_F6 - #define FK07 KC_F7 - #define FK08 KC_F8 - #define FK09 KC_F9 - #define FK10 KC_F10 - #define FK11 KC_F11 - #define FK12 KC_F12 - #define FK13 KC_F13 - #define FK14 KC_F14 +#define FK01 KC_F1 +#define FK02 KC_F2 +#define FK03 KC_F3 +#define FK04 KC_F4 +#define FK05 KC_F5 +#define FK06 KC_F6 +#define FK07 KC_F7 +#define FK08 KC_F8 +#define FK09 KC_F9 +#define FK10 KC_F10 +#define FK11 KC_F11 +#define FK12 KC_F12 +#define FK13 KC_F13 +#define FK14 KC_F14 // Special Actions and Media Keys - #define INSE KC_INS // Insert here - #define HOME KC_HOME // Go to beginning of line - #define ENDI KC_END // go to end of line - #define PSCR KC_PSCR // Print Screen - #define SLCK KC_SLCK // go to end of line - #define PGDN KC_PGDN // go to end of line - #define PGUP KC_PGUP // go to end of line - #define PLPS KC_MPLY // Play/Pause - #define PAUS KC_PAUS // Pause button - #define MUTE KC_MUTE // Mute sound - #define VOLU KC_VOLU // Volume increase - #define VOLD KC_VOLD // Volume decrease - #define MNXT KC_MNXT // next track - #define MPRV KC_MPRV // prev track - #define MSTP KC_MSTP // stop playing - #define MSEL KC_MSEL // Select media (Start playing it) - #define MAIL KC_MAIL // Open default mail app - #define CALC KC_CALC // Open default calculator app - #define MYCM KC_MYCM // Open default file manager - //#define LILO KC_XXXXXX // Reserved for later - //#define LIHI KC_XXXXXX // Reserved for later +#define INSE KC_INS // Insert here +#define HOME KC_HOME // Go to beginning of line +#define ENDI KC_END // go to end of line +#define PSCR KC_PSCR // Print Screen +#define SLCK KC_SLCK // go to end of line +#define PGDN KC_PGDN // go to end of line +#define PGUP KC_PGUP // go to end of line +#define PLPS KC_MPLY // Play/Pause +#define PAUS KC_PAUS // Pause button +#define MUTE KC_MUTE // Mute sound +#define VOLU KC_VOLU // Volume increase +#define VOLD KC_VOLD // Volume decrease +#define MNXT KC_MNXT // next track +#define MPRV KC_MPRV // prev track +#define MSTP KC_MSTP // stop playing +#define MSEL KC_MSEL // Select media (Start playing it) +#define MAIL KC_MAIL // Open default mail app +#define CALC KC_CALC // Open default calculator app +#define MYCM KC_MYCM // Open default file manager +//#define LILO KC_XXXXXX // Reserved for later +//#define LIHI KC_XXXXXX // Reserved for later // dual-role shortcuts - #define DUTB LT(elev, KC_TAB) // `tabs` layer on hold and tab on tap - #define DUSP LT(spac, KC_SPACE) // `spce` layer on hold and space on tap - #define LOCK LGUI(KC_L) // lock computer (win) +#define DUTB LT(elev, KC_TAB) // `tabs` layer on hold and tab on tap +#define DUSP LT(spac, KC_SPACE) // `spce` layer on hold and space on tap +#define LOCK LGUI(KC_L) // lock computer (win) // Space Admiral Strokers - #define SADL MAC0 // Hold for lshift and { on tap - #define SADR MAC1 // Hold for rshift and } on tap - #define CADL MAC2 // Hold for lctrl and [ on tap - #define CADR MAC3 // Hold for rctrl and ] on tap +#define SADL MAC0 // Hold for lshift and { on tap +#define SADR MAC1 // Hold for rshift and } on tap +#define CADL MAC2 // Hold for lctrl and [ on tap +#define CADR MAC3 // Hold for rctrl and ] on tap // arrow cluster duality bottom right corner - #define ARLF ALT_T(KC_LEFT) // Left arrow - #define ARRT CTL_T(KC_RIGHT)// Right arrow - #define ARUP SFT_T(KC_UP) // Up arrow - #define ARDN GUI_T(KC_DOWN) // Down arrow +#define ARLF ALT_T(KC_LEFT) // Left arrow +#define ARRT CTL_T(KC_RIGHT)// Right arrow +#define ARUP SFT_T(KC_UP) // Up arrow +#define ARDN GUI_T(KC_DOWN) // Down arrow // brackets - #define NOCL RALT(KC_7) // [ - #define NOCR RALT(KC_0) // ] - #define NOPL LSFT(KC_8) // ( - #define NOPR LSFT(KC_9) // ) - #define NOAL KC_NUBS // < - #define NOAR LSFT(KC_NUBS) // > - #define NOBL RALT(KC_8) // [ - #define NOBR RALT(KC_9) // ] +#define NOCL RALT(KC_7) // [ +#define NOCR RALT(KC_0) // ] +#define NOPL LSFT(KC_8) // ( +#define NOPR LSFT(KC_9) // ) +#define NOAL KC_NUBS // < +#define NOAR LSFT(KC_NUBS) // > +#define NOBL RALT(KC_8) // [ +#define NOBR RALT(KC_9) // ] // increase readability - #define XXXX KC_TRNS - #define DEAD KC_NO - #define SCAN KC_TRNS // Scandinavian keys, the Row 5 key 5 is actually Row 1 key 15 on the PCB +#define XXXX KC_TRNS +#define DEAD KC_NO +#define SCAN KC_TRNS // Scandinavian keys, the Row 5 key 5 is actually Row 1 key 15 on the PCB [ norm ] = KEYMAP( // Normal scandinavian mapping (danish has QUOT and SCLN wapped) GRAV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, MINS, EQUL, BSPC, DELE,\ @@ -143,40 +143,45 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function - static uint16_t key_timer; + static uint16_t key_timer; + bool checkTime(){ + return (timer_elapsed(key_timer) < 150) ? true : false; + } + + switch(id) { case 0: //MAC0 - Hold for lshift and { on tap if (record->event.pressed) { key_timer = timer_read(); return MACRO(D(LSFT), END ); } else { - return (timer_elapsed(key_timer) < 150) ? MACRO(U(LSFT),D(RALT),T(7),U(RALT),END): MACRO(U(LSFT),END); + return checktime() ? MACRO(U(LSFT),D(RALT),T(7),U(RALT),END): MACRO(U(LSFT),END); }; break; case 1: //MAC1 - Hold for rshift and } on tap if (record->event.pressed) { key_timer = timer_read(); return MACRO(D(RSFT), END ); } else { - return (timer_elapsed(key_timer) < 150) ? MACRO(U(RSFT),D(RALT),T(0),U(RALT),END): MACRO(U(RSFT),END); + return checktime() ? MACRO(U(RSFT),D(RALT),T(0),U(RALT),END): MACRO(U(RSFT),END); }; break; case 2: //MAC2 - Hold for lctrl and [ on tap if (record->event.pressed) { key_timer = timer_read(); return MACRO(D(LCTL), END ); - } else {return (timer_elapsed(key_timer) < 150) ? MACRO(U(LCTL),D(RALT),T(8),U(RALT),END):MACRO(U(LCTL),END); + } else {return checktime() ? MACRO(U(LCTL),D(RALT),T(8),U(RALT),END):MACRO(U(LCTL),END); }; break; case 3: //MAC3 - Hold for rctrl and ] on tap if (record->event.pressed) { key_timer = timer_read(); return MACRO(D(RCTL), END ); } else { - return (timer_elapsed(key_timer) < 150) ? MACRO(U(RCTL),D(RALT),T(9),U(RALT),END):MACRO(U(RCTL),END); + return checktime() ? MACRO(U(RCTL),D(RALT),T(9),U(RALT),END):MACRO(U(RCTL),END); }; break; - case 4: //MAC4 + case 4: //MAC4 reserved for later. if (record->event.pressed) { } else { }; break; - case 5: //MAC5 + case 5: //MAC5 reserved for later. if (record->event.pressed) { } else { }; break; - case 6: //MAC6 + case 6: //MAC6 reserved for later. if (record->event.pressed) { } else { }; break; } return MACRO_NONE; }; From 7042af702057d4d129f1517712fab7f28e75b2f3 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Tue, 7 Mar 2017 23:06:41 -0500 Subject: [PATCH 050/181] Add Makefile --- keyboards/handwired/magicforce68/Makefile | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 keyboards/handwired/magicforce68/Makefile diff --git a/keyboards/handwired/magicforce68/Makefile b/keyboards/handwired/magicforce68/Makefile new file mode 100644 index 0000000000..191c6bb664 --- /dev/null +++ b/keyboards/handwired/magicforce68/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif \ No newline at end of file From 3d082382b20ab338bb7f41b33329daffc994169a Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Tue, 7 Mar 2017 23:08:44 -0500 Subject: [PATCH 051/181] Fix function layer actions --- .../handwired/magicforce68/keymaps/default/keymap.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/keyboards/handwired/magicforce68/keymaps/default/keymap.c b/keyboards/handwired/magicforce68/keymaps/default/keymap.c index 628249c2d8..22553f714c 100644 --- a/keyboards/handwired/magicforce68/keymaps/default/keymap.c +++ b/keyboards/handwired/magicforce68/keymaps/default/keymap.c @@ -4,6 +4,8 @@ #define _FN1 1 #define _FN2 2 #define KC_ KC_TRNS +#define KC_X0 LT(_FN2, KC_GRV) +#define KC_X1 MO(_FN1) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = KEYMAP( @@ -12,11 +14,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /*|----`----`----`----`----`----`----`----`----`----`----`----`----`--------| |----`----| */ TAB , Q , W , E , R , T , Y , U , I , O , P ,LBRC,RBRC, BSLS , DEL ,PGDN, /*|------`----`----`----`----`----`----`----`----`----`----`----`----`------| `----`----' */ - FN0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, ENTER , + X0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, ENTER , /*|-------`----`----`----`----`----`----`----`----`----`----`----`----------| ,----. */ LSFT , Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, RSFT , UP , /*|---------`----`----`----`----`----`----`----`----`----`----`-------------.--|----|----. */ - LCTL ,LGUI ,LALT , SPACE , FN1 ,RALT ,RCTL , LEFT,DOWN,RGHT + LCTL ,LGUI ,LALT , SPACE , X1 ,RALT ,RCTL , LEFT,DOWN,RGHT /*`-----+-----+-----+------------------------------+------+-----+-----' `----+----+----' */ ), @@ -49,13 +51,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ) }; -const uint16_t PROGMEM fn_actions[] = { - [0] = LT(KC_FN2, KC_GRV), - [1] = MO(_FN1), - [2] = MO(_FN2), -}; - - const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function From 01980c96e9c1e8ab5aad0e89d03c0e15417712c8 Mon Sep 17 00:00:00 2001 From: milestogo Date: Wed, 8 Mar 2017 01:06:25 -0800 Subject: [PATCH 052/181] added browser babble, removed code from keymap --- .../handwired/MS-sculpt-mobile/babblePaste.c | 408 +++++++++++------- .../handwired/MS-sculpt-mobile/babblePaste.h | 151 ++++++- .../keymaps/milestogo/config.h | 13 +- .../keymaps/milestogo/keymap.c | 78 ++-- 4 files changed, 438 insertions(+), 212 deletions(-) diff --git a/keyboards/handwired/MS-sculpt-mobile/babblePaste.c b/keyboards/handwired/MS-sculpt-mobile/babblePaste.c index 93ff486e0d..491a79333e 100644 --- a/keyboards/handwired/MS-sculpt-mobile/babblePaste.c +++ b/keyboards/handwired/MS-sculpt-mobile/babblePaste.c @@ -15,6 +15,13 @@ and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jee // GLOBAL variable to determine mode. Sets startup default if no eeppom uint8_t babble_mode =0 ; +// small function that we might also want to call from a keymap. + +macro_t* switch_babble_mode( uint8_t id) { + babble_mode= id; + return MACRO_NONE; //less typing above +} + // Today I learned that the preprocessor can not create a switch statement label from an argument // And else statements have problems, see https://gcc.gnu.org/onlinedocs/gcc-3.0.1/cpp_3.html#SEC15 @@ -23,63 +30,80 @@ uint8_t babble_mode =0 ; { action_macro_play( MACRO(macro)); return MACRO_NONE; } -const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { /* this function runs the appropriate babblepaste macro, given the global babble_mode, and a shortcut from the ENUM in babblePaste.h TODO, the pointers in this function should be stored in a PROGMEM array, not ram. But that requires even more clever preprocessor foo. */ - +const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { +/* if ( shortcut < BABL_START_NUM || \ shortcut >= (BABL_START_NUM + BABL_NUM_MACROS ) ) { return MACRO_NONE; } - - +*/ switch(babble_mode) { - -#ifdef MS_MODE + + +#ifdef MS_MODE + if ( BABL_WINDOWS == shortcut ) { return switch_babble_mode(MS_MODE); } + case MS_MODE: - BABLM( BABL_DEL_RIGHT_1C, T(DEL), END ); - BABLM( BABL_DEL_LEFT_WORD, D(LCTRL), T(BSPACE), U(LCTRL), END ); - BABLM( BABL_DEL_RIGHT_WORD,D(LCTRL), T(DEL), U(LCTRL), END ); BABLM( BABL_GO_LEFT_1C, T(LEFT), END ); BABLM( BABL_GO_RIGHT_1C , T(RIGHT), END ); - BABLM( BABL_GO_LEFT_WORD, D(LCTRL), T(LEFT), U(LCTRL), END ); - BABLM( BABL_GO_RIGHT_WORD, D(LCTRL), T(RIGHT), U(LCTRL), END ); + BABLM( BABL_GO_LEFT_WORD, D(LCTL), T(LEFT), U(LCTL), END ); + BABLM( BABL_GO_RIGHT_WORD, D(LCTL), T(RIGHT), U(LCTL), END ); BABLM( BABL_GO_START_LINE, T(HOME), END ); - BABLM( BABL_GO_START_DOC, D(LCTRL),T(HOME), U(LCTRL),END ); BABLM( BABL_GO_END_LINE, T(END), END ); - BABLM( BABL_GO_END_DOC, D(LCTRL),T(END), U(LCTRL),END ); + BABLM( BABL_GO_START_DOC, D(LCTL),T(HOME), U(LCTL),END ); + BABLM( BABL_GO_END_DOC, D(LCTL),T(END), U(LCTL),END ); BABLM( BABL_GO_NEXT_LINE, T(DOWN), END ); BABLM( BABL_GO_PREV_LINE, T(UP), END ); BABLM( BABL_PGDN, T(PGDN), END ); BABLM( BABL_PGUP, T(PGUP), END ); + BABLM( BABL_DEL_RIGHT_1C, T(DEL), END ); + BABLM( BABL_DEL_LEFT_WORD, D(LCTL), T(BSPACE), U(LCTL), END ); + BABLM( BABL_DEL_RIGHT_WORD, D(LCTL), T(DEL), U(LCTL), END ); + BABLM( BABL_DEL_TO_LINE_END, D(RSFT), T(HOME), U(RSFT), T(DEL), END); + BABLM( BABL_DEL_TO_LINE_START, D(RSFT), T(END), U(RSFT), T(DEL), END ); #ifndef BABL_MOVEMENTONLY - BABLM( BABL_UNDO, D(LCTRL), T(Z), U(LCTRL), END ); - BABLM( BABL_REDO, D(LCTRL), T(Y), U(LCTRL), END ); - BABLM( BABL_CUT, D(LCTRL), T(X), U(LCTRL), END ); - BABLM( BABL_COPY, D(LCTRL), T(C), U(LCTRL), END ); - BABLM( BABL_PASTE, D(LCTRL), T(V), U(LCTRL), END ); - BABLM( BABL_SELECT_ALL, D(LCTRL), T(A), U(LCTRL), END ); - BABLM( BABL_UNDO, D(LCTRL), T(Z), U(LCTRL), END ); - BABLM( BABL_REDO, D(LCTRL), T(Y), U(LCTRL), END ); - BABLM( BABL_CUT, D(LCTRL), T(X), U(LCTRL), END ); - BABLM( BABL_COPY, D(LCTRL), T(C), U(LCTRL), END ); - BABLM( BABL_PASTE, D(LCTRL), T(V), U(LCTRL), END ); - BABLM( BABL_SELECT_ALL, D(LCTRL), T(A), U(LCTRL), END ); - BABLM( BABL_FIND, D(LCTRL),T(F), U(LCTRL),END ); + BABLM( BABL_UNDO, D(LCTL), T(Z), U(LCTL), END ); + BABLM( BABL_REDO, D(LCTL), T(Y), U(LCTL), END ); + BABLM( BABL_CUT, D(LCTL), T(X), U(LCTL), END ); + BABLM( BABL_COPY, D(LCTL), T(C), U(LCTL), END ); + BABLM( BABL_PASTE, D(LCTL), T(V), U(LCTL), END ); + BABLM( BABL_SELECT_ALL, D(LCTL), T(A), U(LCTL), END ); + BABLM( BABL_FIND, D(LCTL),T(F), U(LCTL),END ); BABLM( BABL_FIND_NEXT, T(F3),END ); - BABLM( BABL_FIND_REPLACE, D(LCTRL),T(H), U(LCTRL),END ); + BABLM( BABL_FIND_REPLACE, D(LCTL),T(H), U(LCTL),END ); BABLM( BABL_RUNAPP, D(LGUI),T(R), U(LGUI),END ); BABLM( BABL_SWITCH_APP_NEXT, D(LALT),T(TAB), U(LALT),END ); BABLM( BABL_SWITCH_APP_LAST, D(LSFT),D(LALT),T(TAB), U(LALT), U(LSFT),END ); BABLM( BABL_CLOSE_APP, D(LALT),T(F4), U(LALT),END ); BABLM( BABL_HELP, T(F1),END ); +#ifndef BABL_NOBROWSER + BABLM( BABL_BROWSER_NEW_TAB, D(LCTL), T(T), U(LCTL),END ); + BABLM( BABL_BROWSER_CLOSE_TAB, D(LCTL), T(W), U(LCTL),END ); + BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LCTL), D(RSFT),T(T), U(RSFT),U(LCTL),END ); + BABLM( BABL_BROWSER_NEXT_TAB, D(LCTL), T(TAB), U(LCTL),END ); + BABLM( BABL_BROWSER_PREV_TAB, D(LCTL), D(RSFT), T(TAB), U(RSFT), U(LCTL),END ); + BABLM( BABL_BROWSER_URL_BAR, D(LCTL), T(L), U(LCTL),END ); + BABLM( BABL_BROWSER_FORWARD, D(LALT), T(RIGHT), U(LALT),END ); + BABLM( BABL_BROWSER_BACK, D(LALT), T(LEFT), U(LALT),END ); + BABLM( BABL_BROWSER_FIND, D(LCTL), T(F), U(LCTL),END ); + BABLM( BABL_BROWSER_BOOKMARK, D(LCTL), T(D), U(LCTL),END ); + //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LCTL),END ); // EDGE + BABLM( BABL_BROWSER_DEV_TOOLS, D(LCTL), T(T), U(LCTL),END ); // Chrome + // Chrome + BABLM( BABL_BROWSER_RELOAD, D(LCTL), T(F5), U(LCTL),END ); // hard reload w/o cache + BABLM( BABL_BROWSER_FULLSCREEN, T(F11),END ); //command shift F + BABLM( BABL_BROWSER_ZOOM_IN, D(LCTL), D(RSFT), T(EQL), U(RSFT), U(LCTL),END ); // ctr+ + + BABLM( BABL_BROWSER_ZOOM_OUT, D(LCTL), T(MINS), U(LCTL),END ); +#endif #endif - + // Todo, ring bell, flash light, show user this isn't supported return MACRO_NONE; @@ -87,62 +111,87 @@ But that requires even more clever preprocessor foo. #ifdef LINUX_MODE + if ( BABL_LINUX == shortcut ) { return switch_babble_mode(LINUX_MODE); } + case LINUX_MODE: - - BABLM( BABL_DEL_RIGHT_1C , D(DEL), END ); - BABLM( BABL_DEL_LEFT_WORD , D(LCTRL), T(BSPACE), U(LCTRL), END ); - BABLM( BABL_DEL_RIGHT_WORD , D(LCTRL), T(DEL), U(LCTRL), END ); BABLM( BABL_GO_LEFT_1C , T(LEFT), END ); BABLM( BABL_GO_RIGHT_1C , T(RIGHT), END ); - BABLM( BABL_GO_LEFT_WORD , D(LCTRL), T(LEFT), U(LCTRL), END ); - BABLM( BABL_GO_RIGHT_WORD , D(LCTRL), T(RIGHT), U(LCTRL), END ); + BABLM( BABL_GO_LEFT_WORD , D(LCTL), T(LEFT), U(LCTL), END ); + BABLM( BABL_GO_RIGHT_WORD , D(LCTL), T(RIGHT), U(LCTL), END ); BABLM( BABL_GO_START_LINE , T(HOME), END ); - BABLM( BABL_GO_START_DOC , D(LCTRL),T(HOME), U(LCTRL),END ); BABLM( BABL_GO_END_LINE , T(END), END ); - BABLM( BABL_GO_END_DOC , D(LCTRL),T(END), U(LCTRL),END ); + BABLM( BABL_GO_START_DOC , D(LCTL),T(HOME), U(LCTL),END ); + BABLM( BABL_GO_END_DOC , D(LCTL),T(END), U(LCTL),END ); BABLM( BABL_GO_NEXT_LINE , T(DOWN), END ); BABLM( BABL_GO_PREV_LINE , T(UP), END ); BABLM( BABL_PGDN , T(PGDN), END ); BABLM( BABL_PGUP , T(PGUP), END ); + BABLM( BABL_DEL_RIGHT_1C , D(DEL), END ); + BABLM( BABL_DEL_LEFT_WORD , D(LCTL), T(BSPACE), U(LCTL), END ); + BABLM( BABL_DEL_RIGHT_WORD , D(LCTL), T(DEL), U(LCTL), END ); + BABLM( BABL_DEL_TO_LINE_END, D(RSFT), T(HOME), U(RSFT), T(DEL), END); + BABLM( BABL_DEL_TO_LINE_START, D(RSFT), T(END), U(RSFT), T(DEL), END ); #ifndef BABL_MOVEMENTONLY - BABLM( BABL_UNDO , D(LCTRL), T(Z), U(LCTRL), END ); - BABLM( BABL_REDO , D(LCTRL), T(Y), U(LCTRL), END ); - BABLM( BABL_CUT , D(LCTRL), T(X), U(LCTRL), END ); - BABLM( BABL_COPY , D(LCTRL), T(C), U(LCTRL), END ); - BABLM( BABL_PASTE , D(LCTRL), T(V), U(LCTRL), END ); - BABLM( BABL_SELECT_ALL, D(LCTRL), T(A), U(LCTRL), END ); - BABLM( BABL_FIND, D(LCTRL),T(F), U(LCTRL),END ); + BABLM( BABL_UNDO , D(LCTL), T(Z), U(LCTL), END ); + BABLM( BABL_REDO , D(LCTL), T(Y), U(LCTL), END ); + BABLM( BABL_CUT , D(LCTL), T(X), U(LCTL), END ); + BABLM( BABL_COPY , D(LCTL), T(C), U(LCTL), END ); + BABLM( BABL_PASTE , D(LCTL), T(V), U(LCTL), END ); + BABLM( BABL_SELECT_ALL, D(LCTL), T(A), U(LCTL), END ); + BABLM( BABL_FIND, D(LCTL),T(F), U(LCTL),END ); /* BABLM(BABL_FIND_NEXT , T(F3),END ); KDE */ - BABLM( BABL_FIND_NEXT, D(LCTRL),T(G), U(LCTRL),END ); // Gnome*/ - /* BABLM( , D(LCTRL),T(R), U(LCTRL),END ); KDE */ - BABLM( BABL_FIND_REPLACE, D(LCTRL),T(H), U(LCTRL),END ); // Gnome*/ + BABLM( BABL_FIND_NEXT, D(LCTL),T(G), U(LCTL),END ); // Gnome*/ + /* BABLM( , D(LCTL),T(R), U(LCTL),END ); KDE */ + BABLM( BABL_FIND_REPLACE, D(LCTL),T(H), U(LCTL),END ); // Gnome*/ BABLM( BABL_RUNAPP, D(LALT),T(F2), U(LALT),END ); BABLM( BABL_SWITCH_APP_NEXT, D(LCTL),T(TAB), U(LCTL),END ); BABLM( BABL_SWITCH_APP_LAST, D(LSFT),D(LCTL),T(TAB), U(LCTL), U(LSFT),END ); BABLM( BABL_CLOSE_APP, D(LALT),T(F4), U(LALT),END ); - BABLM( BABL_HELP, END ); + //BABLM( BABL_HELP, END ); + +#ifndef BABL_NOBROWSER + BABLM( BABL_BROWSER_NEW_TAB, D(LCTL), T(T), U(LCTL),END ); + BABLM( BABL_BROWSER_CLOSE_TAB, D(LCTL), T(W), U(LCTL),END ); + BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LCTL), D(RSFT),T(T), U(RSFT),U(LCTL),END ); + BABLM( BABL_BROWSER_NEXT_TAB, D(LCTL), T(TAB), U(LCTL),END ); + BABLM( BABL_BROWSER_PREV_TAB, D(LCTL), D(RSFT), T(TAB), U(RSFT), U(LCTL),END ); + BABLM( BABL_BROWSER_URL_BAR, D(LCTL), T(L), U(LCTL),END ); + BABLM( BABL_BROWSER_FORWARD, D(LALT), T(RIGHT), U(LALT),END ); + BABLM( BABL_BROWSER_BACK, D(LALT), T(LEFT), U(LALT),END ); + BABLM( BABL_BROWSER_FIND, D(LCTL), T(F), U(LCTL),END ); + BABLM( BABL_BROWSER_BOOKMARK, D(LCTL), T(D), U(LCTL),END ); + BABLM( BABL_BROWSER_DEV_TOOLS, D(LCTL), T(T), U(LCTL),END ); // Chrome + BABLM( BABL_BROWSER_RELOAD, D(LCTL), T(F5), U(LCTL),END ); // hard reload w/o cache + BABLM( BABL_BROWSER_FULLSCREEN, T(F11),END ); //command shift F + BABLM( BABL_BROWSER_ZOOM_IN, D(LCTL), T(PLUS), U(LCTL),END ); + BABLM( BABL_BROWSER_ZOOM_OUT, D(LCTL), T(MINS), U(LCTL),END ); +#endif #endif return MACRO_NONE; #endif #ifdef MAC_MODE + if ( BABL_MAC == shortcut) { return switch_babble_mode(MAC_MODE); } + case MAC_MODE: - BABLM( BABL_DEL_RIGHT_1C , D(DEL), END ); - BABLM( BABL_DEL_LEFT_WORD , D(LALT), T(BSPACE), U(LALT), END ); - BABLM( BABL_DEL_RIGHT_WORD, D(LALT), T(DEL), U(LALT), END ); BABLM( BABL_GO_LEFT_1C , T(LEFT), END ); BABLM( BABL_GO_RIGHT_1C, T(RIGHT), END ); BABLM( BABL_GO_LEFT_WORD , D(LALT), T(LEFT), U(LALT), END ); BABLM( BABL_GO_RIGHT_WORD , D(LALT), T(RIGHT), U(LALT), END ); BABLM( BABL_GO_START_LINE , D(LGUI), T(LEFT), U(LGUI), END ); - BABLM( BABL_GO_START_DOC , D(LGUI),T(UP), U(LGUI),END ); BABLM( BABL_GO_END_LINE , D(LGUI), T(RIGHT), U(LGUI), END ); + BABLM( BABL_GO_START_DOC , D(LGUI),T(UP), U(LGUI),END ); BABLM( BABL_GO_END_DOC , D(LGUI),T(DOWN), U(LGUI),END ); BABLM( BABL_GO_NEXT_LINE , T(DOWN), END ); BABLM( BABL_GO_PREV_LINE , T(UP), END ); BABLM( BABL_PGDN , D(LALT),T(DOWN), U(LALT), END ); BABLM( BABL_PGUP , D(LALT),T(UP), U(LALT), END ); + BABLM( BABL_DEL_RIGHT_1C , D(DEL), END ); + BABLM( BABL_DEL_LEFT_WORD , D(LALT), T(BSPACE), U(LALT), END ); + BABLM( BABL_DEL_RIGHT_WORD, D(LALT), T(DEL), U(LALT), END ); + BABLM( BABL_DEL_TO_LINE_END, D(LCTL), T(K), U(LCTL), END );// there must be another way + BABLM( BABL_DEL_TO_LINE_START, D(LGUI), T(BSPACE), U(LGUI), END ); #ifndef BABL_MOVEMENTONLY BABLM( BABL_UNDO , D(1), D(LGUI), T(Z), U(LGUI), END ); BABLM( BABL_REDO , D(LSFT),D(LGUI), T(Z), U(LSFT),U(LGUI), END ); @@ -158,75 +207,92 @@ But that requires even more clever preprocessor foo. BABLM( BABL_SWITCH_APP_LAST , D(LSFT),D(LGUI),T(TAB), U(LGUI), U(LSFT),END ); BABLM( BABL_CLOSE_APP , D(LGUI),T(Q), U(LGUI),END ); BABLM( BABL_HELP , D(LSFT),D(LGUI),T(SLASH), U(LGUI), U(LSFT),END ); + +#ifndef BABL_NOBROWSER + BABLM( BABL_BROWSER_NEW_TAB, D(LGUI), T(T), U(LGUI),END ); + BABLM( BABL_BROWSER_CLOSE_TAB, D(LGUI), T(W), U(LGUI),END ); + BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LGUI), D(RSFT),T(T), U(RSFT),U(LGUI),END ); + BABLM( BABL_BROWSER_NEXT_TAB, D(LGUI),D(LALT), T(RIGHT),U(LALT), U(LGUI),END ); + BABLM( BABL_BROWSER_PREV_TAB, D(LGUI), D(RSFT), T(LEFT), U(RSFT), U(LGUI),END ); + BABLM( BABL_BROWSER_URL_BAR, D(LGUI), T(L), U(LGUI),END ); + BABLM( BABL_BROWSER_FORWARD, D(LGUI), T(RIGHT), U(LGUI),END ); + BABLM( BABL_BROWSER_BACK, D(LGUI), T(LEFT), U(LGUI),END ); + BABLM( BABL_BROWSER_FIND, D(LGUI), T(F), U(LGUI),END ); + BABLM( BABL_BROWSER_BOOKMARK, D(LGUI), T(D), U(LGUI),END ); + //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE + BABLM( BABL_BROWSER_DEV_TOOLS, D(LGUI), D(LALT), T(I), U(LALT),U(LGUI),END ); // Chrome + // Chrome + BABLM( BABL_BROWSER_RELOAD, D(LGUI), T(R), U(LGUI),END ); // add shift for reload w/o cache + BABLM( BABL_BROWSER_FULLSCREEN, D(LGUI), D(LCTL), T(P), U(LCTL), U(LGUI),END ); //command shift F + BABLM( BABL_BROWSER_ZOOM_IN, D(LGUI), D(RSFT), T(EQL), U(RSFT), U(LGUI),END ); // ctr+ + + BABLM( BABL_BROWSER_ZOOM_OUT, D(LGUI), T(MINS), U(LGUI),END ); +#endif #endif return MACRO_NONE; #endif #ifdef EMACS_MODE + + if ( BABL_EMACS == shortcut ) { return switch_babble_mode(EMACS_MODE); } + case EMACS_MODE: switch(shortcut) { //probably should allow meta to not be ALT - - case BABL_DEL_RIGHT_1C: - BABLM( , D(LCTL), T(D), U(LCTL),END ); - case BABL_DEL_LEFT_WORD: - BABLM( , D(LCTL), T(BSPACE), U(LCTL), END ); - case BABL_DEL_RIGHT_WORD: - BABLM( , D(LALT), T(D), U(LALT), END ); - case BABL_GO_LEFT_1C: - BABLM( , T(LEFT), END ); - case BABL_GO_RIGHT_1C: - BABLM( , T(RIGHT), END ); - case BABL_GO_LEFT_WORD: - BABLM( , D(LALT), T(B), U(LALT), END ); - case BABL_GO_RIGHT_WORD: - BABLM( , D(LALT), T(F), U(LALT), END ); - case BABL_GO_START_LINE: - BABLM( , D(LCTRL), T(A), U(LCTRL), END ); - case BABL_GO_START_DOC: - BABLM( , D(LALT), D(LSFT), T(COMM),U(LSFT), U(LALT) ,END ); - case BABL_GO_END_LINE: - BABLM( , D(LCTRL), T(E), U(LCTRL), END ); - case BABL_GO_END_DOC: - BABLM( , D(LALT), D(LSFT), T(DOT),U(LSFT), U(LALT) ,END ); - case BABL_GO_NEXT_LINE: - BABLM( , D(LCTRL), T(N), U(LCTRL), END ); - case BABL_GO_PREV_LINE: - BABLM( , D(LCTRL), T(P), U(LCTRL), END ); - case BABL_PGDN: - BABLM( ,D(LCTRL), T(V), U(LCTRL), END ); - case BABL_PGUP: - BABLM( , D(LALT), T(V), U(LALT), END ); + + BABLM( BABL_GO_LEFT_1C, T(LEFT), END ); + BABLM( BABL_GO_RIGHT_1C, T(RIGHT), END ); + BABLM( BABL_GO_LEFT_WORD, D(LALT), T(B), U(LALT), END ); + BABLM( BABL_GO_RIGHT_WORD , D(LALT), T(F), U(LALT), END ); + BABLM( BABL_GO_START_LINE , D(LCTL), T(A), U(LCTL), END ); + BABLM( BABL_GO_END_LINE , D(LCTL), T(E), U(LCTL), END ); + BABLM( BABL_GO_START_DOC , D(LALT), D(LSFT), T(COMM),U(LSFT), U(LALT) ,END ); + BABLM( BABL_GO_END_DOC , D(LALT), D(LSFT), T(DOT), U(LSFT), U(LALT) ,END ); + BABLM( BABL_GO_NEXT_LINE , D(LCTL), T(N), U(LCTL), END ); + BABLM( BABL_GO_PREV_LINE , D(LCTL), T(P), U(LCTL), END ); + BABLM( BABL_PGDN , D(LCTL), T(V), U(LCTL), END ); + BABLM( BABL_PGUP , D(LALT), T(V), U(LALT), END ); + BABLM( BABL_DEL_RIGHT_1C, D(LCTL), T(D), U(LCTL),END ); + BABLM( BABL_DEL_LEFT_WORD , D(LCTL), T(BSPACE), U(LCTL), END ); + BABLM( BABL_DEL_RIGHT_WORD , D(LALT), T(D), U(LALT), END ); + BABLM( BABL_DEL_TO_LINE_END, D(LCTL), T(K), U(LCTL), END ); + BABLM( BABL_DEL_TO_LINE_START, T(ESC), T(0), D(LCTL), T(K), U(LCTL), END ); #ifndef BABL_MOVEMENTONLY - case BABL_UNDO: - BABLM( , D(LCTL), T(X), U(LCTL),T(C), END ); - case BABL_REDO: - BABLM( , D(LCTL), T(X), U(LCTL),T(C), END ); // arguably - case BABL_CUT: - BABLM( , D(LCTL), T(W), U(LCTL), END ); - case BABL_COPY: - BABLM( , D(LALT), T(W), U(LALT), END ); //really? - case BABL_PASTE: - BABLM( , D(LCTL), T(Y), U(LCTL), END ); - case BABL_SELECT_ALL: - BABLM( ,D(LCTL), T(X), U(LCTL),T(H), END ); - case BABL_FIND: - BABLM( , D(LCTRL), T(S), U(LCTRL),END ); - case BABL_FIND_NEXT: - BABLM( , D(LCTRL), T(S), U(LCTRL),END ); - case BABL_FIND_REPLACE: - BABLM( , D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END ); - case BABL_RUNAPP: - BABLM( , D(LALT), T(X), U(LALT),T(S),T(H),T(E),T(L),T(L),END );// arguably - case BABL_SWITCH_APP_NEXT: - BABLM( , D(LCTL), T(X), U(LCTL),T(RIGHT), END ); // arguably - case BABL_SWITCH_APP_LAST: - BABLM( , D(LCTL), T(X), U(LCTL),T(LEFT), END ); // arguably - case BABL_CLOSE_APP: - BABLM( ,D(LCTL), T(X), U(LCTL),T(C),END ); - case BABL_HELP: - BABLM( , D(LCTL),T(H), U(LCTL),T(A),END); // start search in help + BABLM( BABL_UNDO , D(LCTL), T(X), U(LCTL),T(C), END ); + BABLM( BABL_REDO , D(LCTL), T(X), U(LCTL),T(C), END ); // arguably + BABLM( BABL_CUT , D(LCTL), T(W), U(LCTL), END ); + BABLM( BABL_COPY , D(LALT), T(W), U(LALT), END ); //really? + BABLM( BABL_PASTE , D(LCTL), T(Y), U(LCTL), END ); + BABLM( BABL_SELECT_ALL ,D(LCTL), T(X), U(LCTL),T(H), END ); + BABLM( BABL_FIND , D(LCTL), T(S), U(LCTL),END ); + BABLM( BABL_FIND_NEXT , D(LCTL), T(S), U(LCTL),END ); + BABLM( BABL_FIND_REPLACE , D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END ); + BABLM( BABL_RUNAPP , D(LALT), T(X), U(LALT),T(S),T(H),T(E),T(L),T(L),END );// arguably + BABLM( BABL_SWITCH_APP_NEXT , D(LCTL), T(X), U(LCTL),T(RIGHT), END ); // arguably + BABLM( BABL_SWITCH_APP_LAST , D(LCTL), T(X), U(LCTL),T(LEFT), END ); // arguably + BABLM( BABL_CLOSE_APP , D(LCTL), T(X), U(LCTL),T(C),END ); + BABLM( BABL_HELP , D(LCTL),T(H), U(LCTL),T(A),END); // start search in help +#ifndef BABL_NOBROWSER +/* you get to figure w3 out + BABLM( BABL_BROWSER_NEW_TAB, D(LGUI), T(T), U(LGUI),END ); + BABLM( BABL_BROWSER_CLOSE_TAB, D(LGUI), T(W), U(LGUI),END ); + BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LGUI), D(RSFT),T(T), U(RSFT),U(LGUI),END ); + BABLM( BABL_BROWSER_NEXT_TAB, D(LGUI),D(LALT), T(RIGHT),U(LALT), U(LGUI),END ); + BABLM( BABL_BROWSER_PREV_TAB, D(LGUI), D(RSFT), T(LEFT), U(RSFT), U(LGUI),END ); + BABLM( BABL_BROWSER_URL_BAR, D(LGUI), T(L), U(LGUI),END ); + BABLM( BABL_BROWSER_FORWARD, D(LGUI), T(RIGHT), U(LGUI),END ); + BABLM( BABL_BROWSER_BACK, D(LGUI), T(LEFT), U(LGUI),END ); + BABLM( BABL_BROWSER_FIND, D(LGUI), T(F), U(LGUI),END ); + BABLM( BABL_BROWSER_BOOKMARK, D(LGUI), T(D), U(LGUI),END ); + //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE + BABLM( BABL_BROWSER_DEV_TOOLS, D(LGUI), D(LALT), T(I), U(LALT),U(LGUI),END ); // Chrome + // Chrome + BABLM( BABL_BROWSER_RELOAD, D(LGUI), T(R), U(LGUI),END ); // add shift for reload w/o cache + BABLM( BABL_BROWSER_FULLSCREEN, D(LGUI), D(LCTL), T(P), U(LCTL), U(LGUI),END ); //command shift F + BABLM( BABL_BROWSER_ZOOM_IN, D(LGUI), D(RSFT), T(EQL), U(RSFT), U(LGUI),END ); // ctr+ + + BABLM( BABL_BROWSER_ZOOM_OUT, D(LGUI), T(MINS), U(LGUI),END ); +*/ +#endif #endif break; @@ -234,25 +300,31 @@ But that requires even more clever preprocessor foo. } #endif + + #ifdef VI_MODE + if ( BABL_VI == shortcut ) { return switch_babble_mode(VI_MODE); } case VI_MODE: -//assume esc is already called +// you have to track the modes yourself. Otherwise motion is awful (bell, bell, bell) + - BABLM( BABL_DEL_RIGHT_1C , T(X),END ); - BABLM( BABL_DEL_LEFT_WORD , T(D),T(G),T(E),END ); - BABLM( BABL_DEL_RIGHT_WORD , T(D),T(W),END ); BABLM( BABL_GO_LEFT_1C , T(H), END ); BABLM( BABL_GO_RIGHT_1C , T(L), END ); BABLM( BABL_GO_LEFT_WORD , T(B),END ); BABLM( BABL_GO_RIGHT_WORD , T(W), END ); BABLM( BABL_GO_START_LINE , D(LSFT), T(6),U(LSFT), END ); //^ - BABLM( BABL_GO_START_DOC , T(G),T(G) ,END ); BABLM( BABL_GO_END_LINE , D(LSFT), T(4),U(LSFT) , END ); //$ + BABLM( BABL_GO_START_DOC , T(G),T(G) ,END ); BABLM( BABL_GO_END_DOC , D(LSFT), T(G),U(LSFT),END ); BABLM( BABL_GO_NEXT_LINE , T(J), END ); BABLM( BABL_GO_PREV_LINE, T(K), END ); - BABLM( BABL_PGDN ,D(LCTRL), T(F), U(LCTRL), END ); - BABLM( BABL_PGUP , D(LCTRL), T(B), U(LCTRL), END ); + BABLM( BABL_PGDN ,D(LCTL), T(F), U(LCTL), END ); + BABLM( BABL_PGUP , D(LCTL), T(B), U(LCTL), END ); + BABLM( BABL_DEL_RIGHT_1C , T(X),END ); + BABLM( BABL_DEL_LEFT_WORD , T(D),T(G),T(E),END ); + BABLM( BABL_DEL_RIGHT_WORD , T(D),T(W),END ); + BABLM( BABL_DEL_TO_LINE_END, T(D),D(LSFT), T(4),U(LSFT) ,END ); // d$ + BABLM( BABL_DEL_TO_LINE_START, T(D),D(LSFT), T(6),U(LSFT) ,END ); #ifndef BABL_MOVEMENTONLY BABLM( BABL_UNDO , T(U), END ); BABLM( BABL_REDO , D(LCTL), T(R), U(LCTL), END ); @@ -268,6 +340,27 @@ But that requires even more clever preprocessor foo. BABLM( BABL_SWITCH_APP_LAST ,END ); BABLM(BABL_CLOSE_APP, D(LSFT), T(SCLN),U(LSFT), T(Q), D(RSFT), T(1),U(RSFT), END ); BABLM(BABL_HELP, D(LSFT), T(SCLN),U(LSFT),T(H),END); // start search in help +#ifndef BABL_NOBROWSER +/* you get to figure this out + BABLM( BABL_BROWSER_NEW_TAB, D(LGUI), T(T), U(LGUI),END ); + BABLM( BABL_BROWSER_CLOSE_TAB, D(LGUI), T(W), U(LGUI),END ); + BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LGUI), D(RSFT),T(T), U(RSFT),U(LGUI),END ); + BABLM( BABL_BROWSER_NEXT_TAB, D(LGUI),D(LALT), T(RIGHT),U(LALT), U(LGUI),END ); + BABLM( BABL_BROWSER_PREV_TAB, D(LGUI), D(RSFT), T(LEFT), U(RSFT), U(LGUI),END ); + BABLM( BABL_BROWSER_URL_BAR, D(LGUI), T(L), U(LGUI),END ); + BABLM( BABL_BROWSER_FORWARD, D(LGUI), T(RIGHT), U(LGUI),END ); + BABLM( BABL_BROWSER_BACK, D(LGUI), T(LEFT), U(LGUI),END ); + BABLM( BABL_BROWSER_FIND, D(LGUI), T(F), U(LGUI),END ); + BABLM( BABL_BROWSER_BOOKMARK, D(LGUI), T(D), U(LGUI),END ); + //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE + BABLM( BABL_BROWSER_DEV_TOOLS, D(LGUI), D(LALT), T(I), U(LALT),U(LGUI),END ); // Chrome + // Chrome + BABLM( BABL_BROWSER_RELOAD, D(LGUI), T(R), U(LGUI),END ); // add shift for reload w/o cache + BABLM( BABL_BROWSER_FULLSCREEN, D(LGUI), D(LCTL), T(P), U(LCTL), U(LGUI),END ); //command shift F + BABLM( BABL_BROWSER_ZOOM_IN, D(LGUI), T(PLUS), U(LGUI),END ); + BABLM( BABL_BROWSER_ZOOM_OUT, D(LGUI), T(MINS), U(LGUI),END ); +*/ +#endif #endif return MACRO_NONE; #endif @@ -278,37 +371,62 @@ But that requires even more clever preprocessor foo. #ifdef READMUX_MODE // Readline command line editing + tmux windowing // I havent decided how much to do readline and how much tmux + if ( BABL_READLINE == shortcut ) { switch_babble_mode(READMUX_MODE); return MACRO_NONE; } case READMUX_MODE: - BABLM( BABL_DEL_RIGHT_1C , D(LCTL), T(D), U(LCTL),END ); + + BABLM( BABL_GO_LEFT_1C , T(LEFT), END ); + BABLM( BABL_GO_RIGHT_1C , T(RIGHT), END ); + BABLM( BABL_GO_LEFT_WORD , D(LALT), T(B), U(LALT), END ); + BABLM( BABL_GO_RIGHT_WORD , D(LALT), T(F), U(LALT), END ); + BABLM( BABL_GO_START_LINE , D(LCTL), T(A), U(LCTL), END ); + BABLM( BABL_GO_END_LINE , D(LCTL), T(E), U(LCTL), END ); + //BABLM( BABL_GO_START_DOC ,END );// tmux? + //BABLM( BABL_GO_END_DOC ,END ); // tmux? + BABLM( BABL_GO_NEXT_LINE , D(LCTL), T(N), U(LCTL), END ); + BABLM( BABL_GO_PREV_LINE , D(LCTL), T(P), U(LCTL), END ); + BABLM( BABL_PGDN , T(PGDN), END ); + BABLM( BABL_PGUP , T(PGUP), END ); + BABLM( BABL_DEL_RIGHT_1C , D(LCTL), T(D), U(LCTL),END ); BABLM( BABL_DEL_LEFT_WORD , D(LCTL), T(W), U(LCTL), END ); - BABLM( BABL_DEL_RIGHT_WORD , D(LALT), T(D), U(LALT), END ); - BABLM( BABL_GO_LEFT_1C , T(LEFT), END ); - BABLM( BABL_GO_RIGHT_1C , T(RIGHT), END ); - BABLM( BABL_GO_LEFT_WORD , D(LALT), T(B), U(LALT), END ); - BABLM( BABL_GO_RIGHT_WORD , D(LALT), T(F), U(LALT), END ); - BABLM( BABL_GO_START_LINE , D(LCTRL), T(A), U(LCTRL), END ); - BABLM( BABL_GO_START_DOC ,END );// tmux? - BABLM( BABL_GO_END_LINE , D(LCTRL), T(E), U(LCTRL), END ); - BABLM( BABL_GO_END_DOC ,END ); // tmux? - BABLM( BABL_GO_NEXT_LINE , D(LCTRL), T(N), U(LCTRL), END ); - BABLM( BABL_GO_PREV_LINE , D(LCTRL), T(P), U(LCTRL), END ); - BABLM( BABL_PGDN , T(PGDN), END ); - BABLM( BABL_PGUP , T(PGUP), END ); + BABLM( BABL_DEL_RIGHT_WORD , D(LALT), T(D), U(LALT), END ); + BABLM( BABL_DEL_TO_LINE_END, D(LCTL), T(K), U(LCTL), END ); + BABLM( BABL_DEL_TO_LINE_START, D(LCTL), T(U), U(LCTL), END ); #ifndef BABL_MOVEMENTONLY - BABLM( BABL_UNDO , D(LALT), T(R), U(LALT) , END ); - BABLM( BABL_REDO , D(LCTL), T(X), U(LCTL),T(C), END ); // arguably - BABLM( BABL_CUT , D(LCTL), T(K), U(LCTL), END ); // wrong half the time - BABLM( BABL_COPY ,END ); - BABLM( BABL_PASTE , D(LCTL), T(Y), U(LCTL), END ); - BABLM( BABL_SELECT_ALL ,D(LCTL), T(A), T(K), T(Y), U(LCTL) , END ); - BABLM( BABL_FIND , D(LCTRL), T(R), U(LCTRL), END ); // search history - BABLM(BABL_FIND_NEXT, D(LCTRL), T(S), U(LCTRL), END ); - BABLM( BABL_FIND_REPLACE ,END ); - BABLM( BABL_RUNAPP , D(LCTRL), T(B), U(LCTRL), T(C),END ); //tmux - BABLM( BABL_SWITCH_APP_NEXT , D(LCTRL), T(B), U(LCTRL), T(N),END ); //tmux - BABLM( BABL_SWITCH_APP_LAST , D(LCTRL), T(B), U(LCTRL), T(P),END ); //tmux - BABLM( BABL_CLOSE_APP , D(LCTRL), T(B), U(LCTRL), T(D),END); // usually what I want - BABLM( BABL_HELP ,END ); + BABLM( BABL_UNDO , D(LALT), T(R), U(LALT) , END ); + BABLM( BABL_REDO , D(LCTL), T(X), U(LCTL),T(C), END ); // arguably + BABLM( BABL_CUT , D(LCTL), T(K), U(LCTL), END ); // wrong half the time + //BABLM( BABL_COPY ,END ); + BABLM( BABL_PASTE , D(LCTL), T(Y), U(LCTL), END ); + BABLM( BABL_SELECT_ALL , D(LCTL), T(A), T(K), T(Y), U(LCTL) , END ); + BABLM( BABL_FIND , D(LCTL), T(R), U(LCTL), END ); // search history + BABLM(BABL_FIND_NEXT, D(LCTL), T(S), U(LCTL), END ); + //BABLM( BABL_FIND_REPLACE ,END ); + BABLM( BABL_RUNAPP , D(LCTL), T(B), U(LCTL), T(C),END ); //tmux + BABLM( BABL_SWITCH_APP_NEXT , D(LCTL), T(B), U(LCTL), T(N),END ); //tmux + BABLM( BABL_SWITCH_APP_LAST , D(LCTL), T(B), U(LCTL), T(P),END ); //tmux + BABLM( BABL_CLOSE_APP , D(LCTL), T(B), U(LCTL), T(D),END); // usually what I want + // BABLM( BABL_HELP ,END ); +#ifndef BABL_NOBROWSER +/* Add lynx shortcuts? + BABLM( BABL_BROWSER_NEW_TAB, D(LGUI), T(T), U(LGUI),END ); + BABLM( BABL_BROWSER_CLOSE_TAB, D(LGUI), T(W), U(LGUI),END ); + BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LGUI), D(RSFT),T(T), U(RSFT),U(LGUI),END ); + BABLM( BABL_BROWSER_NEXT_TAB, D(LGUI),D(LALT), T(RIGHT),U(LALT), U(LGUI),END ); + BABLM( BABL_BROWSER_PREV_TAB, D(LGUI), D(RSFT), T(LEFT), U(RSFT), U(LGUI),END ); + BABLM( BABL_BROWSER_URL_BAR, D(LGUI), T(L), U(LGUI),END ); + BABLM( BABL_BROWSER_FORWARD, D(LGUI), T(RIGHT), U(LGUI),END ); + BABLM( BABL_BROWSER_BACK, D(LGUI), T(LEFT), U(LGUI),END ); + BABLM( BABL_BROWSER_FIND, D(LGUI), T(F), U(LGUI),END ); + BABLM( BABL_BROWSER_BOOKMARK, D(LGUI), T(D), U(LGUI),END ); + //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE + BABLM( BABL_BROWSER_DEV_TOOLS, D(LGUI), D(LALT), T(I), U(LALT),U(LGUI),END ); // Chrome + // Chrome + BABLM( BABL_BROWSER_RELOAD, D(LGUI), T(R), U(LGUI),END ); // add shift for reload w/o cache + BABLM( BABL_BROWSER_FULLSCREEN, D(LGUI), D(LCTL), T(P), U(LCTL), U(LGUI),END ); //command shift F + BABLM( BABL_BROWSER_ZOOM_IN, D(LGUI), T(PLUS), U(LGUI),END ); + BABLM( BABL_BROWSER_ZOOM_OUT, D(LGUI), T(MINS), U(LGUI),END ); +*/ +#endif #endif return MACRO_NONE; diff --git a/keyboards/handwired/MS-sculpt-mobile/babblePaste.h b/keyboards/handwired/MS-sculpt-mobile/babblePaste.h index 313fa80ec4..67153fb0d8 100644 --- a/keyboards/handwired/MS-sculpt-mobile/babblePaste.h +++ b/keyboards/handwired/MS-sculpt-mobile/babblePaste.h @@ -10,6 +10,8 @@ and jeebak & algernon's keymap #ifndef _babblePaste_h_included__ #define _babblePaste_h_included__ #include "action_layer.h" +#include "quantum_keycodes.h" +#include "config.h" #ifdef USE_BABLPASTE @@ -39,23 +41,28 @@ and jeebak & algernon's keymap /* Macros handled by babblepaste. Most should be available for all platforms. Whatever isn't defined will NOP */ enum { - - // Movement - BABL_DEL_RIGHT_1C= BABL_START_NUM, - BABL_DEL_LEFT_WORD, - BABL_DEL_RIGHT_WORD, - BABL_GO_LEFT_1C, +// Movement macros + // left & right + BABL_GO_LEFT_1C= BABL_START_NUM, BABL_GO_RIGHT_1C, - BABL_GO_LEFT_WORD, + BABL_GO_LEFT_WORD, BABL_GO_RIGHT_WORD, BABL_GO_START_LINE, BABL_GO_END_LINE, + // now up & down BABL_GO_START_DOC, BABL_GO_END_DOC, BABL_GO_NEXT_LINE, BABL_GO_PREV_LINE, BABL_PGDN, BABL_PGUP, + // And the delete options + //BABL_DEL_LEFT_1C == backspace, so why bother. + BABL_DEL_RIGHT_1C, // usually = Del + BABL_DEL_LEFT_WORD, + BABL_DEL_RIGHT_WORD, + BABL_DEL_TO_LINE_END, // delete from cursor to end of line + BABL_DEL_TO_LINE_START, // delete from cursor to begining line #ifndef BABL_MOVEMENTONLY // Cut & Paste BABL_UNDO, @@ -64,20 +71,142 @@ enum { BABL_COPY, BABL_PASTE, BABL_SELECT_ALL, - // GUI or app + /* not yet implemented + BABL_SWAP_LAST2C // swap last characters before the cursor + BABL_SWAP_LAST2W // Swap the last two words before the cursor + */ + // find & replace BABL_FIND, BABL_FIND_NEXT, BABL_FIND_REPLACE, + // GUI or app BABL_RUNAPP, BABL_SWITCH_APP_NEXT, BABL_SWITCH_APP_LAST, // previous BABL_CLOSE_APP, - BABL_HELP + BABL_HELP, + +#ifndef BABL_NOBROWSER + BABL_BROWSER_NEW_TAB, + BABL_BROWSER_CLOSE_TAB, + BABL_BROWSER_REOPEN_LAST_TAB, + BABL_BROWSER_NEXT_TAB, + BABL_BROWSER_PREV_TAB, + BABL_BROWSER_URL_BAR, + BABL_BROWSER_FORWARD, + BABL_BROWSER_BACK, + BABL_BROWSER_FIND, + BABL_BROWSER_BOOKMARK, + BABL_BROWSER_DEV_TOOLS, // hard one to remember + BABL_BROWSER_RELOAD, + BABL_BROWSER_FULLSCREEN, + BABL_BROWSER_ZOOM_IN, + BABL_BROWSER_ZOOM_OUT, + #endif + +#endif +// Macros for mode switching +#ifdef MS_MODE + BABL_WINDOWS, +#endif +#ifdef MAC_MODE + BABL_MAC, +#endif +#ifdef LINUX_MODE + BABL_LINUX, +#endif +#ifdef EMACS_MODE + BABL_EMACS, +#endif +#ifdef VI_MODE + BABL_VI, +#endif +#ifdef READMUX_MODE + BABL_READLINE, +#endif + + }; -// How many macros/ how many array elements? -#define BABL_NUM_MACROS 28 +// BUG, used to jump to babble functiion. Surely there is a way to calculate size of enum? +#define BABL_NUM_MACROS 48 + 4 // 48 + # of defined modes. + +/* And all the shorthand keymap ready versions */ +// First the mode switching macros +#ifdef MS_MODE +#define B_WIN M(BABL_WINDOWS) +#endif +#ifdef MAC_MODE +#define B_MAC M(BABL_MAC) +#endif +#ifdef LINUX_MODE +#define B_LNX M(BABL_LINUX) +#endif +#ifdef EMACS_MODE +#define B_EMAX M(BABL_EMACS) +#endif +#ifdef VI_MODE +#define B_VI M(BABL_VI) +#endif +#ifdef READMUX_MODE +#define B_READ M(BABL_READLINE) +#endif + +// and all the movement & action. + +#define B_L1C M(BABL_GO_LEFT_1C) +#define B_R1C M(BABL_GO_RIGHT_1C) +#define B_L1W M(BABL_GO_LEFT_WORD) +#define B_R1W M(BABL_GO_RIGHT_WORD) +#define B_GSOL M(BABL_GO_START_LINE) +#define B_GEOL M(BABL_GO_END_LINE) +#define B_GTOP M(BABL_GO_START_DOC) +#define B_GEND M(BABL_GO_END_DOC) +#define B_DOWN M(BABL_GO_NEXT_LINE) +#define B_UP M(BABL_GO_PREV_LINE) +#define B_PGDN M(BABL_PGDN) +#define B_PGUP M(BABL_PGUP) +//#define B_BKSP M(BABL_DEL_LEFT_1C) == backspace so why bother. +#define B_DEL M(BABL_DEL_RIGHT_1C) // usually = Del +#define B_DLW M(BABL_DEL_LEFT_WORD) +#define B_DRW M(BABL_DEL_RIGHT_WORD) +#define B_DEOL M(BABL_DEL_TO_LINE_END) // delete from cursor to end of line +#define B_DSOL M(BABL_DEL_TO_LINE_START) // delete from cursor to begining line +#define B_UNDO M(BABL_UNDO) +#define B_REDO M(BABL_REDO) +#define B_CUT M(BABL_CUT) +#define B_COPY M(BABL_COPY) +#define B_PAST M(BABL_PASTE) +#define B_SELA M(BABL_SELECT_ALL) +#define B_FIND M(BABL_FIND) +#define B_FINDN M(BABL_FIND_NEXT) +#define B_FINDR M(BABL_FIND_REPLACE) +#define B_RAPP M(BABL_RUNAPP) +#define B_NAPP M(BABL_SWITCH_APP_NEXT) +#define B_PAPP M(BABL_SWITCH_APP_LAST) // previous +#define B_CAPP M(BABL_CLOSE_APP) +#define B_HELP M(BABL_HELP) +#define B_NTAB M(BABL_BROWSER_NEW_TAB) +#define B_CTAB M(BABL_BROWSER_CLOSE_TAB) +#define B_ROTB M(BABL_BROWSER_REOPEN_LAST_TAB) +#define B_NXTB M(BABL_BROWSER_NEXT_TAB) +#define B_PTAB M(BABL_BROWSER_PREV_TAB) +#define B_NURL M(BABL_BROWSER_URL_BAR) +#define B_BFWD M(BABL_BROWSER_FORWARD) +#define B_BBAK M(BABL_BROWSER_BACK) +#define B_BFND M(BABL_BROWSER_FIND) +#define B_BOOK M(BABL_BROWSER_BOOKMARK) +#define B_BDEV M(BABL_BROWSER_DEV_TOOLS) // hard one to remember +#define B_BRLD M(BABL_BROWSER_RELOAD) +#define B_BFUlL M(BABL_BROWSER_FULLSCREEN) +#define B_ZMIN M(BABL_BROWSER_ZOOM_IN) +#define B_ZMOT M(BABL_BROWSER_ZOOM_OUT) + + + + + /* from action_macro.h diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h index 7ad1b0f0f5..9f9b050944 100644 --- a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h @@ -5,23 +5,28 @@ #define USE_BABLPASTE +// Expect to get errors if you comment a feature out and leave it in your keymap. + #ifdef USE_BABLPASTE //define BabblePaste maps // Windows. -//#define MS_MODE 1 -#define MAC_MODE 0 +#define MS_MODE 0 +#define MAC_MODE 1 //aka gnome+KDE //#define LINUX_MODE 2 //#define EMACS_MODE 3 -//#define VI_MODE 4 +#define VI_MODE 4 //#define WORDSTAR_MODE 5 // Readline and tmux #define READMUX_MODE 6 #endif // Uncomment if you need more free flash space -// It removes everything but cursor movement + +// This removes everything but cursor movement //#define BABL_MOVEMENTONLY +// and this just removes browser shortcuts +//#define BABL_NOBROWSER // place overrides here #endif diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c index 3a162db864..a662825475 100644 --- a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c @@ -14,13 +14,6 @@ #define _TRAN 5 - - -// adjust babblemode default -extern uint8_t babble_mode; - - - enum layer_keycodes { QWR, CDH, @@ -46,11 +39,6 @@ TRAN enum macro_keycodes { DHPASTE=1, VIBRK, -B_LNX, -B_WIN, -B_MAC, -B_VI, -B_READ , }; @@ -115,24 +103,38 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ____, KC_SCLN, KC_TILDE, KC_COLN, KC_TILDE, KC_PIPE, KC_DLR, KC_ASTR, ____, KC_DOT , KC_SLSH, ____, ____, ____,\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ ), +/* +* |ESC | Win| MAC|RdLn| VI | | | | | | | | | | | | +* -------------------------------------------------------------------------------' +* | | | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Bakspace| Del| +* --------------------------------------------------------------------------- +* | tab | q | w |Find| |pTab |DSOL|DelW| Up |DelW|DEOL| [ | ] | \ | | +* -------------------------------------------------------------------------------' +* |Bak/Mov| a | s | d | |nTab |GSOL| <- | Dwn | -> | EOL | ' | enter |PgUp| +* -------------------------------------------------------------------------------- +* |Lsft |Undo| Cut|Copy|Pste| b | n | m | , | . | / | Rsft| Up| PgDn| +* --------------------------------------------------------------------------------- +* |Lctl |Lgui |Lalt | Space/Sym | GUI | Sym | Rctl |Left|Down|Rght| +* --------------------------------------------------------------------------------- +*/ [_MOV] = KEYMAP (\ - ____, M(B_WIN),M(B_MAC),M(B_READ), M(B_VI), ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ - ____, M(BABL_UNDO), ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ - ____, ____,RGUI(KC_TAB), ____, ____, RCTL(KC_B), ____, M(BABL_DEL_LEFT_WORD), KC_UP, M(BABL_DEL_RIGHT_WORD), ____, ____, ____, ____, \ - ____, RCTL(KC_A), KC_S, RCTL(KC_K), RCTL(KC_E), ____, M(BABL_GO_START_LINE), KC_LEFT,KC_DOWN, KC_RIGHT, M(BABL_GO_END_LINE), ____,____,____,\ - ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, B_MAC,B_WIN,B_READ, B_VI, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, B_PAPP, B_NAPP, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, B_UNDO, ____, B_BFND, ____, B_PTAB, B_DSOL, B_DLW, B_UP, B_DRW, B_DEOL, ____, ____, ____, \ + ____, B_SELA, B_BRLD, ____, ____, B_NXTB, B_GSOL, B_L1C, B_DOWN, B_R1C,B_GEOL, ____, ____, ____,\ + ____, B_UNDO,B_CUT, B_COPY, B_PAST, B_PAST, ____, ____, ____, ____, ____, ____, ____, ____, \ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ ), [_TRAN] = KEYMAP (\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ - ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ - ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ - ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ - ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ - ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ -) + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ +) }; const uint16_t PROGMEM fn_actions[] = { @@ -188,6 +190,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { /* If this is in the range of BABL macros, call a separate function */ +/* Any clever remapping with modifiers should happen here e.g. shift bablkey does opposite*/ #ifdef USE_BABLPASTE if( id >= BABL_START_NUM && id < (BABL_START_NUM + BABL_NUM_MACROS ) ) { if (record->event.pressed) { // is there a case where this isn't desired? @@ -235,31 +238,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) - -#ifdef USE_BABLPASTE - -#ifdef LINUX_MODE - case B_LNX: - return switch_babble_mode(LINUX_MODE); -#endif -#ifdef MS_MODE - case B_WIN: - return switch_babble_mode(MS_MODE); -#endif -#ifdef MAC_MODE - case B_MAC: - return switch_babble_mode(MAC_MODE); -#endif -#ifdef VI_MODE - case B_VI: - return switch_babble_mode(VI_MODE); -#endif -#ifdef READMUX_MODE - case B_READ: - return switch_babble_mode(READMUX_MODE); -#endif -#endif - default: return MACRO_NONE; @@ -286,10 +264,6 @@ void led_set_user(uint8_t usb_led) { } -macro_t* switch_babble_mode( uint8_t id) { - babble_mode= id; - return MACRO_NONE; //less typing above -} From 89aba30c7f50aa733262f4add253817e2fb84e8a Mon Sep 17 00:00:00 2001 From: milestogo Date: Wed, 8 Mar 2017 01:25:33 -0800 Subject: [PATCH 053/181] fix stupid error w/ mode switch --- .../handwired/MS-sculpt-mobile/babblePaste.c | 38 +++++++++++++------ .../handwired/MS-sculpt-mobile/babblePaste.h | 10 ++++- keyboards/handwired/MS-sculpt-mobile/config.h | 5 +-- .../MS-sculpt-mobile/keymaps/default/Makefile | 2 +- .../keymaps/milestogo/config.h | 10 ++--- .../keymaps/milestogo/keymap.c | 4 +- .../handwired/MS-sculpt-mobile/readme.md | 2 +- keyboards/handwired/MS-sculpt-mobile/rules.mk | 5 ++- 8 files changed, 51 insertions(+), 25 deletions(-) diff --git a/keyboards/handwired/MS-sculpt-mobile/babblePaste.c b/keyboards/handwired/MS-sculpt-mobile/babblePaste.c index 491a79333e..3a9b86997d 100644 --- a/keyboards/handwired/MS-sculpt-mobile/babblePaste.c +++ b/keyboards/handwired/MS-sculpt-mobile/babblePaste.c @@ -19,7 +19,7 @@ uint8_t babble_mode =0 ; macro_t* switch_babble_mode( uint8_t id) { babble_mode= id; - return MACRO_NONE; //less typing above + return MACRO_NONE; //less typing where called } @@ -42,12 +42,32 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { return MACRO_NONE; } */ - switch(babble_mode) { - - + + +#ifdef MS_MODE + if ( BABL_WINDOWS == shortcut ) { return switch_babble_mode(MS_MODE); } +#endif +#ifdef MAC_MODE + if ( BABL_MAC == shortcut) { return switch_babble_mode(MAC_MODE); } +#endif +#ifdef LINUX_MODE + if ( BABL_LINUX == shortcut ) { return switch_babble_mode(LINUX_MODE); } +#endif + #ifdef READMUX_MODE + if ( BABL_READLINE == shortcut ) { switch_babble_mode(READMUX_MODE); return MACRO_NONE; } +#endif +#ifdef VI_MODE + if ( BABL_VI == shortcut ) { return switch_babble_mode(VI_MODE); } +#endif +#ifdef EMACS_MODE + if ( BABL_EMACS == shortcut ) { return switch_babble_mode(EMACS_MODE); } +#endif + + + + switch(babble_mode) { #ifdef MS_MODE - if ( BABL_WINDOWS == shortcut ) { return switch_babble_mode(MS_MODE); } case MS_MODE: BABLM( BABL_GO_LEFT_1C, T(LEFT), END ); @@ -111,7 +131,6 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { #ifdef LINUX_MODE - if ( BABL_LINUX == shortcut ) { return switch_babble_mode(LINUX_MODE); } case LINUX_MODE: BABLM( BABL_GO_LEFT_1C , T(LEFT), END ); @@ -172,7 +191,6 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { #endif #ifdef MAC_MODE - if ( BABL_MAC == shortcut) { return switch_babble_mode(MAC_MODE); } case MAC_MODE: BABLM( BABL_GO_LEFT_1C , T(LEFT), END ); @@ -234,8 +252,6 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { #ifdef EMACS_MODE - if ( BABL_EMACS == shortcut ) { return switch_babble_mode(EMACS_MODE); } - case EMACS_MODE: switch(shortcut) { //probably should allow meta to not be ALT @@ -303,7 +319,6 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { #ifdef VI_MODE - if ( BABL_VI == shortcut ) { return switch_babble_mode(VI_MODE); } case VI_MODE: // you have to track the modes yourself. Otherwise motion is awful (bell, bell, bell) @@ -371,7 +386,8 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) { #ifdef READMUX_MODE // Readline command line editing + tmux windowing // I havent decided how much to do readline and how much tmux - if ( BABL_READLINE == shortcut ) { switch_babble_mode(READMUX_MODE); return MACRO_NONE; } + + case READMUX_MODE: BABLM( BABL_GO_LEFT_1C , T(LEFT), END ); diff --git a/keyboards/handwired/MS-sculpt-mobile/babblePaste.h b/keyboards/handwired/MS-sculpt-mobile/babblePaste.h index 67153fb0d8..3067c854de 100644 --- a/keyboards/handwired/MS-sculpt-mobile/babblePaste.h +++ b/keyboards/handwired/MS-sculpt-mobile/babblePaste.h @@ -18,6 +18,9 @@ and jeebak & algernon's keymap /* *************************** // Uncomment any modes you want. Whatever mode = 0 will be the default on boot +// Expect to get errors if you comment a feature out and leave it in your keymap. + +#define USE_BABLPASTE //#define MS_MODE 0 // Windows. //#define MAC_MODE 1 @@ -26,6 +29,11 @@ and jeebak & algernon's keymap //#define VI_MODE 4 //#define WORDSTAR_MODE 5 //#define READMUX 6 // Readline and tmux + +// This removes everything but cursor movement +//#define BABL_MOVEMENTONLY +// and this just removes browser shortcuts +//#define BABL_NOBROWSER ****************************/ @@ -130,7 +138,7 @@ enum { }; // BUG, used to jump to babble functiion. Surely there is a way to calculate size of enum? -#define BABL_NUM_MACROS 48 + 4 // 48 + # of defined modes. +#define BABL_NUM_MACROS 48+4 // 48 + # of defined modes. /* And all the shorthand keymap ready versions */ // First the mode switching macros diff --git a/keyboards/handwired/MS-sculpt-mobile/config.h b/keyboards/handwired/MS-sculpt-mobile/config.h index d85c5c6233..f89514278d 100644 --- a/keyboards/handwired/MS-sculpt-mobile/config.h +++ b/keyboards/handwired/MS-sculpt-mobile/config.h @@ -25,7 +25,6 @@ along with this program. If not, see . #define PRODUCT_ID 0x6060 #define DEVICE_VER 0x0001 #define MANUFACTURER Microsoftplus -#define PRODUCT sculpt mobile #define DESCRIPTION 6000 /* key matrix size */ @@ -33,14 +32,14 @@ along with this program. If not, see . #define MATRIX_COLS 18 #ifdef ASTAR - +#define PRODUCT sculpt mobile astar /*0 1 2 3 4 5 6 7 8 */ #define MATRIX_ROW_PINS {D7, C6, D4, D0, D1, D3, D2, E2} /* A B C D E F G H I J K L M N O P Q R */ #define MATRIX_COL_PINS {B4, B5, E6, B7, B6, D6, C7, F7, F6, F4,F5, F1,F0, D5, B0, B1, B2, B3} #else - +#define PRODUCT sculpt mobile teensypp /* 0 1 2 3 4 5 6 7 */ #define MATRIX_ROW_PINS { F7,F6,F4,F5,F3,F2,F1,F0} /* A B C D E F G H I J K L M N O P Q R */ diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/default/Makefile b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/Makefile index 9d3df5964f..8b829218b2 100644 --- a/keyboards/handwired/MS-sculpt-mobile/keymaps/default/Makefile +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/default/Makefile @@ -17,5 +17,5 @@ RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR - include ../../../../Makefile + include ../../../../../Makefile endif diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h index 9f9b050944..8cf4202cda 100644 --- a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/config.h @@ -10,15 +10,15 @@ #ifdef USE_BABLPASTE //define BabblePaste maps // Windows. -#define MS_MODE 0 -#define MAC_MODE 1 +#define MAC_MODE 0 +#define MS_MODE 1 //aka gnome+KDE //#define LINUX_MODE 2 //#define EMACS_MODE 3 -#define VI_MODE 4 -//#define WORDSTAR_MODE 5 +#define VI_MODE 3 // Readline and tmux -#define READMUX_MODE 6 +#define READMUX_MODE 2 +//#define WORDSTAR_MODE 5 #endif // Uncomment if you need more free flash space diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c index a662825475..3b2f53a0c1 100644 --- a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c @@ -104,7 +104,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ ), /* -* |ESC | Win| MAC|RdLn| VI | | | | | | | | | | | | +* |ESC | MAC| Win|RdLn| VI | | | | | | | | | | | | * -------------------------------------------------------------------------------' * | | | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Bakspace| Del| * --------------------------------------------------------------------------- @@ -192,6 +192,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) /* If this is in the range of BABL macros, call a separate function */ /* Any clever remapping with modifiers should happen here e.g. shift bablkey does opposite*/ #ifdef USE_BABLPASTE + if( id >= BABL_START_NUM && id < (BABL_START_NUM + BABL_NUM_MACROS ) ) { if (record->event.pressed) { // is there a case where this isn't desired? @@ -201,6 +202,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) } #endif + // MACRODOWN only works in this function switch(id) { case 0: diff --git a/keyboards/handwired/MS-sculpt-mobile/readme.md b/keyboards/handwired/MS-sculpt-mobile/readme.md index 58029b50db..d435b449fb 100644 --- a/keyboards/handwired/MS-sculpt-mobile/readme.md +++ b/keyboards/handwired/MS-sculpt-mobile/readme.md @@ -53,6 +53,6 @@ The Astar mini has all pins exposed , so you can do 18x8 If you want a speaker, LEDs &etc, you'll need to free up a pin. I recommend joining columns R and L to the same pin. -Building - edit rules.mk to set ASTAR=1 or comment it out for teensy2++ +Building - add ASTAR=1 to the compile line or leave out for teensy2++ diff --git a/keyboards/handwired/MS-sculpt-mobile/rules.mk b/keyboards/handwired/MS-sculpt-mobile/rules.mk index 34ac78da81..680389c846 100644 --- a/keyboards/handwired/MS-sculpt-mobile/rules.mk +++ b/keyboards/handwired/MS-sculpt-mobile/rules.mk @@ -1,10 +1,10 @@ -#CFLAGS=-D ASTAR ## Project specific files SRC= babblePaste.c ifdef ASTAR + CFLAGS=-D ASTAR OPT_DEFS += -DBOOTLOADER_SIZE=4096 MCU = atmega32u4 OPT_DEFS += -DCATERINA_BOOTLOADER @@ -40,7 +40,8 @@ BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE ?= no # Audio output on port C6 -USB ?= /dev/cu.usbmodem1421 +USB ?= /dev/cu.usbmodem14141 + upload: build From cd1eb8d24649662dcc1e916634beb481c98173d7 Mon Sep 17 00:00:00 2001 From: Gunther Gruber Date: Wed, 8 Mar 2017 11:13:19 +0100 Subject: [PATCH 054/181] added readme file --- keyboards/ergodox/keymaps/guni/readme.txt | 133 ++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 keyboards/ergodox/keymaps/guni/readme.txt diff --git a/keyboards/ergodox/keymaps/guni/readme.txt b/keyboards/ergodox/keymaps/guni/readme.txt new file mode 100644 index 0000000000..93ae5f0567 --- /dev/null +++ b/keyboards/ergodox/keymaps/guni/readme.txt @@ -0,0 +1,133 @@ +My main layout (Layer 0) is based on qwerty. I tried to fit the layout of the kinesis keyboard onto the ergodox. Furthermore I did some tweaks. +The other layers are seldom used. Except the F Keys and the teensy key. As I own a ergodox I cant press the reset button, so i need a key to send the teensy into reprogram mode. +There is a layer with symbols a numpad. These layers are seldom used. Except the F Keys and the teensy key. As I own a ergodox I need a key to reprogram, because I can't access the reset button. + +I am a linux user and need the esc key and str keys often therefore it is easyly accessed. Switching console str+alt+tab+f2 (layer 2 and 2) is tricky but you get it after a while. +As I live in germany and need to type umlaut frquently, i mapped the CAPS to the meta key, and swapped ' and ". So I can type ö with CAPS o + ¨. no need to press o+SHIFT+' +As a note for linux users i use str+p to get last command, instead of using the cursor keys. + +HOWTO to convert CAPS to Meta-Key and swap ' with " + +* create file with following content +.Xmodmap + clear Lock + keycode 48 = quotedbl apostrophe quotedbl apostrophe + keycode 66 = Multi_key + +* apply with +xmodmap .Xmodmap + +* convert to xkbmap +xkbcomp $DISPLAY $HOME/.xkbmap + +* automatic startup each time you startup x +echo 'xkbcomp $HOME/.xkbmap $DISPLAY' >> ~/.xinitrc + + KEYMAP( // layer 0 : default + // left hand + KC_EQL , KC_1, KC_2, KC_3, KC_4, KC_5, KC_LBRC, + KC_FN25 , KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME, + KC_FN27 , KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT , KC_Z, KC_X, KC_C, KC_V, KC_B, KC_PGUP, + KC_LGUI , KC_GRV,KC_LEFT,KC_RGHT,KC_LALT, + KC_NO , KC_NO , + KC_NO , + KC_BSPC,KC_DEL ,KC_FN23, + // right hand + KC_RBRC , KC_6, KC_7 , KC_8, KC_9, KC_0, KC_MINS, + KC_END , KC_Y, KC_U , KC_I, KC_O, KC_P, KC_FN28, + KC_H , KC_J, KC_K , KC_L, KC_SCLN,KC_FN30, + KC_PGDN , KC_N, KC_M , KC_COMM,KC_DOT, KC_SLSH,KC_FN29, + KC_RALT , KC_DOWN,KC_UP, KC_NO ,KC_RGUI, + KC_NO , KC_NO, + KC_NO , + KC_FN29,KC_ENT ,KC_SPC + ), + + KEYMAP( // layer 1 : function and symbol keys + // left hand + KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, + KC_TRNS,KC_AT,KC_UNDS ,KC_LBRC,KC_RBRC,KC_CIRC ,KC_TRNS, + KC_TRNS,KC_BSLS,KC_SLSH,KC_LCBR ,KC_RCBR ,KC_ASTR, + KC_TRNS,KC_HASH ,KC_DLR ,KC_PIPE ,KC_TILD ,KC_GRV ,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1, + // right hand + KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_TRNS,KC_EXLM,LSFT(KC_COMM),LSFT(KC_DOT),KC_EQL,KC_AMPR, KC_TRNS, + LSFT(KC_SLSH),KC_LPRN,KC_RPRN,KC_MINS,LSFT(KC_SCLN),KC_TRNS, + KC_TRNS,KC_PLUS,LSFT(KC_5),LSFT(KC_QUOT),KC_QUOT,KC_SCLN,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + + KEYMAP( // layer 2: navigation + // left hand + KC_NO,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_PGUP,KC_HOME,KC_UP ,KC_END,KC_NO ,KC_TRNS, + KC_TRNS,KC_PGDN,KC_LEFT,KC_DOWN,KC_RGHT,KC_NO, + KC_TRNS,KC_NO, KC_NO, KC_NO, KC_NO,KC_NO,KC_NO, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1 , + // right hand + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS ,KC_TRNS, KC_HOME, KC_TRNS, KC_TRNS, KC_END ,KC_TRNS, + KC_NO, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT,KC_TRNS, + KC_TRNS,KC_TRNS, KC_HOME, KC_UP, KC_END, KC_PGUP,KC_TRNS, + KC_LEFT, KC_DOWN,KC_RGHT,KC_PGDN,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + KEYMAP( // layer 3 : teensy bootloader functions + // left hand + KC_FN0, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_FN1 , + // 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_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + + + KEYMAP( // layer 4: numpad + // left 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_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,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_NLCK,KC_PSLS,KC_PAST,KC_PAST,KC_PMNS,KC_BSPC, + KC_TRNS,KC_NO, KC_P7, KC_P8, KC_P9, KC_PMNS,KC_BSPC, + KC_NO, KC_P4, KC_P5, KC_P6, KC_PPLS,KC_PENT, + KC_TRNS,KC_NO, KC_P1, KC_P2, KC_P3, KC_PPLS,KC_PENT, + KC_P0, KC_PDOT,KC_SLSH,KC_PENT,KC_PENT, + KC_TRNS,KC_TRNS, + KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS + ), + +}; + + From 2aa079d93e31403debd467fb4eed98fb98cced0f Mon Sep 17 00:00:00 2001 From: Lukas Stiebig Date: Wed, 8 Mar 2017 20:41:35 +0100 Subject: [PATCH 055/181] Left control and alt Use the left control and the left alt key. --- quantum/quantum_keycodes.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 63b626926d..903d57f1ee 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -183,6 +183,7 @@ enum quantum_keycodes { #define ALTG(kc) (kc | QK_RCTL | QK_RALT) #define SCMD(kc) (kc | QK_LGUI | QK_LSFT) #define SWIN(kc) SCMD(kc) +#define LCA(kc) (kc | QK_LCTL | QK_LALT) #define MOD_HYPR 0xf #define MOD_MEH 0x7 @@ -339,6 +340,7 @@ enum quantum_keycodes { #define ALL_T(kc) MT((MOD_LCTL | MOD_LSFT | MOD_LALT | MOD_LGUI), kc) // see http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/ #define SCMD_T(kc) MT((MOD_LGUI | MOD_LSFT), kc) #define SWIN_T(kc) SCMD_T(kc) +#define LCA_T(kc) MT((MOD_LCTL | MOD_LALT), kc) // Left control and left alt // Dedicated keycode versions for Hyper and Meh, if you want to use them as standalone keys rather than mod-tap #define KC_HYPR HYPR(KC_NO) From 8cc70f4d9dd75e4efb186ec71ee4a3a7a0dd4587 Mon Sep 17 00:00:00 2001 From: Lukas Stiebig Date: Wed, 8 Mar 2017 20:58:55 +0100 Subject: [PATCH 056/181] Added german-lukas Added my keymap called germman-lukas. --- .../ergodox/keymaps/german-lukas/keymap.c | 235 ++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 keyboards/ergodox/keymaps/german-lukas/keymap.c diff --git a/keyboards/ergodox/keymaps/german-lukas/keymap.c b/keyboards/ergodox/keymaps/german-lukas/keymap.c new file mode 100644 index 0000000000..f6709595ec --- /dev/null +++ b/keyboards/ergodox/keymaps/german-lukas/keymap.c @@ -0,0 +1,235 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "keymap_german.h" + +// Layer names +#define BASE 0 // default layer +#define SYMB 1 // symbol layer +#define MDIA 2 // media keys +#define SHRT 3 // shortcut layer + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | Caps | 1 | 2 | 3 | 4 | 5 |X ` X| | PRSC | 6 | 7 | 8 | 9 | 0 | ß | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T | L1 | | L1 | Z | U | I | O | P | Ü | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | Esc | A | S | D | F | G |------| |------| H | J | K | L | Ö | Ä/L2 | + * |--------+------+------+------+------+------| L2 | | L2 |------+------+------+------+------+--------| + * | LShift | Y | X | C | V | B | | | | N | M | , | . | - | RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | LGui | ^ | < | LEFT | RIGHT| | Up | Down | # | + | LCA | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | CTRL | ALT | | Alt |Ctrl/Esc| + * ,------+------+------| |------+--------+------. + * | | | Home | | PgUp | | | + * | Space|Del |------| |------| Bkspc | Enter| + * | | | 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_CAPS, KC_1, KC_2, KC_3, KC_4, KC_5, DE_ACUT, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, DE_Y, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + KC_LGUI, DE_CIRC, DE_LESS, KC_LEFT, KC_RIGHT, + KC_LCTRL, KC_LALT, + KC_HOME, + KC_SPC ,KC_DELT,KC_END, + // right hand + KC_PSCREEN, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + TG(MDIA), DE_Z, KC_U, KC_I, KC_O, KC_P, LT(SHRT,DE_UE), + KC_H, KC_J, KC_K, KC_L, DE_OE, LT(MDIA,DE_AE), + MEH_T(KC_NO), KC_N, KC_M, KC_COMM, KC_DOT, DE_MINS, KC_RSFT, + KC_UP, KC_DOWN, DE_HASH, DE_PLUS, LCA_T(KC_NO), + KC_RALT, KC_RCTRL, + KC_PGUP, + KC_PGDN, KC_BSPC, 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,DE_EXLM,DE_AT, DE_LCBR,DE_RCBR,DE_PIPE,KC_TRNS, + KC_TRNS,DE_HASH,DE_DLR, DE_LPRN,DE_RPRN,DE_GRV, + KC_TRNS,DE_PERC,DE_CIRC,DE_LBRC,DE_RBRC,DE_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, DE_ASTR, KC_F12, + KC_DOWN, KC_4, KC_5, KC_6, DE_PLUS, KC_TRNS, + KC_TRNS, DE_AMPR, KC_1, KC_2, KC_3, DE_BSLS, KC_TRNS, + KC_TRNS,KC_DOT, KC_0, DE_EQL, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), + +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | Lclk | MsUp | Rclk | | | | | |VolDwn| Mute |VolUp | | F12 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | Btn4 |MsLeft|MsDown|MsRght| Btn5 |------| |------| | Prev | Stop | Play | Next | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | |WhRght|WhDown| WhUp |WhLeft|WhClk | | | |BwSrch|BwBack|BwHome|BwRefr|BwFwd | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | |MsAcl0|MsAcl1|MsAcl2| | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | |Brwser|Brwser| + * | Lclk | Rclk |------| |------|Back |Forwd | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[MDIA] = KEYMAP( + // left hand + KC_TRNS, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_TRNS, + KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_TRNS, KC_TRNS, + KC_TRNS, KC_BTN4, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN5, + KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, KC_BTN3, KC_TRNS, + KC_TRNS, KC_TRNS, KC_ACL0, KC_ACL1, KC_ACL2, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_BTN1, KC_BTN2, KC_TRNS, + // right hand + KC_TRNS, KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11, + KC_TRNS, KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, KC_F12, + KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, KC_TRNS, + KC_TRNS, KC_WSCH, KC_WBAK, KC_WHOM, KC_WREF, KC_WFWD, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_WBAK, KC_WFWD +), + +/* Keymap 3: Linux shortcuts + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | |LCA-F1|LCA-F2|LCA-F3|LCA-F4|LCA-F5| | | |LCA-F6|LCA-F7|LCA-F8|LCA-F9| | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |LCA-Le| |LCA-Ri| |------| |------| | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | |LCA-Le|LCA-Ri| | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[SHRT] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, LCA(KC_F1), LCA(KC_F2), LCA(KC_F3), LCA(KC_F4), LCA(KC_F5), KC_TRNS, + KC_TRNS, KC_TRNS, LCA(KC_LEFT), KC_TRNS, LCA(KC_RIGHT), KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, LCA(KC_LEFT), LCA(KC_RIGHT), + 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, LCA(KC_F6), LCA(KC_F7), LCA(KC_F8), LCA(KC_F9), KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + LCA(KC_UP), LCA(KC_DOWN), 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_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) { + case SYMB: + ergodox_right_led_1_on(); + break; + case MDIA: + ergodox_right_led_2_on(); + break; + case SHRT: + ergodox_right_led_3_on(); + break; + default: + ergodox_board_led_off(); + break; + } + +}; From 2f5143e219c8410cfaeeadb87782b3dc212aa3b9 Mon Sep 17 00:00:00 2001 From: Lukas Stiebig Date: Wed, 8 Mar 2017 21:09:51 +0100 Subject: [PATCH 057/181] Corrected the description of the layer Corrected the description of the Shortcuts layer. --- keyboards/ergodox/keymaps/german-lukas/keymap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/keyboards/ergodox/keymaps/german-lukas/keymap.c b/keyboards/ergodox/keymaps/german-lukas/keymap.c index f6709595ec..c6e9f2f900 100644 --- a/keyboards/ergodox/keymaps/german-lukas/keymap.c +++ b/keyboards/ergodox/keymaps/german-lukas/keymap.c @@ -162,8 +162,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | * `--------------------' `--------------------' */ -// MEDIA AND MOUSE +// Shortcuts [SHRT] = KEYMAP( + // left hand KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, LCA(KC_F1), LCA(KC_F2), LCA(KC_F3), LCA(KC_F4), LCA(KC_F5), KC_TRNS, KC_TRNS, KC_TRNS, LCA(KC_LEFT), KC_TRNS, LCA(KC_RIGHT), KC_TRNS, From 34fa8fd5d3f0c46135f22d5d24b098c9e7117b67 Mon Sep 17 00:00:00 2001 From: Lukas Stiebig Date: Wed, 8 Mar 2017 21:14:16 +0100 Subject: [PATCH 058/181] readme Added a readme.md file for the keymap german-lukas. --- keyboards/ergodox/keymaps/german-lukas/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 keyboards/ergodox/keymaps/german-lukas/README.md diff --git a/keyboards/ergodox/keymaps/german-lukas/README.md b/keyboards/ergodox/keymaps/german-lukas/README.md new file mode 100644 index 0000000000..3566b4ee64 --- /dev/null +++ b/keyboards/ergodox/keymaps/german-lukas/README.md @@ -0,0 +1,12 @@ +# About this keymap + +This keymap is based on the qwertz layout. +It has a key for pressing the left control and the left alt key at once. + +Linux makes a difference between AltGr and Control + Alt. Some keybindings are easier to press now. + +Also, I added a layer for pressing Control + Alt + F-Keys very fast. + +# Layer + +Each layer in the *keymap.c*-file has a comment showing the mappings of the layer. From 88e862e4728343fab4ed7e8dc44ae5594b702955 Mon Sep 17 00:00:00 2001 From: Stephen Tudor Date: Wed, 8 Mar 2017 16:00:23 -0500 Subject: [PATCH 059/181] Update smt keymaps for consistency --- keyboards/lets_split/keymaps/smt/keymap.c | 52 +++---- keyboards/planck/keymaps/smt/keymap.c | 56 ++++---- keyboards/preonic/keymaps/smt/keymap.c | 159 ++++++++++++++-------- keyboards/tv44/keymaps/smt/keymap.c | 24 ++-- 4 files changed, 171 insertions(+), 120 deletions(-) diff --git a/keyboards/lets_split/keymaps/smt/keymap.c b/keyboards/lets_split/keymaps/smt/keymap.c index 5ba5417a96..b7db699fdb 100644 --- a/keyboards/lets_split/keymaps/smt/keymap.c +++ b/keyboards/lets_split/keymaps/smt/keymap.c @@ -28,6 +28,12 @@ enum custom_keycodes { #define _______ KC_TRNS #define XXXXXXX KC_NO +// Custom macros +#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift +#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Alt+Shift) +#define MEH_GRV MEH_T(KC_GRV) // Tap for Backtick, hold for Meh (Ctrl+Alt+Shift) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Qwerty @@ -42,10 +48,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_QWERTY] = KEYMAP( \ - ALL_T(KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ - CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ - SFT_T(KC_ESC), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), \ - MEH_T(KC_GRV), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + CTL_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, SFT_ENT, \ + MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), /* Colemak @@ -60,10 +66,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_COLEMAK] = KEYMAP( \ - ALL_T(KC_TAB), KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ - CTL_T(KC_ESC), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ - SFT_T(KC_ESC), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), \ - MEH_T(KC_GRV), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ + CTL_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, SFT_ENT, \ + MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), /* Dvorak @@ -78,28 +84,28 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_DVORAK] = KEYMAP( \ - ALL_T(KC_TAB), KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ - CTL_T(KC_ESC), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, \ - SFT_T(KC_ESC), KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_T(KC_ENT), \ - MEH_T(KC_GRV), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + HPR_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ + CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, \ + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT, \ + MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), /* Lower * ,-----------------------------------------------------------------------------------. * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | $ | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | Home |PageUp| + * | $ | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | | | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | End |PageDn| + * | | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | | | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ [_LOWER] = KEYMAP( \ - KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ - KC_DLR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_4, KC_5, KC_6, KC_HOME, KC_PGUP, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_1, KC_2, KC_3, KC_END, KC_PGDN, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY + ALL_T(KC_0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + CTL_T(KC_DLR), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_4, KC_5, KC_6, _______, _______, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_1, KC_2, KC_3, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ), /* Raise @@ -110,14 +116,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | | | | | | | - | / | = | [ | ] | \ | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | Next | Vol- | Vol+ | Play | + * | | | | | | | | | Home |PageDn|PageUp| End | * `-----------------------------------------------------------------------------------' */ [_RAISE] = KEYMAP( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ - _______, _______, _______, _______, _______, _______, KC_UNDS, KC_QUES, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, _______, _______, _______, _______, _______, KC_MINS, KC_SLSH, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY + ALL_T(KC_TILD), KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + _______, _______, _______, _______, _______, _______, KC_UNDS, KC_QUES, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, _______, _______, _______, _______, _______, KC_MINS, KC_SLSH, KC_EQL, KC_LBRC, KC_RBRC, SFT_T(KC_BSLS), \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END ), /* Adjust (Lower + Raise) diff --git a/keyboards/planck/keymaps/smt/keymap.c b/keyboards/planck/keymaps/smt/keymap.c index afc82b49f9..2e1c355477 100644 --- a/keyboards/planck/keymaps/smt/keymap.c +++ b/keyboards/planck/keymaps/smt/keymap.c @@ -31,6 +31,12 @@ enum planck_keycodes { #define _______ KC_TRNS #define XXXXXXX KC_NO +// Custom macros +#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift +#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Alt+Shift) +#define MEH_GRV MEH_T(KC_GRV) // Tap for Backtick, hold for Meh (Ctrl+Alt+Shift) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Qwerty @@ -45,10 +51,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_QWERTY] = { - {ALL_T(KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, - {SFT_T(KC_ESC), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT)}, - {MEH_T(KC_GRV), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + {HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {CTL_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, SFT_ENT}, + {MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, /* Colemak @@ -63,10 +69,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_COLEMAK] = { - {ALL_T(KC_TAB), KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, - {CTL_T(KC_ESC), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT}, - {SFT_T(KC_ESC), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT)}, - {MEH_T(KC_GRV), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + {HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {CTL_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, SFT_ENT}, + {MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, /* Dvorak @@ -81,17 +87,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_DVORAK] = { - {ALL_T(KC_TAB), KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, - {CTL_T(KC_ESC), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS}, - {SFT_T(KC_ESC), KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_T(KC_ENT)}, - {MEH_T(KC_GRV), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + {HPR_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, + {CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS}, + {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT}, + {MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, /* Lower * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | Home |PageUp| + * | $ | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | Home |PageUp| * |------+------+------+------+------+------|------+------+------+------+------+------| * | | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | End |PageDn| * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -99,10 +105,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_LOWER] = { - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, - {_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_4, KC_5, KC_6, KC_HOME, KC_PGUP}, - {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_1, KC_2, KC_3, KC_END, KC_PGDN}, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} + {ALL_T(KC_0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, + {CTL_T(KC_DLR), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_4, KC_5, KC_6, _______, _______}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_1, KC_2, KC_3, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} }, /* Raise @@ -113,19 +119,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | | | | | | | - | / | = | [ | ] | \ | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | + * | | | | | | | | | Home |PageDn|PageUp| End | * `-----------------------------------------------------------------------------------' */ [_RAISE] = { - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, - {_______, _______, _______, _______, _______, _______, KC_UNDS, KC_QUES, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, - {_______, _______, _______, _______, _______, _______, KC_MINS, KC_SLSH, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} + {ALL_T(KC_TILD), KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, + {_______, _______, _______, _______, _______, _______, KC_UNDS, KC_QUES, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, + {_______, _______, _______, _______, _______, _______, KC_MINS, KC_SLSH, KC_EQL, KC_LBRC, KC_RBRC, SFT_T(KC_BSLS)}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END} }, /* Adjust (Lower + Raise) * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | + * | | Reset| | | | | | | | | | Reset| * |------+------+------+------+------+-------------+------+------+------+------+------| * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | * |------+------+------+------+------+------|------+------+------+------+------+------| @@ -135,7 +141,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_ADJUST] = { - {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, + {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET}, {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} diff --git a/keyboards/preonic/keymaps/smt/keymap.c b/keyboards/preonic/keymaps/smt/keymap.c index ba05d9ad53..690feca472 100644 --- a/keyboards/preonic/keymaps/smt/keymap.c +++ b/keyboards/preonic/keymaps/smt/keymap.c @@ -9,15 +9,17 @@ // 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 _DVORAK 0 -#define _QWERTY 1 -#define _LOWER 2 -#define _RAISE 3 +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 #define _ADJUST 16 enum preonic_keycodes { - DVORAK = SAFE_RANGE, - QWERTY, + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, LOWER, RAISE, BACKLIT @@ -27,28 +29,13 @@ enum preonic_keycodes { #define _______ KC_TRNS #define XXXXXXX KC_NO -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +// Custom macros +#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift +#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Alt+Shift) +#define MEH_GRV MEH_T(KC_GRV) // Tap for Backtick, hold for Meh (Ctrl+Alt+Shift) -/* Dvorak - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | O | E | U | I | D | H | T | N | S | - | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_DVORAK] = { - {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_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_MINS}, - {SFT_T(KC_ESC), KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_T(KC_ENT)}, - {ALL_T(KC_GRV), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Qwerty * ,-----------------------------------------------------------------------------------. @@ -60,24 +47,66 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ [_QWERTY] = { - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, _______}, - {_______, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, - {_______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, + {CTL_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, SFT_ENT}, + {MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = { + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, + {CTL_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, SFT_ENT}, + {MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | - | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = { + {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, + {HPR_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC}, + {CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS}, + {KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT}, + {MEH_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, /* Lower * ,-----------------------------------------------------------------------------------. * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | Home |PageUp| + * | $ | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | Home |PageUp| * |------+------+------+------+------+------|------+------+------+------+------+------| * | | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | End |PageDn| * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -85,11 +114,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_LOWER] = { - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, - {_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_4, KC_5, KC_6, KC_HOME, KC_PGUP}, - {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_1, KC_2, KC_3, KC_END, KC_PGDN}, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} + {ALL_T(KC_GRV), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, + {ALL_T(KC_0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, + {CTL_T(KC_DLR), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_4, KC_5, KC_6, _______, _______}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_1, KC_2, KC_3, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} }, /* Raise @@ -102,24 +131,24 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | | | | | | | - | / | = | [ | ] | \ | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | + * | | | | | | | | | Home |PageDn|PageUp| End | * `-----------------------------------------------------------------------------------' */ [_RAISE] = { - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, - {_______, _______, _______, _______, _______, _______, KC_UNDS, KC_QUES, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, - {_______, _______, _______, _______, _______, _______, KC_MINS, KC_SLSH, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} + {ALL_T(KC_TILD), KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, + {ALL_T(KC_TILD), KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, + {_______, _______, _______, _______, _______, _______, KC_UNDS, KC_QUES, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, + {_______, _______, _______, _______, _______, _______, KC_MINS, KC_SLSH, KC_EQL, KC_LBRC, KC_RBRC, SFT_T(KC_BSLS)}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END} }, /* Adjust (Lower + Raise) * ,-----------------------------------------------------------------------------------. * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | Reset| | | | | | | | | | Del | + * | | Reset| | | | | | | | | | Reset| * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|AudOff|AGnorm|AGswap|Dvorak|Qwerty| | | | + * | | | |Aud on|AudOff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | * |------+------+------+------+------+------|------+------+------+------+------+------| * | |Voice-|Voice+|Mus on|MusOff|MidiOn|MidOff| | | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -128,8 +157,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_ADJUST] = { {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, - {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, - {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, DVORAK, QWERTY, _______, _______, _______}, + {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET}, + {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} } @@ -145,8 +174,9 @@ float tone_startup[][2] = { {NOTE_B6, 8} }; -float tone_dvorak[][2] = SONG(DVORAK_SOUND); float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); float tone_goodbye[][2] = SONG(GOODBYE_SOUND); @@ -160,15 +190,6 @@ void persistant_default_layer_set(uint16_t default_layer) { bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { - case DVORAK: - if (record->event.pressed) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_dvorak, false, 0); - #endif - persistant_default_layer_set(1UL<<_DVORAK); - } - return false; - break; case QWERTY: if (record->event.pressed) { #ifdef AUDIO_ENABLE @@ -178,6 +199,24 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; case LOWER: if (record->event.pressed) { layer_on(_LOWER); diff --git a/keyboards/tv44/keymaps/smt/keymap.c b/keyboards/tv44/keymaps/smt/keymap.c index de5ce03e25..532e74de08 100644 --- a/keyboards/tv44/keymaps/smt/keymap.c +++ b/keyboards/tv44/keymaps/smt/keymap.c @@ -32,8 +32,8 @@ enum planck_keycodes { // Custom macros #define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl #define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift -#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper -#define ALT_GRV ALT_T(KC_GRV) // Tap for Backtick, hold for Alt +#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Alt+Shift) +#define ALT_GRV ALT_T(KC_GRV) // Tap for Backtick, hold for Alt (Ctrl+Alt+Shift) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -117,13 +117,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_LOWER] = KEYMAP_TV45( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/ - KC_0 , KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL , +ALL_T(KC_0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL , /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/ - KC_DLR , KC_4, KC_5, KC_6, KC_DOT, KC_PLUS, KC_ASTR, KC_4, KC_5, KC_6, KC_DOT, KC_PGUP , +CTL_T(KC_DLR), KC_4, KC_5, KC_6, KC_DOT, KC_PLUS, KC_ASTR, KC_4, KC_5, KC_6, KC_DOT, KC_PGUP , /*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ - KC_EQL , KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_SLSH, KC_1, KC_2, KC_3, KC_UP, KC_PGDN , +SFT_T(KC_EQL), KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_SLSH, KC_1, KC_2, KC_3, KC_UP, SFT_T(KC_PGDN), /*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ - BACKLIT , _______ , _______ , KC_HOME , KC_END , _______ , KC_LEFT, KC_DOWN, KC_RGHT ), +ALT_T(BACKLIT), _______ , _______ , KC_HOME , KC_END , _______ , KC_LEFT, KC_DOWN, KC_RGHT ), /*`---------+---------------+---------+-------^^^------+-------^^^-------+----------+--------+--------+--------------'*/ /* Raise @@ -139,18 +139,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_RAISE] = KEYMAP_TV45( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/ - KC_TILD,KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL , +ALL_T(KC_TILD),KC_EXLM,KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL , /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/ - KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_QUES, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE , +CTL_T(KC_F1), KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_QUES, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE , /*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ - KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MINS, KC_SLSH, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS , + SFT_T(KC_F7), KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MINS, KC_SLSH, KC_EQL, KC_LBRC, KC_RBRC, SFT_T(KC_BSLS), /*|----------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`---------------|*/ - BACKLIT , _______ , _______ , KC_MPLY , KC_MNXT , _______ , KC_MUTE, KC_VOLD, KC_VOLU ), +ALT_T(BACKLIT), _______ , _______ , KC_MPLY , KC_MNXT , _______ , KC_MUTE, KC_VOLD, KC_VOLU ), /*`---------+---------------+---------+-------^^^------+-------^^^-------+----------+--------+--------+--------------'*/ /* Adjust (Lower + Raise) * ,---------+------+------+------+------+------+------+------+------+------+------+---------. - * | | Reset| | | | | | | | | | Del | + * | | Reset| | | | | | | | | | Reset | * |---------`------`------`------`------`------`------`------`------`------`------`---------| * | | | | | |AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | * |----------`------`------`------`------`------`------`------`------`------`------`--------| @@ -161,7 +161,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_ADJUST] = KEYMAP_TV45( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------.*/ - _______, RESET , _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL , + _______, RESET , _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET , /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`-----------------|*/ _______ ,_______, _______, _______, _______, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______ , /*|---------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`----------------|*/ From b5bfb5104b63766ab9a54509302a3f4b0b1d7b16 Mon Sep 17 00:00:00 2001 From: milestogo Date: Wed, 8 Mar 2017 15:48:39 -0800 Subject: [PATCH 060/181] docs for babblepaste --- .../MS-sculpt-mobile/babblePaste.txt | 602 ++++-------------- .../keymaps/milestogo/keymap.c | 10 +- 2 files changed, 123 insertions(+), 489 deletions(-) diff --git a/keyboards/handwired/MS-sculpt-mobile/babblePaste.txt b/keyboards/handwired/MS-sculpt-mobile/babblePaste.txt index 6170ec7af5..cf75e153e8 100644 --- a/keyboards/handwired/MS-sculpt-mobile/babblePaste.txt +++ b/keyboards/handwired/MS-sculpt-mobile/babblePaste.txt @@ -1,489 +1,123 @@ -/* A library to output the right key shortcut in any common app. -Given a global variable babble_mode to show the environment and a -key that calls the paste macro, do the right type of paste. -Setting the context is done by another macro, or TBD interaction with the host. + BabblePaste is a library of common macros used to make sure that +you can have one "paste" button on one layer, and it will do the +right thing on any OS or app. Windows=Ctrl-V. Mac = Command-V and so on. -Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts -and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c -*/ - -#include "eeconfig.h" +The babblepaste library looks for the current status in a babble_mode global variable. +To switch modes, run the switch_babble_mode() function, or a pre defined macro. +Currently supported are Windows, OS X, Gnome/kde, Emacs, VI and readline, +across 42+ common macro actions. -// Comment out anything you will never use. -// Windows. -#define MS_MODE 0 -#define MAC_MODE 1 -//aka gnome+KDE -#define LINUX_MODE 2 -#define EMACS_MODE 3 -#define VI_MODE 4 -//#define WORDSTAR_MODE 5 +###To use the library +1) Paste the following into your config.h. + +//////Begin////// +#define USE_BABLPASTE 1 + +#ifdef USE_BABLPASTE +/* define BabblePaste maps. Whatever = 0 will be the default. */ +// MAC_MODE 0 +// MS_MODE 1 +// LINUX_MODE 2 +// EMACS_MODE 3 +// VI_MODE 3 // Readline and tmux -#define READMUX 6 - -// GLOBAL variable. Sets startup default if no eeppom -char babble_mode = MAC_MODE ; - - -/* minimum set required for babble: - // Cut & Paste - BABL_UNDO - BABL_REDO - BABL_CUT - BABL_COPY - BABL_PASTE - BABL_SELECT_ALL - - // Movement - BABL_DEL_RIGHT_1C - BABL_DEL_RIGHT_1C - BABL_DEL_LEFT_WORD - BABL_DEL_RIGHT_WORD - BABL_GO_LEFT_1C - BABL_GO_LEFT_WORD - BABL_GO_RIGHT_WORD - BABL_GOTO_START_LINE - BABL_GOTO_START_DOC - BABL_GOTO_END_LINE - BABL_GOTO_END_DOC - BABL_GOTO_NEXT_LINE // down arrow will do. - BABL_GOTO_PREV_LINE // up arrow will do. - BABL_PGDN - BABL_PGUP - - // GUI - BABL_FIND - BABL_FIND_NEXT - BABL_FIND_REPLACE - BABL_RUNAPP - BABL_SWITCH_NEXT - BABL_SWITCH_LAST // previous - BABL_CLOSE_APP - BABL_HELP -*/ - - - - -static macro_t *babblePaste (keyrecord_t *record, uint16_t shortcut) { - - switch(babble_mode) { - -#ifdef MS_MODE - case MS_MODE: - switch(shortcut) { - - case BABL_UNDO: - return MACRO( D(LCTRL), T(Z), U(LCTRL), END ); - case BABL_REDO: - return MACRO( D(LCTRL), T(Y), U(LCTRL), END ); - case BABL_CUT: - return MACRO( D(LCTRL), T(X), U(LCTRL), END ); - case BABL_COPY: - return MACRO( D(LCTRL), T(C), U(LCTRL), END ); - case BABL_PASTE: - return MACRO( D(LCTRL), T(V), U(LCTRL), END ); - case BABL_SELECT_ALL: - return MACRO( D(LCTRL), T(A), U(LCTRL), END ); - case BABL_DEL_RIGHT_1C: - return MACRO( D(DEL), END ); - case BABL_DEL_LEFT_WORD: - return MACRO( D(LCTRL), T(BSPACE), U(LCTRL), END ); - case BABL_DEL_RIGHT_WORD: - return MACRO( D(LCTRL), T(DEL), U(LCTRL), END ); - case BABL_GO_LEFT_1C: - return MACRO( T(LEFT), END ); - case BABL_GO_RIGHT_1C: - return MACRO( T(RIGHT), END ); - case BABL_GO_LEFT_WORD: - return MACRO( D(LCTRL), T(LEFT), U(LCTRL), END ); - case BABL_GO_RIGHT_WORD: - return MACRO( D(LCTRL), T(RIGHT), U(LCTRL), END ); - case BABL_GOTO_START_LINE: - return MACRO( T(HOME), END ); - case BABL_GOTO_START_DOC: - return MACRO( D(LCTRL),T(HOME), U(LCTRL),END ); - case BABL_GOTO_END_LINE: - return MACRO( T(END), END ); - case BABL_GOTO_END_DOC: - return MACRO( D(LCTRL),T(END), U(LCTRL),END ); - case BABL_GOTO_NEXT_LINE: - return MACRO( T(DOWN), END ); - case BABL_GOTO_PREV_LINE: - return MACRO( T(UP), END ); - case BABL_PGDN: - return MACRO( T(PGDN), END ); - case BABL_PGUP: - return MACRO( T(PGUP), END ); - case BABL_FIND: - return MACRO( D(LCTRL),T(F), U(LCTRL),END ); - case BABL_FIND_NEXT: - return MACRO( T(F3),END ); - case BABL_FIND_REPLACE: - return MACRO( D(LCTRL),T(H), U(LCTRL),END ); - case BABL_RUNAPP: - return MACRO( D(LGUI),T(R), U(LGUI),END ); - case BABL_SWITCH_APP_NEXT: - return MACRO( D(LALT),T(TAB), U(LALT),END ); - case BABL_SWITCH_APP_LAST: - return MACRO( D(LSFT),D(LALT),T(TAB), U(LALT), U(LSFT),END ); - case BABL_CLOSE_APP: - return MACRO( D(LALT),T(F4), U(LALT),END ); - case BABL_HELP: - return MACRO( T(F1),END ); - break; - - return MACRO_NONE; - } - -#endif -#ifdef LINUX_MODE - case LINUX_MODE: - switch(shortcut) { - - case BABL_UNDO: - return MACRO( D(LCTRL), T(Z), U(LCTRL), END ); - case BABL_REDO: - return MACRO( D(LCTRL), T(Y), U(LCTRL), END ); - case BABL_CUT: - return MACRO( D(LCTRL), T(X), U(LCTRL), END ); - case BABL_COPY: - return MACRO( D(LCTRL), T(C), U(LCTRL), END ); - case BABL_PASTE: - return MACRO( D(LCTRL), T(V), U(LCTRL), END ); - case BABL_SELECT_ALL: - return MACRO( D(LCTRL), T(A), U(LCTRL), END ); - case BABL_DEL_RIGHT_1C: - return MACRO( D(DEL), END ); - case BABL_DEL_LEFT_WORD: - return MACRO( D(LCTRL), T(BSPACE), U(LCTRL), END ); - case BABL_DEL_RIGHT_WORD: - return MACRO( D(LCTRL), T(DEL), U(LCTRL), END ); - case BABL_GO_LEFT_1C: - return MACRO( T(LEFT), END ); - case BABL_GO_RIGHT_1C: - return MACRO( T(RIGHT), END ); - case BABL_GO_LEFT_WORD: - return MACRO( D(LCTRL), T(LEFT), U(LCTRL), END ); - case BABL_GO_RIGHT_WORD: - return MACRO( D(LCTRL), T(RIGHT), U(LCTRL), END ); - case BABL_GOTO_START_LINE: - return MACRO( T(HOME), END ); - case BABL_GOTO_START_DOC: - return MACRO( D(LCTRL),T(HOME), U(LCTRL),END ); - case BABL_GOTO_END_LINE: - return MACRO( T(END), END ); - case BABL_GOTO_END_DOC: - return MACRO( D(LCTRL),T(END), U(LCTRL),END ); - case BABL_GOTO_NEXT_LINE: - return MACRO( T(DOWN), END ); - case BABL_GOTO_PREV_LINE: - return MACRO( T(UP), END ); - case BABL_PGDN: - return MACRO( T(PGDN), END ); - case BABL_PGUP: - return MACRO( T(PGUP), END ); - case BABL_FIND: - return MACRO( D(LCTRL),T(F), U(LCTRL),END ); - case BABL_FIND_NEXT: - /* return MACRO( T(F3),END ); KDE */ - return MACRO( D(LCTRL),T(G), U(LCTRL),END ); // Gnome*/ - case BABL_FIND_REPLACE: - /* return MACRO( D(LCTRL),T(R), U(LCTRL),END ); KDE */ - return MACRO( D(LCTRL),T(H), U(LCTRL),END ); // Gnome*/ - case BABL_RUNAPP: - return MACRO( D(LALT),T(F2), U(LALT),END ); - case BABL_SWITCH_APP_NEXT: - return MACRO( D(LCTL),T(TAB), U(LCTL),END ); - case BABL_SWITCH_APP_LAST: - return MACRO( D(LSFT),D(LCTL),T(TAB), U(LCTL), U(LSFT),END ); - case BABL_CLOSE_APP: - return MACRO( D(LALT),T(F4), U(LALT),END ); - case BABL_HELP: - return MACRO_NONE; - break; - - return MACRO_NONE; - } - -#endif - - - -#ifdef MAC_MODE - case MAC_MODE: - switch(shortcut) { - - case BABL_UNDO: - return MACRO( D(LGUI), T(Z), U(LGUI), END ); - case BABL_REDO: - return MACRO( D(LSFT),D(LGUI), T(Z), U(LSFT),U(LGUI), END ); - case BABL_CUT: - return MACRO( D(LGUI), T(X), U(LGUI), END ); - case BABL_COPY: - return MACRO( D(LGUI), T(C), U(LGUI), END ); - case BABL_PASTE: - return MACRO( D(LGUI), T(V), U(LGUI), END ); - case BABL_SELECT_ALL: - return MACRO( D(LGUI), T(A), U(LGUI), END ); - case BABL_DEL_RIGHT_1C: - return MACRO( D(DEL), END ); - case BABL_DEL_LEFT_WORD: - return MACRO( D(LALT), T(BSPACE), U(LALT), END ); - case BABL_DEL_RIGHT_WORD: - return MACRO( D(LALT), T(DEL), U(LALT), END ); - case BABL_GO_LEFT_1C: - return MACRO( T(LEFT), END ); - case BABL_GO_RIGHT_1C: - return MACRO( T(RIGHT), END ); - case BABL_GO_LEFT_WORD: - return MACRO( D(LALT), T(LEFT), U(LALT), END ); - case BABL_GO_RIGHT_WORD: - return MACRO( D(LALT), T(RIGHT), U(LALT), END ); - case BABL_GOTO_START_LINE: - return MACRO( D(LGUI), T(LEFT), U(LGUI), END ); - case BABL_GOTO_START_DOC: - return MACRO( D(LGUI),T(UP), U(LGUI),END ); - case BABL_GOTO_END_LINE: - return MACRO( D(LGUI), T(RIGHT), U(LGUI), END ); - case BABL_GOTO_END_DOC: - return MACRO( D(LGUI),T(DOWN), U(LGUI),END ); - case BABL_GOTO_NEXT_LINE: - return MACRO( T(DOWN), END ); - case BABL_GOTO_PREV_LINE: - return MACRO( T(UP), END ); - case BABL_PGDN: - return MACRO( D(LALT), T(DOWN), U(LALT), END ); - case BABL_PGUP: - return MACRO( D(LALT), T(UP), U(LALT), END ); - case BABL_FIND: - return MACRO( D(LGUI),T(F), U(LGUI),END ); - case BABL_FIND_NEXT: - return MACRO( D(LGUI),T(G), U(LGUI),END ); - case BABL_FIND_REPLACE: - return MACRO( D(LGUI),T(F), U(LGUI),END ); - case BABL_RUNAPP: - return MACRO( D(LGUI),T(R), U(LGUI),END ); - case BABL_SWITCH_APP_NEXT: - return MACRO( D(LGUI),T(TAB), U(LGUI),END ); - case BABL_SWITCH_APP_LAST: - return MACRO( D(LSFT),D(LGUI),T(TAB), U(LGUI), U(LSFT),END ); - case BABL_CLOSE_APP: - return MACRO( D(LGUI),T(Q), U(LGUI),END ); - case BABL_HELP: - return MACRO( D(LSFT),D(LGUI),T(SLASH), U(LGUI), U(LSFT),END ); - break; - - return MACRO_NONE; - } - -#endif - -#ifdef EMACS_MODE - case EMACS_MODE: - switch(shortcut) { -//probably should allow meta to not be ALT - case BABL_UNDO: - return MACRO( D(LCTL), T(X), U(LCTL),T(C), END ); - case BABL_REDO: - return MACRO( D(LCTL), T(X), U(LCTL),T(C), END ); // arguably - case BABL_CUT: - return MACRO( D(LCTL), T(W), U(LCTL), END ); - case BABL_COPY: - return MACRO( D(LALT), T(W), U(LALT), END ); - case BABL_PASTE: - return MACRO( D(LCTL), T(Y), U(LCTL), END ); - case BABL_SELECT_ALL: - return MACRO(D(LCTL), T(X), U(LCTL),T(H), END ); - case BABL_DEL_RIGHT_1C: - return MACRO( D(LCTL), T(D), U(LCTL),END ); - case BABL_DEL_LEFT_WORD: - return MACRO( D(LCTL), T(BSPACE), U(LCTL), END ); - case BABL_DEL_RIGHT_WORD: - return MACRO( D(LALT), T(D), U(LALT), END ); - case BABL_GO_LEFT_1C: - return MACRO( T(LEFT), END ); - case BABL_GO_RIGHT_1C: - return MACRO( T(RIGHT), END ); - case BABL_GO_LEFT_WORD: - return MACRO( D(LALT), T(B), U(LALT), END ); - case BABL_GO_RIGHT_WORD: - return MACRO( D(LALT), T(F), U(LALT), END ); - case BABL_GOTO_START_LINE: - return MACRO( D(LCTRL), T(A), U(LCTRL), END ); - case BABL_GOTO_START_DOC: - return MACRO( D(LALT), D(LSFT), T(COMM),U(LSFT), U(LALT) ,END ); - case BABL_GOTO_END_LINE: - return MACRO( D(LCTRL), T(E), U(LCTRL), END ); - case BABL_GOTO_END_DOC: - return MACRO( D(LALT), D(LSFT), T(DOT),U(LSFT), U(LALT) ,END ); - case BABL_GOTO_NEXT_LINE: - return MACRO( D(LCTRL), T(N), U(LCTRL), END ); - case BABL_GOTO_PREV_LINE: - rreturn MACRO( D(LCTRL), T(P), U(LCTRL), END ); - case BABL_PGDN: - return MACRO(D(LCTRL), T(V), U(LCTRL), END ); - case BABL_PGUP: - return MACRO( D(LALT), T(V), U(LALT), END ); - case BABL_FIND: - return MACRO( D(LCTRL), T(S), U(LCTRL),END ); - case BABL_FIND_NEXT: - return MACRO( D(LCTRL), T(S), U(LCTRL),END ); - case BABL_FIND_REPLACE: - return MACRO( D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END ); - case BABL_RUNAPP: - return MACRO( D(LALT), T(X), U(LALT),T(S),T(H),T(E),T(L),T(L),END );// arguably - case BABL_SWITCH_APP_NEXT: - return MACRO( D(LCTL), T(X), U(LCTL),T(RIGHT), END ); // arguably - case BABL_SWITCH_APP_LAST: - return MACRO( D(LCTL), T(X), U(LCTL),T(LEFT), END ); // arguably - case BABL_CLOSE_APP: - return MACRO(D(LCTL), T(X), U(LCTL),T(C),END ); - case BABL_HELP: - return MACRO( D(LCTL),T(H), U(LCTL),T(A),END); // start search in help - break; - - return MACRO_NONE; - } - -#endif -#ifdef VI_MODE - case VI_MODE: - switch(shortcut) { -//assume esc is already called - case BABL_UNDO: - return MACRO( T(U), END ); - case BABL_REDO: - return MACRO( D(LCTL), T(R), U(LCTL), END ); - case BABL_CUT: - return MACRO( T(X), END ); - case BABL_COPY: - return MACRO( T(Y),END ); - case BABL_PASTE: - return MACRO( T(P), END ); - case BABL_SELECT_ALL: - return MACRO( T(COLN),T(PERC),T(Y), END ); // wrong but helpful? - case BABL_DEL_RIGHT_1C: - return MACRO( T(X),END ); - case BABL_DEL_LEFT_WORD: - return MACRO( T(D),T(G),T(E),END ); - case BABL_DEL_RIGHT_WORD: - return MACRO( T(D),T(W),END ); - case BABL_GO_LEFT_1C: - return MACRO( T(H), END ); - case BABL_GO_RIGHT_1C: - return MACRO( T(L), END ); - case BABL_GO_LEFT_WORD: - return MACRO( T(B),END ); - case BABL_GO_RIGHT_WORD: - return MACRO( T(W), END ); - case BABL_GOTO_START_LINE: - return MACRO( T(CIRC), END ); - case BABL_GOTO_START_DOC: - return MACRO( T(G),T(G) ,END ); - case BABL_GOTO_END_LINE: - return MACRO( T(DLR), END ); - case BABL_GOTO_END_DOC: - return MACRO( D(LSFT), T(G),U(LSFT), ,END ); - case BABL_GOTO_NEXT_LINE: - return MACRO( T(J), END ); - case BABL_GOTO_PREV_LINE: - rreturn MACRO( T(K), END ); - case BABL_PGDN: - return MACRO(D(LCTRL), T(F), U(LCTRL), END ); - case BABL_PGUP: - return MACRO( D(LCTRL), T(B), U(LCTRL), END ); - case BABL_FIND: - return MACRO( T(SLASH),END ); - case BABL_FIND_NEXT: - return MACRO( T(N),END ); - case BABL_FIND_REPLACE: - return MACRO( D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END ); - case BABL_RUNAPP: - return MACRO_NONE; - case BABL_SWITCH_APP_NEXT: - return MACRO_NONE; - case BABL_SWITCH_APP_LAST: - return MACRO_NONE; - case BABL_CLOSE_APP: - return MACRO(T(COLN), T(Q), T(EXLM),END ); - case BABL_HELP: - return MACRO(T(COLN),T(H),END); // start search in help - break; - - return MACRO_NONE; - } - +// READMUX_MODE 2 +// WORDSTAR_MODE 5 #endif -#ifdef READMUX_MODE -// I havent decided how much to do bash and how much tmux - case READMUX_MODE: - switch(shortcut) { - case BABL_UNDO: - return MACRO( D(LALT), T(R), U(LALT) , END ); - case BABL_REDO: - return MACRO( D(LCTL), T(X), U(LCTL),T(C), END ); // arguably - case BABL_CUT: - return MACRO( D(LCTL), T(K), U(LCTL), END ); // wrong half the time - case BABL_COPY: - return MACRO_NONE; - case BABL_PASTE: - return MACRO( D(LCTL), T(Y), U(LCTL), END ); - case BABL_SELECT_ALL: - return MACRO(D(LCTL), T(A), T(K), T(Y), U(LCTL) , END ); // should this be tmux all? - case BABL_DEL_RIGHT_1C: - return MACRO( D(LCTL), T(D), U(LCTL),END ); - case BABL_DEL_LEFT_WORD: - return MACRO( D(LCTL), T(W), U(LCTL), END ); - case BABL_DEL_RIGHT_WORD: - return MACRO( D(LALT), T(D), U(LALT), END ); - case BABL_GO_LEFT_1C: - return MACRO( T(LEFT), END ); - case BABL_GO_RIGHT_1C: - return MACRO( T(RIGHT), END ); - case BABL_GO_LEFT_WORD: - return MACRO( D(LALT), T(B), U(LALT), END ); - case BABL_GO_RIGHT_WORD: - return MACRO( D(LALT), T(F), U(LALT), END ); - case BABL_GOTO_START_LINE: - return MACRO( D(LCTRL), T(A), U(LCTRL), END ); - case BABL_GOTO_START_DOC: - return MACRO_NONE; // tmux? - case BABL_GOTO_END_LINE: - return MACRO( D(LCTRL), T(E), U(LCTRL), END ); - case BABL_GOTO_END_DOC: - return MACRO_NONE; // tmux? - case BABL_GOTO_NEXT_LINE: - return MACRO( D(LCTRL), T(N), U(LCTRL), END ); - case BABL_GOTO_PREV_LINE: - return MACRO( D(LCTRL), T(P), U(LCTRL), END ); - case BABL_PGDN: - return MACRO( T(PGDN), END ); - case BABL_PGUP: - return MACRO( T(PGUP), END ); - case BABL_FIND: - return MACRO( D(LCTRL), T(R), U(LCTRL), END ); // search history - case BABL_FIND_NEXT: - eturn MACRO( D(LCTRL), T(S), U(LCTRL), END ); - case BABL_FIND_REPLACE: - return MACRO_NONE; // tmux? - case BABL_RUNAPP: - return MACRO( D(LCTRL), T(B), U(LCTRL), T(C),END ); //tmux - case BABL_SWITCH_APP_NEXT: - return MACRO( D(LCTRL), T(B), U(LCTRL), T(N),END ); //tmux - case BABL_SWITCH_APP_LAST: - return MACRO( D(LCTRL), T(B), U(LCTRL), T(P),END ); //tmux - case BABL_CLOSE_APP: - return MACRO( D(LCTRL), T(B), U(LCTRL), T(D),END); // usually what I want - break; - case BABL_HELP: - return MACRO_NONE; - break; - - return MACRO_NONE; - } - -#endif - return MACRO_NONE; -} \ No newline at end of file + +// Uncomment these to remove options an free up flash space + +// This removes everything but cursor movement +// BABL_MOVEMENTONLY +// and this just removes browser shortcuts +// BABL_NOBROWSER +///////End/////// + +2) Add the following to your keymap in the action_get_macro + +//////Begin////// +#ifdef USE_BABLPASTE + + if( id >= BABL_START_NUM && id < (BABL_START_NUM + BABL_NUM_MACROS ) ) { + if (record->event.pressed) { // is there a case where this isn't desired? + + babblePaste ( record, id ); + return MACRO_NONE; + } + } +#endif +///////End/////// + +3) add Babbelpaste actions to your keymap. See the full list in babblePaste.h, or the +list below +B_L1C // go left 1 char +B_R1C // go Right 1 char + B_L1W //GO_LEFT_1 WORD + B_R1W //BABL_GO_RIGHT_1 WORD + B_GSOL // BABL_GOTO_START of _LINE + B_GEOL // BABL_GOTO_END_LINE + B_GTOP //BABL_GOTO_START_DOC + B_GEND //BABL_GO_END_DOC + B_DOWN //BABL_GO_NEXT_LINE + B_UP // BABL_GO_PREV_LINE + B_PGDN //PGDN + B_PGUP //PGUP +// B_BKSP //backspace so why bother. + B_DEL // DEL_RIGHT_1 Char // usually = Del + B_DLW // DEL_LEFT_ 1 WORD) + B_DRW //DEL_RIGHT_1 WORD + B_DEOL // delete from cursor to end of line + B_DSOL // delete from cursor to begining line + B_UNDO //UNDO + B_REDO // REDO + B_CUT // CUT) + B_COPY // COPY) + B_PAST // PASTE) + B_SELA // SELECT_ALL + B_FIND // FIND) + B_FINDN //FIND_NEXT) + B_FINDR // FIND_REPLACE) + B_RAPP // open application launcher + B_NAPP // switch to next app + B_PAPP // switch to previous app + B_CAPP // CLOSE_APP) + B_HELP // HELP) + B_NTAB // BROWSER_NEW_TAB) + B_CTAB //BROWSER_CLOSE_TAB) + B_ROTB //BROWSER_REOPEN_LAST_TAB) + B_NXTB //BROWSER_NEXT_TAB) + B_PTAB //BROWSER_PREV_TAB) + B_NURL //BROWSER_jump to URL_BAR) + B_BFWD // BROWSER_FORWARD (in history) + B_BBAK //BROWSER_BACK (in history) + B_BFND // BROWSER_FIND) + B_BOOK //BROWSER_New BOOKMARK) + B_BDEV //BROWSER_ Open DEV_TOOLS) // hard one to remember + B_BRLD // BROWSER_RELOAD Page + B_BFUlL // BROWSER_FULLSCREEN) + B_ZMIN // BROWSER_ZOOM_IN) + B_ZMOT //BROWSER_ZOOM_OUT) + + +#### Development notes +-Why a new function? Because it would make the keymap too ugly to put it there. +-Why not return the macro to action_get_macro? Because I kept running into scope problems +and pointers to the wrong type. +-Why not an array of arrays as a lookup instead of a function? That would allow you +to store the lookup table in PROGMEM. True, but that takes more pre-processor skill +than I had. + +-Have you tested this on every platform? No. Submit a patch. + + +### Next steps for someone. +Make it easier to pair macros with modifiers. So key foo will jump to start of line, and +Shift(foo) will jump to the first tab in a browser. + +## Thanks + +Thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts +and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c +And of course QMK... + diff --git a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c index 3b2f53a0c1..395a9fb470 100644 --- a/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c +++ b/keyboards/handwired/MS-sculpt-mobile/keymaps/milestogo/keymap.c @@ -100,7 +100,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \ M(VIBRK), KC_CIRC, KC_LCBR, KC_RCBR,KC_AT, KC_PERC, ____, KC_LBRC,KC_LPRN,KC_RPRN,KC_UNDS, ____, ____, ____,\ ____, KC_EXLM, KC_HASH, KC_0, KC_EQL, KC_LCBR, KC_RCBR,KC_MINS,KC_1, KC_PLUS,KC_RBRC, KC_GRV, ____, ____,\ - ____, KC_SCLN, KC_TILDE, KC_COLN, KC_TILDE, KC_PIPE, KC_DLR, KC_ASTR, ____, KC_DOT , KC_SLSH, ____, ____, ____,\ + ____, KC_SCLN, KC_TILDE, KC_COLN, KC_TILDE, KC_PIPE, KC_DLR, KC_ASTR, ____, KC_DOT , KC_SLSH, ____, ____, ____,\ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ ), /* @@ -108,11 +108,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * -------------------------------------------------------------------------------' * | | | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Bakspace| Del| * --------------------------------------------------------------------------- -* | tab | q | w |Find| |pTab |DSOL|DelW| Up |DelW|DEOL| [ | ] | \ | | +* | tab | | |Find| |pTab |DSOL|DelW| Up |DelW|DEOL| [ | ] | \ | | * -------------------------------------------------------------------------------' -* |Bak/Mov| a | s | d | |nTab |GSOL| <- | Dwn | -> | EOL | ' | enter |PgUp| +* |Bak/Mov| | | | |nTab |GSOL| <- | Dwn | -> | EOL | ' | enter |PgUp| * -------------------------------------------------------------------------------- -* |Lsft |Undo| Cut|Copy|Pste| b | n | m | , | . | / | Rsft| Up| PgDn| +* |Lsft |Undo| Cut|Copy|Pste| | | | | | / | Rsft| Up| PgDn| * --------------------------------------------------------------------------------- * |Lctl |Lgui |Lalt | Space/Sym | GUI | Sym | Rctl |Left|Down|Rght| * --------------------------------------------------------------------------------- @@ -189,7 +189,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { -/* If this is in the range of BABL macros, call a separate function */ +/* If id is in the range of BABL macros, call the babl function */ /* Any clever remapping with modifiers should happen here e.g. shift bablkey does opposite*/ #ifdef USE_BABLPASTE From 7c7a77d4bf8f35cd7f59119be0e95b5d28063988 Mon Sep 17 00:00:00 2001 From: Erez Zukerman Date: Wed, 8 Mar 2017 19:43:10 -0500 Subject: [PATCH 061/181] Tweaks keymap to reset on boot --- keyboards/ergodox/keymaps/reset_eeprom/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/ergodox/keymaps/reset_eeprom/keymap.c b/keyboards/ergodox/keymaps/reset_eeprom/keymap.c index f708454ce2..8d68976585 100644 --- a/keyboards/ergodox/keymaps/reset_eeprom/keymap.c +++ b/keyboards/ergodox/keymaps/reset_eeprom/keymap.c @@ -111,7 +111,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { // Runs just one time when the keyboard initializes. void matrix_init_user(void) { - + eeconfig_init(); }; From 8d4bc714e4e69dd89b0ef7f1bad60e6ca6c0f791 Mon Sep 17 00:00:00 2001 From: Stephen Tudor Date: Wed, 8 Mar 2017 23:16:58 -0500 Subject: [PATCH 062/181] Update smt keymap READMEs --- keyboards/lets_split/keymaps/smt/keymap.c | 108 ++++++++++----------- keyboards/lets_split/keymaps/smt/readme.md | 88 +++++++++++++++++ keyboards/planck/keymaps/smt/keymap.c | 4 +- keyboards/planck/keymaps/smt/readme.md | 91 ++++++++++------- keyboards/preonic/keymaps/smt/keymap.c | 4 +- keyboards/preonic/keymaps/smt/readme.md | 91 ++++++++++------- 6 files changed, 259 insertions(+), 127 deletions(-) create mode 100644 keyboards/lets_split/keymaps/smt/readme.md diff --git a/keyboards/lets_split/keymaps/smt/keymap.c b/keyboards/lets_split/keymaps/smt/keymap.c index b7db699fdb..c4bdb7ebc4 100644 --- a/keyboards/lets_split/keymaps/smt/keymap.c +++ b/keyboards/lets_split/keymaps/smt/keymap.c @@ -37,15 +37,15 @@ enum custom_keycodes { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D | F | G | H | J | K | L | ; | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | A | S | D | F | G | | H | J | K | L | ; | " | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------' `-----------------------------------------' */ [_QWERTY] = KEYMAP( \ HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ @@ -55,15 +55,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* Colemak - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | R | S | T | D | H | N | E | I | O | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | A | R | S | T | D | | H | N | E | I | O | " | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------' `-----------------------------------------' */ [_COLEMAK] = KEYMAP( \ HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \ @@ -73,15 +73,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* Dvorak - * ,-----------------------------------------------------------------------------------. - * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | O | E | U | I | D | H | T | N | S | - | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' + * ,-----------------------------------------. ,-----------------------------------------. + * | Tab | " | , | . | P | Y | | F | G | C | R | L | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | A | O | E | U | I | | D | H | T | N | S | - | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------' `-----------------------------------------' */ [_DVORAK] = KEYMAP( \ HPR_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \ @@ -91,15 +91,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* Lower - * ,-----------------------------------------------------------------------------------. - * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | $ | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' + * ,-----------------------------------------. ,-----------------------------------------. + * | 0 | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | $ | F1 | F2 | F3 | F4 | F5 | | F6 | 4 | 5 | 6 | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | F12 | 1 | 2 | 3 | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------' `-----------------------------------------' */ [_LOWER] = KEYMAP( \ ALL_T(KC_0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ @@ -109,15 +109,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* Raise - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | | | | | _ | ? | + | { | } | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | - | / | = | [ | ] | \ | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | Home |PageDn|PageUp| End | - * `-----------------------------------------------------------------------------------' + * ,-----------------------------------------. ,-----------------------------------------. + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | _ | ? | + | { | } | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | - | / | = | [ | ] | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | Home |PageDn|PageUp| End | + * `-----------------------------------------' `-----------------------------------------' */ [_RAISE] = KEYMAP( \ ALL_T(KC_TILD), KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ @@ -127,15 +127,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Reset| - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' + * ,-----------------------------------------. ,-----------------------------------------. + * | | Reset| | | | | | | | | | | Reset| + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm| |AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * `-----------------------------------------' `-----------------------------------------' */ [_ADJUST] = KEYMAP( \ _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, \ diff --git a/keyboards/lets_split/keymaps/smt/readme.md b/keyboards/lets_split/keymaps/smt/readme.md new file mode 100644 index 0000000000..20bc662f0a --- /dev/null +++ b/keyboards/lets_split/keymaps/smt/readme.md @@ -0,0 +1,88 @@ +# smt's Let's Split keymap + +This keymap is ported from my Planck keymap. + + +## Qwerty + +``` +,-----------------------------------------. ,-----------------------------------------. +| Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Esc | A | S | D | F | G | | H | J | K | L | ; | " | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------' `-----------------------------------------' +``` + +## Colemak + +``` +,-----------------------------------------. ,-----------------------------------------. +| Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Esc | A | R | S | T | D | | H | N | E | I | O | " | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------' `-----------------------------------------' +``` + +## Dvorak + +``` +,-----------------------------------------. ,-----------------------------------------. +| Tab | " | , | . | P | Y | | F | G | C | R | L | Bksp | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Esc | A | O | E | U | I | | D | H | T | N | S | - | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower |Space | |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------' `-----------------------------------------' +``` + +## Lower + +``` +,-----------------------------------------. ,-----------------------------------------. +| 0 | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| $ | F1 | F2 | F3 | F4 | F5 | | F6 | 4 | 5 | 6 | | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | F7 | F8 | F9 | F10 | F11 | | F12 | 1 | 2 | 3 | | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | | | Next | Vol- | Vol+ | Play | +`-----------------------------------------' `-----------------------------------------' +``` + +## Raise + +``` +,-----------------------------------------. ,-----------------------------------------. +| ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | _ | ? | + | { | } | | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | - | / | = | [ | ] | \ | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | | | Home |PageDn|PageUp| End | +`-----------------------------------------' `-----------------------------------------' +``` + +## Adjust (Lower + Raise) + +``` +,-----------------------------------------. ,-----------------------------------------. +| | Reset| | | | | | | | | | | Reset| +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | |Aud on|Audoff|AGnorm| |AGswap|Qwerty|Colemk|Dvorak| | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | | | | | | | +|------+------+------+------+------+------| |------+------+------+------+------+------| +| | | | | | | | | | | | | | +`-----------------------------------------' `-----------------------------------------' +``` diff --git a/keyboards/planck/keymaps/smt/keymap.c b/keyboards/planck/keymaps/smt/keymap.c index 2e1c355477..708f699da9 100644 --- a/keyboards/planck/keymaps/smt/keymap.c +++ b/keyboards/planck/keymaps/smt/keymap.c @@ -97,9 +97,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------------------------------------------------. * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | $ | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | Home |PageUp| + * | $ | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | | | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | End |PageDn| + * | | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | | | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' diff --git a/keyboards/planck/keymaps/smt/readme.md b/keyboards/planck/keymaps/smt/readme.md index 0e955a5742..dc7c9cf9f1 100644 --- a/keyboards/planck/keymaps/smt/readme.md +++ b/keyboards/planck/keymaps/smt/readme.md @@ -4,27 +4,62 @@ This keymap is primarily based on the default Planck keymap. Notable differences from the default are: -1. **Dvorak by default** +- **[Mod-Tap](https://github.com/jackhumbert/qmk_firmware/wiki#fun-with-modifier-keys) keys** - I happen to type in Dvorak, and prefer that layer to be the default on my keyboard. This is easy enough to switch around with Qwerty, Colemak, or whatever. + - `Esc/Ctrl` -2. **Right Shift** + I am experimenting with using Left Shift as a mod-tap key for Escape, similar to how I use the Enter key. It's set up like this on my Minivan, so in the interest of consistency... - I use both the left and right shift keys when I type. When I want to modify a key with shift, I hold shift with the hand opposite the one typing the key. In the default keymap, Enter is where shift would be on a standard keyboard layout. Oh, muscle memory. + - `Enter/Shift` - Thankfully, QMK supports [mod-tap](https://github.com/jackhumbert/qmk_firmware/wiki#fun-with-modifier-keys) keys, and this allows me to set the Enter key to send a modifier (MOD_LSFT) when held, and KC_ENT when tapped. Awesome! + I use both the left and right shift keys when I type. When I want to modify a key with shift, I hold shift with the hand opposite the one typing the key. In the default keymap, Enter is where shift would be on a standard keyboard layout. Oh, muscle memory. -3. Escape + - `Tab/Hyper` (Super+Ctrl+Shift+Alt) - I am experimenting with using Left Shift as a mod-tap key for Escape, similar to how I use the Enter key. It's set up like this on my Minivan, so in the interest of consistency... + It's great to be able to use Tab as a custom modifier key. I tend to use [Hyper](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/) commands for various OS-specific operations depending on what machine I'm working on. -4. Backtick + - `Backtick/Meh` (Ctrl+Shift+Alt) - I don't currently have LEDs on any of my keyboards, and even if I did, I don't think I would want their controls on a base layer. + Why use backtick in the lower left corner? I use it as my tmux prefix key, so I need to type it more frequently than most people. Putting it on the base layer works well for me. The "Meh" mapping is just a less-cool "Hyper"; the same, just without Super. - So, why use backtick in the lower left corner? I use it as my tmux prefix key, so I need to type it more frequently than most people. Putting it on the base layer works well for me. +- **Swapped responsibilities of "lower" and "raise" layers** -## Dvorak (default) + I prefer to use symbols via the "raise" layer, and numbers via the "lower" layer. + +- **Removed Plover layer** + + I don't intend to use stenography anytime soon, so Plover just didn't have a place in my keymap. + + +## Qwerty + +``` +,-----------------------------------------------------------------------------------. +| Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | +|------+------+------+------+------+-------------+------+------+------+------+------| +| Esc | A | S | D | F | G | H | J | K | L | ; | " | +|------+------+------+------+------+------|------+------+------+------+------+------| +| Shift| Z | X | C | V | B | N | M | , | . | / |Enter | +|------+------+------+------+------+------+------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------------------------------------------------' +``` + +## Colemak + +``` +,-----------------------------------------------------------------------------------. +| Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | +|------+------+------+------+------+-------------+------+------+------+------+------| +| Esc | A | R | S | T | D | H | N | E | I | O | " | +|------+------+------+------+------+------|------+------+------+------+------+------| +| Shift| Z | X | C | V | B | K | M | , | . | / |Enter | +|------+------+------+------+------+------+------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------------------------------------------------' +``` + +## Dvorak ``` ,-----------------------------------------------------------------------------------. @@ -38,31 +73,17 @@ Notable differences from the default are: `-----------------------------------------------------------------------------------' ``` -## Qwerty (same as default) - -``` -,-----------------------------------------------------------------------------------. -| Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | -|------+------+------+------+------+-------------+------+------+------+------+------| -| Esc | A | S | D | F | G | H | J | K | L | ; | " | -|------+------+------+------+------+------|------+------+------+------+------+------| -| Shift| Z | X | C | V | B | N | M | , | . | / |Enter | -|------+------+------+------+------+------+------+------+------+------+------+------| -| ` | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | -`-----------------------------------------------------------------------------------' -``` - ## Lower -This is where I put the number row, a numpad cluster, function keys, and some light navigation via Home/End/PageUp/PageDn. Like the "Raise" layer, the top row is redundant to help with Planck compatibility. +This is where I put the number row, a numpad cluster, function keys, and media controls. ``` ,-----------------------------------------------------------------------------------. -| ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | |------+------+------+------+------+-------------+------+------+------+------+------| -| | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | Home |PageUp| +| $ | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | | | |------+------+------+------+------+------|------+------+------+------+------+------| -| | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | End |PageDn| +| | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | | | |------+------+------+------+------+------+------+------+------+------+------+------| | | | | | | | | Next | Vol- | Vol+ | Play | `-----------------------------------------------------------------------------------' @@ -70,7 +91,7 @@ This is where I put the number row, a numpad cluster, function keys, and some li ## Raise -As a developer, it makes the most sense for me to group all the commonly-used symbols that don't fit on the main layer. In particular, having the dual-column of parens-braces-brackets really helps a lot. +As a developer, it makes the most sense for me to group all the commonly-used symbols that don't fit on the main layer. In particular, having the dual-column of parens-braces-brackets really helps a lot. I've also added cursorkeys to correspond to the arrows. I haven't completely filled this layer, which leaves room for future mappings and macros. @@ -82,21 +103,21 @@ I haven't completely filled this layer, which leaves room for future mappings an |------+------+------+------+------+------|------+------+------+------+------+------| | | | | | | | - | / | = | [ | ] | \ | |------+------+------+------+------+------+------+------+------+------+------+------| -| | | | | | | | Next | Vol- | Vol+ | Play | +| | | | | | | | | Home |PageDn|PageUp| End | `-----------------------------------------------------------------------------------' ``` ## Adjust (Lower + Raise) -Utility layer. This is where I'd switch to Qwerty, or ~~fool around with~~ adjust the audio/music settings. +Utility layer. This is where I'd switch between Qwerty and Dvorak, ~~fool around with~~ adjust the audio/music settings, or put the Planck into bootloader mode. ``` ,-----------------------------------------------------------------------------------. -| | Reset| | | | | | | | | | Del | +| | Reset| | | | | | | | | | Reset| |------+------+------+------+------+-------------+------+------+------+------+------| -| | | |Aud on|AudOff|AGnorm|AGswap|Dvorak|Qwerty| | | | +| | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | |------+------+------+------+------+------|------+------+------+------+------+------| -| |Voice-|Voice+|Mus on|MusOff|MidiOn|MidOff| | | | | | +| |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | |------+------+------+------+------+------+------+------+------+------+------+------| | | | | | | | | | | | | `-----------------------------------------------------------------------------------' diff --git a/keyboards/preonic/keymaps/smt/keymap.c b/keyboards/preonic/keymaps/smt/keymap.c index 690feca472..a10deb7500 100644 --- a/keyboards/preonic/keymaps/smt/keymap.c +++ b/keyboards/preonic/keymaps/smt/keymap.c @@ -106,9 +106,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+------+------+------+------+------+------| * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | $ | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | Home |PageUp| + * | $ | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | | | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | End |PageDn| + * | | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | | | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' diff --git a/keyboards/preonic/keymaps/smt/readme.md b/keyboards/preonic/keymaps/smt/readme.md index 016da7b01f..2ec2603f3e 100644 --- a/keyboards/preonic/keymaps/smt/readme.md +++ b/keyboards/preonic/keymaps/smt/readme.md @@ -4,43 +4,34 @@ This keymap is primarily based on the default Preonic keymap, which in turn is d Notable differences from the default are: -1. **Dvorak by default** +- **[Mod-Tap](https://github.com/jackhumbert/qmk_firmware/wiki#fun-with-modifier-keys) keys** - I happen to type in Dvorak, and prefer that layer to be the default on my keyboard. This is easy enough to switch around with Qwerty, Colemak, or whatever. + - `Esc/Ctrl` -2. **Right Shift** + I am experimenting with using Left Shift as a mod-tap key for Escape, similar to how I use the Enter key. It's set up like this on my Minivan, so in the interest of consistency... - I use both the left and right shift keys when I type. When I want to modify a key with shift, I hold shift with the hand opposite the one typing the key. In the default keymap, Enter is where shift would be on a standard keyboard layout. Oh, muscle memory. + - `Enter/Shift` - Thankfully, QMK supports [mod-tap](https://github.com/jackhumbert/qmk_firmware/wiki#fun-with-modifier-keys) keys, and this allows me to set the Enter key to send a modifier (MOD_LSFT) when held, and KC_ENT when tapped. Awesome! + I use both the left and right shift keys when I type. When I want to modify a key with shift, I hold shift with the hand opposite the one typing the key. In the default keymap, Enter is where shift would be on a standard keyboard layout. Oh, muscle memory. -3. Escape + - `Tab/Hyper` (Super+Ctrl+Shift+Alt) - I am experimenting with using Left Shift as a mod-tap key for Escape, similar to how I use the Enter key. It's set up like this on my Minivan, so in the interest of consistency... + It's great to be able to use Tab as a custom modifier key. I tend to use [Hyper](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/) commands for various OS-specific operations depending on what machine I'm working on. -4. Backtick + - `Backtick/Meh` (Ctrl+Shift+Alt) - I don't currently have LEDs on any of my keyboards, and even if I did, I don't think I would want their controls on a base layer. + Why use backtick in the lower left corner? I use it as my tmux prefix key, so I need to type it more frequently than most people. Putting it on the base layer works well for me. The "Meh" mapping is just a less-cool "Hyper"; the same, just without Super. - So, why use backtick in the lower left corner? I use it as my tmux prefix key, so I need to type it more frequently than most people. Putting it on the base layer works well for me. +- **Swapped responsibilities of "lower" and "raise" layers** -## Dvorak (default) + I prefer to use symbols via the "raise" layer, and numbers via the "lower" layer. -``` -,-----------------------------------------------------------------------------------. -| ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | -|------+------+------+------+------+------+------+------+------+------+------+------| -| Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | -|------+------+------+------+------+-------------+------+------+------+------+------| -| Esc | A | O | E | U | I | D | H | T | N | S | - | -|------+------+------+------+------+------|------+------+------+------+------+------| -| Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | -|------+------+------+------+------+------+------+------+------+------+------+------| -| ` | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | -`-----------------------------------------------------------------------------------' -``` +- **Removed Plover layer** -## Qwerty (same as default) + I don't intend to use stenography anytime soon, so Plover just didn't have a place in my keymap. + + +## Qwerty ``` ,-----------------------------------------------------------------------------------. @@ -56,19 +47,51 @@ Notable differences from the default are: `-----------------------------------------------------------------------------------' ``` +## Colemak + +``` +,-----------------------------------------------------------------------------------. +| ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | +|------+------+------+------+------+------+------+------+------+------+------+------| +| Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | +|------+------+------+------+------+-------------+------+------+------+------+------| +| Esc | A | R | S | T | D | H | N | E | I | O | " | +|------+------+------+------+------+------|------+------+------+------+------+------| +| Shift| Z | X | C | V | B | K | M | , | . | / |Enter | +|------+------+------+------+------+------+------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | +`-----------------------------------------------------------------------------------' +``` + +## Dvorak + +``` +,-----------------------------------------------------------------------------------. +| ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | +|------+------+------+------+------+------+------+------+------+------+------+------| +| Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | +|------+------+------+------+------+-------------+------+------+------+------+------| +| Esc | A | O | E | U | I | D | H | T | N | S | - | +|------+------+------+------+------+------|------+------+------+------+------+------| +| Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | +|------+------+------+------+------+------+------+------+------+------+------+------| +| ` | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | +`-----------------------------------------------------------------------------------' +``` + ## Lower -This is where I put the number row, a numpad cluster, function keys, and some light navigation via Home/End/PageUp/PageDn. Like the "Raise" layer, the top row is redundant to help with Planck compatibility. +This is where I put the number row, a numpad cluster, function keys, and media controls. Like the "Raise" layer, the top row is redundant to help with Planck compatibility. ``` ,-----------------------------------------------------------------------------------. | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | |------+------+------+------+------+------+------+------+------+------+------+------| -| ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | |------+------+------+------+------+-------------+------+------+------+------+------| -| | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | Home |PageUp| +| $ | F1 | F2 | F3 | F4 | F5 | F6 | 4 | 5 | 6 | | | |------+------+------+------+------+------|------+------+------+------+------+------| -| | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | End |PageDn| +| | F7 | F8 | F9 | F10 | F11 | F12 | 1 | 2 | 3 | | | |------+------+------+------+------+------+------+------+------+------+------+------| | | | | | | | | Next | Vol- | Vol+ | Play | `-----------------------------------------------------------------------------------' @@ -76,7 +99,7 @@ This is where I put the number row, a numpad cluster, function keys, and some li ## Raise -As a developer, it makes the most sense for me to group all the commonly-used symbols that don't fit on the main layer. In particular, having the dual-column of parens-braces-brackets really helps a lot. +As a developer, it makes the most sense for me to group all the commonly-used symbols that don't fit on the main layer. In particular, having the dual-column of parens-braces-brackets really helps a lot. I've also added cursorkeys to correspond to the arrows. I haven't completely filled this layer, which leaves room for future mappings and macros. @@ -90,21 +113,21 @@ I haven't completely filled this layer, which leaves room for future mappings an |------+------+------+------+------+------|------+------+------+------+------+------| | | | | | | | - | / | = | [ | ] | \ | |------+------+------+------+------+------+------+------+------+------+------+------| -| | | | | | | | Next | Vol- | Vol+ | Play | +| | | | | | | | | Home |PageDn|PageUp| End | `-----------------------------------------------------------------------------------' ``` ## Adjust (Lower + Raise) -Utility layer. This is where I'd switch to Qwerty, or ~~fool around with~~ adjust the audio/music settings. +Utility layer. This is where I'd switch between Qwerty and Dvorak, ~~fool around with~~ adjust the audio/music settings, or put the Preonic into bootloader mode. ``` ,-----------------------------------------------------------------------------------. | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | |------+------+------+------+------+------+------+------+------+------+------+------| -| | Reset| | | | | | | | | | Del | +| | Reset| | | | | | | | | | Reset| |------+------+------+------+------+-------------+------+------+------+------+------| -| | | |Aud on|AudOff|AGnorm|AGswap|Dvorak|Qwerty| | | | +| | | |Aud on|AudOff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | |------+------+------+------+------+------|------+------+------+------+------+------| | |Voice-|Voice+|Mus on|MusOff|MidiOn|MidOff| | | | | | |------+------+------+------+------+------+------+------+------+------+------+------| From 06e4b3fe1abbc938678a3e3abcddf5658ca5dca2 Mon Sep 17 00:00:00 2001 From: Kevin Hogeland Date: Thu, 9 Mar 2017 02:40:01 -0800 Subject: [PATCH 063/181] Colemak layout for Clueboard --- keyboards/clueboard/keymaps/colemak/keymap.c | 83 ++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 keyboards/clueboard/keymaps/colemak/keymap.c diff --git a/keyboards/clueboard/keymaps/colemak/keymap.c b/keyboards/clueboard/keymaps/colemak/keymap.c new file mode 100644 index 0000000000..6b1fc7c9c6 --- /dev/null +++ b/keyboards/clueboard/keymaps/colemak/keymap.c @@ -0,0 +1,83 @@ +#include "clueboard.h" + +// Helpful defines +#define GRAVE_MODS (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)|MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)|MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) +#define _______ KC_TRNS + +// 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 _BL 0 +#define _FL 1 +#define _CL 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _BL: Base Layer (Default Layer) + */ +[_BL] = KEYMAP( + F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, \ + KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_NUHS, KC_ENT, \ + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, \ + KC_LCTL, MO(_FL), KC_LGUI,KC_MHEN, KC_SPC,KC_SPC, KC_HENK, KC_RALT, KC_RCTL, KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + */ +[_FL] = KEYMAP( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_CAPS, BL_STEP, \ + _______, _______, _______,_______,_______,_______,_______,KC_HOME,KC_PGDN,KC_PGUP, KC_END, _______, _______, _______, _______, \ + KC_DEL, _______, MO(_CL),_______,_______,_______,_______,KC_LEFT,KC_DOWN,KC_UP, KC_RGHT, _______, _______, _______, \ + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, KC_PGUP, \ + _______, _______, _______,_______, _______,_______, _______, _______, _______, MO(_FL), KC_HOME, KC_PGDN, KC_END), + + /* Keymap _CL: Control layer + */ +[_CL] = KEYMAP( + _______, _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_TOG, RGB_VAI, \ + _______, _______, _______,_______,RESET, _______,_______,_______,_______,_______, _______, _______, _______, _______, RGB_VAD, \ + _______, _______, MO(_CL),_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, _______, \ + MO(_FL), _______, _______,_______,_______,_______,_______,_______,_______,_______, _______, _______, _______, MO(_FL), RGB_SAI, \ + _______, _______, _______,_______, RGB_MOD, RGB_MOD, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_HUI), +}; + +/* This is a list of user defined functions. F(N) corresponds to item N + of this list. + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(0), // Calls action_function() +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t mods_pressed; + + switch (id) { + case 0: + /* Handle the combined Grave/Esc key + */ + mods_pressed = get_mods()&GRAVE_MODS; // Check to see what mods are pressed + + if (record->event.pressed) { + /* The key is being pressed. + */ + if (mods_pressed) { + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + /* The key is being released. + */ + if (mods_pressed) { + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} From 718b9648061be99a82e6dddfdebd3eb2e5386f19 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Tue, 7 Mar 2017 13:30:32 -0500 Subject: [PATCH 064/181] =?UTF-8?q?Add=20hexwire=20layout=20for=20Let?= =?UTF-8?q?=E2=80=99s=20Split?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keyboards/lets_split/keymaps/hexwire/config.h | 29 +++ keyboards/lets_split/keymaps/hexwire/keymap.c | 230 ++++++++++++++++++ 2 files changed, 259 insertions(+) create mode 100644 keyboards/lets_split/keymaps/hexwire/config.h create mode 100644 keyboards/lets_split/keymaps/hexwire/keymap.c diff --git a/keyboards/lets_split/keymaps/hexwire/config.h b/keyboards/lets_split/keymaps/hexwire/config.h new file mode 100644 index 0000000000..cd766cc4f1 --- /dev/null +++ b/keyboards/lets_split/keymaps/hexwire/config.h @@ -0,0 +1,29 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + + +#define USE_SERIAL + +#define EE_HANDS + + +#ifdef SUBPROJECT_rev1 + #include "../../rev1/config.h" +#endif +#ifdef SUBPROJECT_rev2 + #include "../../rev2/config.h" +#endif \ No newline at end of file diff --git a/keyboards/lets_split/keymaps/hexwire/keymap.c b/keyboards/lets_split/keymaps/hexwire/keymap.c new file mode 100644 index 0000000000..403987dbe8 --- /dev/null +++ b/keyboards/lets_split/keymaps/hexwire/keymap.c @@ -0,0 +1,230 @@ +#include "lets_split.h" +#include "action_layer.h" +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _FN3 5 +#define _FN4 6 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + FN3, + FN4, + ADJUST, +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +#define KC_CAPW LGUI(LSFT(KC_3)) // Capture whole screen +#define KC_CPYW LGUI(LSFT(LCTL(KC_3))) // Copy whole screen +#define KC_CAPP LGUI(LSFT(KC_4)) // Capture portion of screen +#define KC_CPYP LGUI(LSFT(LCTL(KC_4))) // Copy portion of screen + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | - | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space | Bksp |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = KEYMAP( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, \ + MT(MOD_LCTL,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, MT(MOD_LSFT,KC_ENT) , \ + LT(_FN3,KC_GRV), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | - | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space | Bksp |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = KEYMAP( \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_MINS, \ + 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_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | - | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space | Bksp |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = KEYMAP( \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_MINS, \ + 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 , \ + KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | | \ | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = KEYMAP( \ + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ + KC_DEL, KC_CAPP, KC_LEFT, KC_RGHT, KC_UP, KC_LBRC, KC_RBRC, KC_P4, KC_P5, KC_P6, KC_PLUS, KC_PIPE, \ + _______, KC_CPYP, _______, _______, KC_DOWN, KC_LCBR, KC_RCBR, KC_P1, KC_P2, KC_P3, KC_MINS, _______, \ + _______, _______, _______, _______, _______, _______, KC_DEL, KC_P0, KC_PDOT, _______, _______, _______ \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = KEYMAP( \ + _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ + KC_DEL, KC_MPRV, KC_MNXT, KC_VOLU, KC_PGUP, KC_UNDS, KC_EQL , KC_HOME, _______, _______, _______, KC_BSLS, \ + _______, KC_MSTP, KC_MPLY, KC_VOLD, KC_PGDN, KC_MINS, KC_PLUS, KC_END, _______, _______, _______, _______, \ + _______, _______, _______, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______ \ +), + +[_FN3] = KEYMAP( \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_UP, KC_F9, KC_F10, KC_F11, \ + _______, _______, _______, _______, _______, KC_F8, KC_F12, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = KEYMAP( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + + +}; + +#ifdef AUDIO_ENABLE +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +#endif + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + return false; + break; + } + return true; +} \ No newline at end of file From 74c6c3d277bc76c319b5d28d578fbda9009efcbf Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Tue, 7 Mar 2017 15:39:59 -0500 Subject: [PATCH 065/181] Convert keymap to compact version --- .../keymaps/hexwire/compact_keymap.h | 23 +++ keyboards/lets_split/keymaps/hexwire/keymap.c | 183 ++++++++---------- 2 files changed, 102 insertions(+), 104 deletions(-) create mode 100644 keyboards/lets_split/keymaps/hexwire/compact_keymap.h diff --git a/keyboards/lets_split/keymaps/hexwire/compact_keymap.h b/keyboards/lets_split/keymaps/hexwire/compact_keymap.h new file mode 100644 index 0000000000..d9d063fbfe --- /dev/null +++ b/keyboards/lets_split/keymaps/hexwire/compact_keymap.h @@ -0,0 +1,23 @@ +#ifndef COMPACT_KEYMAP_H +#define COMPACT_KEYMAP_H + +#define COMPACT_KEYMAP( \ + k00, k01, k02, k03, k04, k05, k45, k44, k43, k42, k41, k40, \ + k10, k11, k12, k13, k14, k15, k55, k54, k53, k52, k51, k50, \ + k20, k21, k22, k23, k24, k25, k65, k64, k63, k62, k61, k60, \ + k30, k31, k32, k33, k34, k35, k75, k74, k73, k72, k71, k70 \ + ) \ + { \ + { KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05 }, \ + { KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15 }, \ + { KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25 }, \ + { KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35 }, \ + { KC_##k40, KC_##k41, KC_##k42, KC_##k43, KC_##k44, KC_##k45 }, \ + { KC_##k50, KC_##k51, KC_##k52, KC_##k53, KC_##k54, KC_##k55 }, \ + { KC_##k60, KC_##k61, KC_##k62, KC_##k63, KC_##k64, KC_##k65 }, \ + { KC_##k70, KC_##k71, KC_##k72, KC_##k73, KC_##k74, KC_##k75 } \ + } + +#define KC_ KC_TRNS + +#endif \ No newline at end of file diff --git a/keyboards/lets_split/keymaps/hexwire/keymap.c b/keyboards/lets_split/keymaps/hexwire/keymap.c index 403987dbe8..bae2e687e6 100644 --- a/keyboards/lets_split/keymaps/hexwire/keymap.c +++ b/keyboards/lets_split/keymaps/hexwire/keymap.c @@ -1,13 +1,10 @@ #include "lets_split.h" #include "action_layer.h" #include "eeconfig.h" +#include "compact_keymap.h" extern keymap_config_t keymap_config; -// Each layer gets a name for readability, which is then used in the keymap matrix below. -// The underscores don't mean anything - you can have a layer called STUFF or any other name. -// Layer names don't all need to be of the same length, obviously, and you can also skip them -// entirely and just use numbers. #define _QWERTY 0 #define _COLEMAK 1 #define _DVORAK 2 @@ -28,113 +25,91 @@ enum custom_keycodes { ADJUST, }; -// Fillers to make layering more clear #define _______ KC_TRNS -#define XXXXXXX KC_NO #define KC_CAPW LGUI(LSFT(KC_3)) // Capture whole screen #define KC_CPYW LGUI(LSFT(LCTL(KC_3))) // Copy whole screen #define KC_CAPP LGUI(LSFT(KC_4)) // Capture portion of screen #define KC_CPYP LGUI(LSFT(LCTL(KC_4))) // Copy portion of screen +#define KC_X0 MT(MOD_LCTL, KC_ESC) +#define KC_X1 LOWER +#define KC_X2 RAISE +#define KC_X3 LT(_FN3, KC_GRV) +#define KC_X4 MT(MOD_LSFT, KC_ENT) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Y | U | I | O | P | - | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D | F | G | H | J | K | L | ; | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | Ctrl | Alt | GUI |Lower |Space | Bksp |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTY] = KEYMAP( \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, \ - MT(MOD_LCTL,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, MT(MOD_LSFT,KC_ENT) , \ - LT(_FN3,KC_GRV), KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), + [_QWERTY] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, X4 , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT + //`----+----+----+----+----+----' `----+----+----+----+----+----' + ), -/* Colemak - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | F | P | G | J | L | U | Y | ; | - | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | R | S | T | D | H | N | E | I | O | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | Ctrl | Alt | GUI |Lower |Space | Bksp |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_COLEMAK] = KEYMAP( \ - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_MINS, \ - 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_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), + [_COLEMAK] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB , Q , W , F , P , G , J , L , U , Y ,SCLN,MINS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , R , S , T , D , H , N , E , I , O ,QUOT, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, Z , X , C , V , B , K , M ,COMM,DOT ,SLSH, X4 , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT + //`----+----+----+----+----+----' `----+----+----+----+----+----' + ), -/* Dvorak - * ,-----------------------------------------------------------------------------------. - * | Tab | " | , | . | P | Y | F | G | C | R | L | - | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | O | E | U | I | D | H | T | N | S | / | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | Ctrl | Alt | GUI |Lower |Space | Bksp |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_DVORAK] = KEYMAP( \ - KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_MINS, \ - 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 , \ - KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), + [_DVORAK] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB ,QUOT,COMM,DOT , P , Y , F , G , C , R , L ,MINS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , O , E , U , I , D , H , R , N , S ,SLSH, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT,SCLN, Q , J , K , X , B , M , W , V , Z , X4 , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT + //`----+----+----+----+----+----' `----+----+----+----+----+----' + ), -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | | \ | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = KEYMAP( \ - _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ - KC_DEL, KC_CAPP, KC_LEFT, KC_RGHT, KC_UP, KC_LBRC, KC_RBRC, KC_P4, KC_P5, KC_P6, KC_PLUS, KC_PIPE, \ - _______, KC_CPYP, _______, _______, KC_DOWN, KC_LCBR, KC_RCBR, KC_P1, KC_P2, KC_P3, KC_MINS, _______, \ - _______, _______, _______, _______, _______, _______, KC_DEL, KC_P0, KC_PDOT, _______, _______, _______ \ -), + [_LOWER] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + DEL ,CAPP,LEFT,RGHT, UP ,LBRC, RBRC, P4 , P5 , P6 ,PLUS,PIPE, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ,CPYP, , ,DOWN,LCBR, RCBR, P1 , P2 , P3 ,MINS, , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , DEL , P0 ,PDOT, , , + //`----+----+----+----+----+----' `----+----+----+----+----+----' + ), -/* Raise - * ,-----------------------------------------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_RAISE] = KEYMAP( \ - _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ - KC_DEL, KC_MPRV, KC_MNXT, KC_VOLU, KC_PGUP, KC_UNDS, KC_EQL , KC_HOME, _______, _______, _______, KC_BSLS, \ - _______, KC_MSTP, KC_MPLY, KC_VOLD, KC_PGDN, KC_MINS, KC_PLUS, KC_END, _______, _______, _______, _______, \ - _______, _______, _______, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______ \ -), + [_RAISE] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + ,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN, , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + DEL ,MPRV,MNXT,VOLU,PGUP,UNDS, EQL ,HOME, , , ,BSLS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ,MSTP,MPLY,VOLD,PGDN,MINS, PLUS,END , , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , ,MUTE, , , , , , , + //`----+----+----+----+----+----' `----+----+----+----+----+----' + ), -[_FN3] = KEYMAP( \ - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_UP, KC_F9, KC_F10, KC_F11, \ - _______, _______, _______, _______, _______, KC_F8, KC_F12, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ -), + [_FN3] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + F12 , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , + //`----+----+----+----+----+----' `----+----+----+----+----+----' + ), /* Adjust (Lower + Raise) * ,-----------------------------------------------------------------------------------. @@ -147,12 +122,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ -[_ADJUST] = KEYMAP( \ - _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ -) + [_ADJUST] = KEYMAP( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ) }; @@ -227,4 +202,4 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { break; } return true; -} \ No newline at end of file +} From 3df35f712eca0fddcd3aabf62de7f32d8a5cb11b Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Thu, 9 Mar 2017 09:52:33 -0500 Subject: [PATCH 066/181] Add readme for layout --- .../lets_split/keymaps/hexwire/README.md | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 keyboards/lets_split/keymaps/hexwire/README.md diff --git a/keyboards/lets_split/keymaps/hexwire/README.md b/keyboards/lets_split/keymaps/hexwire/README.md new file mode 100644 index 0000000000..2dc0446466 --- /dev/null +++ b/keyboards/lets_split/keymaps/hexwire/README.md @@ -0,0 +1,108 @@ +Hexwire's Let's Split Layout +============================ + +### Changes from default layout + +- Main layer + - The right space bar key has been changed to backspace, as I only hit space with my left thumb + - Backtick is at the lower right and also serves goes to the 3rd function layer when held + - Enter key acts as shift when held + - Escape key acts as control when held + - Minus key at upper right +- Lower layer + - Numbers are on the lower layer, to make it easier to use a numpad on the right hand + - Arrow keys + - Straight and curly brackets in the middle two columns + - Screenshot keys for MacOS +- Upper layer + - Symbols are on the upper layer + - Media keys + - Page Up/Down, Home/End +- 3rd function layer + - Function keys + +## Layouts + +### Qwerty + +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS, +|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, +|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, X4 , +|----+----+----+----+----+----| |----+----+----+----+----+----| + X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` + +### Colemak + +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB , Q , W , F , P , G , J , L , U , Y ,SCLN,MINS, +|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , R , S , T , D , H , N , E , I , O ,QUOT, +|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, Z , X , C , V , B , K , M ,COMM,DOT ,SLSH, X4 , +|----+----+----+----+----+----| |----+----+----+----+----+----| + X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` + +### Dvorak + +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB ,QUOT,COMM,DOT , P , Y , F , G , C , R , L ,MINS, +|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , O , E , U , I , D , H , R , N , S ,SLSH, +|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT,SCLN, Q , J , K , X , B , M , W , V , Z , X4 , +|----+----+----+----+----+----| |----+----+----+----+----+----| + X3 ,LCTL,LALT,LGUI, X1 ,SPC , BSPC, X2 ,LEFT,DOWN, UP ,RGHT +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` + +### Lower + +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. + , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , , +|----+----+----+----+----+----| |----+----+----+----+----+----| + DEL ,CAPP,LEFT,RGHT, UP ,LBRC, RBRC, P4 , P5 , P6 ,PLUS,PIPE, +|----+----+----+----+----+----| |----+----+----+----+----+----| + ,CPYP, , ,DOWN,LCBR, RCBR, P1 , P2 , P3 ,MINS, , +|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , DEL , P0 ,PDOT, , , +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` + +### Raise + +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. + ,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN, , +|----+----+----+----+----+----| |----+----+----+----+----+----| + DEL ,MPRV,MNXT,VOLU,PGUP,UNDS, EQL ,HOME, , , ,BSLS, +|----+----+----+----+----+----| |----+----+----+----+----+----| + ,MSTP,MPLY,VOLD,PGDN,MINS, PLUS,END , , , , , +|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , ,MUTE, , , , , , , +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` + +### 3rd function layer + +``` +,----+----+----+----+----+----. ,----+----+----+----+----+----. + F12 , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 , +|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , , +|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , , +|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , +`----+----+----+----+----+----' `----+----+----+----+----+----' +``` From a8f872e728cde990f7b272306480eedc96a7f3f7 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Thu, 9 Mar 2017 09:21:25 -0500 Subject: [PATCH 067/181] Initial commit for handwired numpad --- keyboards/handwired/numpad20/Makefile | 3 + keyboards/handwired/numpad20/config.h | 162 ++++++++++++++++++ .../numpad20/keymaps/default/keymap.c | 16 ++ keyboards/handwired/numpad20/numpad20.c | 8 + keyboards/handwired/numpad20/numpad20.h | 20 +++ keyboards/handwired/numpad20/rules.mk | 83 +++++++++ 6 files changed, 292 insertions(+) create mode 100644 keyboards/handwired/numpad20/Makefile create mode 100644 keyboards/handwired/numpad20/config.h create mode 100644 keyboards/handwired/numpad20/keymaps/default/keymap.c create mode 100644 keyboards/handwired/numpad20/numpad20.c create mode 100644 keyboards/handwired/numpad20/numpad20.h create mode 100644 keyboards/handwired/numpad20/rules.mk diff --git a/keyboards/handwired/numpad20/Makefile b/keyboards/handwired/numpad20/Makefile new file mode 100644 index 0000000000..191c6bb664 --- /dev/null +++ b/keyboards/handwired/numpad20/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/handwired/numpad20/config.h b/keyboards/handwired/numpad20/config.h new file mode 100644 index 0000000000..847f2111f5 --- /dev/null +++ b/keyboards/handwired/numpad20/config.h @@ -0,0 +1,162 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xBB80 +#define PRODUCT_ID 0x0504 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Hexwire +#define PRODUCT Numpad 20 +#define DESCRIPTION Handwired 4x5 numpad + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 4 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { F6, B1, B3, B6, B5 } +#define MATRIX_COL_PINS { D1, D0, F5, F4 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/handwired/numpad20/keymaps/default/keymap.c b/keyboards/handwired/numpad20/keymaps/default/keymap.c new file mode 100644 index 0000000000..37031206a9 --- /dev/null +++ b/keyboards/handwired/numpad20/keymaps/default/keymap.c @@ -0,0 +1,16 @@ +#include "numpad20.h" + +#define KC_ KC_TRNS + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = COMPACT_KEYMAP( + LEFT,RGHT, UP ,DOWN, \ + P7 , P8 , P9 ,PLUS, \ + P4 , P5 , P6 ,MINS, \ + P1 , P2 , P3 , ENT, \ + P0 ,DOT ,RGHT, TAB \ + ) +}; + +const uint16_t PROGMEM fn_actions[] = { +}; diff --git a/keyboards/handwired/numpad20/numpad20.c b/keyboards/handwired/numpad20/numpad20.c new file mode 100644 index 0000000000..101cf2cb4b --- /dev/null +++ b/keyboards/handwired/numpad20/numpad20.c @@ -0,0 +1,8 @@ +#include "numpad20.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} diff --git a/keyboards/handwired/numpad20/numpad20.h b/keyboards/handwired/numpad20/numpad20.h new file mode 100644 index 0000000000..191979be0d --- /dev/null +++ b/keyboards/handwired/numpad20/numpad20.h @@ -0,0 +1,20 @@ +#ifndef NUMPAD20_H +#define NUMPAD20_H + +#include "quantum.h" + +#define COMPACT_KEYMAP( \ + K00, K01, K02, K03, \ + K10, K11, K12, K13, \ + K20, K21, K22, K23, \ + K30, K31, K32, K33, \ + K40, K41, K42, K43 \ + ) { \ + { KC_##K00, KC_##K01, KC_##K02, KC_##K03 }, \ + { KC_##K10, KC_##K11, KC_##K12, KC_##K13 }, \ + { KC_##K20, KC_##K21, KC_##K22, KC_##K23 }, \ + { KC_##K30, KC_##K31, KC_##K32, KC_##K33 }, \ + { KC_##K40, KC_##K41, KC_##K42, KC_##K43 } \ +} + +#endif \ No newline at end of file diff --git a/keyboards/handwired/numpad20/rules.mk b/keyboards/handwired/numpad20/rules.mk new file mode 100644 index 0000000000..e897ef2523 --- /dev/null +++ b/keyboards/handwired/numpad20/rules.mk @@ -0,0 +1,83 @@ + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=512 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 + +ifndef QUANTUM_DIR + include ../../../Makefile +endif + +avrdude: build + ls /dev/tty* > /tmp/1; \ + echo "Reset your Pro Micro now"; \ + while [[ -z $$USB ]]; do \ + sleep 1; \ + ls /dev/tty* > /tmp/2; \ + USB=`diff /tmp/1 /tmp/2 | grep -o '/dev/tty.*'`; \ + done; \ + avrdude -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex + +.PHONY: avrdude From 20a48e0198b02a246dce2b729c14809ccaa471c6 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Thu, 9 Mar 2017 12:02:05 -0500 Subject: [PATCH 068/181] Add handwired 5x13 ortholinear keyboard --- keyboards/handwired/ortho5x13/Makefile | 3 + keyboards/handwired/ortho5x13/config.h | 162 ++++++++++ .../ortho5x13/keymaps/default/keymap.c | 289 ++++++++++++++++++ keyboards/handwired/ortho5x13/ortho5x13.c | 8 + keyboards/handwired/ortho5x13/ortho5x13.h | 36 +++ keyboards/handwired/ortho5x13/rules.mk | 83 +++++ 6 files changed, 581 insertions(+) create mode 100644 keyboards/handwired/ortho5x13/Makefile create mode 100644 keyboards/handwired/ortho5x13/config.h create mode 100644 keyboards/handwired/ortho5x13/keymaps/default/keymap.c create mode 100644 keyboards/handwired/ortho5x13/ortho5x13.c create mode 100644 keyboards/handwired/ortho5x13/ortho5x13.h create mode 100644 keyboards/handwired/ortho5x13/rules.mk diff --git a/keyboards/handwired/ortho5x13/Makefile b/keyboards/handwired/ortho5x13/Makefile new file mode 100644 index 0000000000..191c6bb664 --- /dev/null +++ b/keyboards/handwired/ortho5x13/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/handwired/ortho5x13/config.h b/keyboards/handwired/ortho5x13/config.h new file mode 100644 index 0000000000..f85159596c --- /dev/null +++ b/keyboards/handwired/ortho5x13/config.h @@ -0,0 +1,162 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xBB80 +#define PRODUCT_ID 0x050D +#define DEVICE_VER 0x0001 +#define MANUFACTURER Hexwire +#define PRODUCT Ortho 5x13 +#define DESCRIPTION Handwired 5x13 ortholinear keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 13 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { D3, D2, D1, D0, D4 } +#define MATRIX_COL_PINS { C6, D7, E6, B4, B5, B6, B2, B3, B1, F7, F6, F5, F4 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/handwired/ortho5x13/keymaps/default/keymap.c b/keyboards/handwired/ortho5x13/keymaps/default/keymap.c new file mode 100644 index 0000000000..c1262a83d7 --- /dev/null +++ b/keyboards/handwired/ortho5x13/keymaps/default/keymap.c @@ -0,0 +1,289 @@ +#include "ortho5x13.h" +#include "action_layer.h" +#include "eeconfig.h" +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + BACKLIT +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +#define KC_L1 LOWER +#define KC_L2 RAISE + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,------------------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | + * |------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | + * |------+------+------+------+------+-------------+------+------+------+------+------+------| + * | ` | A | S | D | F | G | H | J | K | L | ; | ' | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | Up | + * |------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Hyper| Ctrl | Alt | GUI |Lower | Space |Raise | Bksp |Shift | Left | Down |Right | + * `------------------------------------------------------------------------------------------' + */ +[_QWERTY] = COMPACT_KEYMAP( + //,----+----+----+----+----+----+----+----+----+----+----+----+----. + ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,MINS,EQL , + //|----+----+----+----+----+----+----+----+----+----+----+----+----| + TAB , Q , W , E , R , T , Y , U , I , O , P ,LBRC,RBRC, + //|----+----+----+----+----+----+----+----+----+----+----+----+----| + GRV , A , S , D , F , G , H , J , K , L ,SCLN,QUOT,BSLS, + //|----+----+----+----+----+----+----+----+----+----+----+----+----| + LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH,ENT , UP , + //|----+----+----+----+----+---------+----+----+----+----+----+----| + HYPR,LCTL,LALT,LGUI, L1 , SPACE , L2 ,BSPC,RSFT,LEFT,RGHT,DOWN + //`----+----+----+----+----+---------+----+----+----+----+----+----' + ), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = { + {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_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL}, + {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 }, + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | " | , | . | P | Y | F | G | C | R | L | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = { + {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_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL}, + {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 }, + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_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_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL}, + {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_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_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL}, + {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Musoff|Mus on| | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = { + {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, + {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, + {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______}, + {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} +} + + +}; + +#ifdef AUDIO_ENABLE +float tone_startup[][2] = { + {NOTE_B5, 20}, + {NOTE_B6, 8}, + {NOTE_DS6, 20}, + {NOTE_B6, 8} +}; + +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); + +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); + +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); +#endif + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + } + return true; +}; + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + startup_user(); + #endif +} + +#ifdef AUDIO_ENABLE + +void startup_user() +{ + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void shutdown_user() +{ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_NOTE_ARRAY(music_scale, false, 0); +} + +#endif \ No newline at end of file diff --git a/keyboards/handwired/ortho5x13/ortho5x13.c b/keyboards/handwired/ortho5x13/ortho5x13.c new file mode 100644 index 0000000000..cf8352cc43 --- /dev/null +++ b/keyboards/handwired/ortho5x13/ortho5x13.c @@ -0,0 +1,8 @@ +#include "ortho5x13.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} diff --git a/keyboards/handwired/ortho5x13/ortho5x13.h b/keyboards/handwired/ortho5x13/ortho5x13.h new file mode 100644 index 0000000000..d442212fe9 --- /dev/null +++ b/keyboards/handwired/ortho5x13/ortho5x13.h @@ -0,0 +1,36 @@ +#ifndef ORTHO5X13_H +#define ORTHO5X13_H + +#include "quantum.h" + +#define KEYMAP( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, \ + k40, k41, k42, k43, k44, k45, k47, k48, k49, k4a, k4b, k4c \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c }, \ + { k30, k31, k32, k33, k34, k35, k35, k37, k38, k39, k3a, k3b, k3c }, \ + { k40, k41, k42, k43, k44, k45, KC_NO, k47, k48, k49, k4a, k4b, k4c } \ +} + +#define COMPACT_KEYMAP( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, \ + k40, k41, k42, k43, k44, k45, k47, k48, k49, k4a, k4b, k4c \ +) \ +{ \ + { KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_##k06, KC_##k07, KC_##k08, KC_##k09, KC_##k0a, KC_##k0b, KC_##k0c }, \ + { KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k1a, KC_##k1b, KC_##k1c }, \ + { KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_##k26, KC_##k27, KC_##k28, KC_##k29, KC_##k2a, KC_##k2b, KC_##k2c }, \ + { KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##k35, KC_##k37, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b, KC_##k3c }, \ + { KC_##k40, KC_##k41, KC_##k42, KC_##k43, KC_##k44, KC_##k45, KC_NO, KC_##k47, KC_##k48, KC_##k49, KC_##k4a, KC_##k4b, KC_##k4c } \ +} + +#endif \ No newline at end of file diff --git a/keyboards/handwired/ortho5x13/rules.mk b/keyboards/handwired/ortho5x13/rules.mk new file mode 100644 index 0000000000..e897ef2523 --- /dev/null +++ b/keyboards/handwired/ortho5x13/rules.mk @@ -0,0 +1,83 @@ + +# MCU name +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=512 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 + +ifndef QUANTUM_DIR + include ../../../Makefile +endif + +avrdude: build + ls /dev/tty* > /tmp/1; \ + echo "Reset your Pro Micro now"; \ + while [[ -z $$USB ]]; do \ + sleep 1; \ + ls /dev/tty* > /tmp/2; \ + USB=`diff /tmp/1 /tmp/2 | grep -o '/dev/tty.*'`; \ + done; \ + avrdude -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex + +.PHONY: avrdude From 8b09fd8b55f94f3e88609ed2196270ea9b678b5e Mon Sep 17 00:00:00 2001 From: Lukas Stiebig Date: Thu, 9 Mar 2017 19:41:14 +0100 Subject: [PATCH 069/181] readme keymap.h to quantum_keycodes.h Changed the quantum/keymap.h to quantum/quantum_keycodes.h because this seems to be the file where they keycodes are defined. --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 21bb79a49d..7ce3d03757 100644 --- a/readme.md +++ b/readme.md @@ -35,5 +35,5 @@ This is not a tiny project. While this is the main readme, there are many other * The readme for your own keyboard: This is found under `keyboards//`. So for the ErgoDox EZ, it's [here](keyboards/ergodox/ez/); for the Planck, it's [here](keyboards/planck/) and so on. * The list of possible keycodes you can use in your keymap is actually spread out in a few different places: * [doc/keycode.txt](doc/keycode.txt) - an explanation of those same keycodes. - * [quantum/keymap.h](quantum/keymap.h) - this is where the QMK-specific aliases are all set up. Things like the Hyper and Meh key, the Leader key, and all of the other QMK innovations. These are also explained and documented below, but `keymap.h` is where they're actually defined. + * [quantum/quantum_keycodes.h](quantum/quantum_keycodes.h) - this is where the QMK-specific aliases are all set up. Things like the Hyper and Meh key, the Leader key, and all of the other QMK innovations. These are also explained and documented below, but `quantum_keycodes.h` is where they're actually defined. * The [TMK documentation](doc/TMK_README.md). QMK is based on TMK, and this explains how it works internally. From 5ae0cfeef5134b8ba9d1f2bff0c105d4e18b064c Mon Sep 17 00:00:00 2001 From: Stephen Tudor Date: Thu, 9 Mar 2017 13:58:33 -0500 Subject: [PATCH 070/181] Add smt keymap for Satan 'GH60' --- keyboards/satan/keymaps/smt/Makefile | 21 +++ keyboards/satan/keymaps/smt/keymap.c | 204 ++++++++++++++++++++++++++ keyboards/satan/keymaps/smt/readme.md | 1 + 3 files changed, 226 insertions(+) create mode 100644 keyboards/satan/keymaps/smt/Makefile create mode 100644 keyboards/satan/keymaps/smt/keymap.c create mode 100644 keyboards/satan/keymaps/smt/readme.md diff --git a/keyboards/satan/keymaps/smt/Makefile b/keyboards/satan/keymaps/smt/Makefile new file mode 100644 index 0000000000..2a7ff27793 --- /dev/null +++ b/keyboards/satan/keymaps/smt/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/satan/keymaps/smt/keymap.c b/keyboards/satan/keymaps/smt/keymap.c new file mode 100644 index 0000000000..1dfa9495b8 --- /dev/null +++ b/keyboards/satan/keymaps/smt/keymap.c @@ -0,0 +1,204 @@ +#include "satan.h" + + +// Used for SHIFT_ESC +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 + +enum planck_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK +}; + +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Custom macros +#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift +#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Shift+Alt) +#define ALT_GRV ALT_T(KC_GRV) // Tap for Backtick, hold for Alt + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap _QWERTY: (Base Layer) Default Layer + * ,-----------------------------------------------------------. + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | + * |-----------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space/Fn |Alt |Gui |Fn |Ctrl | + * `-----------------------------------------------------------' + */ +[_QWERTY] = KEYMAP_ANSI( + F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS, \ + CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_ENT, \ + KC_LCTL, KC_LGUI,KC_LALT, LT(_RAISE, KC_SPC), KC_RALT,KC_RGUI,MO(_LOWER),KC_RCTL), + + /* Keymap _COLEMAK: (Base Layer) Default Layer + * ,-----------------------------------------------------------. + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | + * |-----------------------------------------------------------| + * |Tab | Q| W| F| P| G| J| L| U| Y| ;| [| ]| \ | + * |-----------------------------------------------------------| + * |CAPS | A| R| S| T| D| H| N| E| I| O| '|Return | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| K| M| ,| .| /|Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space/Fn |Alt |Gui |Fn |Ctrl | + * `-----------------------------------------------------------' + */ +[_COLEMAK] = KEYMAP_ANSI( + F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN,KC_LBRC, KC_RBRC,KC_BSLS, \ + CTL_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O ,KC_QUOT, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_ENT, \ + KC_LCTL, KC_LGUI,KC_LALT, LT(_RAISE, KC_SPC), KC_RALT,KC_RGUI,MO(_LOWER),KC_RCTL), + + /* Keymap _DVORAK: (Base Layer) Default Layer + * ,-----------------------------------------------------------. + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| [| ]|Backsp | + * |-----------------------------------------------------------| + * |HypTb| '| ,| .| P| Y| F| G| C| R| L| /| =| \ | + * |-----------------------------------------------------------| + * |CtrlEsc| A| O| E| U| I| D| H| T| N| S| -|Return | + * |-----------------------------------------------------------| + * |Shift | ;| Q| J| K| X| B| M| W| V| Z|ShiftEnter| + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space/Fn |Alt |Gui |Fn |Ctrl | + * `-----------------------------------------------------------' + */ +[_DVORAK] = KEYMAP_ANSI( + F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC,KC_BSPC, \ + HPR_TAB, KC_QUOT,KC_COMM,KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, \ + CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, \ + KC_LSFT, KC_SCLN,KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT, \ + KC_LCTL, KC_LGUI,KC_LALT, LT(_RAISE, KC_SPC), KC_RALT,KC_RGUI,MO(_LOWER),KC_RCTL), + + /* Keymap _LOWER: Function Layer + * ,-----------------------------------------------------------. + * | | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete | + * |-----------------------------------------------------------| + * | |Hom| UP|End| | | | | | | |Vo-|Vo+| | + * |-----------------------------------------------------------| + * | |LFT| DN| RT| | |LFT| DN| UP| RT| |Pg+| | + * |-----------------------------------------------------------| + * | | | | | | | | | | |Pg-| | + * |-----------------------------------------------------------| + * | | |Prev| Play |Next| | | | + * `-----------------------------------------------------------' + */ +[_LOWER] = KEYMAP_ANSI( + KC_GRV ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,KC_DEL, \ + _______,KC_HOME,KC_UP ,KC_END ,_______,_______,_______,_______,_______,_______,_______,KC_VOLD,KC_VOLU,_______, \ + _______,KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,KC_LEFT,KC_DOWN,KC_UP ,KC_RGHT,_______,KC_PGUP ,_______, \ + _______ ,_______,_______,_______,_______,_______,_______,_______,_______,_______,KC_PGDN ,_______, \ + _______,_______,KC_MPRV ,KC_MPLY ,KC_MNXT,_______,_______,_______), + + /* Keymap _RAISE: Function Layer + * ,-----------------------------------------------------------. + * | | | | | | | | | | | | | | RESET | + * |-----------------------------------------------------------| + * | | | | | | | | | | | |BL-|BL+|BL | + * |-----------------------------------------------------------| + * | | | | | | | |QWT|CLM|DVK| | | | + * |-----------------------------------------------------------| + * | | F1|F2 | F3|F4 | F5| F6| F7| F8| | | | + * |-----------------------------------------------------------| + * | | | | | | | | | + * `-----------------------------------------------------------' + */ +[_RAISE] = KEYMAP_ANSI( + #ifdef RGBLIGHT_ENABLE + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET , \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,BL_DEC ,BL_INC ,BL_TOGG, \ + _______,_______,_______,_______,_______,_______,_______,QWERTY ,COLEMAK,DVORAK ,_______,_______ ,_______, \ + _______ ,RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,_______,_______ ,_______, \ + _______,_______,_______ ,_______ ,_______,_______,_______,_______ + #else + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET , \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,BL_DEC ,BL_INC ,BL_TOGG, \ + _______,_______,_______,_______,_______,_______,_______,QWERTY ,COLEMAK,DVORAK ,_______,_______ ,_______, \ + _______ ,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______ ,_______, \ + _______,_______,_______ ,_______ ,_______,_______,XXXXXXX,_______ + #endif + ) +}; + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + } + return true; +} + +enum function_id { + SHIFT_ESC, +}; + +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(SHIFT_ESC), +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + static uint8_t shift_esc_shift_mask; + switch (id) { + case SHIFT_ESC: + shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; + if (record->event.pressed) { + if (shift_esc_shift_mask) { + add_key(KC_GRV); + send_keyboard_report(); + } else { + add_key(KC_ESC); + send_keyboard_report(); + } + } else { + if (shift_esc_shift_mask) { + del_key(KC_GRV); + send_keyboard_report(); + } else { + del_key(KC_ESC); + send_keyboard_report(); + } + } + break; + } +} diff --git a/keyboards/satan/keymaps/smt/readme.md b/keyboards/satan/keymaps/smt/readme.md new file mode 100644 index 0000000000..7b706d6014 --- /dev/null +++ b/keyboards/satan/keymaps/smt/readme.md @@ -0,0 +1 @@ +# smt's Satan GH60 layout From b19e34c81e3e16dc75a39cdc94300fb116c9254c Mon Sep 17 00:00:00 2001 From: Stephen Tudor Date: Fri, 10 Mar 2017 16:10:05 -0500 Subject: [PATCH 071/181] Forsake spacefn in favor of left shift tapdance. Move media controls. --- keyboards/satan/keymaps/smt/keymap.c | 51 ++++++++++++++-------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/keyboards/satan/keymaps/smt/keymap.c b/keyboards/satan/keymaps/smt/keymap.c index 1dfa9495b8..4ac016f212 100644 --- a/keyboards/satan/keymaps/smt/keymap.c +++ b/keyboards/satan/keymaps/smt/keymap.c @@ -24,10 +24,11 @@ enum planck_keycodes { #define XXXXXXX KC_NO // Custom macros -#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl -#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift -#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Shift+Alt) #define ALT_GRV ALT_T(KC_GRV) // Tap for Backtick, hold for Alt +#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl +#define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Shift+Alt) +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift +#define SFT_RSE TD(KC_LSFT, OS(_RAISE)) // Double-tap for RAISE one-shot, otherwise Left Shift const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap _QWERTY: (Base Layer) Default Layer @@ -40,15 +41,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----------------------------------------------------------| * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | * |-----------------------------------------------------------| - * |Ctrl|Gui |Alt | Space/Fn |Alt |Gui |Fn |Ctrl | + * |Ctrl|Gui |Alt | Space |Alt |Gui |Fn |Ctrl | * `-----------------------------------------------------------' */ [_QWERTY] = KEYMAP_ANSI( F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS, \ CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_ENT, \ - KC_LCTL, KC_LGUI,KC_LALT, LT(_RAISE, KC_SPC), KC_RALT,KC_RGUI,MO(_LOWER),KC_RCTL), + SFT_RSE, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_ENT, \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,MO(_LOWER),KC_RCTL), /* Keymap _COLEMAK: (Base Layer) Default Layer * ,-----------------------------------------------------------. @@ -60,15 +61,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----------------------------------------------------------| * |Shift | Z| X| C| V| B| K| M| ,| .| /|Shift | * |-----------------------------------------------------------| - * |Ctrl|Gui |Alt | Space/Fn |Alt |Gui |Fn |Ctrl | + * |Ctrl|Gui |Alt | Space |Alt |Gui |Fn |Ctrl | * `-----------------------------------------------------------' */ [_COLEMAK] = KEYMAP_ANSI( F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN,KC_LBRC, KC_RBRC,KC_BSLS, \ CTL_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O ,KC_QUOT, KC_ENT, \ - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_ENT, \ - KC_LCTL, KC_LGUI,KC_LALT, LT(_RAISE, KC_SPC), KC_RALT,KC_RGUI,MO(_LOWER),KC_RCTL), + SFT_RSE, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_ENT, \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,MO(_LOWER),KC_RCTL), /* Keymap _DVORAK: (Base Layer) Default Layer * ,-----------------------------------------------------------. @@ -80,35 +81,35 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----------------------------------------------------------| * |Shift | ;| Q| J| K| X| B| M| W| V| Z|ShiftEnter| * |-----------------------------------------------------------| - * |Ctrl|Gui |Alt | Space/Fn |Alt |Gui |Fn |Ctrl | + * |Ctrl|Gui |Alt | Space |Alt |Gui |Fn |Ctrl | * `-----------------------------------------------------------' */ [_DVORAK] = KEYMAP_ANSI( F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC,KC_BSPC, \ HPR_TAB, KC_QUOT,KC_COMM,KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, \ CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, \ - KC_LSFT, KC_SCLN,KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT, \ - KC_LCTL, KC_LGUI,KC_LALT, LT(_RAISE, KC_SPC), KC_RALT,KC_RGUI,MO(_LOWER),KC_RCTL), + SFT_RSE, KC_SCLN,KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT, \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,MO(_LOWER),KC_RCTL), /* Keymap _LOWER: Function Layer * ,-----------------------------------------------------------. * | | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete | * |-----------------------------------------------------------| - * | |Hom| UP|End| | | | | | | |Vo-|Vo+| | + * | |Hom| UP|End| | | | | | | |BL-|BL+|BL | * |-----------------------------------------------------------| - * | |LFT| DN| RT| | |LFT| DN| UP| RT| |Pg+| | + * | |LFT| DN| RT| | |LFT| DN| UP| RT|Vo+|Pg+| | * |-----------------------------------------------------------| - * | | | | | | | | | | |Pg-| | + * | | | |Prv|Ply|Nxt| | | |Vo-|Pg-| | * |-----------------------------------------------------------| - * | | |Prev| Play |Next| | | | + * | | | | | | | | | * `-----------------------------------------------------------' */ [_LOWER] = KEYMAP_ANSI( KC_GRV ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,KC_DEL, \ - _______,KC_HOME,KC_UP ,KC_END ,_______,_______,_______,_______,_______,_______,_______,KC_VOLD,KC_VOLU,_______, \ - _______,KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,KC_LEFT,KC_DOWN,KC_UP ,KC_RGHT,_______,KC_PGUP ,_______, \ - _______ ,_______,_______,_______,_______,_______,_______,_______,_______,_______,KC_PGDN ,_______, \ - _______,_______,KC_MPRV ,KC_MPLY ,KC_MNXT,_______,_______,_______), + _______,KC_HOME,KC_UP ,KC_END ,_______,_______,_______,_______,_______,_______,_______,BL_DEC ,BL_INC ,BL_TOGG, \ + _______,KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,KC_LEFT,KC_DOWN,KC_UP ,KC_RGHT,KC_VOLU,KC_PGUP ,_______, \ + KC_LSFT ,_______,_______,KC_MPRV,KC_MPLY,KC_MNXT,_______,_______,_______,KC_VOLD,KC_PGDN ,_______, \ + _______,_______,_______ ,_______ ,_______,_______,_______,_______), /* Keymap _RAISE: Function Layer * ,-----------------------------------------------------------. @@ -126,15 +127,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_RAISE] = KEYMAP_ANSI( #ifdef RGBLIGHT_ENABLE _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET , \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,BL_DEC ,BL_INC ,BL_TOGG, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ _______,_______,_______,_______,_______,_______,_______,QWERTY ,COLEMAK,DVORAK ,_______,_______ ,_______, \ - _______ ,RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,_______,_______ ,_______, \ - _______,_______,_______ ,_______ ,_______,_______,_______,_______ + KC_LSFT ,RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,_______,_______ ,_______, \ + _______,_______,_______ ,_______ ,_______,_______,XXXXXXX,_______ #else _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET , \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,BL_DEC ,BL_INC ,BL_TOGG, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ _______,_______,_______,_______,_______,_______,_______,QWERTY ,COLEMAK,DVORAK ,_______,_______ ,_______, \ - _______ ,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______ ,_______, \ + KC_LSFT ,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______ ,_______, \ _______,_______,_______ ,_______ ,_______,_______,XXXXXXX,_______ #endif ) From f75c7266a3c30a44e16a831e383baba97fc07eca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dennis=20Tr=C3=BCmper?= Date: Sat, 11 Mar 2017 00:02:39 +0100 Subject: [PATCH 072/181] working but some documentation needed --- .../keymaps/neo2_on_qwerz_hardware/keymap.c | 407 ++++++++++++++++++ .../keymaps/neo2_on_qwerz_hardware/keymap.md | 188 ++++++++ 2 files changed, 595 insertions(+) create mode 100644 keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.c create mode 100644 keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.md diff --git a/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.c b/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.c new file mode 100644 index 0000000000..cfc51a4e46 --- /dev/null +++ b/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.c @@ -0,0 +1,407 @@ +#include "ergodox.h" +#include "action_layer.h" +#include "keymap_extras/keymap_german.h" + +#define UM 0 + +#define L0 0 // layer_0 +#define L1 1 // layer_1 +#define L2 2 // layer_2 +#define L3 3 // layer_3 +#define L4 4 // layer_4 +#define L5 5 // layer_5 +#define L6 6 // layer_6 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* + * .------------------------------------.------------------------------------. + * |ESC | 1 | 2 | 3 | 4 | 5 |ACUT | GRV | 6 | 7 | 8 | 9 | 0 |CIRC | + * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + * |TAB | X | V | L | C | W |Print| | K | H | G | F | Q | SS | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * |MO(1)| U | I | A | E | O |-----!-----! S | N | R | T | D | Y | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * |LSFT | UE | OE | AE | P | Z |SPACE| | B | M |COMM| DOT| J |RSFT | + * '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + * |LCTL|LGUI|LALT|MO(3)|MO(2)| !MO(2)|MO(3)|APP |RALT|RCTL| + * '------------------------' '------------------------' + * .-----------. .-----------. + * |VOL- |VOL+ | !MUTE |PLAY | + * .-----+-----+-----! !-----+-----+-----. + * ! ! | | ! | ! ! + * ! CTL ! !-ALT-! !-CTL-! ! ALT ! + * |ENTER|MO(1)| TAB | !ESC |MO(3)|SPACE| + * '-----------------' '-----------------' + */ +[L0] = KEYMAP( + KC_ESC, DE_1, DE_2, DE_3, DE_4, DE_5, DE_ACUT, + KC_TAB, DE_X, DE_V, DE_L, DE_C, DE_W, KC_PSCR, + MO(1), DE_U, DE_I, DE_A, DE_E, DE_O, + KC_LSFT, DE_UE, DE_OE, DE_AE, DE_P, DE_Z, KC_SPACE, + KC_LCTL, KC_LGUI, KC_LALT, MO(3), MO(2), + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_VOLD, KC_VOLU, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ CTL_T(KC_ENTER), MO(1), ALT_T(KC_TAB), + DE_GRV, DE_6, DE_7, DE_8, DE_9, DE_0, DE_CIRC, + KC_TRNS, DE_K, DE_H, DE_G, DE_F, DE_Q, DE_SS, + /*-*/ DE_S, DE_N, DE_R, DE_T, DE_D, DE_Y, + KC_TRNS, DE_B, DE_M, DE_COMM, DE_DOT, DE_J, KC_RSFT, + /*-*/ /*-*/ MO(2), MO(3), KC_APP, KC_RALT, KC_RCTL, + KC_MUTE, KC_MPLY, + KC_TRNS, + CTL_T(KC_ESC), MO(3), ALT_T(KC_SPACE) +), +/* + * .------------------------------------.------------------------------------. + * | | | | | | | | | | | | | | | + * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + * | |EURO|UNDS|LBRC|RBRC| | | |EXLM|LESS|MORE|EQL |AMPR| | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | |BSLS|SLSH|LCBR|RCBR|ASTR|-----!-----!QST |LPRN|RPRN|MINS|COLN| AT | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | |HASH|DLR |PIPE|TILD| | | |PLUS|PERC|DQOT|QUOT|SCLN| | + * '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + * | | | | | | ! | | | | | + * '------------------------' '------------------------' + * .-----------. .-----------. + * | | | ! | | + * .-----+-----+-----! !-----+-----+-----. + * ! ! | | ! | ! ! + * ! ! !-----! !-----! ! ! + * | | | | ! | | | + * '-----------------' '-----------------' + */ +[L1] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, DE_EURO, DE_UNDS, DE_LBRC, DE_RBRC, KC_TRNS, KC_TRNS, + KC_TRNS, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, + KC_TRNS, DE_HASH, DE_DLR, 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_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, DE_EXLM, DE_LESS, DE_MORE, DE_EQL, DE_AMPR, KC_TRNS, + /*-*/ DE_QST, DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, DE_AT, + KC_TRNS, DE_PLUS, DE_PERC, DE_DQOT, DE_QUOT, DE_SCLN, KC_TRNS, + /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* + * .------------------------------------.------------------------------------. + * | | | | | | | | | | | | | | | + * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + * | |PGUP|BSPC| UP |DEL |PGDN| | | | 7 | 8 | 9 | | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | |HOME|LEFT|DOWN|RGHT|END |-----!-----! | 4 | 5 | 6 | | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | | | |PREV|NEXT| | | | | 1 | 2 | 3 | | | + * '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + * | | | | | | ! | | | | | + * '------------------------' '------------------------' + * .-----------. .-----------. + * | | | ! | | + * .-----+-----+-----! !-----+-----+-----. + * ! ! | | ! | ! ! + * ! ! !-----! !-----! ! ! + * | | | | ! | | 0 | + * '-----------------' '-----------------' + */ +[L2] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, KC_TRNS, + KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, DE_7, DE_8, DE_9, KC_TRNS, KC_TRNS, + /*-*/ KC_TRNS, DE_4, DE_5, DE_6, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, DE_1, DE_2, DE_3, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, DE_0 +), +/* + * .------------------------------------.------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | F6 | | | | | | | | + * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + * | | F7 | F8 | F9 | F10| F11| F12 | | |M_WU|M_CU|M_WD| | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * |M_B5 |M_B4|M_B3|M_B2|M_B1| |-----!-----! |M_CL|M_CD|M_CR| | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | | |M_A2|M_A1|M_A0| | | | | | | | | | + * '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + * | | | | | | ! | | | | | + * '------------------------' '------------------------' + * .-----------. .-----------. + * | | | ! | | + * .-----+-----+-----! !-----+-----+-----. + * ! ! | | ! | ! ! + * ! ! !-----! !-----! ! ! + * | | | | ! | | | + * '-----------------' '-----------------' + */ +[L3] = KEYMAP( + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, + KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_BTN1, KC_TRNS, + KC_TRNS, KC_TRNS, KC_ACL2, KC_ACL1, KC_ACL0, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_WH_U, KC_MS_U, KC_WH_D, 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_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* + * .------------------------------------.------------------------------------. + * | | | | | | | | | | | | | | | + * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + * | | | | | | | | | | | | | | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | | | | | | |-----!-----! | | | | | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | | | | | | | | | | | | | | | + * '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + * | | | | | | ! | | | | | + * '------------------------' '------------------------' + * .-----------. .-----------. + * | | | ! | | + * .-----+-----+-----! !-----+-----+-----. + * ! ! | | ! | ! ! + * ! ! !-----! !-----! ! ! + * | | | | ! | | | + * '-----------------' '-----------------' + */ +[L4] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* + * .------------------------------------.------------------------------------. + * | | | | | | | | | | | | | | | + * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + * | | | | | | | | | | | | | | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | | | | | | |-----!-----! | | | | | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | | | | | | | | | | | | | | | + * '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + * | | | | | | ! | | | | | + * '------------------------' '------------------------' + * .-----------. .-----------. + * | | | ! | | + * .-----+-----+-----! !-----+-----+-----. + * ! ! | | ! | ! ! + * ! ! !-----! !-----! ! ! + * | | | | ! | | | + * '-----------------' '-----------------' + */ +[L5] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +/* + * .------------------------------------.------------------------------------. + * | | | | | | | | | | | | | | | + * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + * | | | | | | | | | | | | | | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | | | | | | |-----!-----! | | | | | | + * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + * | | | | | | | | | | | | | | | + * '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + * | | | | | | ! | | | | | + * '------------------------' '------------------------' + * .-----------. .-----------. + * | | | ! | | + * .-----+-----+-----! !-----+-----+-----. + * ! ! | | ! | ! ! + * ! ! !-----! !-----! ! ! + * | | | | ! | | | + * '-----------------' '-----------------' + */ +[L6] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, + /*-*/ /*-*/ /*-*/ /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + /*-*/ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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[] = {}; + +#define UC_MODE_WIN 0 +#define UC_MODE_LINUX 1 +#define UC_MODE_OSX 2 + +// TODO: allow default mode to be configured +static uint16_t unicode_mode = UC_MODE_WIN; + +uint16_t hextokeycode(uint8_t hex) { + if (hex == 0x0) { + return KC_P0; + } + if (hex < 0xA) { + return KC_P1 + (hex - 0x1); + } + return KC_A + (hex - 0xA); +} + +void unicode_action_function(uint16_t hi, uint16_t lo) { + switch (unicode_mode) { + case UC_MODE_WIN: + register_code(KC_LALT); + + register_code(KC_PPLS); + unregister_code(KC_PPLS); + + register_code(hextokeycode((hi & 0xF0) >> 4)); + unregister_code(hextokeycode((hi & 0xF0) >> 4)); + register_code(hextokeycode((hi & 0x0F))); + unregister_code(hextokeycode((hi & 0x0F))); + register_code(hextokeycode((lo & 0xF0) >> 4)); + unregister_code(hextokeycode((lo & 0xF0) >> 4)); + register_code(hextokeycode((lo & 0x0F))); + unregister_code(hextokeycode((lo & 0x0F))); + + unregister_code(KC_LALT); + break; + case UC_MODE_LINUX: + register_code(KC_LCTL); + register_code(KC_LSFT); + + register_code(KC_U); + unregister_code(KC_U); + + register_code(hextokeycode((hi & 0xF0) >> 4)); + unregister_code(hextokeycode((hi & 0xF0) >> 4)); + register_code(hextokeycode((hi & 0x0F))); + unregister_code(hextokeycode((hi & 0x0F))); + register_code(hextokeycode((lo & 0xF0) >> 4)); + unregister_code(hextokeycode((lo & 0xF0) >> 4)); + register_code(hextokeycode((lo & 0x0F))); + unregister_code(hextokeycode((lo & 0x0F))); + + unregister_code(KC_LCTL); + unregister_code(KC_LSFT); + break; + case UC_MODE_OSX: + break; + } +} + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + if (!record->event.pressed) { + return MACRO_NONE; + } + // MACRODOWN only works in this function + switch(id) { + case UM: + unicode_mode = (unicode_mode + 1) % 2; + break; + + + default: + 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) { + case L1: + ergodox_right_led_1_on(); + break; + case L2: + ergodox_right_led_2_on(); + break; + case L3: + ergodox_right_led_3_on(); + break; + case L4: + ergodox_right_led_1_on(); + ergodox_right_led_2_on(); + break; + case L5: + ergodox_right_led_1_on(); + ergodox_right_led_3_on(); + break; + // case L6: + // ergodox_right_led_2_on(); + // ergodox_right_led_3_on(); + // break; + // case L7: + // ergodox_right_led_1_on(); + // ergodox_right_led_2_on(); + // ergodox_right_led_3_on(); + // break; + default: + ergodox_board_led_off(); + break; + } +}; diff --git a/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.md b/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.md new file mode 100644 index 0000000000..fdcc86a497 --- /dev/null +++ b/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.md @@ -0,0 +1,188 @@ +# ManuNeo Ergodox Keyboard Layout + +Compile this file to a `keymap.c` file using `compile_keymap.py` + + python compile_keymap.py keymaps/german-manuneo/keymap.md + +Tested with python 2.7 and python 3.4 + + +# Layout Config + + { + "layout": "ergodox_ez", + "keymaps_includes": [ + "ergodox.h", + "action_layer.h", + "keymap_common.h", + "keymap_extras/keymap_german.h", + ], + "key_prefixes": ["DE_", "KC_"], + "macros": { + // TODO: implement macros + // "MUC": "", + }, + // TODO: implement default unicode mode + } + + +# Layers + + +## Layer 0 + + .------------------------------------.------------------------------------. + |ESC | 1 | 2 | 3 | 4 | 5 |ACUT | GRV | 6 | 7 | 8 | 9 | 0 |CIRC | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + |TAB | X | V | L | C | W | | | K | H | G | F | Q | SS | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + |MO(1)| U | I | A | E | O |-----!-----! S | N | R | T | D | Y | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + |LSFT | UE | OE | AE | P | Z |SPACE| | B | M |COMM| DOT| J |RSFT | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + |LCTL|LGUI|LCTL|MO(3)|MO(2)| !MO(2)|MO(3)|APP |RALT|RCTL| + '------------------------' '------------------------' + .-----------. .-----------. + | | | ! | | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! !-----! !-----! ! ! + |ENTER|MO(3)|LGUI | !RCTL |MO(1)|SPACE| + '-----------------' '-----------------' + + +## Layer 1 + + .------------------------------------.------------------------------------. + | | | | | | | | | | | | | | | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + | |EURO|UNDS|LBRC|RBRC| | | |EXLM|LESS|MORE|EQL |AMPR| | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | |BSLS|SLSH|LCBR|RCBR|ASTR|-----!-----!QST |LPRN|RPRN|MINS|COLN| AT | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | |HASH|DLR |PIPE|TILD| | | |PLUS|PERC|DQOT|QUOT|SCLN| | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + | | | | | | ! | | | | | + '------------------------' '------------------------' + .-----------. .-----------. + | | | ! | | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! !-----! !-----! ! ! + | | | | ! | | | + '-----------------' '-----------------' + + +## Layer 2 + + .------------------------------------.------------------------------------. + | | | | | | | | | | | | | |PEQL | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + | |PGUP|BSPC| UP |DEL |PGDN| | | | 7 | 8 | 9 |PAST|PSLS | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | |HOME|LEFT|DOWN|RGHT|END |-----!-----! | 4 | 5 | 6 |PMNS| | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | | | | | | | | | 1 | 2 | 3 |PPLS| | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + | | | | | | ! | |PCMM|PDOT|PENT| + '------------------------' '------------------------' + .-----------. .-----------. + | | | ! | | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! !-----! !-----! ! ! + | | | | ! | | 0 | + '-----------------' '-----------------' + + + +## Layer 3 + + .------------------------------------.------------------------------------. + | | F1 | F2 | F3 | F4 | F5 | F6 | | | | | | | | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + | | F7 | F8 | F9 | F10| F11| F12 | | | | | | | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | | | | | |-----!-----! | | | | | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | | | | | | | | | | | | | | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + | | | | | | ! | | | | | + '------------------------' '------------------------' + .-----------. .-----------. + | | | ! | | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! !-----! !-----! ! ! + | | | | ! | | | + '-----------------' '-----------------' + + +## Layer 4 + + + + .------------------------------------.------------------------------------. + | | | | | | | | | | | | | | | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + | | | | | | | | | | | | | | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | | | | | |-----!-----! | | | | | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | | | | | | | | | | | | | | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + | | | | | | ! | | | | | + '------------------------' '------------------------' + .-----------. .-----------. + | | | ! | | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! !-----! !-----! ! ! + | | | | ! | | | + '-----------------' '-----------------' + + +## Layer 5 + + + .------------------------------------.------------------------------------. + | | | | | | | | | | | | | | | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + | | | | | | | | | | | | | | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | | | | | |-----!-----! | | | | | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | | | | | | | | | | | | | | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + | | | | | | ! | | | | | + '------------------------' '------------------------' + .-----------. .-----------. + | | | ! | | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! !-----! !-----! ! ! + | | | | ! | | | + '-----------------' '-----------------' + + +## Layer 6 + + .------------------------------------.------------------------------------. + | | | | | | | | | | | | | | | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + | | | | | | | | | | | | | | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | | | | | |-----!-----! | | | | | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | | | | | | | | | | | | | | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + | | | | | | ! | | | | | + '------------------------' '------------------------' + .-----------. .-----------. + | | | ! | | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! !-----! !-----! ! ! + | | | | ! | | | + '-----------------' '-----------------' + From 303f5aed41aac700b6cbc5a2ce06a872d5b85d88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dennis=20Tr=C3=BCmper?= Date: Sat, 11 Mar 2017 10:31:22 +0100 Subject: [PATCH 073/181] change layer 3 on right thumb back to layer 1 --- keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.c b/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.c index cfc51a4e46..0401966005 100644 --- a/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.c +++ b/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.c @@ -30,7 +30,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * .-----+-----+-----! !-----+-----+-----. * ! ! | | ! | ! ! * ! CTL ! !-ALT-! !-CTL-! ! ALT ! - * |ENTER|MO(1)| TAB | !ESC |MO(3)|SPACE| + * |ENTER|MO(1)| TAB | !ESC |MO(1)|SPACE| * '-----------------' '-----------------' */ [L0] = KEYMAP( @@ -49,7 +49,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /*-*/ /*-*/ MO(2), MO(3), KC_APP, KC_RALT, KC_RCTL, KC_MUTE, KC_MPLY, KC_TRNS, - CTL_T(KC_ESC), MO(3), ALT_T(KC_SPACE) + CTL_T(KC_ESC), MO(1), ALT_T(KC_SPACE) ), /* * .------------------------------------.------------------------------------. From edb8fcc8102ae86807b70750e57db0de9d49047c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dennis=20Tr=C3=BCmper?= Date: Sat, 11 Mar 2017 11:44:39 +0100 Subject: [PATCH 074/181] update documentation --- .../keymaps/neo2_on_qwerz_hardware/keymap.c | 75 ++++++------- .../keymaps/neo2_on_qwerz_hardware/keymap.md | 100 ++++++++++-------- 2 files changed, 91 insertions(+), 84 deletions(-) diff --git a/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.c b/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.c index 0401966005..ab2464c424 100644 --- a/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.c +++ b/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.c @@ -5,7 +5,7 @@ #define UM 0 #define L0 0 // layer_0 -#define L1 1 // layer_1 +#define L1 1 // layer_1 #define L2 2 // layer_2 #define L3 3 // layer_3 #define L4 4 // layer_4 @@ -14,24 +14,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* - * .------------------------------------.------------------------------------. - * |ESC | 1 | 2 | 3 | 4 | 5 |ACUT | GRV | 6 | 7 | 8 | 9 | 0 |CIRC | - * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! - * |TAB | X | V | L | C | W |Print| | K | H | G | F | Q | SS | - * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! - * |MO(1)| U | I | A | E | O |-----!-----! S | N | R | T | D | Y | - * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! - * |LSFT | UE | OE | AE | P | Z |SPACE| | B | M |COMM| DOT| J |RSFT | - * '-----+----+----+----+----+----------'----------+----+----+----+----+-----' - * |LCTL|LGUI|LALT|MO(3)|MO(2)| !MO(2)|MO(3)|APP |RALT|RCTL| - * '------------------------' '------------------------' - * .-----------. .-----------. - * |VOL- |VOL+ | !MUTE |PLAY | - * .-----+-----+-----! !-----+-----+-----. - * ! ! | | ! | ! ! - * ! CTL ! !-ALT-! !-CTL-! ! ALT ! - * |ENTER|MO(1)| TAB | !ESC |MO(1)|SPACE| - * '-----------------' '-----------------' + .------------------------------------.------------------------------------. + |ESC | 1 | 2 | 3 | 4 | 5 | ´ | ` | 6 | 7 | 8 | 9 | 0 | ^ | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + |TAB | X | V | L | C | W |Print| | K | H | G | F | Q | ß | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + |MO(1)| U | I | A | E | O |-----!-----! S | N | R | T | D | Y | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + |LSFT | ü | ö | ä | P | Z |SPACE| | B | M | , | . | J |RSFT | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + |LCTL|LGUI|LALT|MO(3)|MO(2)| !MO(2)|MO(3)|APP |RALT|RCTL| + '------------------------' '------------------------' + .-----------. .-----------. + |VOL- |VOL+ | !MUTE |PLAY | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! |-----| !-----| ! ! + ! CTL ! ! ALT ! ! CTL ! ! ALT ! + |ENTER|MO(1)| TAB | !ESC |MO(1)|SPACE| + '-----------------' '-----------------' */ [L0] = KEYMAP( KC_ESC, DE_1, DE_2, DE_3, DE_4, DE_5, DE_ACUT, @@ -52,24 +53,24 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { CTL_T(KC_ESC), MO(1), ALT_T(KC_SPACE) ), /* - * .------------------------------------.------------------------------------. - * | | | | | | | | | | | | | | | - * !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! - * | |EURO|UNDS|LBRC|RBRC| | | |EXLM|LESS|MORE|EQL |AMPR| | - * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! - * | |BSLS|SLSH|LCBR|RCBR|ASTR|-----!-----!QST |LPRN|RPRN|MINS|COLN| AT | - * !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! - * | |HASH|DLR |PIPE|TILD| | | |PLUS|PERC|DQOT|QUOT|SCLN| | - * '-----+----+----+----+----+----------'----------+----+----+----+----+-----' - * | | | | | | ! | | | | | - * '------------------------' '------------------------' - * .-----------. .-----------. - * | | | ! | | - * .-----+-----+-----! !-----+-----+-----. - * ! ! | | ! | ! ! - * ! ! !-----! !-----! ! ! - * | | | | ! | | | - * '-----------------' '-----------------' + .------------------------------------.------------------------------------. + | | | | | | | | | | | | | | | + !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! + | | € | _ | [ | ] | | | | ! | < | > | = | & | | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | \ | / | { | } | * |-----!-----! ? | ( | ) | - | : | @ | + !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! + | | # | $ | | | ~ | | | | + | % | " | ' | ; | | + '-----+----+----+----+----+----------'----------+----+----+----+----+-----' + | | | | | | ! | | | | | + '------------------------' '------------------------' + .-----------. .-----------. + | | | ! | | + .-----+-----+-----! !-----+-----+-----. + ! ! | | ! | ! ! + ! ! !-----! !-----! ! ! + | | | | ! | | | + '-----------------' '-----------------' */ [L1] = KEYMAP( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, diff --git a/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.md b/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.md index fdcc86a497..d9fcda9661 100644 --- a/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.md +++ b/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.md @@ -1,54 +1,57 @@ -# ManuNeo Ergodox Keyboard Layout - -Compile this file to a `keymap.c` file using `compile_keymap.py` - - python compile_keymap.py keymaps/german-manuneo/keymap.md - -Tested with python 2.7 and python 3.4 - - -# Layout Config - - { - "layout": "ergodox_ez", - "keymaps_includes": [ - "ergodox.h", - "action_layer.h", - "keymap_common.h", - "keymap_extras/keymap_german.h", - ], - "key_prefixes": ["DE_", "KC_"], - "macros": { - // TODO: implement macros - // "MUC": "", - }, - // TODO: implement default unicode mode - } - - +# Neo2 for ErgoDox on QWERTZ +# +# Description +This layout is ment to be used on PCs with DE-de with an additional guest keyboard. E.g. on your PC at work you can use your ergodox with neo but a second keybord is plugged in so your coworkers can enter a few signs if necessary. I live in Germany, so this is my usecase. # Layers +[Layer0](#layer-0) +Letters, modifiers and volume + +[Layer1](#layer-1) +Symbols + +[Layer2](#layer-2) +Motion, digits and next/prev Song + +[Layer3](#layer-3) +F1 to F12 and mouse actions + +[Layer4](#layer-4) +not used + +[Layer5](#layer-5) +not used + +[Layer6](#layer-6) +not used ## Layer 0 .------------------------------------.------------------------------------. - |ESC | 1 | 2 | 3 | 4 | 5 |ACUT | GRV | 6 | 7 | 8 | 9 | 0 |CIRC | + |ESC | 1 | 2 | 3 | 4 | 5 | ´ | ` | 6 | 7 | 8 | 9 | 0 | ^ | !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! - |TAB | X | V | L | C | W | | | K | H | G | F | Q | SS | + |TAB | X | V | L | C | W |Print| | K | H | G | F | Q | ß | !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! |MO(1)| U | I | A | E | O |-----!-----! S | N | R | T | D | Y | !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! - |LSFT | UE | OE | AE | P | Z |SPACE| | B | M |COMM| DOT| J |RSFT | + |LSFT | ü | ö | ä | P | Z |SPACE| | B | M | , | . | J |RSFT | '-----+----+----+----+----+----------'----------+----+----+----+----+-----' - |LCTL|LGUI|LCTL|MO(3)|MO(2)| !MO(2)|MO(3)|APP |RALT|RCTL| + |LCTL|LGUI|LALT|MO(3)|MO(2)| !MO(2)|MO(3)|APP |RALT|RCTL| '------------------------' '------------------------' .-----------. .-----------. - | | | ! | | + |VOL- |VOL+ | !MUTE |PLAY | .-----+-----+-----! !-----+-----+-----. ! ! | | ! | ! ! - ! ! !-----! !-----! ! ! - |ENTER|MO(3)|LGUI | !RCTL |MO(1)|SPACE| + ! ! |-----| !-----| ! ! + ! CTL ! ! ALT ! ! CTL ! ! ALT ! + |ENTER|MO(1)| TAB | !ESC |MO(1)|SPACE| '-----------------' '-----------------' + +* Left side ESC, TAB, [SymbolLayer], Shift, Ctr, Gui(Windows key), and Alt like normal QWERTZ with neo2. +* Space on right side of left half for mous activity so you don't have to leave the mouse for Space. +* Top row of thumb keys is hard to reach for me, so I put media control on there. +* Thumb keys make use of modifier/tap. E.g. if you tap the Enter key it will be Enter. If you keep it pressed down it will be Ctr. The hold action is written on top of the tap action. +* The small middle thumb keys are not used, es well as the 1.5 sized ones on the left side of the right half. ## Layer 1 @@ -56,11 +59,11 @@ Tested with python 2.7 and python 3.4 .------------------------------------.------------------------------------. | | | | | | | | | | | | | | | !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! - | |EURO|UNDS|LBRC|RBRC| | | |EXLM|LESS|MORE|EQL |AMPR| | + | | € | _ | [ | ] | | | | ! | < | > | = | & | | !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! - | |BSLS|SLSH|LCBR|RCBR|ASTR|-----!-----!QST |LPRN|RPRN|MINS|COLN| AT | + | | \ | / | { | } | * |-----!-----! ? | ( | ) | - | : | @ | !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! - | |HASH|DLR |PIPE|TILD| | | |PLUS|PERC|DQOT|QUOT|SCLN| | + | | # | $ | | | ~ | | | | + | % | " | ' | ; | | '-----+----+----+----+----+----------'----------+----+----+----+----+-----' | | | | | | ! | | | | | '------------------------' '------------------------' @@ -76,15 +79,15 @@ Tested with python 2.7 and python 3.4 ## Layer 2 .------------------------------------.------------------------------------. - | | | | | | | | | | | | | |PEQL | + | | | | | | | | | | | | | | | !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! - | |PGUP|BSPC| UP |DEL |PGDN| | | | 7 | 8 | 9 |PAST|PSLS | + | |PGUP|BSPC| UP |DEL |PGDN| | | | 7 | 8 | 9 | | | !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! - | |HOME|LEFT|DOWN|RGHT|END |-----!-----! | 4 | 5 | 6 |PMNS| | + | |HOME|LEFT|DOWN|RGHT|END |-----!-----! | 4 | 5 | 6 | | | !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! - | | | | | | | | | | 1 | 2 | 3 |PPLS| | + | | | |PREV|NEXT| | | | | 1 | 2 | 3 | | | '-----+----+----+----+----+----------'----------+----+----+----+----+-----' - | | | | | | ! | |PCMM|PDOT|PENT| + | | | | | | ! | | | | | '------------------------' '------------------------' .-----------. .-----------. | | | ! | | @@ -101,11 +104,11 @@ Tested with python 2.7 and python 3.4 .------------------------------------.------------------------------------. | | F1 | F2 | F3 | F4 | F5 | F6 | | | | | | | | !-----+----+----+----+----+----------!-----+----+----+----+----+----+-----! - | | F7 | F8 | F9 | F10| F11| F12 | | | | | | | | + | | F7 | F8 | F9 | F10| F11| F12 | | |M_WU|M_CU|M_WD| | | !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! - | | | | | | |-----!-----! | | | | | | + |M_B5 |M_B4|M_B3|M_B2|M_B1| |-----!-----! |M_CL|M_CD|M_CR| | | !-----+----+----+----x----x----! ! !----x----x----+----+----+-----! - | | | | | | | | | | | | | | | + | | |M_A2|M_A1|M_A0| | | | | | | | | | '-----+----+----+----+----+----------'----------+----+----+----+----+-----' | | | | | | ! | | | | | '------------------------' '------------------------' @@ -116,7 +119,10 @@ Tested with python 2.7 and python 3.4 ! ! !-----! !-----! ! ! | | | | ! | | | '-----------------' '-----------------' - +* M_A Mouse acceleration +* M_B Mouse button +* M_C Mouse cursor +* M_W Mouse wheel ## Layer 4 From e3f934ed919f75f27379dcf8b1316fa0ed8e78c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dennis=20Tr=C3=BCmper?= Date: Sat, 11 Mar 2017 12:09:30 +0100 Subject: [PATCH 075/181] remove typo from folder name --- .../{neo2_on_qwerz_hardware => neo2_on_qwertz_hardware}/keymap.c | 0 .../{neo2_on_qwerz_hardware => neo2_on_qwertz_hardware}/keymap.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename keyboards/ergodox/keymaps/{neo2_on_qwerz_hardware => neo2_on_qwertz_hardware}/keymap.c (100%) rename keyboards/ergodox/keymaps/{neo2_on_qwerz_hardware => neo2_on_qwertz_hardware}/keymap.md (100%) diff --git a/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.c b/keyboards/ergodox/keymaps/neo2_on_qwertz_hardware/keymap.c similarity index 100% rename from keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.c rename to keyboards/ergodox/keymaps/neo2_on_qwertz_hardware/keymap.c diff --git a/keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.md b/keyboards/ergodox/keymaps/neo2_on_qwertz_hardware/keymap.md similarity index 100% rename from keyboards/ergodox/keymaps/neo2_on_qwerz_hardware/keymap.md rename to keyboards/ergodox/keymaps/neo2_on_qwertz_hardware/keymap.md From e66b31a648080ec7dde4a265014bf71dfd6a4114 Mon Sep 17 00:00:00 2001 From: Brendan Johan Lee Date: Sat, 11 Mar 2017 12:22:38 +0100 Subject: [PATCH 076/181] [deadcyclo layout] Added second unicode layer, more sane layer switches --- .../images/deadcyclo-base-layout.png | Bin 79488 -> 97053 bytes .../deadcyclo-layer-2-media-and-mouse.png | Bin 62258 -> 66254 bytes .../images/deadcyclo-layer-3-navigation.png | Bin 58886 -> 0 bytes .../images/deadcyclo-layer-3-unicode.png | Bin 0 -> 73624 bytes .../images/deadcyclo-layer-4-unicode-2.png | Bin 0 -> 66132 bytes keyboards/ergodox/keymaps/deadcyclo/keymap.c | 84 ++++++++++++++---- keyboards/ergodox/keymaps/deadcyclo/readme.md | 9 +- 7 files changed, 73 insertions(+), 20 deletions(-) delete mode 100644 keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-3-navigation.png create mode 100644 keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-3-unicode.png create mode 100644 keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-4-unicode-2.png diff --git a/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-base-layout.png b/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-base-layout.png index 2c03af58186308c91864bad7f9a57f41bd196629..273a49778e69342b28bda0b667dba784ff2fff89 100644 GIT binary patch literal 97053 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 literal 79488 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 diff --git a/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-2-media-and-mouse.png b/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-2-media-and-mouse.png index a267ff23d223eff976ce032965d301886d759825..798952aa917e3a2767933d463f492adde62c7143 100644 GIT binary patch literal 66254 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ðDj$D!j^h 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 literal 62258 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 $druM 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 LSe0n%aQy!Od%;*` diff --git a/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-3-navigation.png b/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-3-navigation.png deleted file mode 100644 index c8c90cf5c4fae139592d6a19dd28f89472a751c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58886 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 diff --git a/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-3-unicode.png b/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-3-unicode.png new file mode 100644 index 0000000000000000000000000000000000000000..0c6473abbd83a8fb96440ee9ea005c49202f184d GIT binary patch literal 73624 zcmce;1yt1A7e9(hH-dB{p~4Uf(nyPRqcC(yr+}n%r$|a8(x6g9H;ANkcS}l2yff(a zdhh+M|9fw(x87Y|*8*qed(J-l?D%{>dx8|?B(cy*(Gd_3u%sS~DIp*rvLhf|dyk3? zexsx5k&b{sjUXi^tm2%!`PM~CW$B`QF1t9coinq6fV~?!*?Dttfa_x`=JVKs2hu+h z-enktxaJPAh*v|qC%Ok;b9EEyJ~ABjZDixHRmW}ABYX4e)zjJiA3pSc33~oK_g8p& z-Fi0;Jf`xS7f+H`_-B@yd3qP-`fUgZ313v%Eq$)w;o*smgFy4Dop)(by{Uiy(dy2Y zj$8lm@#8&vd;6p1l@+JG%8QQ9PPC4mo?&Q}9g?4)AJd&XuOu>Qe!mCR+lGgpo}P)B zSwR`p}4D=vS?tZb1{3KvoMuRpc|W@V&ttUAN7uU|XtSAsRA z-%~Go?4k7cON4Qk!SB)S?Cm}Gz!GwqnVDao`Tp@(>Mx243SOI=7KQDtAw={-B!6rK zRr>Yo*Ry*|U5ZTs;r!#rj_Vxke>@`+3B2DIYje7m?A5DR ztJAf7{QUfe;zwIkcmxE#Q`Jt=9u#O-&rL=fvOsJU0xuW4SMaP1z1H&R3`FfLzISCg-*|;?3EZt4V8wcVX=&8H0Rc&}Y)`UpqWfKsii(m+S71t0 zx!awx|As}A&30bwf4;BhEgu~_d%p#TjJ&+0xHysw1HQ6~iVC%Wz?6lO%;U$8Mv9>H z^+i8Tq%XorCR~XFH^MEj^DnRk@Tg~nYI}<&XoYGRej<8@lLGwwxBvV4jF`B%fXYg4 za(-t8wU*Xa8dlbAWR^EK^$iWP7Nv?gY3b-Jp9J!U5nb)9yjdCR5hqzS*k2%40xF7+YDyf|l)yilK5%0cqihd>`)=UyTq$x|Vi@$j zFu zp8oEg#NH#bp!Ib#F-b{H8S)wiG3|Egb(cr*rxrAu!|kpK?9Po3JYUhKqD2@sIymGk z^afm@zI0KI+LxS!tlG@?fY*kldR~x#yUwyqQVc`&p1q-MKwu4XF1+@b$aNIv$SgdH z0nUzThg4UJ$o113-1{6HY%ex7Fe&+o_m{hy!F4oht#R3BGwi@cL`0;fqsx3AzMBWm zP;i!0V)uOr*nmSR3iybR)c8KQNZL1;*Yt7BVZdVpyu1(!G)k|pt*se*%3){aDuSSSl^C93s2U;nCJM?(N zJ<1uYq^K{ORi^dAT0cs&ISz8Ct*f^eCjf`aYWJy`*b?!gx@}<`+#c_SPcStjxhg!|CW-Xwx31qt+gN_{?A#KTNCU~~0y?&6~ zHu&p0$lymY%h>=EQC|v*B_1~63V*YkEgigTHd6F4I2MSt*YaIcv5V}-;7%>_bo z7YJ#r|FRGRvg;>DG7g_cYVes&x@^>U?|%N~AVpDu>Wzz{ZScB!4Q^I^pYC1w$M3z9 zWoXM)&e=Jfur^p9%q13h`9SX#_=Wz`=UCvW^XsIEUt7(+=<$679uo<{vgEuFg#&LC zvj<-t?^&q2!P#sf=z94)SQ1JargMYEMSp%rcBmGG+?^Gr@mOzgqh zJZD36P$Okl2o+T6q4qx)PE;&_chF_YSF{~x*~#}Jf%v}hmj)CnH{C<3qM{;yiA-TV zz4VEUep3ZyWrM@h0-buw#>U2Yb^~O!0u8+v*R!&+s38z+c6N3dJR+ii*RKgau8G%iO#?-)DvX zayjOiLAlF zJ}$Q~Tv`)GRD6_90Lu!u{A=H3VQqzvBXmyj(qm>Gc?TYV=sdrX$9uw_l6*lUx7ej%Q&qNSRxbik71zTQT{>gXjhWw!Z_aPO# z^9O>jMdAiqQH62m8_Yv#p_ZAYWAfa!82B#*Ud?ds4Ih{ZUGwgHWPKrnnfrxA+m&`b zj^eLVqNJo`xnM`==<13&(=QP_KQMJs5HZBhbyQ8!2uiPzYpB-QYD^J0AXm_u6(LF> z&I*yi^q!>x;cd-~tR{gtC*lq~cpo1-Gb#6qWHR83V#AW9%wg|!UKHq*({D!x&CLtX zxim!=m8bKSAw^(P1-`m*spqgtGqypC@8eMRPI|o!#5r3K=c05>^iOmapRH9}Lbvu($-s zU=rb=_u{{CDD@kJfuH~_T#JT*+VCo-X60K(2GOuW4fO+yL%{i-8forfClEs@2~rqA zgvQ8q+_lhO{ZLM`*snUdW_RGu^!GJXpPmza%()Hu{5N3BgBiddNXYhCa&mMV2)z6$RE%;z2 zy_B2hYs5sbNxho7@g44$C(%JPjL@PwoNTL_pFs?Mma?+8wt{lE+a6lT=ZUR94J&Z8 z719R#diU>r72J1VskB%4TAq31%*xw_ELE00Vu90U_7P^nr)UglHx0fh`9G~{Ii5t^ zXO3JKC=0VPA21{r(z$C6<&OXdFu$JRF;?m^_NGRZ!9N7WZv}0`0?J>X(y-vXTL4bi z)oNSEh3kZY~UYbeEyx!e&BPKjymJ1}oWN)Bd+Jcedza z41iPQ483K7S9aOP5^8P8S|{IOpZCkR8*j-Ddue|y709!#mUFQlb2*LQ0op#cz($(}VoHnnXhug}Qy|85!uvnUv#pEM}nt;Y2t`H2;2r z(?GV$-Kdn59z&&qf&#IZFL_@-p$`MAi53N|z)r+H*-*6Fl!k3mL4DS9s_v^`Q*N(Ych zG~k(p2EV!0r)l5Ukr8UwM)AMj6PIk;z6WM1Bs7o5hBjKztdQ zoQ#>R6qKAy4jP?z@ZQ(6fSG43qX@Ko7Bh9wJuwDC&2o#zmLU8p3RdkTcWuYN1BlaC z`XhKB@WSROG3+0~+UY)fIF(R1s5wA8HrEkF_g4uLvhr4s!{W`a{h8DKmCW#+GDRB3sYOJe2Q?k@@g6sRn z2u{9wF(?7&Ueqvm7r%ecM2v~t8IwYfiF_j?BjZa-by+2i(;qoQ9a=MtK#DbFVV72x z7$$>xf`+^MiG&aX!!XjH+z|4pD+=ii%Cdu_=%*KRB|{i zynuq9Gy5bqF)x~it7%;?b~VQBSn+pab-sms&{WiM@L6SMm7+Dk_t2rguT^eM{!F9e-~Z5dG}~u z^}_GPVQIE;jH|rZ`GL`C5Tx;b7Ztp*Sl1K_vtUt^PV z>z1)8gJ@t@799~p|LGYEIFT?Sl*(pW3q;`#vMUomAU(>18=2CzO?nI7D}*2YE_rI? zM%!E$2XmD*$}LE)-?+hUxA^!e9x-uXNeP>wkx|*R_eH19~Es~(Os zJgIsRLFJ=V1m9Jn`t$QN!X$2#Jqx3ke$&v^g>i9l5&z(MbOAt20^;I`-aw$}WzV`D zy&NlcqwjAiJjO?)vA$}N2TUjP0bnBga`Jf%xF|L75;jm@e{p3cv#3aIFQoB$Ss8;? z^^5NLG>wU(d^mz2_53dcA-Mzz2?-Sos}&qO=wTRLqOI=j?(W9(*fRjjDQakRSb8lv z){K{#w-0d{f@b^MM8%3)+#nq3fmiPHszg8W7K07vKOBNCI7m@R$$M|lu9FoN<8@q| zXlB0#Ie|1j7wDIsK7AT3FC(2S=svDL`+aApp)HJz-Q&zTBt$AZJDY}{-tW%9z`&Q3 z{3qE>Q%*Bs-ANDauOJ>FAt7=>H;p|p7D5ypN-^MNaIoO7Ch@8h2k-|UH;1;}cF-TD z7#tqXC@H}OI|aC=gXW+aCprd(qNb*~tpc;G20(#;uY;>`n}LBt93V@e-DgIY$HBqD zq!OIm%-fnmXsJ9Ycwn?@M4n~1j`0XkwwRvzX24H;Ru9$mAk%vel*n72rIp*|MO(}hj-1y zivIRqMOjSV0xEvio2~nBd3cR!qI@y8-FY@KfnVYe7%dwJ7`n%fV6 zJqB`fe_=)xhm>;c?C>m;m`Ivi*16ZW=CInA?$dfSzKFiPO%n|{EO{3acNF*a>(|m3 z-^K~IjjTsYt}(<&t=kMQgWH1*(%vUf!Py`Kv|}W>3BYTx(M%R|caR!EbG%ee6$TGG z?GSu}5RsF!FdG|gq??dI@cl%xe$?6zfL`gW%)O`nJ zn5+|q*2%FS)s)9=XXAhqrYQfVetd_M5C^$?KGo& z3j8wCTmRLY74!IAp??9K(3(TBLDq_Im38p21P~hn0s`s>4+v;zXqcFoBA?|mhXXtT z5e0?r!GllFt!DwEE0ZcXwOKA|M*~7dgwTca6(n>89fBxi!bQ^7)xahS6;{Alf@aQDqL0LKu0(Q;iigkW| zeiiWNwzp?Qh>EX)URzSLg62LkW^`)xuOgvfox|y86ed)9c>T@${Csf_kGe7Y3dcDH zZ|czi;H>s?wmEQ^G*>!v?jxgFQ3&vPs`McLIPgM4%wH!ZVOU#R13ycE zvh(urkbpuR;CazRblshuov)N~#q8|tLiW{|2!P?2xf-5W>YH9Vqcpn;21Y~|rR|8^ zRtw)iPiIXa-g+O>4lFe)@e7mgxsxTWl?S0{Tb7OLuwK9~FIcx*b_Td(ry`O0NZ*^w za43U+PEO94fHej>x-Q!)y}TH6+Q>-!lw8h#vAih$QH_ksN@8@sj8+%$E&v6_Od#9~ z4(eC*qK;2j#m~H+8-lFgH*fHsEkT!qMDhE6%&IL2;QSS{cq5HI1Oz2{EP zSJkkZV|m?BG#u7}suyl-!e^(B)rM#I3lwV3itdnUkOV z9Xb+9l)o=sR2ugeklM@BItI&Q{nn^lfrjh56@OU2`Hu0)Qc>64Hal`1zVeGZuUjP* zEM~>7EEr$we+3jW(Qw??!xC3?&hC|sFImELV8EAQpbO4ePU|hi(HqGo9a}eZ3>iwi zcl>+~y4qh#=jJcqee|L>WLFrgIF9(ii*IKShuhcUv}PE4bA4RTOtYF>c{i$BdKkx4Ta`>VoP{} zdlE|3X7SmKP4KSm{M)%ogOq3*sAVhawUTN%7&`zU`sGhU$@S%XFVa z(blKHF7l(vNfK=+%IszMn+8*k#`oRrRTzGKB(iL3%QUv%n4E>&i0K*dFB!kmxU5;UGMcQiH0iKyrDciv zW~eGq>xh2~gE&ZWVXN8T=&+?5i@{$i)dza?y)9E{k#-}-cJ*=q?=?qmNW^a5XRR>3 zw-OI(Z`uhY&X_di|Hyo!!)QBOy(OsquP`=jq;MI!;yU=Sq2k3&YSf2wrQ1b~)b>!q z{wu+P+Uy2-4u9ti5%967$X&N@3I<4 zU|Sn!Y3K>Dti=2Jx1kfHvY5(PJ=V2k?%ov!Q^yza6#058M2rin2aIYs^(4YNT4v?k zCL}irzx(wX3=px&2;C0HOt3#-&0IozOf8lD z4fK50J$*cT)mki5H7+l=e~_w^Pd*RtPLvI)=R(Pdp-#KJY)$Lv$+@MK-W46xuV$6B zN2x#fveQutsTihF^)n=LO9d*;SoCnRo7s45a39N@A?8+@C97T#6-N+IBW|^1``5NR z=5XoDII%i>JHJjqs^+-Mp)K+HcG07ThMb-H`(YDVqzYMXI8H~Nm^#U2hrEGwGmid6 zPtK~?5xc_8W;Y8BhJ@<Wwd3G;(w#-&G+oWnqvFok~p*`7WHd zBhXjv>l<%C5m7~O>uhW)co@vNG6_wN>R-9$6iApopU_UwYiik94{J1Fm`!IinH!?t zo}J>M>%N$5XrF1k5R$fdIquuJd-IyMW2qgyPBYZEiN?*Y8%s9Vk55y-S7K*p?QoN~ z`KagV@!}7gFPkIyUtj3t;$*0L&Y#m#U=1%kU8r-&lpg>y}aam(-OzVC3usq^phujgU(M429JNRpN~~(d_Uwp z+X%7VS=dH9rn`qC9@}jOP)FK#Gj7f2%X~(7buv}PBgg&Dozig98%_lwGomT3C&}7D zhfH?YDkpZeRM2!_0Lf!;Sc^R9zdc#;?Yfyv(I{^@I^zhE-g-}0cPRFR!ykbFAmiGh zOgtP^?ugf#WN{We$2es@bsQ@7Dnjr!YzJOh^5vG>hC!gi#-Wy#y;c+tQBqsAB(lRc zbV~|CfbfLwC*E8%WYm{uyLFVkQ!hZ!Pk*)=z3&V?vBYS~WPPNpdc)ljX^`=7E{4@| zhINV_W(J{lo98Y#$-m&lQ@5bdwB5uCeQ6po#>fljqC|>7anjLJ67yN8)XL$!D(rmc zc3#nCfmnZ!-_|M`af%s6tCxmaict)vghD^aMQK(A8-*@DtC@$i6s2k=jr4fYC z#@CQ3qZaXtAbk`fJtNR7Ezm0iegl_-{V@?nBxD2jJx;LQR}aIsAmgGJGR9l}0J-;j zHO`E-`N<4eI5lcj6QHH>n_ple1>n6*LJ;1O=r~%gATE5Y>CK0DO{7@e=F@94vH@|} zBng~i0IY87^{g&I{APO1_BU;_2_DL%DWfIwe-=xPNxm_q=oeqg5w@mU`&a{@$ zYWOrjik>}r{9}YIbKKvd)LY9zHT8mMYs=U`X6@+i{a^m|6|Fz;Lrit)aiiX9zm!+s z64$X%4W_HSYJ+Ls4CMKjj*3XdJLlbP1HO)aMSwa|Q7b=xD`%29WCny}rZoj?X3lRH zkKQ?|B-c9@D7quyV4}9-y?hH+?mdeN(9Q&6z;>ULv^fz_ql)g9=S_a@UEeuEIhc4c zeYPkZHv|VQQ4X*N)(4C%o0v2Wo)G^N06 zVmRCZ4htu5?3jvmfF9^}Y$CH3<8k4EaF7LOzCB~(qK+TSJk|5Y%*xHOUhljMlK=K=q`dX(K%YM4>SO4+5^M214PsPoFyGrjm<#_*DEdIZ) zu#dod;|0%}%^_6{Eu&`E#KjzG%#M~>YN<|k8d6Tl(%En;;+r3kU1K1Rlzky!6!3b*sX%##AwHAH`IA0#A;(+Uc3-DY>(_^Zz`9V`d`tXgF-4}swAa`%J!$R_1= z-yVvjW$|7Yb^s-mHhS{9tJUkGQy?U(|1B61gR~(NvX}VTNfHG zS|RYNLO>ts!c+r4^RE4^w$PLI7GeQ@%=WT_)G{{qXd>O6$_U$c&wOUy&G=WB>sY*O zsogua!z2@fcX(X3BR>@WXmsFGq$`Wn2leAQU9MaYX3d%n*ok$1zRvXBG@ec{ld{!( zqh4Zj?WUp*#hb1(z-s&4rf>I+ueau~s@<5W%&Ono#&Q`I=*L(nhl;s;^b<%*A|CNn zi`wHwo~a^vI>Zn!BSCQf9ra~suIEiU7hzA#XVJ)(&Gm}#MlzF;9du2>)&J-h|GFE+ zb`g+a*_!bcxt@G9;8e$GIu|yUloJ-A2k%OK4vC^JQ;7bCEALPZdl!&Qv*AW{r+^-wYpHuZ_ z4jA^lFR{>%H!GUW@pDR-Y!BZdIYgbFIDoXFaMoz+_fflVd?j9+!kgNvr0Q}iXggNa z%a9peTr>o@|Kj4}qe8X&;&O7>K&2a%oNS?}uAqQhZao8Wp~Vkj(Ja@UZwZ>H&pq?wQ3d(jzTI#;YT@j_&b|?t~MDhXH6UW z-9V&cQUAN_vuyv>?QzLo1P_Yu;7s2A>?`1L#;v5JgbUPUbduq0;#ykd;78_^ihux= z!|j=fYd4TJrY@d9z^dW2AuX*pFtD{p5dQx(@CzHGZsU(ZdQ6fp#%bIxF77!y$jGBM zbrZk5ly<%ps;5yd#4j^8$R-4puFvgOR}lx_564xj4|h1pVOf6KuE>`dYd0<{G_A%pWUR3@8bF0;n=Ckxs;_6 zGqiPAUMA&R_S{igu`n6@$(1&$GDygFk}%=8`7fm(>5a00LnWijsSS42X`NNE4f|@w z#qJPv?dr-;<7bGj77Le}ks?nGAVIAUTjNbCM2wcB?mEc^l7=ByJ8eto>QV!^zb{K2 z0{*@xEG#?_swPX8M_AoA-Fdk zP+;iS5z`s38#A}Ot9_DuZ%CS}9uz|7q~mZoSDNo*wEibvmMOU4nGhH6k8xX5)yg7^ zy8mkI9>4vVYn+)V%a1SG;1xGASL+f%(@>F4vptHkkoqiGzMjv26MbR?X0r^!M)RS$ zDO|?kb2EeKVNy;GBgm8VIKlcrRst8#nLcYWkbYvd9~jxt6Nww@9po?r;5G-61|VyAbkU^J};d9v`4=p z3-fO1MU_*TJx$cf&CLxA3K9l#UAa`jZi0k_1o)3; zW_hhA^ecY@BR^Rj&Ln=*LO64L+XPzhtBMJ|EygoBI&4)A_?z#WWB5M~zs2x#^M0PL zbp`6nu&k`x4qKCBo9n{>rUlAnKrBSMX(cKvD!u}x%||JA8k%c>f>?S{Q&9UbPboJN zu-@R4-T_v~`$_f(=js2LVbegmo8c(sanJ8=kXS0vuCi3KdJNFhURF~u8o-o*F@xqJ zXtkj@m_IP?PV@u6o&x~B>`@I*_b>TAd#SHlK4A3IcIOe`tq%~e1AzdKc&2SJoFrc> zHGy-Golk%FDs*Uy*bmED9!>ztsKjE70}&Znf3YL#11+E$fWd+27dDrYv#XB}c<&wn zci|##{A8fQ7M3A!y~x0V93Zy;WxB#C3jlOWzhQm_`06u2kUSr_{S*)+I6%0{422Px zl_hQLe!kY_kM>u=EOc2&qYX;QzS?zDZvwm4ZQ6}{4%x!RJ=t)YTMq2r>FHi@J zy~WMU$N)-Qx)Us;zv%0lv40H*+@4YcF`V6gS;p7jACSHZ!>>A?+06c%!7dk${4Gxe zYxt@6ZyVl?1|FdfWrl*fHk^q;LP`qlb5|D}99PiR#txG(V5fNoD_xkMkBp6_Kan*G z`kEuJiJ1%psiT#)bZrq-*0$`qpFTYR!eBP>XU`JH>{WABDt~NMm%8j5TjA3dFD$LB z1T+WWNTO=)=1(x^UbUJ6wufc)v(6~ug+NyQ^HF(SsV`qo6gBluvfGqFVjPq)Tb^J}R zNUGrbU~i!GhKO|@oEMkZjW8Vfc5DENIH{qbp)Qb=6Z1Q>Eq5mcfSH1>V3+-6y}mSI z@We+F638RJO>Q4L4@|BBpVc6=q+sP~&WEV${OoEV{LZzdQ|z{p5H3f~wmcwawiy3} z2J~XBzG(P{tw8y)+b>C#URgQHLW<~3y@<2T9^9VXWbl(ChAmw4hXy<~G_KFpCcJbr^q8e~TvN_?n2htV8fgZt$u%;hTUT{F8PU=cK?I30Qi!cN3 zC#j?qJ*F!ka6kuw7I20Sl}#mDbME4%U`S%vfkmSP0r0cNLh89H@aUzKYZwfoU&y@& zU$<@pZOk!P%4ks=pHD5rZ?u7~9S;Mj_;k8Y*OlTO{Lwztu0Qk=PWIJnYod&da`k;sZ`iNX)*tCa8L!fE%p8T_$xhc4T8UX zk%9ln$ywIwLdEZl3kD*V{`5}%6#~kuxsG86KyB@2N$0^cD3H_xX8Dn+DU*nZh=PKG zF4yW;+XeV=8Ia}w3<@P{q##H9pGfBCE&m~zk-r0y*?xlh@o#l+iajv0*GGpn>0VIu z*%WA&qV8+EU1ROl@pj_!2-4vw${1kMfhtA7=L}e3Sv5cHgZU4c51mA4!)kvf8b&BF z`*koNr2%ueGiX*eX1=<;9T7z*`5E2Q^O6t-CRX6oKMX6OQ8)5zk_B8n+*`MdREZ*f zyYdy5T&axJrv`2NpnQBW)!wIrORbUiW0YujEh_*0n<$7{+ZE3YB%l~0C7hdF?4WXx zd&}zwBunrV04|6x5|A>Lx}Deo36rfORyTZpVmw>ASmMjNB>T%nZp3g3Z}#4A4J2>v zd!9Ni3pro(%vIiBg@lst6Ax3~@k+T#JMv#{^r>W=J8npuL*B!Cu!y!V*{Qm{)=#qD zc8EzlVaDFl2ywyrZq9c9p18+v!;8$Waw z)1^=HtY{Hl-raio0&|H$;DeKFlk9n%aCWwD$43a|pFzl8jt2Use}$?o|9m6$6Y>EuASd<`>|Mvi+D|RIcjiF?jE>enOm1#!!X+pFV(C>TseUo-+LwJ~ z{y48>Wu~~XtP*E8>yl-4{yw_AXEH(=7TW&H&-mKH#XU#5@^$^+@M(Mh>m~^~{4RK> z=+}MOH*7@AMGjg8;`xe%{P{m2OVNips$mtK9ebjZv!TY!1dFFPdU@;Uh_DJjYEQG| z)@e?G5VnJfmB-;Qjp|?b43r%}eo=w?{r@utempaOz2yh-xFvaca$()>eFGA?Efb50gpwkv=?<~ z(>rC}WrtF3ZJ@2O8*Clt{IpaLlq*2X8U%yE2w&Bur6C~uXzz)&Tz}~vHulYAV|{%V z2wg!J@o~cO4goqic?F^V(&wsv%vFmQo|-#b&|Dk-sTaF%WNJ6GE-q@xzlNCqKn(k^I>!lV!KS zR1P}@CGAk@+#e7T?S@@ zA$8~(ZjM8@U_PX!bJhL$EJpU&VI|@*Ok;W;ZS=!&T%RZ|n{F%Bmo<(AnfGV*_{MdI z0!0rrKQ?Q4T-PMBZtlDbI9zRS^*a8q^9M$vb9e6MZCOx$LMx`X%+Pi1r-%TcFHGz6g|Ps zuyo-ZmDcy5r$pjKkw zZzp(pu^-Vod=m~?N%pjXwBf*zys6WU-UpO!;S?&jZ|sFjt=?Z)VKA8c9)8&zJTt@= zFVnX|Au>vKX?{qtq1pcIN8Q}|!}$3lZjZZcmkt2{uwBOXX+!{e?tuX%Ab`Fv4uq3H z`301}ttePP+hPuJ2=z6OJ{^$9X*+Y+gTlkTp^w_!r=2*Z9v^Fmdg=*YBg|_A2!oPv=Q?ZIvsMbZG zs;UZaMt{N_LO(@K;p=%b!JlZ_XD&P+o0?9Rk!%~RI#$(xt<|B`w1$^Dii;tuW8a?& zF-w`BU=Zgzl1R_9)kh!*uSSey?nTvla;2aPVZBXA<$UkiN=9RDQ?p3^f`1-xxi%w= zPmMj*%%DILQyQ{7$5^&B;@Nd6=>1V`Sm2(#hFo!sO;JefFGNiS69~7m@*SaFC`WAt zbjz}SZ$8yI7C1h!F-^p2yVzh3iv#KhEgU#@LIqHXp3iqq2lgMILdZANn44;dbQ-$$ z<7VH6>CDH4=3{S9&*f=V+4Y6-)J=4>?=)?$5ibncVPV!w$uDHDY+0AOcE-#1u;p|a za->n)32vD>-!c|AOc~OdCB7%8KVpBr?xc%09{Pm~;;|Jx{_gg&Y|Zh3QIaQ(tR!HeixWMniqmq5rWtpY{%EV9VfvOz$g=H&z?gGS6ms%geT@ z-1~8E#AWq6M*+CT7ZZ%82EA1dHOkpJuZ~Esj}>RFj&R3IrK}1z^EX4V=XZ%Y$9Tz= zvvLpZ%UWK}&8IqoVS?U(B4jqo?w4{qTp+JsvUhRN5@;Y2mawCs)o=5axK z&BLW?cO=iG-PvYkIoPi#W^CXpEnn`yHhnZ6ywfuY*~(ks~VVW{3~p zu>SOob5c8F9R3=f>~22iN?LWnffLx7;7fsd4`}GMVVMwiDq8w27RZ8wpH_^$^z zoRx&t*b#^4D{j??l%f3#TOtiR7dy`f`mqeOr-OvPO}u!CEiZ=ENgNw7K+->Ic*Uk!wH_g9p+}5|C zFz1M!U3o4@NOj+_)wz31?;S!l4`RQiMuBuFeAb^rh9Ra^U(+g}-&72Mi@)X4uQhnY zQ$2}`4~u*0Z=_t}Trib>PqLw~%TUwX1AurshPU9^jU`LB+Lp1Zy;$v$CCQnQ$gIxB zhhJfuZ0uG|%`=N>I~BOj(4(UpGp9a0P?qbVBqc{7z&v#KYA=q%nD{XK#Td5xpL`6GQZ1B(A&q>{57JSu}A>#XAIBP zvi^5Fqc~66Kz^VZ#bt-`CR;U);mEaSc4VNX@}U26)TF96t8PC|)$j)CIp-PaA^9+U?58!#tlj9;-Z$B^9E-?H^$ zRmIR4DqKYop)mg4{ob#u=jhUY`?#Ci@KEZ_hONVfMojLs4Xk&Y{fv5!F#n?~PD7Hh znr!i77YflfxFD6~(qipCdz*QqH|Ww>>*6xh-wF}&xrS6<=d11Q6)rqsGaW8@ z35~r+RzYj|Y;?cQk~{N$`ny@;7tHR+IPx$IC)tme@R`1%~n!S-`JZJiK;)j2C(F+gpE{-UQEs zcGZQ}#30+PNgnWBA-c`}SZoQ4KRU|$Oy3qyrY72gBGTeF=K9CFbOC+}adpGN00DJlsiq!WGSF`6C;3$YOpyukILY+0Uv~N46S? zR54|jwWfsaI*+CE^}t*3BrEZa{ZrpZpH=pk6mn{W^KmNy25n9w7QCzzb=EHJ7}__Y zMq%I84|&`*CkK490Td6%G9Z?Q zHnz65j(&QM|4#00Fd9BXM=&5V<})J%MQm+L7rP0CaeH1>5YtP@x$H4qYbqJ)C@>S1 z3w1%RK)vo?bD6Wq>E&|Q_T|X^gW|5y&wc7UQ%h#m2bF4Z8&Ps`*IIYC=W>^#6v$-W zSMAXe26*@`U~iSv7D5Ej!;4zayHhUK_+Q-dFrP#odEdAzPbIl+e6-^A^s@Di<;J*6 zEzZ-b70b?tpo9vd`P^+BQMAklbvx4aW?0K__3QMa;y{Q@iGML~w)~ylydX&!@MSRbn}xg%4wfh7+HDH+fuEc^|_Z zcARg?tnByoG9j!l;z)lAqswO1Y=1<0F*|>KFeiSn^~`LIfHpPdo z0?6Wp1>KBsKNM1l{BYvxBF*>MQz zBmB2tk6c#C@DO)zqo)$1Y=@UiqM zcloQ!GiqAjf%D z>73w;bKd=L@qDDlF|ZGu?J0Qr@k?9m`1mswRn_#Gn&dlqd3g$86!I|nxzkPWSq$*? zK*T)R9`^>)HDaHtUOL@s-wm%v&>JOp%T*fLK2s?4H(LoIzC9UCf>I=6&CzJcEWG$} z8rN6bnLd4T*|RscO6iIr1Yb@d=~zfN=w#`uWTz} z;8hC4q^CD}&qbR4e{uE|P*tv5yCxzb2uO#7ARS6bDvb&#QqmzIDcvjq=@JnE0TB`D zZX_fYsDOxcmnhw_B=7ui?|nSy{P&J~?-+ZG#agmi-}k-mJL8$pd}h0NM3Zs)-8cC+ zWE9Tc%%=8`yt&}fctorOZ4v_MyrJ1Q=jTQAN@O&QRl-2S0jU5VNnizVU}v`{H0uK97fH%e#Qg1C(u}S9av<>-vXR_{m%hZjwQY zUn!(@v+~<{UDe`Gmetffo8Iiq0i3sk#~Yh4XHKqd-}b#I8YFe8Z{KU+E)Z)CHssRd zs|2kO@+%S#U;mz!#6|hgq$RYBS-Mhkn?6Cat0zxaBSrh(z4fu3x z%AR{0shTUg=k9F>9CZP(TxXV@ud*7MeY4ju;_CQ~>2^_*AMT@qnA1U8L#w_-Z=j2X zqw^(~gPgawI4F``igf$C$?eY+x9Jlr7K!wi78>7UDXqGi=i|+stg(&J3JdOe`ujFG zHxi--nrZ5X`896p8sBYa-uH^zUcBn)(A2czb>XvmZ^+Zuy*K`1+6pQUjD~{%*xBc2 z@}`Rv_1LzzY25zKXNXReeoi>h2+&1kv!3N2m`!l(J+`RL>8=?@Y{FCEA2HO0X8fC$ z`d1CQbsK}}`sm+I@JA~d$4+eTl`RuZ!}?g>-|?@%sFwXvqDjEi-d?BHwZ#dqk_VRZ_Z;itmgPC0)`F4o|Y z_U*98PMB0*HQg=aZoT?o;}*Nxl7WU-8cO4uJJ-z34VAZ|NtDm>{wj`L{rbISb#QR8 z-{mr83)l0Zk}_%Sx}P7Ps2%BCa3zzMsp#lfIcaA@nTMX2_wE`KGih*e@XWU~-0~^3 z%47lAKV0eb@6WTSo0hfwD2*i`uYX6rCE&Yp`=?Se{p1<8cK?mJf!#`E>7tsCl`(7LQV1d ze^A!}H4*JacvmNh`4hwm0`+P~WQmRO)R|-UiYxMne~@u5Jly@=szcxSMAOZl-Bf&q zxi$<#LE&~Ev%Fwdu(`~Z?$r@>)?*K2_m_;9Tm-dY2xuI_TTM}0X#d`m@GzqtQ7zp< z-QVGQQ_Jv9kz$Y!n?dDr@gT$N*XsKDcrljTe&aGvZ=5PL!F;+va$b6s;hx&5$_(rv zjpv1ml7Ws&gqNjQRbQK!|0q!$DxnyJnw~(4wbI~KMf)!UBWAfBT3_GJ{#u%Fd$s?4 z!EAY~jt&wb>n#j>EeOtqK*16O7oYYYOun01`LZ{ey_lwehvV-lUwW5mmxRdp7-g~D znY<>e-l8j*joCBW@&=AKHc)vfpIeZXaIC{0Srxe&TrU-fX_;p%ynKx=(6r81&7Se5 za(nZY!fWEYHD$umwMNO(Aax-tFOOYjGxE8$g{14-w*r$^QfSJZf{@C-&7^F(m24k< zsbxaZ_>0-lt!Q!*oL^5ZQsuW;t#+;Sn~q_f3?IPwO8nH=Y(E({IO0TP{PFYEncUiB z{gQ(8UF(^Mu@nV7TH&TcCEDOL*3C%K_>h%d-xTuQo(swQdLAx8SboPnwwGk2rB4Yv zFU)*xC4-lsk00e1M&6fq>X^Rw^6J#rv8Nur`opuV=4$Ybl&1ul0wE8Q8_GJ~@lu5k z>hjNK7n^O?DZ#)mDn@Nj4PLdZ{T_mjlY$*4>I{#MsI3vE4qU@hKEfRtUyQI zTzYeCpVleJg~kYK&G%g%<)(q!UpGAw;iI*lt#3?N{*vNv2QNSK!Wj}zXtug)y1u-Z z)v#I9IrEJtnD@b@ZyT?YPBg_bHS5A@92I7rBlHsK2kO}|f64l)yBnmy%z-xk$Ms(^ zolU?p>|M?+Wny75Ml?f5-V1^V#Yw;V>sF}Bm-=VVo-NSaOEz&P3q|_^VW`<79a-cC zCs^gTJ0vQ`$NYSntvp|+#kHGRGKA7*wqo^M;_+pk@(@&Jc)0j7D8W)pt3SG2DP;a! zC)LUKlMT*ok-tO^4qVKPeps*18W7|7KfRfjLnUiVPZ~;36kGtBBe1qo%+ZD3%GMwN ziN4De(tTjhU-wpp6>38F9ckO)S{=nyW3iFjOAtG}W)} zy)(-aB+UR4lT-C)=pN+QB)xoz<1cwUwezEU-Bq;tRmqe)Ji;>Zw*vxc-GllMENsRy zbhzZ8BKClfB3)itIZ%ho#cd4Pb9XAv!KPD9mbAdTZY;1grPS8E&3``G$u8}$b9O%P zW1!E-Hv^GJgh-q4bR*-xp#wXtWVmr7ab$u*s}bU2}_Qefex!o#BcFi+O44Q zaOB_sJI)PxMQXFLv3=%kT?doQxwG8jQhzSumbWE0@3HWK{&cZTvj5@I?`5hY1cWD& z^bHLSJnkFjdLSW#m2xKt=y-I{CvJXnXmlsE11`Z|azYpmh>BN8{nuI}utbH*9&_A( zFG%&XCZGh%T3h4KM+D(^clU#mt@a`zF%i)nUETJb$M!O6Y8QxziFMBj078yDsD>wJ zfoozkqTq281X}ex7Wv!acu!J>2lNGGT${RXfg15xu92pZVvcRK8}r&e|Ngpx$AnDE zo$8Z+EQ-yP4Qka(u}MQ$$3n_wFGAxPxqA(*iHS*$2m{w0b#*Mi`tfh{Rh0dpECbv` zW3M}vlfcB`!v86@J?w{1B``jlp6q=8HX94e86XfQg34mxs@}BywO8(QtX9JnQJR7B z7AXIKfJqQs$`P@!wZp6!Zp`(B_Mbj6gv*WNKS}e?sRi2{SoVA2deCXe!ns}wzI*T9 z$s_s)ezn=Y#EAd zX2I^5=;%h)mtC7($`Xbv;?$Re&!AKFz|71cB$4`u zl|^HHZ=taq;B?n&nm2QdL2kjAnTMSn7xVy_dg-4H>TBfdp%HOhAdKiqoZyIUMUMPL zV_@p**N^|_XM(G|+j>qPc5^qn^ys1R2j9s5!Tk)#qfUph>AQoNB|?QoZom4+SIoW` z^cNVq?ya`)x-98{BuTPHTapOb{?2A2e5c)yHi|c7*jC)tpfTxkaX>a|?w)+uar3rj zPSHi!_E}u0@)Qy8KxW=O*C^qFq136@RTY`7HrbBCG~&ApS3phIush>!H3J(P4k+PX zgO>dFniua}COMF*3TNm{e@cGxj_z}-l~v6`24 zP>n%+oxMJlKD`$m1N`dCE}72AbJtk+w}U*6csrgI{Uty0Vy>VOt=obLI=PJ$sj;Kk>M(7{p!(_=PijAtjS*sWTCg$u;==oHZ=J zb=n?mAR|A2%sqI0pY!#$G7A*{J^%e1((_g>?7j@Ts%upOk1kzJAq>t0sK?@zmX?NL zCF`|mC@SKE)^j0fDqDe43TR>fbdnuY@(@Z$n46?+pTz+sAs{U!>a~9P5+KcR12n|* z^lCn{f`Tc1l>F1Aq(#RuP}!Bu*Q@#WJ^J@u$~jcY>k>!34b4S1M+sYSih4Gp-*7vg z?=DGSJTw9&(qK#R^xhVr_kUdFdbnn=T`lJqgK5$mwit6Ev05wsK?dx`B9H$ z6GuvwOcH>La>m}XFAZ0o%vAks{&o5NvbfQ|HcyXi)B>`3GLVPHrP3$;cE+d}vFf=u zjX?J+LzNBTuS%vMIvfp8>7_1nkzX|@1S>g;I`o2nZ5F`8#gzhrZay|HuERH(ET1%3 zu=JLvVB>q2M=p?to(4DHKF46^^I@wYR5Hc&40y9o;%Q>&W2$6=P84_#@`B~RqWuM| zg4J1gL1T@_f2j9K{cj!_l{$O7v*MOFN12OlI$I@yJ8 zWwhEz$ZHcvy$)r!?x)UGGNKlGbSz2OsR0xd>=ycYKTg|+;36DynNU)YVZjD5B}a?K z_$y{eEF|Q*axotRTEM&>TUOvY1G!Z2b6gzN#)kt~gA_r}Qd|wy)+pipy|IZx_w5#3 z{eNEre@6_RhEe^H?Uc3P{feEs>aXau13vPPI>$4|K^oiEnDTeVVqH zdp|Jr^hs7Jaw#(mJs;eqVk>7P;;2h0eyLek_k|Q|?hoVb{c-5WeV0U}@$1Z32>iRJM(YG=b`;_@(B_A!l9Y z?_T1RQ)T=9a{^=8XUTeH87zL{my2hM2}?iw*JH7xU90|^3vlGFkY(am4pj(ayFd~+ zc^%YKa8Q57mgIE|Y-jM*k^{KGD!f;=~pGrW1j(CZiVj^x4xdVc;36ciLn+nh&XUl4zRb+6h! zS(*41BD$pfjn6fd#iQtPGE@@{u2ayWB3Ur*sWNLSf63KzzXRW%9?^DYUbcLLzVCU2 z8;QYEg4wgtrSy}I=uP_%tlf$%^<~$isLN-NYa&B&}46s!} zb^J{8R29TGcmZWSw^uF!8_TG$f424l&S?mkujlw!7jx~OzrC!QWC(sqi^U;dDBJoKqa&hBAMzU+<5gx4=(H({1TU+(KRZ@-Wy?DC-Y zR@ZunD!roXS^8(10joveK-7qnv_T`vHWSjfJy!j`G?tk+gGNf?1py#lHr2{?nZ``Rc;=R&R$1dA$NJx>Y=RMGmA)riO;GtF?GhP zFBjg|{ha&BB|g-1KJB1i$-cpINa5W0ui7h*LWqYHKuF^tQU5=_wiR7_%eADxe4a16 zxWJ{AUMG|1df5gqwmbI|RkP_Du5UZ7V^6cde*8|}<_HIp3u4Sx^L@lt0!p}oCmfkF zOG$pB_Q(qhsUGEI%q=Zf?o?)XINM3H=HqynayP@q`e1#IWb3V5%Z`ip>c8hyx+L#Y zvvD+Psd0QR5_0Ey;wlf*h23xAFIdrw#aA~z&iBQ_z|>W_bPkU%KW6=AY#qHCnFex% zA(-u^FA_Io??8pEd_|2{e8E|!RhZiwxGnd5r`s&2-Qzwp}U|wugyh2}fut%=! zOcT;Ct(GbsP>B&D4Rn$Dp8oUB7e?I!2nuu_{tgQ61b$q5!g*t^p>}3hiSnkk0JlWt z*YCyFZE#J~!Tw}P$(k7z1vKl%2N89LBk^%=Lx~dElN{odf+qvjs9lXx6eQI2`h(Kx zU_;IXJgj3+*w=lx{VmlP$$L^($c|ivKQr%ew@K9#RHPgEHi712iKVztohDbLV#q^N zbOVgzRq;dHv5M!IUYuJDiDHkQv+!P#|IgQN~Mm zcg{mfHKKT4-_l_bdo$`6ro}m;JHq^%a@Kx_3^H1L56qKW=87huX zhqoM2n82M*4|O$jg^{2!E+)bb0fU(bYH9C)uIO$yNrEP1+Ct z_;%NSzMXUC<>A$XWko^d)i{xp++p`W5$G!In=~)#A4FXAIi{OVCu`TZ$R|3-je>YE z4+&}@9?Xz>VA7z@o`!kksIif-Ph}&>6E`aKth>i-$V#A@@umX5^ucYT5(;-m4n-pf z2uCHe!q@VY3txXa5B(~+g@84ec{dNEMJ-u6>OcM9Dh?~A7hYS9!4kZvc zJW=^g=D5QPuS=N~>b)<-|KiPDUISEpU^d`shf*FVoDpN7E& zD`BYWHu~dWDS2uY*2HW@YDLe+gU~W+g~4xTLvg>KjF^p?`|XS@`uu99~mi=a3@e6Z;-ur~E#@cXw*)2Cr*!Af{vm1VQg((uWl@Y*b?gLR+) z$(GgX(Jp^x5wv%|zc{zR-O);om(LmX_&%}zhjmm!L& zE1O&U67^Qm&PkdzGvMQP6$a(FfYM(IjXNb~RmMg_Gvu3pkTGOy)u#EFrP=dmA+xeL zcrWOm)2Hu|b!*gk$(4h??(&RyY3)NRb@1`Ii<=|_D5>4hEe#JpW?rG7d}^bfO^KC} zLdj$THVsr@_t{%crTV(N%@PsiDy;^^7IsYUM5+|`D9YOeRQD>Wr5MUxJtJTJ`CtR` zOW07&m^0OJP1xQE%@FnW$T+RizJ%WRTEOQXE*mU-%Ml=;%wFaG*g=|_74y%xkoBHx zc`Wnkt2WiaFgE&(AMf}+b>wnqbjJ}E+Modmx87>Z4~7M|3Htm?yuJr^iAR5anw6Bs zzBUy7+)U1(>G|UKnMr!Yl~zv^a=tv3qvPJcdid_sY0H7r3%aEww=@>f{(RZ3Hzqg4 zLn&E|S*A|L)2at-cQMJfRsl|N_wL>LotpP=s;jAu3gfmkaH}}xrd;2nxT}lw!YpNR zb7IOb4z0O}Zp}zMT6sYskbr-9f1AI^kyO($zJIm;W{yrN&8!wK$DpItuE8aB?}FTe zLyG=`RjzW0^3tk5Pjb1Z2^yWxvt-E4#4DL@q;FU{=5;9+viD#6(^qs!@!uBu&Hqq| zjK^%g@NfuTuX4pvGNp zt37q=#nm5+!OBL%VJ-y=sRY!^#pV%4Us^5gA|^h{y=*eSuVG=q1~RxTNk%YA2!4Qm zu7{|~lvc-eCh?>lCP@*A$7h6{TE6y)H%<7y-?!-eIX=`wH>{{WX6_t|G>%RKksbYGwniJ<=E8X`AFBq57_&4rG#U7M(rB*rzwl0#`J4D)q?kE?z&1} zd^}!{?dkq5Y&BHpV0M!GXw@bO*}sf8W}xNS-|t>YXKJ>!>-X%%o*F@Rtb=S&<6ls_=Z||i z7cSpEpbTyCuaMUh4Xfw1w3|shXFA6|loQ%f(sHm?#+6M^W2fBRp4&1SBWX!5MTVg6 z=O*z3&D&hbQb(0;#J2~86sbIak#TWsh2z!OmPYYOU)Es5;sFD8#TyGEXT!bU9g0zM z+tmHQpl%(VKN^N#`!c>{Tw7(t!e@+ov{ ziG3iV5Wts0JM$h!r-yY_mHdwU-_!CevDct@iWsU@bs|Q48(kvfU&T^{wBjVG>9zq4 zU-!N{NCX>7j{f8}YCc;tWyZNrqr$@B6!d+Y?CifC43uZcg-hvu#@&ZF7iU(Py=!LO z3UAD@KWuB}@23e=pSd^IXbjOCf$U@`?r3(fSQ61blYoN; zyM^8T6E|}O`ajzj*grmY;s#6D&B2it0?KaZN7*G(P%U9-U|(cO zsvRjTke#9MYD7!l07Pm2b|M{+KLkJpy7wVL?TsmhR+i5K~Kb$1E$jKS*#PWj^ zB#>9?4tMLCw#Z_sp(ub@yMIbQxTqE@_gQW13)mMcP*-bf^g3wBLP1lET2u>wO7P?E#teV2^}dTF(m8ak>uy+Tr_S|w!E&~+vvM3lDNb}T?I zzopXQ=gOdEK0OoDDUbnxPt3gN6;d!%HF}ZI2abH4U%SKRy}Kv~59~Szsqw+yFUZy- zZ0(1@!6V_b(NQ7cgKV3r+J1-zolOM~>ezYxA8t-m3fe!&6pbpz0*-dj>vNqy&qd|; zvvk74J5NO9o2y;Ew#JKwPGhTqqSG*w2s4u!N$n87xVt8UiV{UaL$COz3h#YkkUvEb zpXR!#=x9F}K8H;2Vo^#o@VX0^8cNKfWB@R-E8rfht=x4ygD-6B_DSLIRRF-3a7cS} znNVcglEE|J`5G6_jd|dG-$_WEe`e{8=Xjvdy)Q|>WFU9?3uw)d+L(PZeFdMT6ME)B zMb;;RMnrgH%^zME`1pvR#AkgqcECnoe}nAPdT4%GU#vpdHHRMttCQ%kWZODmldrCK zNWg48+BhM*HyU&)>31rc;W0y}qyN*VgwWHQD)atVuePlr0D0C2@Bc2)4UzFa_7eRT z7ru+J@Qz8=^-BRm;Co!t^Ckg%;D0>GbmA8sJlC2)M7wxtTN10+G+VGE9W z@ge~F>r+Zfp0BQ3Lc{gFds7$`_(A|$&P2&S0crMe_%VlDh?T_FZoZcjnQ8~41cASI zKhCL)IX-lK??hlXVk+%Aq*Onq0_d&W?cuQ&HdnA>{bD1=sQ494Pe4tSh6m(u!Gh) z`~wW4fX2cWOVEpm6Lw;&a#@amj&Ut+zXr<<;8agdb=G*e0J#R4ENCbKIuuCZFiQR+ z{1^R++`0{Pm=TQzfsr$CgGU9iquoJJLQ;%WUoPqP7M*yTBm`3uwSUBIP@Dagxr@IR zW99|W6v~YA0iD`GXd{3Z7og@18;;9QLOkl(v&qXuG8RZx^e@b|gI)tnM2iXPYHSlI z^=Ci>0&;(9Ccf&~P7evhbb0nMQ<3C+59Cu>I2WK##8)=er``1Q9o*tdO08T{_|LR> zV6`?Z3=iqAh1TalX$C_t-kT{Uq=lMcP^mBmlha>ro7`v$WsVzcF@SEL1cVAAIN8+m zeDPtcZ=s~?0}Zl!8(qq@V@T@xcL~t@tIB_r04Gik8WS0Rd#iw1X(YHW7&giP=HmA_ z7epzAVk{b}kMO1^{H}@J9x7 zva?T-z$?r}DA45KT1;UHy#(S~aNYph@0q<~X<>n&gQZ%D3-)R;XW@T>0+>KT`|1JA z%SeSDaS+9*k73u))Q?lS%xO3M`2w_9zXn-rM8M#?{WYcJydi;SAYB3FClHxoq0>`Q zIT0*9>57u_#!Q?+MuFT+`P^o5p(*t!0HRMWQYSWKs&Skh5d@$D}& zt$>%0Uv~1$xz`{PfJ})ivmOcnSFjoa_Sy(s+)Q^SF(`YClds=?i8kT|X^H#G#2U~X zB*j76b-?iW#WQlx8c_u!n6yd(+BKJ9Siz2Hb`K6L@JmW6t)fnWgq~GSD;Qribp;ew zc-__>z}SW}9$O2BUY$2n`Ui^52oO(Nx4&pB_x;BY7+CT~W(*+Xi!nFB z4@^C6T67H6~tNX9j%>KVEHM_)%dkL%O>3qVt z!N!}OmMv*k*XA%aFVzC1U3QZX0&iY}568l2L`VUf&fzv-U5rHzC%gwQ+yXi}G|u!; zVI&GZ1@4-M94~hbA2>lsX}CmixqAH^6wycLcA1X0-@<;c-hY*zq2k8OTP@J9%60*n znE|zHIJ{xBVlOp7OZ~=WlF9w;vA~;Y41*ua$`2;5Tn)Y(sLCb-ase=oBvCxOs)`b% zHC_!`MQ48F4X`S!a;H$wz98bfa2-bM@>uqAfPj5L?d!A>I#3=#-h;~3X*gF-SstJq z6*g3E>+zk6gA^C&0}x;&EhvKA1PBqplh<~t`#%=U$9K+a9lU+ljFqM`U=bJxqf~%X z*L&tUJ1{gUX-0Y-3o?5wkfJy-^X*5!@CoST6%^_%^J@Zr7s6Hs3Hi;a&Z{;cdZyRr`~ny{a5_cI2aSGI>}V(3fh0SuJqOWo4umrB&@L7r}jeFz4_C ziJeY!$L>~`mY`Yjh#nCH@ZNWaCF~`uAh8E&bxqJ!hfi03B-k=sx^y~Sxv!_@>8A&T zq3Dkt9f1Q@Hqj_hB7wJITWjFZTcB93?X<`9hw1#^7U~T|d_J81{Q0v14>|czW~EOO zn4;=x(cUvL>|hrczC9X+nFwIAPrmZrc^Hd+3kvBlsq+(S+}5dNaowNalmE|!dfb$h z6sVzDGJpTk=QPo98fy2gi>JRqGyvhsggnR9YS;y@`{pM&sceexgUCYSoQY1wqvIVC zhoU>1^MRmVQdrxc_Ou0bOji1hBPS|V46oqEbn{$e29OII^W3H{7Qn&$_QbqedX}1g9SJaRW^!9RcrR1 z9yOpP!0Lxb7?g0I0ORopYVEybwIl~HrIP{~Lko8b?F)g%2WDnwQxM?G-@4_emAh3H ziHwDSDo{x#GN1)0Wj15Ai!ZSLhuf!fvdjJJ_WQZP#)YE4*%WH!wwFbU?6Nz+swO41 zv)bFo6=&j~(T4aXDkf%ngR-wU!p+SsEdE1I4u|7H|8G8qZjJi|@a!$X+34>|2&O^lPcR-YFXIRYP-Tvczf4`}Ze=?0a6l z22Y8!6@WWHlw*)u8d(F$!Cjar0Rl3J@z6iqA%lt7H0u&D!~=p92%*GFGhq(3qt*R~ zHys_X!er2i7o>mQa6{KYQDYzf`G4+M(dcXTuh8!dcRfcAr)O&gYDIv>(Q1&ftL^|h z=6}a`pz`Xn?b~c3Rvxd}9+d)(t$fX*2WNM-mzUpWUxN)C2$Qs+#Y$x0UMTuR%+2Xo z_uKsZ0?%W5dRi}YbGuksRyxg-n!?mou(8H4z!%mxhdYdQST4QG5Z)rwuwh&a7BEn{ z(y97tDm;Jjf#KORx|gPs$>{U#DG2(3MhJtTU>}sM1}_tN;bbCAq6+`?eYBZ;&-5}B z?0`rlMN;caLJ>2cwTq>B+Cz zGo7Oqohi@%JvMzw34v> zb(bus*xxQoy{)Q{^SEuK16v;Wsy>n_2K#z@KI++sIv5gKJh-(em-Vu}$ACTfcsI=_ zt-E*6LG%E-T&^Z8Bm@T$@BhdNsu3B(1TNsuZSS0@6Vu^~$AgU8`MzOX{!_j4FM%tv$Qq3JOCXC({`#3L2jWlQ zC3zl=UkA=-?54;1C1fTZq@m>24}l#AjEMf*23K=qA(lhJA-I(mFH%xcL}v(*hl8n2 z^VT<4xxuf25*_l1qoZT0*8~je1~*jUy2=22n|XnrFEB)$9&(sPOQ6ajbXWKHJI_EO zPf{*i?>$A;0Ysdfws4je7M(Q2;DP9kg$PsJnL8gp^DQw1bn*N!U&{1 zou!r%OPhWSMQ(FreHk@iU4#Y?T$fD=9sfI8};Eah4 zN)f^2;y2(sFw3aJR&xzV_>r;d4D;O8pph1L#q3<_(z9nof}$Os5;8}jOstZZxzzNc}K?m+@^%!k>J-Oryt-(jNOb?&|ZG*Vf6 zd%o20B!H73v~P14@d!np>fCdnhIUMoIo2KQu)A;0$#nPf0LS)-FBIC%f1b6f-%845 zK{NXqIk1u;e?mt7+_~KJ`i37e={y7%3!n1TzX*|q_=pA$E$tU}c=CyV^KxjPk;4)D z06Y>c`KVs&+>4n9zMxtNB8DYexzXyy0}JJhYC|_6L;3u9t}O1VC|WvKeJWgV^g7HT z47w?LcMiuT09b~befqW}C8nmPl0c4?kf1Xyj(6G}ATljRrVWS5b^XLtwpo7fmf8*LkAKW>Qj|t)ANe*VN|j;So}!^a)}MssT-i51<7(6y0Es zI@p=#1|3EUpa|z!u3!NxS(R-25sN9KwW4%L9_nB{S;%qbsebRS%hK?}Qkr$4;0Xdm zO%bfIApmefFi8y}<9tYuE|YR08BDQgFNofHkjZdo=b$ok=dK%7#j-s`-N zi6Gsl7>>Vn+TO&(-xxP|Kd1wyt-(xBDoA1fMjQHih`@y+%uOJFCpq@@_DZIy)En{o zg)>QOcg}CZK2oY0^;}o<-0acFDHlsy^!zm)i_AZaR=laK+yVs6PgU(3r*hTj*FN^x z*8akRzXcJeY0aYcV#WS9jlc7!NNwEBUI#-W>U`h7$g;?YE%d2NwW4Xl|d z4?I|Q0mj1xc61h7bQeSAyXJtRB0hj*04@*->6+bi2Z=f`)`smb`Ev)&W^5N&^m%mw zvjT94mgRhZQ*BaH?IR0U_-9;1c`ullg$L|1w!h?F$Kf6U^pOTE*Y2KkuX(lUoiZ$w z-)9U^C=40AeDD)>a0X%o$TB~`Vii8@Vg`sv2sy725Cf9q9f$=tSycOu^>NlWbDYev z#v~S-bySJkI}KOZVHS!zG?&RVfUgFPhFAZo#eM*{`Hax~-+GX&))B}&a5`R#Cz6dhQ zypOoJxdWBbEuHJFen+U$G%leEdR2~RArL@hJXz?@a$LUrSe{7|hP*}FB($q1pL(Qc zzH%JYQ823E?WR&-+gA>Dmk|`Mzt&3x?iqX=0*JuLN6<-?%;%d2Ddga_dEgT~8ex(# z)S(#YKZDqsFOY)Cb*mh2K;REv3ytZP)Y75^gkj&9juR_!tPYR+N%wBBVe+JB+RtQ- zyLTtxoIs3r5fohkKgrovzK2*rajzYO&I>tIgqwz%+UZg)-8%e^ZwtdcvyNe>B>?i~ zHEP1P8mWqLO0xFpCjX#O#o^*D+bwkh`_u#mlXD!k|C8VGJod$zeSwI~>U#y{V$D`S zTLg~JmY9Hl@ev)62WuUux?PbM654yhS~_}R`X=PfFnIB#@oPrXP(z+a%fqfB|3w4b ze8IKZc^}(3=BcYWwKI=s$jql@j5b-{4lMLED~O$9u*G~P^|KM_>2dO@ zf+bPapZxwQdSs_p30k;J4Q&<(E5DSr} z<9siEU!Jb9X9rY00ssp^sNfKtnA9W>GQz8jsw#>5#*7b`+n1e7i9&WKz>!HooG8A( zaj$tB*!jb?UPCQqohN!wEK>a+H5?mo-{+-P;U^~~CoiuBeJCGw$AwNB_&XAwCiX0G-y62t9UO{0e;n~{nc;lq|Wc1uz?M9G+NKeha03o zND2GUlHNMFQ9?XlrMbk7(3IzlhHUte$L_II8OU4k-r?uD`TB>qx<^viWs2zERB3&9 zBR9A9DBy`S&%1s5=xZN0zPk*%p}?w%PQz$bbjiam^2H;W+s|6%PxEtgZ^+1uFm^#Q z6|sm1pmTzNH8TDalHnG2!dL%PN4gct2dwf?ZxeRqviM5tvb{C|Xg_}ZIC2iWe@&A$ ziizP9QyYO&AiD-I z2|c?BvY*f@wfjA&Cu{Pm6^fmRF_uY6|D|8QIBdd{xT0Ays{}&q8+{Z)S!J$!zaSU_ zCkm3q_TNmB>#UYzxHvePs@>L+uuw5U;F=OSC_~?P_;BQI%Y_Tmxn-B&<~Fql5|3~Y zs66FFsv-RmD@k1J8!YMcAI}Ghh5d8^cC!bNZZfObL+m##%#qr z#`+X=X63uqwVSzm2T9Ju`c^}n%0LwZeOZHHakD~A0O3XTKK6C@Q=VFNDdz|94CFot z!5)IHVxW4qiOenl#0ADJ=VU!HJI%>0AFmuwEo>`1Q#V`sXhITUdqW-(mVffPwY7CB z%X!<8Du2jp-vFK-6d9Sm$>;e*DZLSv1*z2BP7uiL6a;##?`i_Sh;eh69koKshC4*x z020@jp2@u+__Sh`jvVuPL~x_Yp+j8j(3YP0K<8Ac>p96&CpJP`B_C29^ulCcDDsdy zw!WV=gy~zfuE^4Z(SLG+&%V=`ny<1`xdS|R*J6atqN9%S9 zzJ1ef{;XBYv3K)_Xpbl{Uh{`9G>nhw&lP16Oqh6B7rk0$Xq~C+4+uXfdal!=zf;Dd zSNSfq`(Q1Qt87vI-VtsqBw)z?$fl8`iMdb0M$PS9cJj;!xn$lJ)veMco}652&2z*p!bO#1|V=0?jQxQ)k0L ztSf}cIz08JZ6AD}zRN#7xf-iJzWwF}yXX3+4^@q~xNDvuJr|v(-94(8ZHpC){!X=c z651m=G%k|_g@s9jmx6)oOBy2*2N*`s>1fd00B2T&ro59UUFKT=k)hI{5XK@6pOeUhi-=HxIJr_4uy>GL5E_MkmDWMj69B3RFqIZ3T{+pg?R@b7qCyMNR7@^% zD#D*J;^#+-?_hJ+?eWbU_YwDp%5Z-DY1MGp(}I2D$}_EfiX0Bwb~I)xR}cS(hD+Ov znVPbgCl_>kEuLrd70w41Uw*iTj=LZKxIcy9P1j6ERLVnbhEy@GErlL**@y*jl;8lR zGw1xn>32Hh*5GKlXROzfQJ6gOY<6jv9HnPRnw^~BGp7A(CZ`VnE;?;7Zf#EZ=N({o`4^`s+BRw9sNmF|6aXES!PyN9#4^8 zeqg(^OOzMV)HTz25*)jb%Ti*86MM`}r0@lHM5)TsVy?`nLi^+sOLDw`okfW+eZ?K( z$W&;gCLNX^`{G4|0guqDYTkG@n)J{8y9m0D1UcYn&Jz>+L3~&&9`UOUM5z$~2^8WD z0DOx$! zf`!XHa==u4Vpg7rE*(ox&Gz!?SzLX8nD;ZPZa*l&wBt}uK_R%6Az5N?<)r)e(xTAP zKy0Fj%a^<9-=T>rqSCl{0Pr@@rL8_V6)T%+$kDF{K!6;b7YT6pjl8JKNu7=EUg`c8 zLq6f^p27ZZ&o#9tdFl{te45LKA~5hY*ks)mSFaO4d~mv4Y-iTdqzcYR64X-rm?K8{MqoCp$`?gIaQ%Cq3vP1^Q@d>B z=z5g8X|}S_2HN8qSFPPuQ-d4Jui_Had&hs8l6aB%e324wnP#)cvvPo_b7Q_QvXD#C z+L{y4g|;6S`9tZ0gOtx>sc7Wz2Fp3G=GHxeB}jg#|5r)ToTU}Abjt??wyoNs13J2O z`{}(3v0`_j5TtteTw$u!O5lnOjfK`&)4{;>^t2|V;ea0_IB@J~CIyJtb2JN2KtLTz z#_cR>0&QIo&YghF7s9}Lqlbwkf(h;NN=l|V=b`?60&Fd8xXdh2QN8`Q`=0p5ovaZxi&*v;C(RRUfPi3tgz zz}b=A-Tlm-KMqaYYxhwD^Uom;&e1ME2cG$yw%c~l!&GI98C4C9%EZ1i=cupOdGEvI z0qXTle6N*zahCnHNmG2yxjC zx0RPElen<{{cV&Vi38&g`phO!fE46m6QFAT;cZh~AGgVcRfl0*(iD1|O<_ZOh@(w> z=$leR`Gbv7)ok0a%VqS}yDu(PS$7LI6;8=E^`UU@VhvP}x;h#Pf3^~cd`AAF=oZGt zhyX97J!=&CBLntAHdFAz381ktJ4CzDSrL?aG68+$)8KA5J zKx9s&r8prST_liK5IO}teZ8R+@VYLNhT5%8%EaByE7u>cc8gxcRKp+vUxMOo-~4&_dIa$YptQnm{hjfGhPr^K%BQ)m%G|zr(D0}DxdbTd z%79sNp?IFQ-?njr#qgf>dD&CgE8{_>AFUlr@+mCrIIslCQ~ivTZw!S9h3Ce#zft@! zOuM-)=E|=WJ77?39>r6B2Ci$TIZ4)^Y?2=}Uo>D<5WiMnr|Bnte~n*Vtn1V2;p?+w zllG?xoPGswWgI1MFPm150}P+?cl*!${6W6R0Tx57X)g#YX;)T>K9PScJ9jpJSY?qhFadJKcnL3Vz#n&qX#nDav3!YTZhj6*mG#pifU2wB8EcB@4_=BfY3RSc3jUOeC|w@Gyd@Scz>~3WTP|U?E%-ja)lVn z&!c6`rkaelv zkX7A}dP*=JpQ~}FC!kLI&Yf|{`&>rd&cKG+)_m5%K&Y*NP-V9r0-!j_3k!`!NJFoGGe(Fq{hv>1? zsr=H}8O^fA7w@Y#d$qad84wq3ySG<|U5?6r$Xzy2asbJ>cY@=sG!>WxARx?&_FnxZ zueQsIb-Pp%N|oVABwORY*?^!_dgZn>7S`t_J!--NHWi^hTHvv511*anfsO@z&n8|u z4nFJ}c^Ba=#Pw8yHjdp+=9=3Lwbz}0RC3Uei-)z_WqiRq`KL?rQ-|6gZSj6Usw)uh9YGHjhHv$) z;y2%y*sHs8pLDc_t(Dir+q{71 z$@N*s6|JOas4∾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 literal 0 HcmV?d00001 diff --git a/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-4-unicode-2.png b/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-4-unicode-2.png new file mode 100644 index 0000000000000000000000000000000000000000..4488e1b37b827c341307a39c51b43ab1d1475daf GIT binary patch literal 66132 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 literal 0 HcmV?d00001 diff --git a/keyboards/ergodox/keymaps/deadcyclo/keymap.c b/keyboards/ergodox/keymaps/deadcyclo/keymap.c index 5774511cc7..243ce94e98 100644 --- a/keyboards/ergodox/keymaps/deadcyclo/keymap.c +++ b/keyboards/ergodox/keymaps/deadcyclo/keymap.c @@ -5,8 +5,9 @@ #define BASE 0 // default layer #define SYMB 1 // symbols -#define MDIA 2 // media keys -#define NAVG 3 // navigation +#define MDIA 2 // media keys and navigation +#define UNI 3 // unicode 1 +#define UNI2 4 // unicode 2 enum macros { RUN @@ -94,11 +95,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,--------------------------------------------------. ,--------------------------------------------------. * | Esc/L3 | 1 | 2 | 3 | 4 | 5 | 6 | | 6 | 7 | 8 | 9 | 0 | - | =/L3 | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| - * | Tab/L1 | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \/L1 | + * | Tab/L1 | Q | W | E | R | T | L1 | | L2 | Y | U | I | O | P | \/L1 | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | LCtrl | A | S | D | F | G |------| |------| H | J | K | L |; / L2| ctrl/'| + * | LCtrl | A | S | D | F | G |------| |------| H | J | K | L | ; | ctrl/'| * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| - * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift | + * | LShift |Z / L4|X / L2| C | V | B | | | | N | M | , |. / L2|/ / L4| RShift | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * |Grv/L1| UNI |AltShf| Lalt | Ralt | | Lalt | Ralt | LEAD | UNI | ~/L1 | * `----------------------------------' `----------------------------------' @@ -114,25 +115,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Otherwise, it needs KC_* [BASE] = KEYMAP( // layer 0 : default // left hand - LT(NAVG,KC_ESC), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, + LT(UNI,KC_ESC), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, LT(SYMB,KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), - KC_LCTL, LT(MDIA, KC_A), KC_S, KC_D, KC_F, KC_G, - KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, LT(4, KC_Z), LT(MDIA, KC_X), KC_C, KC_V, KC_B, ALL_T(KC_NO), LT(SYMB,KC_GRV),LCTL(LSFT(KC_U)), LALT(KC_LSFT), KC_RALT,KC_LALT, ALT_T(KC_APP), KC_HOME, KC_END, KC_SPC,KC_TAB,KC_LBRC, // right hand - KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, LT(NAVG,KC_EQL), - TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, LT(SYMB, KC_BSLS), - KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),CTL_T(KC_QUOT), - MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT, + KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, LT(UNI,KC_EQL), + TG(MDIA), KC_Y, KC_U, KC_I, KC_O, KC_P, LT(SYMB, KC_BSLS), + KC_H, KC_J, KC_K, KC_L, KC_SCLN,CTL_T(KC_QUOT), + MEH_T(KC_NO),KC_N, KC_M, KC_COMM,LT(MDIA, KC_DOT), LT(UNI2, KC_SLSH), KC_RSFT, KC_LALT, KC_RALT,KC_LEAD,LCTL(LSFT(KC_U)), LT(SYMB,KC_TILD), KC_PGUP, KC_INS, KC_PGDN, - KC_RBRC,KC_BSPC, KC_ENT + KC_RBRC,KC_BSPC, KC_ENT ), -/* Keymap 1: Symbol Layer LCTL(LSFT(KC_U)) +/* Keymap 1: Symbol Layer LCTL(LSFT(KC_U)) * * ,--------------------------------------------------. ,--------------------------------------------------. * | | F1 | F2 | F3 | F4 | F5 | F6 | | F6 | F7 | F8 | F9 | F10 | F11 | F12 | @@ -177,13 +178,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 2: Media, mouse and navigation * * ,--------------------------------------------------. ,--------------------------------------------------. - * | | gg(1)| | | | | | | | | | | | | | + * | | gg(1)| gg(2)| gg(3)| gg(4)| gg(5)| gg(6)| | gg(6)| gg(7)| gg(8)| gg(9)| gg(0)| | | * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| * | | | | MsUp | RUN | | | | | | | Up | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | | |MsLeft|MsDown|MsRght| |------| |------| | Left | Down | Right| | Play | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | | | | | | | | | | | Prev | Next | | | + * | | | | | | | | | | | Prev | Next | | | | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | * `----------------------------------' `----------------------------------' @@ -209,7 +210,7 @@ KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, M(RUN), KC_TRNS, KC_TRNS, F(I3_GO_GROUP_6), F(I3_GO_GROUP_7), F(I3_GO_GROUP_8), F(I3_GO_GROUP_9), F(I3_GO_GROUP_10), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_MPLY, - KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, @@ -238,7 +239,7 @@ KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, M(RUN), KC_TRNS, KC_TRNS, * `--------------------' `--------------------' */ // Unicode -[NAVG] = KEYMAP( +[UNI] = KEYMAP( KC_TRNS, UC(0x250c), UC(0x2510), UC(0x2514), UC(0x2518), UC(0x2502), UC(0x2500), KC_TRNS, F(EMOJI_SHRUG), F(EMOJI_YAY), F(EMOJI_HUG), F(EMOJI_SMILE), F(EMOJI_SMILE2), KC_TRNS, KC_TRNS, F(EMOJI_HMM1), F(EMOJI_HMM2), F(EMOJI_BEAR1), F(EMOJI_BEAR2), F(EMOJI_FUU), @@ -257,6 +258,48 @@ KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, M(RUN), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), + +/* Keymap 4: Unicode 2 + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | ¹ | ² | ³ | ⁴ | ⁵ | ⁶ | | ⁶ | ⁷ | ⁸ | ⁹ | ⁰ | ℃ | ™ | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | ₁ | ₂ | ₃ | ₄ | ₅ | ₆ | | ₆ | ₇ | ₈ | ₉ | ₀ | ⁄ | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | ⅞ | ⅝ | ⅜ | ⅛ | ⅚ |------| |------| ⅓ | ⅒ | ⅑ | ⅐ | ¾ | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | ⅗ | ⅖ | ⅕ | ⅔ | | ¼ | ⅙ | ⅘ | ½ | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// Unicode 2 +[UNI2] = KEYMAP( + KC_TRNS, UC(0x00b9), UC(0x00b2), UC(0x00b3), UC(0x2074), UC(0x2075), UC(0x2076), + KC_TRNS, UC(0x2081), UC(0x2082), UC(0x2083), UC(0x2084), UC(0x2085), UC(0x2086), + KC_TRNS, UC(0x215e), UC(0x215d), UC(0x215c), UC(0x215b), UC(0x215a), + KC_TRNS, KC_TRNS, KC_TRNS, UC(0x2157), UC(0x2156), UC(0x2155), UC(0x2154), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + UC(0x2076), UC(0x2077), UC(0x2078), UC(0x2079), UC(0x2070), UC(0x2103), UC(0x2122), + UC(0x2086), UC(0x2087), UC(0x2088), UC(0x2089), UC(0x2080), UC(0x2044), KC_TRNS, + UC(0x2153), UC(0x2152), UC(0x2151), UC(0x2150), UC(0x00be), KC_TRNS, + UC(0x00bc), UC(0x2159), UC(0x2158), UC(0x00bd), KC_TRNS, KC_TRNS, 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[] = { @@ -506,8 +549,11 @@ void matrix_scan_user(void) { #endif break; case 4: - ergodox_right_led_1_on(); // TODO: Make a fourth layer + ergodox_right_led_1_on(); ergodox_right_led_3_on(); + #ifdef RGBLIGHT_ENABLE + rgblight_setrgb(0xff,0x00,0xff); + #endif break; default: // none diff --git a/keyboards/ergodox/keymaps/deadcyclo/readme.md b/keyboards/ergodox/keymaps/deadcyclo/readme.md index fa41f0ec16..c839f99c90 100644 --- a/keyboards/ergodox/keymaps/deadcyclo/readme.md +++ b/keyboards/ergodox/keymaps/deadcyclo/readme.md @@ -51,10 +51,16 @@ provides standard media control keys, and default arrow keys. ## Layer 3 - Unicode -[![Layer 3 - Unicode](images/deadcyclo-layer-3-navigation.png)](http://www.keyboard-layout-editor.com/#/gists/67d9613dcd873c68693d11863d0fd289) +[![Layer 3 - Unicode](images/deadcyclo-layer-3-unicode.png)](http://www.keyboard-layout-editor.com/#/gists/67d9613dcd873c68693d11863d0fd289) The unicode layer provides keys for directly typing unicode (utf-8) +## Layer 4 - Unicode 2 + +[![Layer 43 - Unicode](images/deadcyclo-layer-4-unicode-2.png)](http://www.keyboard-layout-editor.com/#/gists/7b2241110ab8311d9668a0798f3baf4a) + +The unicode 2 layer provides keys for directly typing unicode (utf-8) + # Changelog - 02.01.2017 Added delete key on second layer @@ -63,6 +69,7 @@ The unicode layer provides keys for directly typing unicode (utf-8) - 24.01.2017 Added unicode keys. Added shrug hug and yay. Moved Navigation to layer 2 - 25.01.2017 Added lots of new emojis and some unicode keys - 27.01.2017 Added new unicode keys and shortcut for ibus unicode composer key (CTRL+SHIFT+U) +- 11.03.2017 Added additional unicode layer. Moved some layer switch keys to more sane locations # TODO From 0d71e631ed5f06b28a83528ed4de3c0f7f90d1ea Mon Sep 17 00:00:00 2001 From: Brendan Johan Lee Date: Sat, 11 Mar 2017 12:27:46 +0100 Subject: [PATCH 077/181] [deadcyclo layout] fix an error in layer illustration --- .../deadcyclo-layer-2-media-and-mouse.png | Bin 66254 -> 65740 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-2-media-and-mouse.png b/keyboards/ergodox/keymaps/deadcyclo/images/deadcyclo-layer-2-media-and-mouse.png index 798952aa917e3a2767933d463f492adde62c7143..5930e38acaeebcca1effd70e47116c135869966e 100644 GIT binary patch literal 65740 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�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%0DmpZ9aFTE%M@8MR{jt#xB|Zf*ni1dYkX9xf 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 literal 66254 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ðDj$D!j^h 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 From 96bde794d8b922d71f11ec2e7eb1ba0bc0ba8d2d Mon Sep 17 00:00:00 2001 From: James Barrett Date: Sat, 11 Mar 2017 22:09:50 -0800 Subject: [PATCH 078/181] Update readme and default layout for TADA68 Add the default function layer mappings for the keyboard. Provide flashing instructions in the readme. --- .gitignore | 1 + keyboards/tada68/keymaps/default/keymap.c | 66 ++++------------------ keyboards/tada68/keymaps/default/readme.md | 2 + keyboards/tada68/readme.md | 15 ++++- 4 files changed, 26 insertions(+), 58 deletions(-) diff --git a/.gitignore b/.gitignore index f66a961fd1..6029afce4f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .dep *.o +*.bin *.eep *.elf *.hex diff --git a/keyboards/tada68/keymaps/default/keymap.c b/keyboards/tada68/keymaps/default/keymap.c index da57c0343b..f28116e0a5 100644 --- a/keyboards/tada68/keymaps/default/keymap.c +++ b/keyboards/tada68/keymaps/default/keymap.c @@ -1,9 +1,5 @@ #include "tada68.h" - -// Used for SHIFT_ESC -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - // 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 @@ -36,63 +32,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap _FL: Function Layer * ,----------------------------------------------------------------. - * | | | | | | | | | | | | | | RESET| | + * | | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |Ins | * |----------------------------------------------------------------| - * | | | | | | | | | | | |BL-|BL+|BL | | + * | | |Up | | | | | | | | | | | |Hme | * |----------------------------------------------------------------| - * | | | | | | | | | | | | | | + * | |<- |Dn | ->| | | | | | | | | |End | * |----------------------------------------------------------------| - * | | F1|F2 | F3|F4 | F5| F6| F7| F8| | | | | | + * | | | |Bl-|BL |BL+| |VU-|VU+|MUT| |MouseL|MsU|Rck | * |----------------------------------------------------------------| - * | | | | | | | | | | | + * | | | | | | | |MsL|MsD|MsR | * `----------------------------------------------------------------' */ [_FL] = KEYMAP_ANSI( - #ifdef RGBLIGHT_ENABLE - _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET,_______, \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, BL_DEC,BL_INC, BL_TOGG,_______, \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______, \ - _______,RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,_______,_______,_______,_______,_______, \ - _______,_______,_______, _______, _______,_______,_______,_______,_______, _______), - #else - _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET,_______, \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, BL_DEC,BL_INC, BL_TOGG,_______, \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______, \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ - _______,_______,_______, _______, _______,_______,_______,_______,_______, _______), - #endif + _______, 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_INS , \ + _______,_______,KC_UP, _______,_______,_______,_______,_______,_______,_______,_______, BL_DEC,BL_INC, BL_TOGG,KC_HOME, \ + _______,KC_LEFT,KC_DOWN,KC_RIGHT,_______,_______,_______,_______,_______,_______,_______,_______, _______,KC_END, \ + _______,_______,_______,BL_DEC, BL_TOGG,BL_INC, _______,KC_VOLD,KC_VOLU,KC_MUTE,_______,KC_BTN1, KC_MS_U, KC_BTN2, \ + _______,_______,_______, _______, _______,_______,_______,KC_MS_L,KC_MS_D, KC_MS_R), }; - -/*enum function_id { - //SHIFT_ESC, -}; - -const uint16_t PROGMEM fn_actions[] = { - //[0] = ACTION_FUNCTION(SHIFT_ESC), -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; - switch (id) { - case SHIFT_ESC: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; - if (record->event.pressed) { - if (shift_esc_shift_mask) { - add_key(KC_GRV); - send_keyboard_report(); - } else { - add_key(KC_ESC); - send_keyboard_report(); - } - } else { - if (shift_esc_shift_mask) { - del_key(KC_GRV); - send_keyboard_report(); - } else { - del_key(KC_ESC); - send_keyboard_report(); - } - } - break; - } -}*/ diff --git a/keyboards/tada68/keymaps/default/readme.md b/keyboards/tada68/keymaps/default/readme.md index 36760d6b91..53412d7c25 100644 --- a/keyboards/tada68/keymaps/default/readme.md +++ b/keyboards/tada68/keymaps/default/readme.md @@ -1 +1,3 @@ # default TADA68 layout + +This layout replicates the default factory layout of the TADA68. diff --git a/keyboards/tada68/readme.md b/keyboards/tada68/readme.md index 552fdea529..dbe2fdca1b 100644 --- a/keyboards/tada68/readme.md +++ b/keyboards/tada68/readme.md @@ -1,4 +1,15 @@ TADA68 keyboard firmware -====================== +======================== -TODO: to be updated. +1) from the keyboards/tada68 directory run: +``` +$ make flashbin +``` + +2) hit the reset button on the TADA, the lights will start flashing. + +3) You'll see a new drive on your computer called TADA68. Backup the original factory `FLASH.BIN` file thats inside it. + +4) Delete `FLASH.BIN` from the TADA drive and copy `tada68_default.bin` that was generated at the root of the qmk directory into the TADA drive. + +5) Hit ESC on the keyboard. The lights will stop flashing and your firmware is loaded! \ No newline at end of file From ec9210959fc67ce631ce5bd2e177fbb49924c1c7 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Mon, 13 Mar 2017 12:12:09 -0400 Subject: [PATCH 079/181] Update readme.md --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 21bb79a49d..7871a12cbf 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,6 @@ # Quantum Mechanical Keyboard Firmware -[![Build Status](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/jackhumbert/qmk_firmware) [![Gitter](https://badges.gitter.im/qmk/qmk_firmware.svg)](https://gitter.im/qmk/qmk_firmware?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[![Build Status](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/qmk/qmk_firmware) [![Gitter](https://badges.gitter.im/qmk/qmk_firmware.svg)](https://gitter.im/qmk/qmk_firmware?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) This is a keyboard firmware based on the [tmk_keyboard firmware](http://github.com/tmk/tmk_keyboard) with some useful features for Atmel AVR controllers, and more specifically, the [OLKB product line](http://olkb.com), the [ErgoDox EZ](http://www.ergodox-ez.com) keyboard, and the [Clueboard product line](http://clueboard.co/). From 52ea58805a74fd4310f3c6a26271245001127cce Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Tue, 14 Mar 2017 09:51:48 -0400 Subject: [PATCH 080/181] Add RGB underglow, move keys to allow Adjust layer to be reached --- keyboards/lets_split/keymaps/hexwire/Makefile | 1 + keyboards/lets_split/keymaps/hexwire/README.md | 6 +++--- keyboards/lets_split/keymaps/hexwire/config.h | 6 ++++++ keyboards/lets_split/keymaps/hexwire/keymap.c | 10 +++++----- 4 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 keyboards/lets_split/keymaps/hexwire/Makefile diff --git a/keyboards/lets_split/keymaps/hexwire/Makefile b/keyboards/lets_split/keymaps/hexwire/Makefile new file mode 100644 index 0000000000..1e3cebb145 --- /dev/null +++ b/keyboards/lets_split/keymaps/hexwire/Makefile @@ -0,0 +1 @@ +RGBLIGHT_ENABLE = yes diff --git a/keyboards/lets_split/keymaps/hexwire/README.md b/keyboards/lets_split/keymaps/hexwire/README.md index 2dc0446466..edf2b66276 100644 --- a/keyboards/lets_split/keymaps/hexwire/README.md +++ b/keyboards/lets_split/keymaps/hexwire/README.md @@ -75,7 +75,7 @@ Hexwire's Let's Split Layout |----+----+----+----+----+----| |----+----+----+----+----+----| ,CPYP, , ,DOWN,LCBR, RCBR, P1 , P2 , P3 ,MINS, , |----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , DEL , P0 ,PDOT, , , + , , , , , , DEL , , P0 ,PDOT, , `----+----+----+----+----+----' `----+----+----+----+----+----' ``` @@ -87,9 +87,9 @@ Hexwire's Let's Split Layout |----+----+----+----+----+----| |----+----+----+----+----+----| DEL ,MPRV,MNXT,VOLU,PGUP,UNDS, EQL ,HOME, , , ,BSLS, |----+----+----+----+----+----| |----+----+----+----+----+----| - ,MSTP,MPLY,VOLD,PGDN,MINS, PLUS,END , , , , , + MUTE,MSTP,MPLY,VOLD,PGDN,MINS, PLUS,END , , , , , |----+----+----+----+----+----| |----+----+----+----+----+----| - , , , ,MUTE, , , , , , , + , , , , , , , , , , , `----+----+----+----+----+----' `----+----+----+----+----+----' ``` diff --git a/keyboards/lets_split/keymaps/hexwire/config.h b/keyboards/lets_split/keymaps/hexwire/config.h index cd766cc4f1..b45214fe08 100644 --- a/keyboards/lets_split/keymaps/hexwire/config.h +++ b/keyboards/lets_split/keymaps/hexwire/config.h @@ -20,6 +20,12 @@ along with this program. If not, see . #define EE_HANDS +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 8 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 #ifdef SUBPROJECT_rev1 #include "../../rev1/config.h" diff --git a/keyboards/lets_split/keymaps/hexwire/keymap.c b/keyboards/lets_split/keymaps/hexwire/keymap.c index bae2e687e6..796a1fcab0 100644 --- a/keyboards/lets_split/keymaps/hexwire/keymap.c +++ b/keyboards/lets_split/keymaps/hexwire/keymap.c @@ -83,7 +83,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----| |----+----+----+----+----+----| ,CPYP, , ,DOWN,LCBR, RCBR, P1 , P2 , P3 ,MINS, , //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , DEL , P0 ,PDOT, , , + , , , , , , DEL , , P0 ,PDOT, , //`----+----+----+----+----+----' `----+----+----+----+----+----' ), @@ -93,9 +93,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----| |----+----+----+----+----+----| DEL ,MPRV,MNXT,VOLU,PGUP,UNDS, EQL ,HOME, , , ,BSLS, //|----+----+----+----+----+----| |----+----+----+----+----+----| - ,MSTP,MPLY,VOLD,PGDN,MINS, PLUS,END , , , , , + MUTE,MSTP,MPLY,VOLD,PGDN,MINS, PLUS,END , , , , , //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , ,MUTE, , , , , , , + , , , , , , , , , , , //`----+----+----+----+----+----' `----+----+----+----+----+----' ), @@ -113,7 +113,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Adjust (Lower + Raise) * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | + * | | Reset|RGB Tg|RGB Md|Hue Up|Hue Dn|Sat Up|Sat Dn|Val Up|Val Dn| | | * |------+------+------+------+------+-------------+------+------+------+------+------| * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | * |------+------+------+------+------+------|------+------+------+------+------+------| @@ -123,7 +123,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_ADJUST] = KEYMAP( \ - _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, RESET , RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, _______, \ _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ From 2e34d4bd85cc748c48e907154ea438f3d9653430 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 15 Mar 2017 10:57:24 -0400 Subject: [PATCH 081/181] update for infinity --- keyboards/ergodox/keymaps/guni/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/ergodox/keymaps/guni/keymap.c b/keyboards/ergodox/keymaps/guni/keymap.c index f33829b8a4..9d9191f627 100644 --- a/keyboards/ergodox/keymaps/guni/keymap.c +++ b/keyboards/ergodox/keymaps/guni/keymap.c @@ -170,7 +170,7 @@ void action_function(keyrecord_t *event, uint8_t id, uint8_t opt) if (id == TEENSY_KEY) { clear_keyboard(); print("\n\nJump to bootloader... "); - _delay_ms(250); + wait_ms(250); bootloader_jump(); // should not return print("not supported.\n"); } From cf28f7bfdaf7a2e5f8734c0936f5e48b93c9353a Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Wed, 15 Mar 2017 23:07:29 -0400 Subject: [PATCH 082/181] Add custom keycap --- keyboards/planck/keymaps/khord/keymap.c | 318 ++++++++++++++++++++++++ 1 file changed, 318 insertions(+) create mode 100644 keyboards/planck/keymaps/khord/keymap.c diff --git a/keyboards/planck/keymaps/khord/keymap.c b/keyboards/planck/keymaps/khord/keymap.c new file mode 100644 index 0000000000..478e1f8224 --- /dev/null +++ b/keyboards/planck/keymaps/khord/keymap.c @@ -0,0 +1,318 @@ +// 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 "action_layer.h" +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif +#include "eeconfig.h" + +extern keymap_config_t keymap_config; + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _PLOVER 5 +#define _ADJUST 16 + +enum planck_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + PLOVER, + LOWER, + RAISE, + BACKLIT, + EXT_PLV +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Dylan's additions +#define C_A_DEL LALT(LCTL(KC_DEL)) +#define C_A_INS LALT(LCTL(KC_INS)) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_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 }, + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_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 }, + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_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 }, + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} +}, + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_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_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_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_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} +}, + +/* Plover layer (http://opensteno.org) + * ,-----------------------------------------------------------------------------------. + * | # | # | # | # | # | # | # | # | # | # | # | # | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | S | T | P | H | * | * | F | P | L | T | D | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |TogOut| S | K | W | R | * | * | R | B | G | S | Z | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Exit | | | A | O | | E | U | | | | + * `-----------------------------------------------------------------------------------' + */ + +[_PLOVER] = { + {KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 }, + {XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC}, + {XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, + {EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX} +}, + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = { + {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, + {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______}, + {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, C_A_INS, C_A_DEL} +} + + +}; + +#ifdef AUDIO_ENABLE + +float tone_startup[][2] = SONG(SONIC_RING); //plug in +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_plover[][2] = SONG(PLOVER_SOUND); +float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); +float music_scale[][2] = SONG(ZELDA_PUZZLE); //music mode + +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); +#endif + + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + case PLOVER: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_NOTE_ARRAY(tone_plover, false, 0); + #endif + layer_off(_RAISE); + layer_off(_LOWER); + layer_off(_ADJUST); + layer_on(_PLOVER); + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + keymap_config.raw = eeconfig_read_keymap(); + keymap_config.nkro = 1; + eeconfig_update_keymap(keymap_config.raw); + } + return false; + break; + case EXT_PLV: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_plover_gb, false, 0); + #endif + layer_off(_PLOVER); + } + return false; + break; + } + return true; +} + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + startup_user(); + #endif +} + +#ifdef AUDIO_ENABLE + +void startup_user() +{ + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void shutdown_user() +{ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_NOTE_ARRAY(music_scale, false, 0); +} + +#endif From 73a70a2c1c78a140ac506bbe8b91ff4a7eb70da4 Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Wed, 15 Mar 2017 23:09:17 -0400 Subject: [PATCH 083/181] Add Makefile --- keyboards/planck/keymaps/khord/Makefile | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 keyboards/planck/keymaps/khord/Makefile diff --git a/keyboards/planck/keymaps/khord/Makefile b/keyboards/planck/keymaps/khord/Makefile new file mode 100644 index 0000000000..457a3d01d4 --- /dev/null +++ b/keyboards/planck/keymaps/khord/Makefile @@ -0,0 +1,3 @@ +ifndef QUANTUM_DIR + include ../../../../Makefile +endif From 0c0a8ee187eb27faefe4391d978283a081896399 Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Thu, 16 Mar 2017 03:46:26 +0000 Subject: [PATCH 084/181] test --- keyboards/planck/keymaps/khord/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/planck/keymaps/khord/keymap.c b/keyboards/planck/keymaps/khord/keymap.c index 478e1f8224..e6c90c26d0 100644 --- a/keyboards/planck/keymaps/khord/keymap.c +++ b/keyboards/planck/keymaps/khord/keymap.c @@ -57,7 +57,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_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 }, + {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT) }, {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, From c043d1cc4709fa03e91942d9b769278994985af2 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 15 Mar 2017 23:49:38 -0400 Subject: [PATCH 085/181] Update config.h --- keyboards/lets_split/keymaps/hexwire/config.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/keyboards/lets_split/keymaps/hexwire/config.h b/keyboards/lets_split/keymaps/hexwire/config.h index b45214fe08..3d600d64d7 100644 --- a/keyboards/lets_split/keymaps/hexwire/config.h +++ b/keyboards/lets_split/keymaps/hexwire/config.h @@ -32,4 +32,7 @@ along with this program. If not, see . #endif #ifdef SUBPROJECT_rev2 #include "../../rev2/config.h" -#endif \ No newline at end of file +#endif +#ifdef SUBPROJECT_rev2fliphalf + #include "../../rev2fliphalf/config.h" +#endif From c36a4496eb190c72c492000f38ab4e98a3681fe4 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Wed, 15 Mar 2017 23:51:56 -0400 Subject: [PATCH 086/181] Update config.h --- keyboards/lets_split/keymaps/hexwire/config.h | 1 + 1 file changed, 1 insertion(+) diff --git a/keyboards/lets_split/keymaps/hexwire/config.h b/keyboards/lets_split/keymaps/hexwire/config.h index 3d600d64d7..983f8e352e 100644 --- a/keyboards/lets_split/keymaps/hexwire/config.h +++ b/keyboards/lets_split/keymaps/hexwire/config.h @@ -21,6 +21,7 @@ along with this program. If not, see . #define EE_HANDS #undef RGBLED_NUM +#define RGB_DI_PIN B0 #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 8 #define RGBLIGHT_HUE_STEP 8 From 683754bce806c634f59dd9d926491952778f913b Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Thu, 16 Mar 2017 04:11:47 +0000 Subject: [PATCH 087/181] added custom tones --- quantum/audio/song_list.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/quantum/audio/song_list.h b/quantum/audio/song_list.h index 8022ca6729..400915db91 100644 --- a/quantum/audio/song_list.h +++ b/quantum/audio/song_list.h @@ -122,4 +122,31 @@ E__NOTE(_E5), \ E__NOTE(_D5), +#define COIN_SOUND \ + E__NOTE(_A5 ), \ + HD_NOTE(_E6 ), + +#define ONE_UP_SOUND \ + Q__NOTE(_E6 ), \ + Q__NOTE(_G6 ), \ + Q__NOTE(_E7 ), \ + Q__NOTE(_C7 ), \ + Q__NOTE(_D7 ), \ + Q__NOTE(_G7 ), + +#define SONIC_RING \ + E__NOTE(_E6), \ + E__NOTE(_G6), \ + HD_NOTE(_C7), + +#define ZELDA_PUZZLE \ + Q__NOTE(_G5), \ + Q__NOTE(_FS5), \ + Q__NOTE(_DS5), \ + Q__NOTE(_A4), \ + Q__NOTE(_GS4), \ + Q__NOTE(_E5), \ + Q__NOTE(_GS5), \ + HD_NOTE(_C6), + #endif From 24d174595120aa6874604eed41db7ae02b26c9be Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Thu, 16 Mar 2017 12:24:31 -0400 Subject: [PATCH 088/181] add config.h for customization --- keyboards/planck/keymaps/khord/config.h | 90 +++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 keyboards/planck/keymaps/khord/config.h diff --git a/keyboards/planck/keymaps/khord/config.h b/keyboards/planck/keymaps/khord/config.h new file mode 100644 index 0000000000..5cf96bb88c --- /dev/null +++ b/keyboards/planck/keymaps/khord/config.h @@ -0,0 +1,90 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define MANUFACTURER Ortholinear Keyboards +#define PRODUCT The Planck Keyboard +#define DESCRIPTION A compact ortholinear keyboard + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 12 + +/* Planck PCB default pin-out */ +#define MATRIX_ROW_PINS { D0, D5, B5, B6 } +#define MATRIX_COL_PINS { F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 } +#define UNUSED_PINS + +#define AUDIO_VOICES + +#define BACKLIGHT_PIN B7 + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +#define BACKLIGHT_LEVELS 3 + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#ifdef SUBPROJECT_rev3 + #include "rev3/config.h" +#endif +#ifdef SUBPROJECT_rev4 + #include "rev4/config.h" +#endif + +#endif From 0c8f71e3c7fe258e6e084d7eec018b89a499d014 Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Thu, 16 Mar 2017 12:44:56 -0400 Subject: [PATCH 089/181] test tap dance --- keyboards/planck/keymaps/khord/Makefile | 1 + keyboards/planck/keymaps/khord/config.h | 3 +++ keyboards/planck/keymaps/khord/keymap.c | 14 +++++++++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/keyboards/planck/keymaps/khord/Makefile b/keyboards/planck/keymaps/khord/Makefile index 457a3d01d4..666161d1ff 100644 --- a/keyboards/planck/keymaps/khord/Makefile +++ b/keyboards/planck/keymaps/khord/Makefile @@ -1,3 +1,4 @@ ifndef QUANTUM_DIR include ../../../../Makefile endif +TAP_DANCE_ENABLE = yes diff --git a/keyboards/planck/keymaps/khord/config.h b/keyboards/planck/keymaps/khord/config.h index 5cf96bb88c..76a1f88322 100644 --- a/keyboards/planck/keymaps/khord/config.h +++ b/keyboards/planck/keymaps/khord/config.h @@ -62,6 +62,9 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) +/* Tap Dance */ +#define TAPPING_TERM 200 + /* * Feature disable options * These options are also useful to firmware size reduction. diff --git a/keyboards/planck/keymaps/khord/keymap.c b/keyboards/planck/keymaps/khord/keymap.c index e6c90c26d0..04b95c7447 100644 --- a/keyboards/planck/keymaps/khord/keymap.c +++ b/keyboards/planck/keymaps/khord/keymap.c @@ -33,6 +33,18 @@ enum planck_keycodes { EXT_PLV }; +// Tap Dance Declarations +enum { + TD_ESC_CAPS = 0 +}; + +// Tap Dance Definitions +qk_tap_dance_action_t tape_dance_actions[] = { + //Tap once for Esc, twice for Caps Lock + [TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS) + // Other declarations would go here, separated by commas, if you have them +}; + // Fillers to make layering more clear #define _______ KC_TRNS #define XXXXXXX KC_NO @@ -56,7 +68,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_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}, + {TD(TD_ESC_CAPS), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT) }, {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} }, From 6ca1c49d38ddc31c5fc9ef1c180849804fe358fd Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Thu, 16 Mar 2017 13:07:01 -0400 Subject: [PATCH 090/181] test fixes for tap dane --- keyboards/planck/keymaps/khord/config.h | 2 +- keyboards/planck/keymaps/khord/keymap.c | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/keyboards/planck/keymaps/khord/config.h b/keyboards/planck/keymaps/khord/config.h index 76a1f88322..008f3a5c2c 100644 --- a/keyboards/planck/keymaps/khord/config.h +++ b/keyboards/planck/keymaps/khord/config.h @@ -63,7 +63,7 @@ along with this program. If not, see . ) /* Tap Dance */ -#define TAPPING_TERM 200 +#define TAPPING_TERM 150 /* * Feature disable options diff --git a/keyboards/planck/keymaps/khord/keymap.c b/keyboards/planck/keymaps/khord/keymap.c index 04b95c7447..50a5daa577 100644 --- a/keyboards/planck/keymaps/khord/keymap.c +++ b/keyboards/planck/keymaps/khord/keymap.c @@ -33,22 +33,15 @@ enum planck_keycodes { EXT_PLV }; +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + // Tap Dance Declarations enum { TD_ESC_CAPS = 0 }; -// Tap Dance Definitions -qk_tap_dance_action_t tape_dance_actions[] = { - //Tap once for Esc, twice for Caps Lock - [TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS) - // Other declarations would go here, separated by commas, if you have them -}; - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - // Dylan's additions #define C_A_DEL LALT(LCTL(KC_DEL)) #define C_A_INS LALT(LCTL(KC_INS)) @@ -328,3 +321,9 @@ void music_scale_user(void) } #endif + +// Tap Dance Definitions +const qk_tap_dance_action_t tape_dance_actions[] = { + //Tap once for Esc, twice for Caps Lock + [TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS) +}; From c7cddfc539f111baeff51a2f7e6272701e0f0109 Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Thu, 16 Mar 2017 13:27:26 -0400 Subject: [PATCH 091/181] test td changes --- keyboards/planck/keymaps/khord/Makefile | 2 +- keyboards/planck/keymaps/khord/keymap.c | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/keyboards/planck/keymaps/khord/Makefile b/keyboards/planck/keymaps/khord/Makefile index 666161d1ff..f0ed9e8dcc 100644 --- a/keyboards/planck/keymaps/khord/Makefile +++ b/keyboards/planck/keymaps/khord/Makefile @@ -1,4 +1,4 @@ +TAP_DANCE_ENABLE = yes ifndef QUANTUM_DIR include ../../../../Makefile endif -TAP_DANCE_ENABLE = yes diff --git a/keyboards/planck/keymaps/khord/keymap.c b/keyboards/planck/keymaps/khord/keymap.c index 50a5daa577..52467641a3 100644 --- a/keyboards/planck/keymaps/khord/keymap.c +++ b/keyboards/planck/keymaps/khord/keymap.c @@ -178,6 +178,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; + +const qk_tap_dance_action_t tape_dance_actions[] = { + [TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS) +}; + #ifdef AUDIO_ENABLE float tone_startup[][2] = SONG(SONIC_RING); //plug in @@ -321,9 +326,3 @@ void music_scale_user(void) } #endif - -// Tap Dance Definitions -const qk_tap_dance_action_t tape_dance_actions[] = { - //Tap once for Esc, twice for Caps Lock - [TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS) -}; From 4b1d0c585977884faac28f1e7210bf528af46c9a Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Thu, 16 Mar 2017 17:36:31 +0000 Subject: [PATCH 092/181] remove const --- keyboards/planck/keymaps/khord/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/planck/keymaps/khord/keymap.c b/keyboards/planck/keymaps/khord/keymap.c index 52467641a3..64185a1488 100644 --- a/keyboards/planck/keymaps/khord/keymap.c +++ b/keyboards/planck/keymaps/khord/keymap.c @@ -179,7 +179,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -const qk_tap_dance_action_t tape_dance_actions[] = { +qk_tap_dance_action_t tape_dance_actions[] = { [TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS) }; From e03ddbe118740493a7adc59539c7edb47a98c799 Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Thu, 16 Mar 2017 18:13:53 +0000 Subject: [PATCH 093/181] tap dance working for esc and arrows --- keyboards/planck/keymaps/khord/keymap.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/keyboards/planck/keymaps/khord/keymap.c b/keyboards/planck/keymaps/khord/keymap.c index 64185a1488..6f19966f25 100644 --- a/keyboards/planck/keymaps/khord/keymap.c +++ b/keyboards/planck/keymaps/khord/keymap.c @@ -39,7 +39,11 @@ enum planck_keycodes { // Tap Dance Declarations enum { - TD_ESC_CAPS = 0 + ESC_CAP = 0, + LFT_HOM, + DWN_PDN, + UPP_PUP, + RGT_END }; // Dylan's additions @@ -60,10 +64,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_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}, - {TD(TD_ESC_CAPS), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT) }, - {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} + {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC }, + {TD(ESC_CAP), 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, SFT_T(KC_ENT)}, + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, TD(LFT_HOM), TD(DWN_PDN), TD(UPP_PUP), TD(RGT_END) } }, /* Colemak @@ -179,8 +183,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -qk_tap_dance_action_t tape_dance_actions[] = { - [TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS) +qk_tap_dance_action_t tap_dance_actions[] = { + [ESC_CAP] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS), + [LFT_HOM] = ACTION_TAP_DANCE_DOUBLE(KC_LEFT, KC_HOME), + [DWN_PDN] = ACTION_TAP_DANCE_DOUBLE(KC_DOWN, KC_PGDN), + [UPP_PUP] = ACTION_TAP_DANCE_DOUBLE(KC_UP, KC_PGUP), + [RGT_END] = ACTION_TAP_DANCE_DOUBLE(KC_RGHT, KC_END) }; #ifdef AUDIO_ENABLE From e123ed8d5f4837a424d8ad58bd8664a323a76f9b Mon Sep 17 00:00:00 2001 From: jprmesh Date: Wed, 15 Mar 2017 13:48:31 -0700 Subject: [PATCH 094/181] Added KC_KEYMAP macro for old style keymaps in Atreus62 --- keyboards/atreus62/atreus62.h | 38 +++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/keyboards/atreus62/atreus62.h b/keyboards/atreus62/atreus62.h index eacf5b4513..ca5cda8a89 100644 --- a/keyboards/atreus62/atreus62.h +++ b/keyboards/atreus62/atreus62.h @@ -9,18 +9,34 @@ void promicro_bootloader_jmp(bool program); // 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, k36, k37, k38, k39, k3a, k3b, \ - k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4d \ + 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, k36, k37, k38, k39, k3a, k3b, \ + k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4d \ ) \ { \ - { k00, k01, k02, k03, k04, k05, KC_NO, k06, k07, k08, k09, k0a, k0b }, \ - { k10, k11, k12, k13, k14, k15, KC_NO, k16, k17, k18, k19, k1a, k1b }, \ - { k20, k21, k22, k23, k24, k25, KC_NO, k26, k27, k28, k29, k2a, k2b }, \ - { k30, k31, k32, k33, k34, k35, k46, k36, k37, k38, k39, k3a, k3b }, \ - { k40, k41, k42, k43, k44, k45, k47, k48, k49, k4a, k4b, k4c, k4d } \ + { k00, k01, k02, k03, k04, k05, KC_NO, k06, k07, k08, k09, k0a, k0b }, \ + { k10, k11, k12, k13, k14, k15, KC_NO, k16, k17, k18, k19, k1a, k1b }, \ + { k20, k21, k22, k23, k24, k25, KC_NO, k26, k27, k28, k29, k2a, k2b }, \ + { k30, k31, k32, k33, k34, k35, k46, k36, k37, k38, k39, k3a, k3b }, \ + { k40, k41, k42, k43, k44, k45, k47, k48, k49, k4a, k4b, k4c, k4d } \ } -#endif \ No newline at end of file +// Used to create a keymap using only KC_ prefixed keys. +#define KC_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, k36, k37, k38, k39, k3a, k3b, \ + k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4d \ +) \ +{ \ + { KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_NO, KC_##k06, KC_##k07, KC_##k08, KC_##k09, KC_##k0a, KC_##k0b }, \ + { KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_NO, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k1a, KC_##k1b }, \ + { KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_NO, KC_##k26, KC_##k27, KC_##k28, KC_##k29, KC_##k2a, KC_##k2b }, \ + { KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##k46, KC_##k36, KC_##k37, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b }, \ + { KC_##k40, KC_##k41, KC_##k42, KC_##k43, KC_##k44, KC_##k45, KC_##k47, KC_##k48, KC_##k49, KC_##k4a, KC_##k4b, KC_##k4c, KC_##k4d } \ +} + +#endif From 3766f902a02da7e9355685c733f70bcff9fe5a12 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sat, 18 Mar 2017 15:38:03 -0700 Subject: [PATCH 095/181] boilerplate project created with new_project.sh --- keyboards/frosty_flake/Makefile | 3 + keyboards/frosty_flake/config.h | 162 ++++++++++++++++++ keyboards/frosty_flake/frosty_flake.c | 28 +++ keyboards/frosty_flake/frosty_flake.h | 19 ++ .../frosty_flake/keymaps/default/Makefile | 21 +++ .../frosty_flake/keymaps/default/config.h | 8 + .../frosty_flake/keymaps/default/keymap.c | 44 +++++ .../frosty_flake/keymaps/default/readme.md | 1 + keyboards/frosty_flake/readme.md | 28 +++ keyboards/frosty_flake/rules.mk | 68 ++++++++ 10 files changed, 382 insertions(+) create mode 100644 keyboards/frosty_flake/Makefile create mode 100644 keyboards/frosty_flake/config.h create mode 100644 keyboards/frosty_flake/frosty_flake.c create mode 100644 keyboards/frosty_flake/frosty_flake.h create mode 100644 keyboards/frosty_flake/keymaps/default/Makefile create mode 100644 keyboards/frosty_flake/keymaps/default/config.h create mode 100644 keyboards/frosty_flake/keymaps/default/keymap.c create mode 100644 keyboards/frosty_flake/keymaps/default/readme.md create mode 100644 keyboards/frosty_flake/readme.md create mode 100644 keyboards/frosty_flake/rules.mk diff --git a/keyboards/frosty_flake/Makefile b/keyboards/frosty_flake/Makefile new file mode 100644 index 0000000000..57b2ef62e5 --- /dev/null +++ b/keyboards/frosty_flake/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif diff --git a/keyboards/frosty_flake/config.h b/keyboards/frosty_flake/config.h new file mode 100644 index 0000000000..9390feb949 --- /dev/null +++ b/keyboards/frosty_flake/config.h @@ -0,0 +1,162 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER You +#define PRODUCT frosty_flake +#define DESCRIPTION A custom keyboard + +/* key matrix size */ +#define MATRIX_ROWS 2 +#define MATRIX_COLS 3 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { D0, D5 } +#define MATRIX_COL_PINS { F1, F0, B0 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/frosty_flake/frosty_flake.c b/keyboards/frosty_flake/frosty_flake.c new file mode 100644 index 0000000000..22979a4515 --- /dev/null +++ b/keyboards/frosty_flake/frosty_flake.c @@ -0,0 +1,28 @@ +#include "frosty_flake.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + + led_set_user(usb_led); +} diff --git a/keyboards/frosty_flake/frosty_flake.h b/keyboards/frosty_flake/frosty_flake.h new file mode 100644 index 0000000000..90ea25ed99 --- /dev/null +++ b/keyboards/frosty_flake/frosty_flake.h @@ -0,0 +1,19 @@ +#ifndef FROSTY_FLAKE_H +#define FROSTY_FLAKE_H + +#include "quantum.h" + +// This a shortcut to help you visually see your layout. +// The following is an example using the Planck MIT layout +// The first section contains all of the arguements +// The second converts the arguments into a two-dimensional array +#define KEYMAP( \ + k00, k01, k02, \ + k10, k11 \ +) \ +{ \ + { k00, k01, k02 }, \ + { k10, KC_NO, k11 }, \ +} + +#endif diff --git a/keyboards/frosty_flake/keymaps/default/Makefile b/keyboards/frosty_flake/keymaps/default/Makefile new file mode 100644 index 0000000000..9d3df5964f --- /dev/null +++ b/keyboards/frosty_flake/keymaps/default/Makefile @@ -0,0 +1,21 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif diff --git a/keyboards/frosty_flake/keymaps/default/config.h b/keyboards/frosty_flake/keymaps/default/config.h new file mode 100644 index 0000000000..8893d122e0 --- /dev/null +++ b/keyboards/frosty_flake/keymaps/default/config.h @@ -0,0 +1,8 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include "../../config.h" + +// place overrides here + +#endif diff --git a/keyboards/frosty_flake/keymaps/default/keymap.c b/keyboards/frosty_flake/keymaps/default/keymap.c new file mode 100644 index 0000000000..1c9e33b649 --- /dev/null +++ b/keyboards/frosty_flake/keymaps/default/keymap.c @@ -0,0 +1,44 @@ +#include "frosty_flake.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = KEYMAP( /* Base */ + KC_A, KC_1, KC_H, \ + KC_TAB, KC_SPC \ +), +}; + +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; +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/frosty_flake/keymaps/default/readme.md b/keyboards/frosty_flake/keymaps/default/readme.md new file mode 100644 index 0000000000..11bf4825ff --- /dev/null +++ b/keyboards/frosty_flake/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for frosty_flake diff --git a/keyboards/frosty_flake/readme.md b/keyboards/frosty_flake/readme.md new file mode 100644 index 0000000000..a329650619 --- /dev/null +++ b/keyboards/frosty_flake/readme.md @@ -0,0 +1,28 @@ +frosty_flake keyboard firmware +====================== + +## Quantum MK Firmware + +For the full Quantum feature list, see [the parent readme](/). + +## Building + +Download or clone the whole firmware and navigate to the keyboards/frosty_flake folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file. + +Depending on which keymap you would like to use, you will have to compile slightly differently. + +### Default + +To build with the default keymap, simply run `make default`. + +### Other Keymaps + +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files. + +To build the firmware binary hex file with a keymap just do `make` with a keymap like this: + +``` +$ make [default|jack|] +``` + +Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. diff --git a/keyboards/frosty_flake/rules.mk b/keyboards/frosty_flake/rules.mk new file mode 100644 index 0000000000..bad3387bf4 --- /dev/null +++ b/keyboards/frosty_flake/rules.mk @@ -0,0 +1,68 @@ +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=512 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= yes # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE ?= no # USB Nkey Rollover +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality on B7 by default +MIDI_ENABLE ?= no # MIDI controls +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +AUDIO_ENABLE ?= no # Audio output on port C6 +FAUXCLICKY_ENABLE ?= no # Use buzzer to emulate clicky switches From 19fd20261b895a6848c8b15fd7365d5b87b7fd72 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sat, 18 Mar 2017 16:19:10 -0700 Subject: [PATCH 096/181] sketch out frosty flake matrix using custom matrix.c based on kitten paw --- keyboards/frosty_flake/config.h | 24 +++-- keyboards/frosty_flake/matrix.c | 167 ++++++++++++++++++++++++++++++++ keyboards/frosty_flake/rules.mk | 7 +- 3 files changed, 187 insertions(+), 11 deletions(-) create mode 100644 keyboards/frosty_flake/matrix.c diff --git a/keyboards/frosty_flake/config.h b/keyboards/frosty_flake/config.h index 9390feb949..2575a52b18 100644 --- a/keyboards/frosty_flake/config.h +++ b/keyboards/frosty_flake/config.h @@ -24,13 +24,19 @@ along with this program. If not, see . #define VENDOR_ID 0xFEED #define PRODUCT_ID 0x6060 #define DEVICE_VER 0x0001 -#define MANUFACTURER You +#define MANUFACTURER Bathroom Epiphanies #define PRODUCT frosty_flake -#define DESCRIPTION A custom keyboard +#define DESCRIPTION Frosty Flake controller for the CM Storm Quick Fire Rapid + +/* + * Frosty Flake Rev. 20140521 made by Bathroom Ephiphanies + * Schematic is available at https://deskthority.net/w/images/a/a4/Frosty_Flake_Schematics.pdf + * + */ /* key matrix size */ -#define MATRIX_ROWS 2 -#define MATRIX_COLS 3 +#define MATRIX_ROWS 8 // Row0 to Row7 in the schematic +#define MATRIX_COLS 18 // ColA to ColR in the schematic /* * Keyboard Matrix Assignments @@ -42,13 +48,13 @@ along with this program. If not, see . * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) * */ -#define MATRIX_ROW_PINS { D0, D5 } -#define MATRIX_COL_PINS { F1, F0, B0 } -#define UNUSED_PINS +//#define MATRIX_ROW_PINS { D5, D4, D6, D2, D1, D0 } +//#define MATRIX_COL_PINS << n/a >> +//#define UNUSED_PINS { B0, C4, D3 } /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ -#define DIODE_DIRECTION COL2ROW - +//#define DIODE_DIRECTION << n/a >> + // #define BACKLIGHT_PIN B7 // #define BACKLIGHT_BREATHING // #define BACKLIGHT_LEVELS 3 diff --git a/keyboards/frosty_flake/matrix.c b/keyboards/frosty_flake/matrix.c new file mode 100644 index 0000000000..21b0d90885 --- /dev/null +++ b/keyboards/frosty_flake/matrix.c @@ -0,0 +1,167 @@ +//TODO(gabe): customize for frosty flake + +/* + Copyright 2014 Ralf Schmitt + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" + +#ifndef DEBOUNCING_DELAY +# define DEBOUNCING_DELAY 5 +#endif +static uint8_t debouncing = DEBOUNCING_DELAY; + +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static uint8_t read_rows(void); +static void select_col(uint8_t col); + +inline uint8_t matrix_rows(void) { + return MATRIX_ROWS; +} + +inline uint8_t matrix_cols(void) { + return MATRIX_COLS; +} + +/* Column pin configuration + * + * col: 0 1 2 3 4 5 6 7 + * pin: PC7 PD5 PD3 PD1 PC2 PD6 PD4 PD2 + * + * Rrr pin configuration + * + * These rrrs uses one 74HC154 4 to 16 bit demultiplexer (low + * active), together with 2 rrrs driven directly from the micro + * controller, to control the 18 rrrs. The rrrs are driven from + * pins B6,5,4,3,2,1,0. + */ +void matrix_init(void) { + DDRC &= ~0b10000100; // Row input pins + DDRD &= ~0b01111110; + PORTC |= 0b10000100; + PORTD |= 0b01111110; + + DDRB |= 0b01111111; // Column output pins + + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } + matrix_init_quantum(); +} + +uint8_t matrix_scan(void) { + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + select_col(col); + _delay_us(3); + uint8_t rows = read_rows(); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1< Date: Sun, 19 Mar 2017 00:07:48 +0000 Subject: [PATCH 097/181] Don't feel like tap dancing arrows anymore --- keyboards/planck/keymaps/khord/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/planck/keymaps/khord/keymap.c b/keyboards/planck/keymaps/khord/keymap.c index 6f19966f25..2ee57b8f4a 100644 --- a/keyboards/planck/keymaps/khord/keymap.c +++ b/keyboards/planck/keymaps/khord/keymap.c @@ -64,10 +64,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_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 }, - {TD(ESC_CAP), 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, SFT_T(KC_ENT)}, - {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, TD(LFT_HOM), TD(DWN_PDN), TD(UPP_PUP), TD(RGT_END) } + {KC_TAB, KC_Q, KC_W, KC_E, KC_R KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC }, + {TD(ESC_CAP), 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, SFT_T(KC_ENT)}, + {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT } }, /* Colemak From 561da65606c8b27f3fecc10f41ff139d7625fd08 Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Sun, 19 Mar 2017 00:14:43 +0000 Subject: [PATCH 098/181] Missing comma --- keyboards/planck/keymaps/khord/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/planck/keymaps/khord/keymap.c b/keyboards/planck/keymaps/khord/keymap.c index 2ee57b8f4a..65ba1c4176 100644 --- a/keyboards/planck/keymaps/khord/keymap.c +++ b/keyboards/planck/keymaps/khord/keymap.c @@ -64,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_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_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC }, {TD(ESC_CAP), 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, SFT_T(KC_ENT)}, {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT } From d7fc2365402069a6149c9593dad82c4b4e31b78a Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sun, 19 Mar 2017 15:59:21 -0700 Subject: [PATCH 099/181] successfully read data from the matrix --- keyboards/frosty_flake/config.h | 7 +- .../frosty_flake/keymaps/default/Makefile | 4 +- .../frosty_flake/keymaps/default/keymap.c | 7 +- keyboards/frosty_flake/matrix.c | 150 ++++++++++-------- 4 files changed, 93 insertions(+), 75 deletions(-) diff --git a/keyboards/frosty_flake/config.h b/keyboards/frosty_flake/config.h index 2575a52b18..507e6a6b69 100644 --- a/keyboards/frosty_flake/config.h +++ b/keyboards/frosty_flake/config.h @@ -30,13 +30,14 @@ along with this program. If not, see . /* * Frosty Flake Rev. 20140521 made by Bathroom Ephiphanies - * Schematic is available at https://deskthority.net/w/images/a/a4/Frosty_Flake_Schematics.pdf + * Ported from the Bathroom Epiphanies TMK Firmware: + * https://github.com/BathroomEpiphanies/epiphanies_tmk_keyboard/tree/master/be_controllers * */ /* key matrix size */ -#define MATRIX_ROWS 8 // Row0 to Row7 in the schematic -#define MATRIX_COLS 18 // ColA to ColR in the schematic +#define MATRIX_ROWS 18 +#define MATRIX_COLS 8 /* * Keyboard Matrix Assignments diff --git a/keyboards/frosty_flake/keymaps/default/Makefile b/keyboards/frosty_flake/keymaps/default/Makefile index 9d3df5964f..0887666802 100644 --- a/keyboards/frosty_flake/keymaps/default/Makefile +++ b/keyboards/frosty_flake/keymaps/default/Makefile @@ -3,9 +3,9 @@ # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) +CONSOLE_ENABLE = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality diff --git a/keyboards/frosty_flake/keymaps/default/keymap.c b/keyboards/frosty_flake/keymaps/default/keymap.c index 1c9e33b649..e553555668 100644 --- a/keyboards/frosty_flake/keymaps/default/keymap.c +++ b/keyboards/frosty_flake/keymaps/default/keymap.c @@ -28,11 +28,12 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) void matrix_init_user(void) { - + debug_enable = true; } void matrix_scan_user(void) { - + if (matrix_is_modified()) + matrix_print(); } bool process_record_user(uint16_t keycode, keyrecord_t *record) { @@ -41,4 +42,4 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { void led_set_user(uint8_t usb_led) { -} +} \ No newline at end of file diff --git a/keyboards/frosty_flake/matrix.c b/keyboards/frosty_flake/matrix.c index 21b0d90885..70456ada32 100644 --- a/keyboards/frosty_flake/matrix.c +++ b/keyboards/frosty_flake/matrix.c @@ -1,5 +1,3 @@ -//TODO(gabe): customize for frosty flake - /* Copyright 2014 Ralf Schmitt @@ -26,16 +24,71 @@ #include "util.h" #include "matrix.h" +#ifndef CONFIG_SPECIFIC_H +#define CONFIG_SPECIFIC_H + +#define CONFIG_LED_IO \ + DDRB |= (1<<7); \ + DDRC |= (1<<5) | (1<<6); + +#define USB_LED_CAPS_LOCK_ON PORTC &= ~(1<<5) +#define USB_LED_CAPS_LOCK_OFF PORTC |= (1<<5) +#define USB_LED_NUM_LOCK_ON PORTB &= ~(1<<7) +#define USB_LED_NUM_LOCK_OFF PORTB |= (1<<7) +#define USB_LED_SCROLL_LOCK_ON PORTC &= ~(1<<6) +#define USB_LED_SCROLL_LOCK_OFF PORTC |= (1<<6) + +#define CONFIG_MATRIX_IO \ + /* Column output pins */ \ + DDRD |= 0b01111011; \ + /* Row input pins */ \ + DDRC &= ~0b10000000; \ + DDRB &= ~0b01111111; \ + PORTC |= 0b10000000; \ + PORTB |= 0b01111111; + +#define MATRIX_ROW_SCAN \ + (PINC&(1<<7) ? 0 : ((matrix_row_t)1<<0)) | \ + (PINB&(1<<5) ? 0 : ((matrix_row_t)1<<1)) | \ + (PINB&(1<<4) ? 0 : ((matrix_row_t)1<<2)) | \ + (PINB&(1<<6) ? 0 : ((matrix_row_t)1<<3)) | \ + (PINB&(1<<1) ? 0 : ((matrix_row_t)1<<4)) | \ + (PINB&(1<<2) ? 0 : ((matrix_row_t)1<<5)) | \ + (PINB&(1<<3) ? 0 : ((matrix_row_t)1<<6)) | \ + (PINB&(1<<0) ? 0 : ((matrix_row_t)1<<7)) + +#define MATRIX_ROW_SELECT \ + case 0: PORTD = (PORTD & ~0b01111011) | 0b00011011; break; \ + case 1: PORTD = (PORTD & ~0b01111011) | 0b01000011; break; \ + case 2: PORTD = (PORTD & ~0b01111011) | 0b01101010; break; \ + case 3: PORTD = (PORTD & ~0b01111011) | 0b01111001; break; \ + case 4: PORTD = (PORTD & ~0b01111011) | 0b01100010; break; \ + case 5: PORTD = (PORTD & ~0b01111011) | 0b01110001; break; \ + case 6: PORTD = (PORTD & ~0b01111011) | 0b01100001; break; \ + case 7: PORTD = (PORTD & ~0b01111011) | 0b01110000; break; \ + case 8: PORTD = (PORTD & ~0b01111011) | 0b01100000; break; \ + case 9: PORTD = (PORTD & ~0b01111011) | 0b01101000; break; \ + case 10: PORTD = (PORTD & ~0b01111011) | 0b00101011; break; \ + case 11: PORTD = (PORTD & ~0b01111011) | 0b00110011; break; \ + case 12: PORTD = (PORTD & ~0b01111011) | 0b00100011; break; \ + case 13: PORTD = (PORTD & ~0b01111011) | 0b01111000; break; \ + case 14: PORTD = (PORTD & ~0b01111011) | 0b00010011; break; \ + case 15: PORTD = (PORTD & ~0b01111011) | 0b01101001; break; \ + case 16: PORTD = (PORTD & ~0b01111011) | 0b00001011; break; \ + case 17: PORTD = (PORTD & ~0b01111011) | 0b00111011; break; + +#endif + #ifndef DEBOUNCING_DELAY -# define DEBOUNCING_DELAY 5 +# define DEBOUNCING_DELAY 0 #endif static uint8_t debouncing = DEBOUNCING_DELAY; static matrix_row_t matrix[MATRIX_ROWS]; static matrix_row_t matrix_debouncing[MATRIX_ROWS]; -static uint8_t read_rows(void); -static void select_col(uint8_t col); +static matrix_row_t scan_row(void); +static void select_row(uint8_t row); inline uint8_t matrix_rows(void) { return MATRIX_ROWS; @@ -45,58 +98,40 @@ inline uint8_t matrix_cols(void) { return MATRIX_COLS; } -/* Column pin configuration - * - * col: 0 1 2 3 4 5 6 7 - * pin: PC7 PD5 PD3 PD1 PC2 PD6 PD4 PD2 - * - * Rrr pin configuration - * - * These rrrs uses one 74HC154 4 to 16 bit demultiplexer (low - * active), together with 2 rrrs driven directly from the micro - * controller, to control the 18 rrrs. The rrrs are driven from - * pins B6,5,4,3,2,1,0. - */ void matrix_init(void) { - DDRC &= ~0b10000100; // Row input pins - DDRD &= ~0b01111110; - PORTC |= 0b10000100; - PORTD |= 0b01111110; - - DDRB |= 0b01111111; // Column output pins + CONFIG_MATRIX_IO; for (uint8_t i=0; i < MATRIX_ROWS; i++) { matrix[i] = 0; matrix_debouncing[i] = 0; } + matrix_init_quantum(); } uint8_t matrix_scan(void) { - for (uint8_t col = 0; col < MATRIX_COLS; col++) { - select_col(col); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + select_row(row); _delay_us(3); - uint8_t rows = read_rows(); - for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + matrix_row_t row_scan = scan_row(); + for (uint8_t col = 0; col < MATRIX_COLS; col++) { bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1< Date: Sun, 19 Mar 2017 19:55:55 -0700 Subject: [PATCH 100/181] start to define keymap; annoying because rows and columns are swapped from schematic --- keyboards/frosty_flake/frosty_flake.h | 74 +++++++++++++++++++ .../frosty_flake/keymaps/default/keymap.c | 11 ++- keyboards/frosty_flake/matrix.c | 4 +- 3 files changed, 84 insertions(+), 5 deletions(-) diff --git a/keyboards/frosty_flake/frosty_flake.h b/keyboards/frosty_flake/frosty_flake.h index 90ea25ed99..767efcbd81 100644 --- a/keyboards/frosty_flake/frosty_flake.h +++ b/keyboards/frosty_flake/frosty_flake.h @@ -7,6 +7,7 @@ // The following is an example using the Planck MIT layout // The first section contains all of the arguements // The second converts the arguments into a two-dimensional array +#if 0 #define KEYMAP( \ k00, k01, k02, \ k10, k11 \ @@ -15,5 +16,78 @@ { k00, k01, k02 }, \ { k10, KC_NO, k11 }, \ } +#endif + +/* + Matrix col/row mapping + + ,----. ,-------------------. ,-------------------. ,-------------------. ,--------------. + | J6 | | I4 | H4 | H2 | H6 | | A7 | E6 | D2 | D4 | | B4 | B7 | B6 | B0 | | C7 | C5 | A5 | + `----' `-------------------' `-------------------' `-------------------' `--------------' + ,-------------------------------------------------------------------------. ,--------------. ,-------------------. + | J4 | J7 | I7 | H7 | G7 | G4 | F4 | F7 | E7 | D7 | R7 | R4 | E4 | B2 | | L4 | O4 | Q4 | | K1 | L1 | Q1 | Q0 | + |-------------------------------------------------------------------------| |--------------| |-------------------| + | J2 | J5 | I5 | H5 | G5 | G2 | F2 | F5 | E5 | D5 | R5 | R2 | E2 | B3 | | K4 | O7 | Q7 | | K5 | L5 | Q5 | O5 | + |-------------------------------------------------------------------------| '--------------' |-------------- | + | O5 | J3 | I3 | H3 | G3 | G6 | F6 | F3 | E3 | D3 | R3 | R6 | B1 | | K2 | L2 | Q2 | | + |-------------------------------------------------------------------------| ,----. |-------------------| + | N2 | J1 | I1 | H1 | G1 | G0 | F0 | F1 | E1 | D1 | R0 | N3 | | O6 | | K3 | L3 | Q3 | O3 | + |-------------------------------------------------------------------------| ,--------------. |-------------- | + | A4 | P2 | C6 | K6 | C0 | M3 | D0 | A1 | | O0 | K0 | L0 | | L6 | Q6 | | + `-------------------------------------------------------------------------' `--------------' `-------------------' +*/ + +#define KEYMAP( \ + KJ6, KI4, KH4, KH2, KH6, KA7, KE6, KD2, KD4, KB4, KB7, KB6, KB0, KC7, KC5, KA5, \ + KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2, KL4, KO4, KQ4, KK1, KL1, KQ1, KQ0, \ + KJ2, KJ5, KI5, KH5, KG5, KG2, KF2, KF5, KE5, KD5, KR5, KR2, KE2, KB3, KK4, KO7, KQ7, KK5, KL5, KQ5, KO5, \ + KI2, KJ3, KI3, KH3, KG3, KG6, KF6, KF3, KE3, KD3, KR3, KR6, KB1, KK2, KL2, KQ2, \ + KN2, KI6, KJ1, KI1, KH1, KG1, KG0, KF0, KF1, KE1, KD1, KR0, KN3, KO6, KK3, KL3, KQ3, KO3, \ + KA4, KP2, KC6, KK6, KC0, KM3, KD0, KA1, KO0, KK0, KL0, KL6, KQ6 \ +) \ +{ \ +/* 0 1 2 3 4 5 6 7 */ \ +/* A */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ +/* B */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ +/* C */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ +/* D */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ +/* E */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ +/* F */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ +/* G */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ +/* H */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ +/* I */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ +/* J */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KJ6, KC_NO }, \ +/* K */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ +/* L */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ +/* M */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ +/* N */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ +/* O */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ +/* P */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ +/* Q */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ +/* R */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ +} + +#if 0 +#define KEYMAP( \ + KJ6, KI4, KH4, KH2, KH6, KA7, KE6, KD2, KD4, KB4, KB7, KB6, KB0, KC7, KC5, KA5, \ + KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2, KL4, KO4, KQ4, KK1, KL1, KQ1, KQ0, \ + KJ2, KJ5, KI5, KH5, KG5, KG2, KF2, KF5, KE5, KD5, KR5, KR2, KE2, KB3, KK4, KO7, KQ7, KK5, KL5, KQ5, KO5, \ + KI2, KJ3, KI3, KH3, KG3, KG6, KF6, KF3, KE3, KD3, KR3, KR6, KB1, KK2, KL2, KQ2, \ + KN2, KI6, KJ1, KI1, KH1, KG1, KG0, KF0, KF1, KE1, KD1, KR0, KN3, KO6, KK3, KL3, KQ3, KO3, \ + KA4, KP2, KC6, KK6, KC0, KM3, KD0, KA1, KO0, KK0, KL0, KL6, KQ6 \ +) \ +{ \ +/* Columns and rows need to be swapped in the below definition */ \ +/* A B C D E F G H I J K L M N O P Q R */ \ +/* 0 */ { KC_NO, KB0, KC0, KD0, KC_NO, KF0, KG0, KC_NO, KC_NO, KC_NO, KK0, KL0, KC_NO, KC_NO, KO0, KC_NO, KQ0, KR0 }, \ +/* 1 */ { KA1, KB1, KC_NO, KD1, KE1, KF1, KG1, KH1, KI1, KJ1, KK1, KL1, KC_NO, KC_NO, KC_NO, KC_NO, KQ1, KC_NO }, \ +/* 2 */ { KC_NO, KB2, KC_NO, KD2, KE2, KF2, KG2, KH2, KI2, KJ2, KK2, KL2, KC_NO, KN2, KC_NO, KP2, KQ2, KR2 }, \ +/* 3 */ { KC_NO, KB3, KC_NO, KD3, KE3, KF3, KG3, KH3, KI3, KJ3, KK3, KL3, KM3, KN3, KO3, KC_NO, KQ3, KR3 }, \ +/* 4 */ { KA4, KB4, KC_NO, KD4, KE4, KF4, KG4, KH4, KI4, KJ4, KK4, KL4, KC_NO, KC_NO, KO4, KC_NO, KQ4, KR4 }, \ +/* 5 */ { KA5, KC_NO, KC5, KD5, KE5, KF5, KG5, KH5, KI5, KJ5, KK5, KL5, KC_NO, KC_NO, KO5, KC_NO, KQ5, KR5 }, \ +/* 6 */ { KC_NO, KB6, KC6, KC_NO, KE6, KF6, KG6, KH6, KI6, KJ6, KK6, KL6, KC_NO, KC_NO, KO6, KC_NO, KQ6, KR6 }, \ +/* 7 */ { KA7, KB7, KC7, KD7, KE7, KF7, KG7, KH7, KI7, KJ7, KC_NO, KC_NO, KC_NO, KC_NO, KO7, KC_NO, KQ7, KR7 } \ +} +#endif #endif diff --git a/keyboards/frosty_flake/keymaps/default/keymap.c b/keyboards/frosty_flake/keymaps/default/keymap.c index e553555668..90711732fa 100644 --- a/keyboards/frosty_flake/keymaps/default/keymap.c +++ b/keyboards/frosty_flake/keymaps/default/keymap.c @@ -1,10 +1,13 @@ #include "frosty_flake.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[0] = KEYMAP( /* Base */ - KC_A, KC_1, KC_H, \ - KC_TAB, KC_SPC \ -), +[0] = KEYMAP(\ + KC_ESC, 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_PSCR,KC_SLCK,KC_PAUS, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL,KC_BSPC, KC_INS,KC_HOME,KC_PGUP, KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC,KC_RBRC,KC_BSLS, KC_DEL, KC_END,KC_PGDN, KC_P7, KC_P8, KC_P9,KC_PPLS, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_SCLN,KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \ + KC_LSFT,KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM, KC_DOT,KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3,KC_PENT, \ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT, KC_P0,KC_PDOT) }; const uint16_t PROGMEM fn_actions[] = { diff --git a/keyboards/frosty_flake/matrix.c b/keyboards/frosty_flake/matrix.c index 70456ada32..07b9f6dd68 100644 --- a/keyboards/frosty_flake/matrix.c +++ b/keyboards/frosty_flake/matrix.c @@ -151,11 +151,13 @@ inline matrix_row_t matrix_get_row(uint8_t row) { return matrix[row]; } +static const char ROW_NAMES[] = "ABCDEFGHIJKLMNOPQR"; + void matrix_print(void) { print("\nr/c 01234567\n"); for (uint8_t row = 0; row < MATRIX_ROWS; row++) { matrix_row_t row_scan = matrix_get_row(row); - xprintf("%02X: ", row); + xprintf("%c: ", ROW_NAMES[row]); for (uint8_t col = 0; col < MATRIX_COLS; col++) { bool curr_bit = row_scan & (1< Date: Sun, 19 Mar 2017 20:33:41 -0700 Subject: [PATCH 101/181] Swap rows and columns to match the schematic --- keyboards/frosty_flake/config.h | 4 +- keyboards/frosty_flake/frosty_flake.h | 43 ----- .../frosty_flake/keymaps/default/keymap.c | 3 +- keyboards/frosty_flake/matrix.c | 150 +++++++----------- 4 files changed, 60 insertions(+), 140 deletions(-) diff --git a/keyboards/frosty_flake/config.h b/keyboards/frosty_flake/config.h index 507e6a6b69..f03cecb3e6 100644 --- a/keyboards/frosty_flake/config.h +++ b/keyboards/frosty_flake/config.h @@ -36,8 +36,8 @@ along with this program. If not, see . */ /* key matrix size */ -#define MATRIX_ROWS 18 -#define MATRIX_COLS 8 +#define MATRIX_ROWS 8 +#define MATRIX_COLS 18 /* * Keyboard Matrix Assignments diff --git a/keyboards/frosty_flake/frosty_flake.h b/keyboards/frosty_flake/frosty_flake.h index 767efcbd81..3b52df6baa 100644 --- a/keyboards/frosty_flake/frosty_flake.h +++ b/keyboards/frosty_flake/frosty_flake.h @@ -7,16 +7,6 @@ // The following is an example using the Planck MIT layout // The first section contains all of the arguements // The second converts the arguments into a two-dimensional array -#if 0 -#define KEYMAP( \ - k00, k01, k02, \ - k10, k11 \ -) \ -{ \ - { k00, k01, k02 }, \ - { k10, KC_NO, k11 }, \ -} -#endif /* Matrix col/row mapping @@ -36,38 +26,6 @@ | A4 | P2 | C6 | K6 | C0 | M3 | D0 | A1 | | O0 | K0 | L0 | | L6 | Q6 | | `-------------------------------------------------------------------------' `--------------' `-------------------' */ - -#define KEYMAP( \ - KJ6, KI4, KH4, KH2, KH6, KA7, KE6, KD2, KD4, KB4, KB7, KB6, KB0, KC7, KC5, KA5, \ - KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2, KL4, KO4, KQ4, KK1, KL1, KQ1, KQ0, \ - KJ2, KJ5, KI5, KH5, KG5, KG2, KF2, KF5, KE5, KD5, KR5, KR2, KE2, KB3, KK4, KO7, KQ7, KK5, KL5, KQ5, KO5, \ - KI2, KJ3, KI3, KH3, KG3, KG6, KF6, KF3, KE3, KD3, KR3, KR6, KB1, KK2, KL2, KQ2, \ - KN2, KI6, KJ1, KI1, KH1, KG1, KG0, KF0, KF1, KE1, KD1, KR0, KN3, KO6, KK3, KL3, KQ3, KO3, \ - KA4, KP2, KC6, KK6, KC0, KM3, KD0, KA1, KO0, KK0, KL0, KL6, KQ6 \ -) \ -{ \ -/* 0 1 2 3 4 5 6 7 */ \ -/* A */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ -/* B */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ -/* C */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ -/* D */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ -/* E */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ -/* F */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ -/* G */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ -/* H */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ -/* I */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ -/* J */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KJ6, KC_NO }, \ -/* K */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ -/* L */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ -/* M */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ -/* N */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ -/* O */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ -/* P */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ -/* Q */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ -/* R */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ -} - -#if 0 #define KEYMAP( \ KJ6, KI4, KH4, KH2, KH6, KA7, KE6, KD2, KD4, KB4, KB7, KB6, KB0, KC7, KC5, KA5, \ KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2, KL4, KO4, KQ4, KK1, KL1, KQ1, KQ0, \ @@ -88,6 +46,5 @@ /* 6 */ { KC_NO, KB6, KC6, KC_NO, KE6, KF6, KG6, KH6, KI6, KJ6, KK6, KL6, KC_NO, KC_NO, KO6, KC_NO, KQ6, KR6 }, \ /* 7 */ { KA7, KB7, KC7, KD7, KE7, KF7, KG7, KH7, KI7, KJ7, KC_NO, KC_NO, KC_NO, KC_NO, KO7, KC_NO, KQ7, KR7 } \ } -#endif #endif diff --git a/keyboards/frosty_flake/keymaps/default/keymap.c b/keyboards/frosty_flake/keymaps/default/keymap.c index 90711732fa..4383f7a8d7 100644 --- a/keyboards/frosty_flake/keymaps/default/keymap.c +++ b/keyboards/frosty_flake/keymaps/default/keymap.c @@ -35,8 +35,7 @@ void matrix_init_user(void) { } void matrix_scan_user(void) { - if (matrix_is_modified()) - matrix_print(); + matrix_print(); } bool process_record_user(uint16_t keycode, keyrecord_t *record) { diff --git a/keyboards/frosty_flake/matrix.c b/keyboards/frosty_flake/matrix.c index 07b9f6dd68..f289f506ad 100644 --- a/keyboards/frosty_flake/matrix.c +++ b/keyboards/frosty_flake/matrix.c @@ -1,5 +1,5 @@ /* - Copyright 2014 Ralf Schmitt + Copyright 2017 Gabriel Young This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,9 +24,6 @@ #include "util.h" #include "matrix.h" -#ifndef CONFIG_SPECIFIC_H -#define CONFIG_SPECIFIC_H - #define CONFIG_LED_IO \ DDRB |= (1<<7); \ DDRC |= (1<<5) | (1<<6); @@ -38,85 +35,40 @@ #define USB_LED_SCROLL_LOCK_ON PORTC &= ~(1<<6) #define USB_LED_SCROLL_LOCK_OFF PORTC |= (1<<6) -#define CONFIG_MATRIX_IO \ - /* Column output pins */ \ - DDRD |= 0b01111011; \ - /* Row input pins */ \ - DDRC &= ~0b10000000; \ - DDRB &= ~0b01111111; \ - PORTC |= 0b10000000; \ - PORTB |= 0b01111111; - -#define MATRIX_ROW_SCAN \ - (PINC&(1<<7) ? 0 : ((matrix_row_t)1<<0)) | \ - (PINB&(1<<5) ? 0 : ((matrix_row_t)1<<1)) | \ - (PINB&(1<<4) ? 0 : ((matrix_row_t)1<<2)) | \ - (PINB&(1<<6) ? 0 : ((matrix_row_t)1<<3)) | \ - (PINB&(1<<1) ? 0 : ((matrix_row_t)1<<4)) | \ - (PINB&(1<<2) ? 0 : ((matrix_row_t)1<<5)) | \ - (PINB&(1<<3) ? 0 : ((matrix_row_t)1<<6)) | \ - (PINB&(1<<0) ? 0 : ((matrix_row_t)1<<7)) - -#define MATRIX_ROW_SELECT \ - case 0: PORTD = (PORTD & ~0b01111011) | 0b00011011; break; \ - case 1: PORTD = (PORTD & ~0b01111011) | 0b01000011; break; \ - case 2: PORTD = (PORTD & ~0b01111011) | 0b01101010; break; \ - case 3: PORTD = (PORTD & ~0b01111011) | 0b01111001; break; \ - case 4: PORTD = (PORTD & ~0b01111011) | 0b01100010; break; \ - case 5: PORTD = (PORTD & ~0b01111011) | 0b01110001; break; \ - case 6: PORTD = (PORTD & ~0b01111011) | 0b01100001; break; \ - case 7: PORTD = (PORTD & ~0b01111011) | 0b01110000; break; \ - case 8: PORTD = (PORTD & ~0b01111011) | 0b01100000; break; \ - case 9: PORTD = (PORTD & ~0b01111011) | 0b01101000; break; \ - case 10: PORTD = (PORTD & ~0b01111011) | 0b00101011; break; \ - case 11: PORTD = (PORTD & ~0b01111011) | 0b00110011; break; \ - case 12: PORTD = (PORTD & ~0b01111011) | 0b00100011; break; \ - case 13: PORTD = (PORTD & ~0b01111011) | 0b01111000; break; \ - case 14: PORTD = (PORTD & ~0b01111011) | 0b00010011; break; \ - case 15: PORTD = (PORTD & ~0b01111011) | 0b01101001; break; \ - case 16: PORTD = (PORTD & ~0b01111011) | 0b00001011; break; \ - case 17: PORTD = (PORTD & ~0b01111011) | 0b00111011; break; - -#endif - #ifndef DEBOUNCING_DELAY -# define DEBOUNCING_DELAY 0 +# define DEBOUNCING_DELAY 5 #endif static uint8_t debouncing = DEBOUNCING_DELAY; static matrix_row_t matrix[MATRIX_ROWS]; static matrix_row_t matrix_debouncing[MATRIX_ROWS]; -static matrix_row_t scan_row(void); -static void select_row(uint8_t row); - -inline uint8_t matrix_rows(void) { - return MATRIX_ROWS; -} - -inline uint8_t matrix_cols(void) { - return MATRIX_COLS; -} +static matrix_row_t scan_col(void); +static void select_col(uint8_t row); void matrix_init(void) { - CONFIG_MATRIX_IO; + /* Row output pins */ + DDRD |= 0b01111011; + /* Column input pins */ + DDRC &= ~0b10000000; + DDRB &= ~0b01111111; + PORTC |= 0b10000000; + PORTB |= 0b01111111; - for (uint8_t i=0; i < MATRIX_ROWS; i++) { - matrix[i] = 0; - matrix_debouncing[i] = 0; - } + for (uint8_t i=0; i < MATRIX_ROWS; i++) + matrix[i] = matrix_debouncing[i] = 0; - matrix_init_quantum(); + matrix_init_quantum(); } uint8_t matrix_scan(void) { - for (uint8_t row = 0; row < MATRIX_ROWS; row++) { - select_row(row); + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + select_col(col); _delay_us(3); - matrix_row_t row_scan = scan_row(); - for (uint8_t col = 0; col < MATRIX_COLS; col++) { + matrix_row_t col_scan = scan_col(); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1< Date: Sun, 19 Mar 2017 20:45:10 -0700 Subject: [PATCH 102/181] support LEDs --- keyboards/frosty_flake/frosty_flake.c | 40 +++++++++++++------ keyboards/frosty_flake/matrix.c | 55 +++++++++++---------------- 2 files changed, 51 insertions(+), 44 deletions(-) diff --git a/keyboards/frosty_flake/frosty_flake.c b/keyboards/frosty_flake/frosty_flake.c index 22979a4515..ed17361840 100644 --- a/keyboards/frosty_flake/frosty_flake.c +++ b/keyboards/frosty_flake/frosty_flake.c @@ -1,28 +1,46 @@ #include "frosty_flake.h" void matrix_init_kb(void) { - // put your keyboard start-up code here - // runs once when the firmware starts up + // put your keyboard start-up code here + // runs once when the firmware starts up - matrix_init_user(); + matrix_init_user(); } void matrix_scan_kb(void) { - // put your looping keyboard code here - // runs every cycle (a lot) + // put your looping keyboard code here + // runs every cycle (a lot) - matrix_scan_user(); + matrix_scan_user(); } bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - // put your per-action keyboard code here - // runs for every action, just before processing by the firmware + // put your per-action keyboard code here + // runs for every action, just before processing by the firmware - return process_record_user(keycode, record); + return process_record_user(keycode, record); } void led_set_kb(uint8_t usb_led) { - // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + DDRB |= (1<<7); + DDRC |= (1<<5) | (1<<6); - led_set_user(usb_led); + print_dec(usb_led); + + if (usb_led & (1< Date: Sun, 19 Mar 2017 20:46:56 -0700 Subject: [PATCH 103/181] fix whitespace --- keyboards/frosty_flake/matrix.c | 99 ++++++++++++++++----------------- 1 file changed, 48 insertions(+), 51 deletions(-) diff --git a/keyboards/frosty_flake/matrix.c b/keyboards/frosty_flake/matrix.c index 5d711a660f..05dffdb643 100644 --- a/keyboards/frosty_flake/matrix.c +++ b/keyboards/frosty_flake/matrix.c @@ -32,8 +32,41 @@ static uint8_t debouncing = DEBOUNCING_DELAY; static matrix_row_t matrix[MATRIX_ROWS]; static matrix_row_t matrix_debouncing[MATRIX_ROWS]; -static matrix_row_t scan_col(void); -static void select_col(uint8_t row); +static matrix_row_t scan_col(void) { + return ( + (PINC&(1<<7) ? 0 : ((matrix_row_t)1<<0)) | + (PINB&(1<<5) ? 0 : ((matrix_row_t)1<<1)) | + (PINB&(1<<4) ? 0 : ((matrix_row_t)1<<2)) | + (PINB&(1<<6) ? 0 : ((matrix_row_t)1<<3)) | + (PINB&(1<<1) ? 0 : ((matrix_row_t)1<<4)) | + (PINB&(1<<2) ? 0 : ((matrix_row_t)1<<5)) | + (PINB&(1<<3) ? 0 : ((matrix_row_t)1<<6)) | + (PINB&(1<<0) ? 0 : ((matrix_row_t)1<<7)) + ); +} + +static void select_col(uint8_t col) { + switch (col) { + case 0: PORTD = (PORTD & ~0b01111011) | 0b00011011; break; + case 1: PORTD = (PORTD & ~0b01111011) | 0b01000011; break; + case 2: PORTD = (PORTD & ~0b01111011) | 0b01101010; break; + case 3: PORTD = (PORTD & ~0b01111011) | 0b01111001; break; + case 4: PORTD = (PORTD & ~0b01111011) | 0b01100010; break; + case 5: PORTD = (PORTD & ~0b01111011) | 0b01110001; break; + case 6: PORTD = (PORTD & ~0b01111011) | 0b01100001; break; + case 7: PORTD = (PORTD & ~0b01111011) | 0b01110000; break; + case 8: PORTD = (PORTD & ~0b01111011) | 0b01100000; break; + case 9: PORTD = (PORTD & ~0b01111011) | 0b01101000; break; + case 10: PORTD = (PORTD & ~0b01111011) | 0b00101011; break; + case 11: PORTD = (PORTD & ~0b01111011) | 0b00110011; break; + case 12: PORTD = (PORTD & ~0b01111011) | 0b00100011; break; + case 13: PORTD = (PORTD & ~0b01111011) | 0b01111000; break; + case 14: PORTD = (PORTD & ~0b01111011) | 0b00010011; break; + case 15: PORTD = (PORTD & ~0b01111011) | 0b01101001; break; + case 16: PORTD = (PORTD & ~0b01111011) | 0b00001011; break; + case 17: PORTD = (PORTD & ~0b01111011) | 0b00111011; break; + } +} void matrix_init(void) { /* Row output pins */ @@ -82,57 +115,21 @@ inline matrix_row_t matrix_get_row(uint8_t row) { } void matrix_print(void) { - print("\nr\\c ABCDEFGHIJKLMNOPQR\n"); - for (uint8_t row = 0; row < MATRIX_ROWS; row++) { - matrix_row_t matrix_row = matrix_get_row(row); - xprintf("%02X: ", row); - for (uint8_t col = 0; col < MATRIX_COLS; col++) { - bool curr_bit = matrix_row & (1< Date: Sun, 19 Mar 2017 20:56:45 -0700 Subject: [PATCH 104/181] update docs --- keyboards/frosty_flake/readme.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/keyboards/frosty_flake/readme.md b/keyboards/frosty_flake/readme.md index a329650619..ef0e7492bf 100644 --- a/keyboards/frosty_flake/readme.md +++ b/keyboards/frosty_flake/readme.md @@ -1,6 +1,10 @@ frosty_flake keyboard firmware ====================== +This is the firmware for Rev. 20140521 of the Frosty Flake controller by [Bathroom Epiphanies](http://bathroomepiphanies.com/controllers/). + +The code was adapted from the [BathroomEpiphanies TMK Firmware](https://github.com/BathroomEpiphanies/epiphanies_tmk_keyboard/tree/master/be_controllers), but has been cleaned up to match the [schematic](https://deskthority.net/wiki/File:Frosty_Flake_Schematics.pdf) and gone through some minor refactoring for QMK. + ## Quantum MK Firmware For the full Quantum feature list, see [the parent readme](/). From a3a304db9ae09c3c5532c43e553cc24d3f9b29a2 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sun, 19 Mar 2017 21:11:17 -0700 Subject: [PATCH 105/181] clean up docs and provide defaults for keymap --- keyboards/frosty_flake/frosty_flake.c | 17 +++++++++ .../frosty_flake/keymaps/default/Makefile | 4 +- .../frosty_flake/keymaps/default/keymap.c | 38 +------------------ keyboards/frosty_flake/readme.md | 2 +- 4 files changed, 21 insertions(+), 40 deletions(-) diff --git a/keyboards/frosty_flake/frosty_flake.c b/keyboards/frosty_flake/frosty_flake.c index ed17361840..1cd4760389 100644 --- a/keyboards/frosty_flake/frosty_flake.c +++ b/keyboards/frosty_flake/frosty_flake.c @@ -44,3 +44,20 @@ void led_set_kb(uint8_t usb_led) { led_set_user(usb_led); } + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +__attribute__ ((weak)) +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +__attribute__ ((weak)) +void led_set_user(uint8_t usb_led) { +} \ No newline at end of file diff --git a/keyboards/frosty_flake/keymaps/default/Makefile b/keyboards/frosty_flake/keymaps/default/Makefile index 0887666802..9d3df5964f 100644 --- a/keyboards/frosty_flake/keymaps/default/Makefile +++ b/keyboards/frosty_flake/keymaps/default/Makefile @@ -3,9 +3,9 @@ # the appropriate keymap folder that will get included automatically # BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = yes # Console for debug(+400) +CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality diff --git a/keyboards/frosty_flake/keymaps/default/keymap.c b/keyboards/frosty_flake/keymaps/default/keymap.c index 4383f7a8d7..4dc7ed655f 100644 --- a/keyboards/frosty_flake/keymaps/default/keymap.c +++ b/keyboards/frosty_flake/keymaps/default/keymap.c @@ -8,40 +8,4 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_SCLN,KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \ KC_LSFT,KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM, KC_DOT,KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3,KC_PENT, \ KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT, KC_P0,KC_PDOT) -}; - -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; -}; - - -void matrix_init_user(void) { - debug_enable = true; -} - -void matrix_scan_user(void) { - matrix_print(); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - return true; -} - -void led_set_user(uint8_t usb_led) { - -} \ No newline at end of file +}; \ No newline at end of file diff --git a/keyboards/frosty_flake/readme.md b/keyboards/frosty_flake/readme.md index ef0e7492bf..ff440e33b6 100644 --- a/keyboards/frosty_flake/readme.md +++ b/keyboards/frosty_flake/readme.md @@ -1,7 +1,7 @@ frosty_flake keyboard firmware ====================== -This is the firmware for Rev. 20140521 of the Frosty Flake controller by [Bathroom Epiphanies](http://bathroomepiphanies.com/controllers/). +This is the firmware for Rev. 20140521 of the Frosty Flake controller by [Bathroom Epiphanies](http://bathroomepiphanies.com/controllers/), a replacement controller for the [Cooler Master Quick Fire Rapid](http://www.coolermaster.com/peripheral/keyboards/quickfirerapid/). The code was adapted from the [BathroomEpiphanies TMK Firmware](https://github.com/BathroomEpiphanies/epiphanies_tmk_keyboard/tree/master/be_controllers), but has been cleaned up to match the [schematic](https://deskthority.net/wiki/File:Frosty_Flake_Schematics.pdf) and gone through some minor refactoring for QMK. From b37f510f323b532360f38afb6f0bb29bc61eaab3 Mon Sep 17 00:00:00 2001 From: Gabriel Young Date: Sun, 19 Mar 2017 21:18:15 -0700 Subject: [PATCH 106/181] clean up config --- keyboards/frosty_flake/config.h | 30 ++++-------------------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/keyboards/frosty_flake/config.h b/keyboards/frosty_flake/config.h index f03cecb3e6..2c73f10743 100644 --- a/keyboards/frosty_flake/config.h +++ b/keyboards/frosty_flake/config.h @@ -36,39 +36,17 @@ along with this program. If not, see . */ /* key matrix size */ -#define MATRIX_ROWS 8 -#define MATRIX_COLS 18 +#define MATRIX_ROWS 8 // Row0 - Row7 in the schematic +#define MATRIX_COLS 18 // ColA - ColR in the schematic /* * Keyboard Matrix Assignments - * - * Change this to how you wired your keyboard - * COLS: AVR pins used for columns, left to right - * ROWS: AVR pins used for rows, top to bottom - * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) - * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) - * -*/ -//#define MATRIX_ROW_PINS { D5, D4, D6, D2, D1, D0 } -//#define MATRIX_COL_PINS << n/a >> -//#define UNUSED_PINS { B0, C4, D3 } - -/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ -//#define DIODE_DIRECTION << n/a >> - -// #define BACKLIGHT_PIN B7 -// #define BACKLIGHT_BREATHING -// #define BACKLIGHT_LEVELS 3 - + */ +#define UNUSED_PINS { B0, C4, D3 } /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ #define DEBOUNCING_DELAY 5 -/* define if matrix has ghost (lacks anti-ghosting diodes) */ -//#define MATRIX_HAS_GHOST - -/* number of backlight levels */ - /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ From 3399e392977f91b1993e1ac581ff5a054a45848b Mon Sep 17 00:00:00 2001 From: Stephen Tudor Date: Mon, 20 Mar 2017 07:26:28 -0400 Subject: [PATCH 107/181] Fix shift tap-dance (can't use one-shot layer) --- keyboards/satan/keymaps/smt/Makefile | 3 +- keyboards/satan/keymaps/smt/keymap.c | 43 +++++++--------------------- 2 files changed, 12 insertions(+), 34 deletions(-) diff --git a/keyboards/satan/keymaps/smt/Makefile b/keyboards/satan/keymaps/smt/Makefile index 2a7ff27793..afcd025e13 100644 --- a/keyboards/satan/keymaps/smt/Makefile +++ b/keyboards/satan/keymaps/smt/Makefile @@ -8,13 +8,14 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +TAP_DANCE_ENABLE = yes # Enable tap dance ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/satan/keymaps/smt/keymap.c b/keyboards/satan/keymaps/smt/keymap.c index 4ac016f212..7f9e9c2d50 100644 --- a/keyboards/satan/keymaps/smt/keymap.c +++ b/keyboards/satan/keymaps/smt/keymap.c @@ -20,6 +20,10 @@ enum planck_keycodes { DVORAK }; +enum { + TD_SHIFT_RAISE = 0 +}; + #define _______ KC_TRNS #define XXXXXXX KC_NO @@ -28,7 +32,7 @@ enum planck_keycodes { #define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl #define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Shift+Alt) #define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift -#define SFT_RSE TD(KC_LSFT, OS(_RAISE)) // Double-tap for RAISE one-shot, otherwise Left Shift +#define SFT_RSE TD(TD_SHIFT_RAISE) // Double-tap for RAISE one-shot, otherwise Left Shift const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap _QWERTY: (Base Layer) Default Layer @@ -170,36 +174,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; } -enum function_id { - SHIFT_ESC, +// Tap Dance Definitions +qk_tap_dance_action_t tap_dance_actions[] = { + // Tap/hold once for Shift, tap twice for raise layer + [TD_SHIFT_RAISE] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, _RAISE) +// Other declarations would go here, separated by commas, if you have them }; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(SHIFT_ESC), -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t shift_esc_shift_mask; - switch (id) { - case SHIFT_ESC: - shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK; - if (record->event.pressed) { - if (shift_esc_shift_mask) { - add_key(KC_GRV); - send_keyboard_report(); - } else { - add_key(KC_ESC); - send_keyboard_report(); - } - } else { - if (shift_esc_shift_mask) { - del_key(KC_GRV); - send_keyboard_report(); - } else { - del_key(KC_ESC); - send_keyboard_report(); - } - } - break; - } -} From b10d95070831dde5801e930c615612dec3a6fd11 Mon Sep 17 00:00:00 2001 From: Stephen Tudor Date: Mon, 20 Mar 2017 07:43:24 -0400 Subject: [PATCH 108/181] Use normal backtick in ESC spot - I've mapped ESC to caps lock --- keyboards/satan/keymaps/smt/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/satan/keymaps/smt/keymap.c b/keyboards/satan/keymaps/smt/keymap.c index 7f9e9c2d50..1a2bc97698 100644 --- a/keyboards/satan/keymaps/smt/keymap.c +++ b/keyboards/satan/keymaps/smt/keymap.c @@ -49,7 +49,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------' */ [_QWERTY] = KEYMAP_ANSI( - F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS, \ CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ SFT_RSE, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_ENT, \ @@ -69,7 +69,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------' */ [_COLEMAK] = KEYMAP_ANSI( - F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN,KC_LBRC, KC_RBRC,KC_BSLS, \ CTL_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O ,KC_QUOT, KC_ENT, \ SFT_RSE, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_ENT, \ @@ -89,7 +89,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------' */ [_DVORAK] = KEYMAP_ANSI( - F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC,KC_BSPC, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC,KC_BSPC, \ HPR_TAB, KC_QUOT,KC_COMM,KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, \ CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, \ SFT_RSE, KC_SCLN,KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT, \ @@ -109,7 +109,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------' */ [_LOWER] = KEYMAP_ANSI( - KC_GRV ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,KC_DEL, \ + _______,KC_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_HOME,KC_UP ,KC_END ,_______,_______,_______,_______,_______,_______,_______,BL_DEC ,BL_INC ,BL_TOGG, \ _______,KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,KC_LEFT,KC_DOWN,KC_UP ,KC_RGHT,KC_VOLU,KC_PGUP ,_______, \ KC_LSFT ,_______,_______,KC_MPRV,KC_MPLY,KC_MNXT,_______,_______,_______,KC_VOLD,KC_PGDN ,_______, \ From 34c5f8094e3a07dfff344f95b29407c9efaa0e4c Mon Sep 17 00:00:00 2001 From: Stephen Tudor Date: Mon, 20 Mar 2017 07:43:45 -0400 Subject: [PATCH 109/181] Remove tap-dance. Raise will be accessed via holding shift while lower is active --- keyboards/satan/keymaps/smt/Makefile | 1 - keyboards/satan/keymaps/smt/keymap.c | 32 ++++++++++------------------ 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/keyboards/satan/keymaps/smt/Makefile b/keyboards/satan/keymaps/smt/Makefile index afcd025e13..0c9ae824f6 100644 --- a/keyboards/satan/keymaps/smt/Makefile +++ b/keyboards/satan/keymaps/smt/Makefile @@ -15,7 +15,6 @@ UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -TAP_DANCE_ENABLE = yes # Enable tap dance ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/satan/keymaps/smt/keymap.c b/keyboards/satan/keymaps/smt/keymap.c index 1a2bc97698..a21d3eb864 100644 --- a/keyboards/satan/keymaps/smt/keymap.c +++ b/keyboards/satan/keymaps/smt/keymap.c @@ -17,11 +17,9 @@ enum planck_keycodes { QWERTY = SAFE_RANGE, COLEMAK, - DVORAK -}; - -enum { - TD_SHIFT_RAISE = 0 + DVORAK, + LOWER, + RAISE }; #define _______ KC_TRNS @@ -32,7 +30,6 @@ enum { #define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl #define HPR_TAB ALL_T(KC_TAB) // Tap for Tab, hold for Hyper (Super+Ctrl+Shift+Alt) #define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift -#define SFT_RSE TD(TD_SHIFT_RAISE) // Double-tap for RAISE one-shot, otherwise Left Shift const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap _QWERTY: (Base Layer) Default Layer @@ -52,7 +49,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS, \ CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ - SFT_RSE, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_ENT, \ KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,MO(_LOWER),KC_RCTL), /* Keymap _COLEMAK: (Base Layer) Default Layer @@ -72,7 +69,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \ HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN,KC_LBRC, KC_RBRC,KC_BSLS, \ CTL_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O ,KC_QUOT, KC_ENT, \ - SFT_RSE, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_ENT, \ KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,MO(_LOWER),KC_RCTL), /* Keymap _DVORAK: (Base Layer) Default Layer @@ -92,7 +89,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC,KC_BSPC, \ HPR_TAB, KC_QUOT,KC_COMM,KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, \ CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, \ - SFT_RSE, KC_SCLN,KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT, \ + KC_LSFT, KC_SCLN,KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT, \ KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,MO(_LOWER),KC_RCTL), /* Keymap _LOWER: Function Layer @@ -112,7 +109,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______,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_HOME,KC_UP ,KC_END ,_______,_______,_______,_______,_______,_______,_______,BL_DEC ,BL_INC ,BL_TOGG, \ _______,KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,KC_LEFT,KC_DOWN,KC_UP ,KC_RGHT,KC_VOLU,KC_PGUP ,_______, \ - KC_LSFT ,_______,_______,KC_MPRV,KC_MPLY,KC_MNXT,_______,_______,_______,KC_VOLD,KC_PGDN ,_______, \ + RAISE ,_______,_______,KC_MPRV,KC_MPLY,KC_MNXT,_______,_______,_______,KC_VOLD,KC_PGDN ,_______, \ _______,_______,_______ ,_______ ,_______,_______,_______,_______), /* Keymap _RAISE: Function Layer @@ -133,14 +130,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET , \ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ _______,_______,_______,_______,_______,_______,_______,QWERTY ,COLEMAK,DVORAK ,_______,_______ ,_______, \ - KC_LSFT ,RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,_______,_______ ,_______, \ - _______,_______,_______ ,_______ ,_______,_______,XXXXXXX,_______ + _______ ,RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,_______,_______ ,_______, \ + _______,_______,_______ ,_______ ,_______,_______,_______,_______ #else _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET , \ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ _______,_______,_______,_______,_______,_______,_______,QWERTY ,COLEMAK,DVORAK ,_______,_______ ,_______, \ - KC_LSFT ,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______ ,_______, \ - _______,_______,_______ ,_______ ,_______,_______,XXXXXXX,_______ + _______ ,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______ ,_______, \ + _______,_______,_______ ,_______ ,_______,_______,_______,_______ #endif ) }; @@ -173,10 +170,3 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return true; } - -// Tap Dance Definitions -qk_tap_dance_action_t tap_dance_actions[] = { - // Tap/hold once for Shift, tap twice for raise layer - [TD_SHIFT_RAISE] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, _RAISE) -// Other declarations would go here, separated by commas, if you have them -}; From d7f2bd29646c585434a8f19e7b9df0d3a6ea7bef Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Mon, 20 Mar 2017 13:14:48 -0400 Subject: [PATCH 110/181] add pgup, pgdn, home, end --- keyboards/planck/keymaps/khord/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/planck/keymaps/khord/keymap.c b/keyboards/planck/keymaps/khord/keymap.c index 6f19966f25..b6adb603e9 100644 --- a/keyboards/planck/keymaps/khord/keymap.c +++ b/keyboards/planck/keymaps/khord/keymap.c @@ -112,7 +112,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+-------------+------+------+------+------+------| * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | END | HOME |Enter | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' @@ -120,7 +120,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_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_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, - {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_END, KC_HOME, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} }, @@ -130,7 +130,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+-------------+------+------+------+------+------| * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |PG DN |PG UP |Enter | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' @@ -138,7 +138,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_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_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS}, - {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______}, + {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGDN, KC_PGUP, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} }, From dce3847ebb900ffebd9038da255309cbac634170 Mon Sep 17 00:00:00 2001 From: Stephen Tudor Date: Mon, 20 Mar 2017 14:12:43 -0400 Subject: [PATCH 111/181] Use single _FUNC layer. Move RESET and base layout-changing keys to _FUNC. --- keyboards/satan/keymaps/smt/keymap.c | 55 ++++++---------------------- 1 file changed, 12 insertions(+), 43 deletions(-) diff --git a/keyboards/satan/keymaps/smt/keymap.c b/keyboards/satan/keymaps/smt/keymap.c index a21d3eb864..d90849914e 100644 --- a/keyboards/satan/keymaps/smt/keymap.c +++ b/keyboards/satan/keymaps/smt/keymap.c @@ -11,15 +11,12 @@ #define _QWERTY 0 #define _COLEMAK 1 #define _DVORAK 2 -#define _LOWER 3 -#define _RAISE 4 +#define _FUNC 3 enum planck_keycodes { QWERTY = SAFE_RANGE, COLEMAK, - DVORAK, - LOWER, - RAISE + DVORAK }; #define _______ KC_TRNS @@ -50,7 +47,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS, \ CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_ENT, \ - KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,MO(_LOWER),KC_RCTL), + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,MO(_FUNC),KC_RCTL), /* Keymap _COLEMAK: (Base Layer) Default Layer * ,-----------------------------------------------------------. @@ -70,7 +67,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN,KC_LBRC, KC_RBRC,KC_BSLS, \ CTL_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O ,KC_QUOT, KC_ENT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM,KC_DOT, KC_SLSH, SFT_ENT, \ - KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,MO(_LOWER),KC_RCTL), + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,MO(_FUNC),KC_RCTL), /* Keymap _DVORAK: (Base Layer) Default Layer * ,-----------------------------------------------------------. @@ -90,55 +87,27 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { HPR_TAB, KC_QUOT,KC_COMM,KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, \ CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, \ KC_LSFT, KC_SCLN,KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SFT_ENT, \ - KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,MO(_LOWER),KC_RCTL), + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,MO(_FUNC),KC_RCTL), - /* Keymap _LOWER: Function Layer + /* Keymap _FUNC: Function Layer * ,-----------------------------------------------------------. * | | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete | * |-----------------------------------------------------------| - * | |Hom| UP|End| | | | | | | |BL-|BL+|BL | + * | |Hom| UP|End| | | |Qwt|Cmk|Dvk| |BL-|BL+|BL | * |-----------------------------------------------------------| * | |LFT| DN| RT| | |LFT| DN| UP| RT|Vo+|Pg+| | * |-----------------------------------------------------------| * | | | |Prv|Ply|Nxt| | | |Vo-|Pg-| | * |-----------------------------------------------------------| - * | | | | | | | | | + * |RESET| | | | | | | | * `-----------------------------------------------------------' */ -[_LOWER] = KEYMAP_ANSI( +[_FUNC] = KEYMAP_ANSI( _______,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_HOME,KC_UP ,KC_END ,_______,_______,_______,_______,_______,_______,_______,BL_DEC ,BL_INC ,BL_TOGG, \ + _______,KC_HOME,KC_UP ,KC_END ,_______,_______,_______,QWERTY ,COLEMAK,DVORAK ,_______,BL_DEC ,BL_INC ,BL_TOGG, \ _______,KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,KC_LEFT,KC_DOWN,KC_UP ,KC_RGHT,KC_VOLU,KC_PGUP ,_______, \ - RAISE ,_______,_______,KC_MPRV,KC_MPLY,KC_MNXT,_______,_______,_______,KC_VOLD,KC_PGDN ,_______, \ - _______,_______,_______ ,_______ ,_______,_______,_______,_______), - - /* Keymap _RAISE: Function Layer - * ,-----------------------------------------------------------. - * | | | | | | | | | | | | | | RESET | - * |-----------------------------------------------------------| - * | | | | | | | | | | | |BL-|BL+|BL | - * |-----------------------------------------------------------| - * | | | | | | | |QWT|CLM|DVK| | | | - * |-----------------------------------------------------------| - * | | F1|F2 | F3|F4 | F5| F6| F7| F8| | | | - * |-----------------------------------------------------------| - * | | | | | | | | | - * `-----------------------------------------------------------' - */ -[_RAISE] = KEYMAP_ANSI( - #ifdef RGBLIGHT_ENABLE - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET , \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ - _______,_______,_______,_______,_______,_______,_______,QWERTY ,COLEMAK,DVORAK ,_______,_______ ,_______, \ - _______ ,RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,_______,_______ ,_______, \ - _______,_______,_______ ,_______ ,_______,_______,_______,_______ - #else - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,RESET , \ - _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ - _______,_______,_______,_______,_______,_______,_______,QWERTY ,COLEMAK,DVORAK ,_______,_______ ,_______, \ - _______ ,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______ ,_______, \ - _______,_______,_______ ,_______ ,_______,_______,_______,_______ - #endif + _______ ,_______,_______,KC_MPRV,KC_MPLY,KC_MNXT,_______,_______,_______,KC_VOLD,KC_PGDN ,_______, \ + RESET ,_______,_______ ,_______ ,_______,_______,_______,_______ ) }; From 9e0ca927f950d1d396e3f45f02e0a3e7dd5b0fff Mon Sep 17 00:00:00 2001 From: tengg Date: Wed, 22 Mar 2017 00:03:30 -0400 Subject: [PATCH 112/181] fixed a bug related to mod + Grave with combined ESC/Grave key This only applies to keymaps that has combined esc/grave. Here we call it theKEY. Think about the motion when we do shift + theKEY (typing ~), or CMD + theKEY (switching window on MAC). Based on the original code, we must do following sequence: press shift -> press theKEY -> release theKEY -> release shift. However, it is very possible and natural that we do this stroke sequence instead: press shift -> press theKEY -> release shift -> release theKEY. If we do the 2nd stroke sequence, the code will del_key(ESC) instead of (GRV) when we release theKEY. This caused some inconvenient issues and ghost typing. By adding a flag, this issue is eliminated and will not affect any other functions. --- keyboards/clueboard/keymaps/mac_optimized/keymap.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/keyboards/clueboard/keymaps/mac_optimized/keymap.c b/keyboards/clueboard/keymaps/mac_optimized/keymap.c index 59f7ff2436..bb1a5d3cb5 100644 --- a/keyboards/clueboard/keymaps/mac_optimized/keymap.c +++ b/keyboards/clueboard/keymaps/mac_optimized/keymap.c @@ -50,6 +50,7 @@ const uint16_t PROGMEM fn_actions[] = { void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { static uint8_t mods_pressed; + static bool mods_flag; switch (id) { case 0: @@ -62,6 +63,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { */ if (mods_pressed) { add_key(KC_GRV); + mod_flag = true; send_keyboard_report(); } else { add_key(KC_ESC); @@ -70,8 +72,9 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } else { /* The key is being released. */ - if (mods_pressed) { + if (mod_flag) { del_key(KC_GRV); + mod_flag = false; send_keyboard_report(); } else { del_key(KC_ESC); From a89998b977ccb707767149c0fa4bbf614d4eefea Mon Sep 17 00:00:00 2001 From: tengg Date: Wed, 22 Mar 2017 00:28:59 -0400 Subject: [PATCH 113/181] fix typo --- keyboards/clueboard/keymaps/mac_optimized/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/clueboard/keymaps/mac_optimized/keymap.c b/keyboards/clueboard/keymaps/mac_optimized/keymap.c index bb1a5d3cb5..bd9a76dc86 100644 --- a/keyboards/clueboard/keymaps/mac_optimized/keymap.c +++ b/keyboards/clueboard/keymaps/mac_optimized/keymap.c @@ -49,7 +49,7 @@ const uint16_t PROGMEM fn_actions[] = { }; void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t mods_pressed; + static uint8_t mod_pressed; static bool mods_flag; switch (id) { From 3cba7a43d976be973a4fe32a058b98f092f2e26e Mon Sep 17 00:00:00 2001 From: tengg Date: Wed, 22 Mar 2017 00:33:44 -0400 Subject: [PATCH 114/181] typo fixed --- keyboards/clueboard/keymaps/mac_optimized/keymap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/clueboard/keymaps/mac_optimized/keymap.c b/keyboards/clueboard/keymaps/mac_optimized/keymap.c index bd9a76dc86..4a18e9a758 100644 --- a/keyboards/clueboard/keymaps/mac_optimized/keymap.c +++ b/keyboards/clueboard/keymaps/mac_optimized/keymap.c @@ -49,8 +49,8 @@ const uint16_t PROGMEM fn_actions[] = { }; void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - static uint8_t mod_pressed; - static bool mods_flag; + static uint8_t mods_pressed; + static bool mod_flag; switch (id) { case 0: From 452949f9139a04d46748e6abc03e92d65d74eb30 Mon Sep 17 00:00:00 2001 From: skullY Date: Tue, 21 Mar 2017 22:06:47 -0700 Subject: [PATCH 115/181] Add #1170 to all the clueboard keymaps --- keyboards/clueboard/keymaps/caps_fn/keymap.c | 5 ++++- keyboards/clueboard/keymaps/colemak/keymap.c | 5 ++++- keyboards/clueboard/keymaps/default/keymap.c | 5 ++++- keyboards/clueboard/keymaps/mac_optimized/keymap.c | 4 ++-- keyboards/clueboard/keymaps/mouse_keys/keymap.c | 5 ++++- keyboards/clueboard/keymaps/shift_fn/keymap.c | 5 ++++- keyboards/clueboard/keymaps/skully/keymap.c | 5 ++++- keyboards/clueboard/keymaps/unix_optimized/keymap.c | 5 ++++- keyboards/clueboard/keymaps/win_optimized/keymap.c | 5 ++++- 9 files changed, 34 insertions(+), 10 deletions(-) diff --git a/keyboards/clueboard/keymaps/caps_fn/keymap.c b/keyboards/clueboard/keymaps/caps_fn/keymap.c index 37f00e8d80..01779446ce 100644 --- a/keyboards/clueboard/keymaps/caps_fn/keymap.c +++ b/keyboards/clueboard/keymaps/caps_fn/keymap.c @@ -50,6 +50,7 @@ const uint16_t PROGMEM fn_actions[] = { void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { static uint8_t mods_pressed; + static boot mod_flag; switch (id) { case 0: @@ -61,6 +62,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { /* The key is being pressed. */ if (mods_pressed) { + mod_flag = true; add_key(KC_GRV); send_keyboard_report(); } else { @@ -70,7 +72,8 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } else { /* The key is being released. */ - if (mods_pressed) { + if (mod_flag) { + mod_flag = false; del_key(KC_GRV); send_keyboard_report(); } else { diff --git a/keyboards/clueboard/keymaps/colemak/keymap.c b/keyboards/clueboard/keymaps/colemak/keymap.c index 6b1fc7c9c6..42c85ff9d8 100644 --- a/keyboards/clueboard/keymaps/colemak/keymap.c +++ b/keyboards/clueboard/keymaps/colemak/keymap.c @@ -50,6 +50,7 @@ const uint16_t PROGMEM fn_actions[] = { void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { static uint8_t mods_pressed; + static bool mod_flag; switch (id) { case 0: @@ -61,6 +62,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { /* The key is being pressed. */ if (mods_pressed) { + mod_flag = true; add_key(KC_GRV); send_keyboard_report(); } else { @@ -70,7 +72,8 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } else { /* The key is being released. */ - if (mods_pressed) { + if (mod_flag) { + mod_flag = false; del_key(KC_GRV); send_keyboard_report(); } else { diff --git a/keyboards/clueboard/keymaps/default/keymap.c b/keyboards/clueboard/keymaps/default/keymap.c index 37f00e8d80..7fad9c1b21 100644 --- a/keyboards/clueboard/keymaps/default/keymap.c +++ b/keyboards/clueboard/keymaps/default/keymap.c @@ -50,6 +50,7 @@ const uint16_t PROGMEM fn_actions[] = { void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { static uint8_t mods_pressed; + static bool mod_flag; switch (id) { case 0: @@ -61,6 +62,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { /* The key is being pressed. */ if (mods_pressed) { + mod_flag = true; add_key(KC_GRV); send_keyboard_report(); } else { @@ -70,7 +72,8 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } else { /* The key is being released. */ - if (mods_pressed) { + if (mod_flag) { + mod_flag = false; del_key(KC_GRV); send_keyboard_report(); } else { diff --git a/keyboards/clueboard/keymaps/mac_optimized/keymap.c b/keyboards/clueboard/keymaps/mac_optimized/keymap.c index 4a18e9a758..7ea02d27e8 100644 --- a/keyboards/clueboard/keymaps/mac_optimized/keymap.c +++ b/keyboards/clueboard/keymaps/mac_optimized/keymap.c @@ -62,8 +62,8 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { /* The key is being pressed. */ if (mods_pressed) { - add_key(KC_GRV); mod_flag = true; + add_key(KC_GRV); send_keyboard_report(); } else { add_key(KC_ESC); @@ -73,8 +73,8 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { /* The key is being released. */ if (mod_flag) { - del_key(KC_GRV); mod_flag = false; + del_key(KC_GRV); send_keyboard_report(); } else { del_key(KC_ESC); diff --git a/keyboards/clueboard/keymaps/mouse_keys/keymap.c b/keyboards/clueboard/keymaps/mouse_keys/keymap.c index a9c5cebd0c..d3108d1e2b 100644 --- a/keyboards/clueboard/keymaps/mouse_keys/keymap.c +++ b/keyboards/clueboard/keymaps/mouse_keys/keymap.c @@ -60,6 +60,7 @@ const uint16_t PROGMEM fn_actions[] = { void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { static uint8_t mods_pressed; + static bool mod_flag; switch (id) { case 0: @@ -71,6 +72,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { /* The key is being pressed. */ if (mods_pressed) { + mod_flag = true; add_key(KC_GRV); send_keyboard_report(); } else { @@ -80,7 +82,8 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } else { /* The key is being released. */ - if (mods_pressed) { + if (mod_flag) { + mod_flag = false; del_key(KC_GRV); send_keyboard_report(); } else { diff --git a/keyboards/clueboard/keymaps/shift_fn/keymap.c b/keyboards/clueboard/keymaps/shift_fn/keymap.c index f21b9b5895..c4fae03698 100644 --- a/keyboards/clueboard/keymaps/shift_fn/keymap.c +++ b/keyboards/clueboard/keymaps/shift_fn/keymap.c @@ -50,6 +50,7 @@ const uint16_t PROGMEM fn_actions[] = { void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { static uint8_t mods_pressed; + static bool mod_flag; switch (id) { case 0: @@ -61,6 +62,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { /* The key is being pressed. */ if (mods_pressed) { + mod_flag = true; add_key(KC_GRV); send_keyboard_report(); } else { @@ -70,7 +72,8 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } else { /* The key is being released. */ - if (mods_pressed) { + if (mod_flag) { + mod_flag = false; del_key(KC_GRV); send_keyboard_report(); } else { diff --git a/keyboards/clueboard/keymaps/skully/keymap.c b/keyboards/clueboard/keymaps/skully/keymap.c index 295090352d..077d214fac 100644 --- a/keyboards/clueboard/keymaps/skully/keymap.c +++ b/keyboards/clueboard/keymaps/skully/keymap.c @@ -47,6 +47,7 @@ const uint16_t PROGMEM fn_actions[] = { void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { static uint8_t mods_pressed; + static bool mod_flag; switch (id) { case 0: @@ -58,6 +59,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { /* The key is being pressed. */ if (mods_pressed) { + mod_flag = true; add_key(KC_GRV); send_keyboard_report(); } else { @@ -67,7 +69,8 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } else { /* The key is being released. */ - if (mods_pressed) { + if (mod_flag) { + mod_flag = false; del_key(KC_GRV); send_keyboard_report(); } else { diff --git a/keyboards/clueboard/keymaps/unix_optimized/keymap.c b/keyboards/clueboard/keymaps/unix_optimized/keymap.c index 9fbd772405..7c1359954b 100644 --- a/keyboards/clueboard/keymaps/unix_optimized/keymap.c +++ b/keyboards/clueboard/keymaps/unix_optimized/keymap.c @@ -50,6 +50,7 @@ const uint16_t PROGMEM fn_actions[] = { void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { static uint8_t mods_pressed; + static bool mod_flag; switch (id) { case 0: @@ -61,6 +62,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { /* The key is being pressed. */ if (mods_pressed) { + mod_flag = true; add_key(KC_GRV); send_keyboard_report(); } else { @@ -70,7 +72,8 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } else { /* The key is being released. */ - if (mods_pressed) { + if (mod_flag) { + mod_flag = false; del_key(KC_GRV); send_keyboard_report(); } else { diff --git a/keyboards/clueboard/keymaps/win_optimized/keymap.c b/keyboards/clueboard/keymaps/win_optimized/keymap.c index a85f0824f1..c5553ff1fb 100644 --- a/keyboards/clueboard/keymaps/win_optimized/keymap.c +++ b/keyboards/clueboard/keymaps/win_optimized/keymap.c @@ -50,6 +50,7 @@ const uint16_t PROGMEM fn_actions[] = { void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { static uint8_t mods_pressed; + static bool mod_flag; switch (id) { case 0: @@ -61,6 +62,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { /* The key is being pressed. */ if (mods_pressed) { + mod_flag = true; add_key(KC_GRV); send_keyboard_report(); } else { @@ -70,7 +72,8 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { } else { /* The key is being released. */ - if (mods_pressed) { + if (mod_flag) { + mod_flag = false; del_key(KC_GRV); send_keyboard_report(); } else { From 7a9437a2e3a2597e8eef1ea293bfb3c394f588b9 Mon Sep 17 00:00:00 2001 From: skullY Date: Tue, 21 Mar 2017 22:24:34 -0700 Subject: [PATCH 116/181] Fix a typo --- keyboards/clueboard/keymaps/caps_fn/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/clueboard/keymaps/caps_fn/keymap.c b/keyboards/clueboard/keymaps/caps_fn/keymap.c index 01779446ce..7fad9c1b21 100644 --- a/keyboards/clueboard/keymaps/caps_fn/keymap.c +++ b/keyboards/clueboard/keymaps/caps_fn/keymap.c @@ -50,7 +50,7 @@ const uint16_t PROGMEM fn_actions[] = { void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { static uint8_t mods_pressed; - static boot mod_flag; + static bool mod_flag; switch (id) { case 0: From f0962bce505a7643abbd169868820715b86f97b7 Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 22 Mar 2017 14:55:13 -0400 Subject: [PATCH 117/181] Add files via upload --- .../lets_split/keymaps/OLED_sample/Makefile | 25 ++ .../lets_split/keymaps/OLED_sample/config.h | 45 +++ .../lets_split/keymaps/OLED_sample/keymap.c | 356 ++++++++++++++++++ 3 files changed, 426 insertions(+) create mode 100644 keyboards/lets_split/keymaps/OLED_sample/Makefile create mode 100644 keyboards/lets_split/keymaps/OLED_sample/config.h create mode 100644 keyboards/lets_split/keymaps/OLED_sample/keymap.c diff --git a/keyboards/lets_split/keymaps/OLED_sample/Makefile b/keyboards/lets_split/keymaps/OLED_sample/Makefile new file mode 100644 index 0000000000..90616d1f19 --- /dev/null +++ b/keyboards/lets_split/keymaps/OLED_sample/Makefile @@ -0,0 +1,25 @@ + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +ONEHAND_ENABLE = no # Enable one-hand typing + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/lets_split/keymaps/OLED_sample/config.h b/keyboards/lets_split/keymaps/OLED_sample/config.h new file mode 100644 index 0000000000..353ea368c6 --- /dev/null +++ b/keyboards/lets_split/keymaps/OLED_sample/config.h @@ -0,0 +1,45 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#define USE_I2C +//#define USE_SERIAL +//#define MASTER_RIGHT +#define FLIP_HALF + +#define SSD1306OLED + + +#define PREVENT_STUCK_MODIFIERS +#define TAPPING_FORCE_HOLD +#define TAPPING_TERM 100 + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 6 +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 + + + + +#ifdef SUBPROJECT_rev1 + #include "../../rev1/config.h" +#endif +#ifdef SUBPROJECT_rev2 + #include "../../rev2/config.h" +#endif \ No newline at end of file diff --git a/keyboards/lets_split/keymaps/OLED_sample/keymap.c b/keyboards/lets_split/keymaps/OLED_sample/keymap.c new file mode 100644 index 0000000000..072b825abe --- /dev/null +++ b/keyboards/lets_split/keymaps/OLED_sample/keymap.c @@ -0,0 +1,356 @@ +#include "lets_split.h" +#include "bootloader.h" +#include "action_layer.h" +#include "eeconfig.h" +#include "tmk_core/protocol/lufa/LUFA-git/LUFA/Drivers/Peripheral/TWI.h" +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif + +extern keymap_config_t keymap_config; + +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; + + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST, + BACKLIT, + RGBLED_TOGGLE, + RGBLED_STEP_MODE, + RGBLED_INCREASE_HUE, + RGBLED_DECREASE_HUE, + RGBLED_INCREASE_SAT, + RGBLED_DECREASE_SAT, + RGBLED_INCREASE_VAL, + RGBLED_DECREASE_VAL, +}; + +enum macro_keycodes { + KC_SAMPLEMACRO, +}; + + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO +//Macros +#define M_SAMPLE M(KC_SAMPLEMACRO) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = KEYMAP( \ + 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 , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Colemak + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = KEYMAP( \ + 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 , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Dvorak + * ,-----------------------------------------------------------------------------------. + * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = KEYMAP( \ + 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 , \ + ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | | \ | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = KEYMAP( \ + 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_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = KEYMAP( \ + 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_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = KEYMAP( \ + _______, RESET, _______, M_SAMPLE, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + + +}; + + +#ifdef AUDIO_ENABLE + +float tone_startup[][2] = SONG(STARTUP_SOUND); +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); +float tone_plover[][2] = SONG(PLOVER_SOUND); +float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND); +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); +#endif + +// define variables for reactive RGB +bool TOG_STATUS = false; +int RGB_current_mode; + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +// Setting ADJUST layer RGB back to default +void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { + if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { + rgblight_mode(RGB_current_mode); + layer_on(layer3); + } else { + layer_off(layer3); + } +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + rgblight_mode(16); + } + layer_on(_LOWER); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } else { + rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change + TOG_STATUS = false; + layer_off(_LOWER); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + //not sure how to have keyboard check mode and set it to a variable, so my work around + //uses another variable that would be set to true after the first time a reactive key is pressed. + if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false + } else { + TOG_STATUS = !TOG_STATUS; + rgblight_mode(15); + } + layer_on(_RAISE); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } else { + rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change + layer_off(_RAISE); + TOG_STATUS = false; + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released + case RGB_MOD: + if (record->event.pressed) { + rgblight_mode(RGB_current_mode); + rgblight_step(); + RGB_current_mode = rgblight_config.mode; + } + return false; + break; + } + return true; +} + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + startup_user(); + #endif + RGB_current_mode = rgblight_config.mode; +} + +//SSD1306 OLED init and update loop, make sure to add #define SSD1306OLED in config.h +#ifdef SSD1306OLED +void matrix_master_OLED_init (void) { + TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000)); + iota_gfx_init(); // turns on the display +} + +void matrix_scan_user(void) { + iota_gfx_task(); // this is what updates the display continuously +} +#endif + +#ifdef AUDIO_ENABLE + +void startup_user() +{ + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void shutdown_user() +{ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_NOTE_ARRAY(music_scale, false, 0); +} + +#endif + +/* + * Macro definition + */ +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + + switch (id) { + case KC_SAMPLEMACRO: + if (record->event.pressed){ + return MACRO (I(10), T(H), T(E), T(L), T(L), T(O), T(SPACE), T(W), T(O), T(R), T(L), T(D), END); + } + + } + + return MACRO_NONE; +} From dfb5a0e8f413338363138dd6beb1701563e1021d Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 22 Mar 2017 14:59:20 -0400 Subject: [PATCH 118/181] Delete Makefile --- keyboards/lets_split/rev2fliphalf/Makefile | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 keyboards/lets_split/rev2fliphalf/Makefile diff --git a/keyboards/lets_split/rev2fliphalf/Makefile b/keyboards/lets_split/rev2fliphalf/Makefile deleted file mode 100644 index 4e2a6f00fd..0000000000 --- a/keyboards/lets_split/rev2fliphalf/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -ifndef MAKEFILE_INCLUDED - include ../../Makefile -endif \ No newline at end of file From 6167d7937c15f7fb68f50a48ce34df858f24d80f Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 22 Mar 2017 14:59:32 -0400 Subject: [PATCH 119/181] Delete config.h --- keyboards/lets_split/rev2fliphalf/config.h | 91 ---------------------- 1 file changed, 91 deletions(-) delete mode 100644 keyboards/lets_split/rev2fliphalf/config.h diff --git a/keyboards/lets_split/rev2fliphalf/config.h b/keyboards/lets_split/rev2fliphalf/config.h deleted file mode 100644 index 1c45cf136b..0000000000 --- a/keyboards/lets_split/rev2fliphalf/config.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#ifndef CONFIG_H -#define CONFIG_H - -#include "config_common.h" - -/* USB Device descriptor parameter */ -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x3060 -#define DEVICE_VER 0x0001 -#define MANUFACTURER Wootpatoot -#define PRODUCT Lets Split v2 -#define DESCRIPTION A split keyboard for the cheap makers - -/* key matrix size */ -// Rows are doubled-up -#define MATRIX_ROWS 8 -#define MATRIX_COLS 6 - -// wiring of each half -#define MATRIX_ROW_PINS { D7, E6, B4, B5 } -//#define MATRIX_COL_PINS { F6, F7, B1, B3, B2, B6 } -#define MATRIX_COL_PINS { B6, B2, B3, B1, F7, F6 } //uncomment this line and comment line above if you need to reverse left-to-right key order - -//#define CATERINA_BOOTLOADER - -/* COL2ROW or ROW2COL */ -#define DIODE_DIRECTION COL2ROW - -/* define if matrix has ghost */ -//#define MATRIX_HAS_GHOST - -/* number of backlight levels */ -// #define BACKLIGHT_LEVELS 3 - -/* Set 0 if debouncing isn't needed */ -#define DEBOUNCING_DELAY 5 - -/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ -#define LOCKING_SUPPORT_ENABLE -/* Locking resynchronize hack */ -#define LOCKING_RESYNC_ENABLE - -/* key combination for command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ -) - -/* ws2812 RGB LED */ -#define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER -#define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD - -/* - * Feature disable options - * These options are also useful to firmware size reduction. - */ - -/* disable debug print */ -// #define NO_DEBUG - -/* disable print */ -// #define NO_PRINT - -/* disable action features */ -//#define NO_ACTION_LAYER -//#define NO_ACTION_TAPPING -//#define NO_ACTION_ONESHOT -//#define NO_ACTION_MACRO -//#define NO_ACTION_FUNCTION - - -#endif \ No newline at end of file From d012b0110811595bed92d3a281ccc5480d0a4a86 Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 22 Mar 2017 14:59:42 -0400 Subject: [PATCH 120/181] Delete rev2fliphalf.c --- .../lets_split/rev2fliphalf/rev2fliphalf.c | 32 ------------------- 1 file changed, 32 deletions(-) delete mode 100644 keyboards/lets_split/rev2fliphalf/rev2fliphalf.c diff --git a/keyboards/lets_split/rev2fliphalf/rev2fliphalf.c b/keyboards/lets_split/rev2fliphalf/rev2fliphalf.c deleted file mode 100644 index c505d3a6e3..0000000000 --- a/keyboards/lets_split/rev2fliphalf/rev2fliphalf.c +++ /dev/null @@ -1,32 +0,0 @@ -#include "lets_split.h" - -#ifdef AUDIO_ENABLE - float tone_startup[][2] = SONG(STARTUP_SOUND); - float tone_goodbye[][2] = SONG(GOODBYE_SOUND); -#endif - -void matrix_init_kb(void) { - - #ifdef AUDIO_ENABLE - _delay_ms(20); // gets rid of tick - PLAY_NOTE_ARRAY(tone_startup, false, 0); - #endif - - // // green led on - // DDRD |= (1<<5); - // PORTD &= ~(1<<5); - - // // orange led on - // DDRB |= (1<<0); - // PORTB &= ~(1<<0); - - matrix_init_user(); -}; - -void shutdown_user(void) { - #ifdef AUDIO_ENABLE - PLAY_NOTE_ARRAY(tone_goodbye, false, 0); - _delay_ms(150); - stop_all_notes(); - #endif -} From a4bdd6d0845667422c9e42818cfc848bcd0807ee Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 22 Mar 2017 14:59:54 -0400 Subject: [PATCH 121/181] Delete rev2fliphalf.h --- .../lets_split/rev2fliphalf/rev2fliphalf.h | 28 ------------------- 1 file changed, 28 deletions(-) delete mode 100644 keyboards/lets_split/rev2fliphalf/rev2fliphalf.h diff --git a/keyboards/lets_split/rev2fliphalf/rev2fliphalf.h b/keyboards/lets_split/rev2fliphalf/rev2fliphalf.h deleted file mode 100644 index 7dc8e5ba8f..0000000000 --- a/keyboards/lets_split/rev2fliphalf/rev2fliphalf.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef REV2FLIPHALF_H -#define REV2FLIPHALF_H - -#include "../lets_split.h" - -//void promicro_bootloader_jmp(bool program); -#include "quantum.h" - -//void promicro_bootloader_jmp(bool program); - -#define KEYMAP( \ - k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \ - k10, k11, k12, k13, k14, k15, k50, k51, k52, k53, k54, k55, \ - k20, k21, k22, k23, k24, k25, k60, k61, k62, k63, k64, k65, \ - k30, k31, k32, k33, k34, k35, k70, k71, k72, k73, k74, k75 \ - ) \ - { \ - { k00, k01, k02, k03, k04, k05 }, \ - { k10, k11, k12, k13, k14, k15 }, \ - { k20, k21, k22, k23, k24, k25 }, \ - { k30, k31, k32, k33, k34, k35 }, \ - { k40, k41, k42, k43, k44, k45 }, \ - { k50, k51, k52, k53, k54, k55 }, \ - { k60, k61, k62, k63, k64, k65 }, \ - { k70, k71, k72, k73, k74, k75 } \ - } - -#endif \ No newline at end of file From 3a7083d810441253404ac22dda259172b6f9b6de Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 22 Mar 2017 15:00:00 -0400 Subject: [PATCH 122/181] Delete rules.mk --- keyboards/lets_split/rev2fliphalf/rules.mk | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 keyboards/lets_split/rev2fliphalf/rules.mk diff --git a/keyboards/lets_split/rev2fliphalf/rules.mk b/keyboards/lets_split/rev2fliphalf/rules.mk deleted file mode 100644 index 80a942d06f..0000000000 --- a/keyboards/lets_split/rev2fliphalf/rules.mk +++ /dev/null @@ -1,5 +0,0 @@ -BACKLIGHT_ENABLE = no - -ifndef QUANTUM_DIR - include ../../../Makefile -endif From 423c68c210d73f6bb05c3e9f4a994833b12a524e Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 22 Mar 2017 15:02:49 -0400 Subject: [PATCH 123/181] Merged Fliphalf, now defined in config, added OLED Can now use the following in the keymap config.h to call the flipped matrix ``` #define FLIPHALF ``` --- keyboards/lets_split/rev2/rev2.c | 8 +++++ keyboards/lets_split/rev2/rev2.h | 59 +++++++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 8 deletions(-) diff --git a/keyboards/lets_split/rev2/rev2.c b/keyboards/lets_split/rev2/rev2.c index c505d3a6e3..8bfa171d01 100644 --- a/keyboards/lets_split/rev2/rev2.c +++ b/keyboards/lets_split/rev2/rev2.c @@ -5,6 +5,13 @@ float tone_goodbye[][2] = SONG(GOODBYE_SOUND); #endif +#ifdef SSD1306OLED +void led_set_kb(uint8_t usb_led) { + // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here + led_set_user(usb_led); +} +#endif + void matrix_init_kb(void) { #ifdef AUDIO_ENABLE @@ -30,3 +37,4 @@ void shutdown_user(void) { stop_all_notes(); #endif } + diff --git a/keyboards/lets_split/rev2/rev2.h b/keyboards/lets_split/rev2/rev2.h index 990976de2b..054731366e 100644 --- a/keyboards/lets_split/rev2/rev2.h +++ b/keyboards/lets_split/rev2/rev2.h @@ -6,23 +6,66 @@ //void promicro_bootloader_jmp(bool program); #include "quantum.h" + +#ifdef USE_I2C +#include +#ifdef __AVR__ +#include +#include +#endif +#ifdef SSD1306OLED +extern bool iota_gfx_init(void); +extern void iota_gfx_task(void); +extern bool iota_gfx_off(void); +extern bool iota_gfx_on(void); +extern void iota_gfx_flush(void); +extern void iota_gfx_write_char(uint8_t c); +extern void iota_gfx_write(const char *data); +extern void iota_gfx_write_P(const char *data); +extern void iota_gfx_clear_screen(void); +#endif +#endif + //void promicro_bootloader_jmp(bool program); +#ifndef FLIP_HALF +//Standard Keymap #define KEYMAP( \ - k00, k01, k02, k03, k04, k05, k45, k44, k43, k42, k41, k40, \ - k10, k11, k12, k13, k14, k15, k55, k54, k53, k52, k51, k50, \ - k20, k21, k22, k23, k24, k25, k65, k64, k63, k62, k61, k60, \ - k30, k31, k32, k33, k34, k35, k75, k74, k73, k72, k71, k70 \ + k40, k41, k42, k43, k44, k45, k05, k04, k03, k02, k01, k00, \ + k50, k51, k52, k53, k54, k55, k15, k14, k13, k12, k11, k10, \ + k60, k61, k62, k63, k64, k65, k25, k24, k23, k22, k21, k20, \ + k70, k71, k72, k73, k74, k75, k35, k34, k33, k32, k31, k30 \ + ) \ + { \ + { k45, k44, k43, k42, k41, k40 }, \ + { k55, k54, k53, k52, k51, k50 }, \ + { k65, k64, k63, k62, k61, k60 }, \ + { k75, k74, k73, k72, k71, k70 }, \ + { k00, k01, k02, k03, k04, k05 }, \ + { k10, k11, k12, k13, k14, k15 }, \ + { k20, k21, k22, k23, k24, k25 }, \ + { k30, k31, k32, k33, k34, k35 } \ + } + +#else +// Keymap with one side flipped +#define KEYMAP( \ + k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \ + k10, k11, k12, k13, k14, k15, k50, k51, k52, k53, k54, k55, \ + k20, k21, k22, k23, k24, k25, k60, k61, k62, k63, k64, k65, \ + k30, k31, k32, k33, k34, k35, k70, k71, k72, k73, k74, k75 \ ) \ { \ { k00, k01, k02, k03, k04, k05 }, \ { k10, k11, k12, k13, k14, k15 }, \ { k20, k21, k22, k23, k24, k25 }, \ { k30, k31, k32, k33, k34, k35 }, \ - { k40, k41, k42, k43, k44, k45 }, \ - { k50, k51, k52, k53, k54, k55 }, \ - { k60, k61, k62, k63, k64, k65 }, \ - { k70, k71, k72, k73, k74, k75 } \ + { k45, k44, k43, k42, k41, k40 }, \ + { k55, k54, k53, k52, k51, k50 }, \ + { k65, k64, k63, k62, k61, k60 }, \ + { k75, k74, k73, k72, k71, k70 } \ } +#endif + #endif \ No newline at end of file From 65317a3a020c0b0261849fb4c40d3aae175ac337 Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 22 Mar 2017 15:04:11 -0400 Subject: [PATCH 124/181] Added OLED SSD1306 support to I2C --- keyboards/lets_split/common/glcdfont.c | 276 ++++++++++++++ keyboards/lets_split/i2c.c | 94 ++++- keyboards/lets_split/i2c.h | 20 +- keyboards/lets_split/matrix.c | 7 +- keyboards/lets_split/rules.mk | 15 +- keyboards/lets_split/split_util.c | 7 +- keyboards/lets_split/split_util.h | 2 + keyboards/lets_split/ssd1306.c | 508 +++++++++++++++++++++++++ 8 files changed, 908 insertions(+), 21 deletions(-) create mode 100644 keyboards/lets_split/common/glcdfont.c create mode 100644 keyboards/lets_split/ssd1306.c diff --git a/keyboards/lets_split/common/glcdfont.c b/keyboards/lets_split/common/glcdfont.c new file mode 100644 index 0000000000..6f88bd23a7 --- /dev/null +++ b/keyboards/lets_split/common/glcdfont.c @@ -0,0 +1,276 @@ +// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0. +// See gfxfont.h for newer custom bitmap font info. + +#ifndef FONT5X7_H +#define FONT5X7_H + +#ifdef __AVR__ + #include + #include +#elif defined(ESP8266) + #include +#else + #define PROGMEM +#endif + +// Standard ASCII 5x7 font + +static const unsigned char font[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, + 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, + 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, + 0x18, 0x3C, 0x7E, 0x3C, 0x18, + 0x1C, 0x57, 0x7D, 0x57, 0x1C, + 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, + 0x00, 0x18, 0x3C, 0x18, 0x00, + 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, + 0x00, 0x18, 0x24, 0x18, 0x00, + 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, + 0x30, 0x48, 0x3A, 0x06, 0x0E, + 0x26, 0x29, 0x79, 0x29, 0x26, + 0x40, 0x7F, 0x05, 0x05, 0x07, + 0x40, 0x7F, 0x05, 0x25, 0x3F, + 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, + 0x7F, 0x3E, 0x1C, 0x1C, 0x08, + 0x08, 0x1C, 0x1C, 0x3E, 0x7F, + 0x14, 0x22, 0x7F, 0x22, 0x14, + 0x5F, 0x5F, 0x00, 0x5F, 0x5F, + 0x06, 0x09, 0x7F, 0x01, 0x7F, + 0x00, 0x66, 0x89, 0x95, 0x6A, + 0x60, 0x60, 0x60, 0x60, 0x60, + 0x94, 0xA2, 0xFF, 0xA2, 0x94, + 0x08, 0x04, 0x7E, 0x04, 0x08, + 0x10, 0x20, 0x7E, 0x20, 0x10, + 0x08, 0x08, 0x2A, 0x1C, 0x08, + 0x08, 0x1C, 0x2A, 0x08, 0x08, + 0x1E, 0x10, 0x10, 0x10, 0x10, + 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, + 0x30, 0x38, 0x3E, 0x38, 0x30, + 0x06, 0x0E, 0x3E, 0x0E, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5F, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x07, 0x00, + 0x14, 0x7F, 0x14, 0x7F, 0x14, + 0x24, 0x2A, 0x7F, 0x2A, 0x12, + 0x23, 0x13, 0x08, 0x64, 0x62, + 0x36, 0x49, 0x56, 0x20, 0x50, + 0x00, 0x08, 0x07, 0x03, 0x00, + 0x00, 0x1C, 0x22, 0x41, 0x00, + 0x00, 0x41, 0x22, 0x1C, 0x00, + 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, + 0x08, 0x08, 0x3E, 0x08, 0x08, + 0x00, 0x80, 0x70, 0x30, 0x00, + 0x08, 0x08, 0x08, 0x08, 0x08, + 0x00, 0x00, 0x60, 0x60, 0x00, + 0x20, 0x10, 0x08, 0x04, 0x02, + 0x3E, 0x51, 0x49, 0x45, 0x3E, + 0x00, 0x42, 0x7F, 0x40, 0x00, + 0x72, 0x49, 0x49, 0x49, 0x46, + 0x21, 0x41, 0x49, 0x4D, 0x33, + 0x18, 0x14, 0x12, 0x7F, 0x10, + 0x27, 0x45, 0x45, 0x45, 0x39, + 0x3C, 0x4A, 0x49, 0x49, 0x31, + 0x41, 0x21, 0x11, 0x09, 0x07, + 0x36, 0x49, 0x49, 0x49, 0x36, + 0x46, 0x49, 0x49, 0x29, 0x1E, + 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x40, 0x34, 0x00, 0x00, + 0x00, 0x08, 0x14, 0x22, 0x41, + 0x14, 0x14, 0x14, 0x14, 0x14, + 0x00, 0x41, 0x22, 0x14, 0x08, + 0x02, 0x01, 0x59, 0x09, 0x06, + 0x3E, 0x41, 0x5D, 0x59, 0x4E, + 0x7C, 0x12, 0x11, 0x12, 0x7C, + 0x7F, 0x49, 0x49, 0x49, 0x36, + 0x3E, 0x41, 0x41, 0x41, 0x22, + 0x7F, 0x41, 0x41, 0x41, 0x3E, + 0x7F, 0x49, 0x49, 0x49, 0x41, + 0x7F, 0x09, 0x09, 0x09, 0x01, + 0x3E, 0x41, 0x41, 0x51, 0x73, + 0x7F, 0x08, 0x08, 0x08, 0x7F, + 0x00, 0x41, 0x7F, 0x41, 0x00, + 0x20, 0x40, 0x41, 0x3F, 0x01, + 0x7F, 0x08, 0x14, 0x22, 0x41, + 0x7F, 0x40, 0x40, 0x40, 0x40, + 0x7F, 0x02, 0x1C, 0x02, 0x7F, + 0x7F, 0x04, 0x08, 0x10, 0x7F, + 0x3E, 0x41, 0x41, 0x41, 0x3E, + 0x7F, 0x09, 0x09, 0x09, 0x06, + 0x3E, 0x41, 0x51, 0x21, 0x5E, + 0x7F, 0x09, 0x19, 0x29, 0x46, + 0x26, 0x49, 0x49, 0x49, 0x32, + 0x03, 0x01, 0x7F, 0x01, 0x03, + 0x3F, 0x40, 0x40, 0x40, 0x3F, + 0x1F, 0x20, 0x40, 0x20, 0x1F, + 0x3F, 0x40, 0x38, 0x40, 0x3F, + 0x63, 0x14, 0x08, 0x14, 0x63, + 0x03, 0x04, 0x78, 0x04, 0x03, + 0x61, 0x59, 0x49, 0x4D, 0x43, + 0x00, 0x7F, 0x41, 0x41, 0x41, + 0x02, 0x04, 0x08, 0x10, 0x20, + 0x00, 0x41, 0x41, 0x41, 0x7F, + 0x04, 0x02, 0x01, 0x02, 0x04, + 0x40, 0x40, 0x40, 0x40, 0x40, + 0x00, 0x03, 0x07, 0x08, 0x00, + 0x20, 0x54, 0x54, 0x78, 0x40, + 0x7F, 0x28, 0x44, 0x44, 0x38, + 0x38, 0x44, 0x44, 0x44, 0x28, + 0x38, 0x44, 0x44, 0x28, 0x7F, + 0x38, 0x54, 0x54, 0x54, 0x18, + 0x00, 0x08, 0x7E, 0x09, 0x02, + 0x18, 0xA4, 0xA4, 0x9C, 0x78, + 0x7F, 0x08, 0x04, 0x04, 0x78, + 0x00, 0x44, 0x7D, 0x40, 0x00, + 0x20, 0x40, 0x40, 0x3D, 0x00, + 0x7F, 0x10, 0x28, 0x44, 0x00, + 0x00, 0x41, 0x7F, 0x40, 0x00, + 0x7C, 0x04, 0x78, 0x04, 0x78, + 0x7C, 0x08, 0x04, 0x04, 0x78, + 0x38, 0x44, 0x44, 0x44, 0x38, + 0xFC, 0x18, 0x24, 0x24, 0x18, + 0x18, 0x24, 0x24, 0x18, 0xFC, + 0x7C, 0x08, 0x04, 0x04, 0x08, + 0x48, 0x54, 0x54, 0x54, 0x24, + 0x04, 0x04, 0x3F, 0x44, 0x24, + 0x3C, 0x40, 0x40, 0x20, 0x7C, + 0x1C, 0x20, 0x40, 0x20, 0x1C, + 0x3C, 0x40, 0x30, 0x40, 0x3C, + 0x44, 0x28, 0x10, 0x28, 0x44, + 0x4C, 0x90, 0x90, 0x90, 0x7C, + 0x44, 0x64, 0x54, 0x4C, 0x44, + 0x00, 0x08, 0x36, 0x41, 0x00, + 0x00, 0x00, 0x77, 0x00, 0x00, + 0x00, 0x41, 0x36, 0x08, 0x00, + 0x02, 0x01, 0x02, 0x04, 0x02, + 0x3C, 0x26, 0x23, 0x26, 0x3C, + 0x1E, 0xA1, 0xA1, 0x61, 0x12, + 0x3A, 0x40, 0x40, 0x20, 0x7A, + 0x38, 0x54, 0x54, 0x55, 0x59, + 0x21, 0x55, 0x55, 0x79, 0x41, + 0x22, 0x54, 0x54, 0x78, 0x42, // a-umlaut + 0x21, 0x55, 0x54, 0x78, 0x40, + 0x20, 0x54, 0x55, 0x79, 0x40, + 0x0C, 0x1E, 0x52, 0x72, 0x12, + 0x39, 0x55, 0x55, 0x55, 0x59, + 0x39, 0x54, 0x54, 0x54, 0x59, + 0x39, 0x55, 0x54, 0x54, 0x58, + 0x00, 0x00, 0x45, 0x7C, 0x41, + 0x00, 0x02, 0x45, 0x7D, 0x42, + 0x00, 0x01, 0x45, 0x7C, 0x40, + 0x7D, 0x12, 0x11, 0x12, 0x7D, // A-umlaut + 0xF0, 0x28, 0x25, 0x28, 0xF0, + 0x7C, 0x54, 0x55, 0x45, 0x00, + 0x20, 0x54, 0x54, 0x7C, 0x54, + 0x7C, 0x0A, 0x09, 0x7F, 0x49, + 0x32, 0x49, 0x49, 0x49, 0x32, + 0x3A, 0x44, 0x44, 0x44, 0x3A, // o-umlaut + 0x32, 0x4A, 0x48, 0x48, 0x30, + 0x3A, 0x41, 0x41, 0x21, 0x7A, + 0x3A, 0x42, 0x40, 0x20, 0x78, + 0x00, 0x9D, 0xA0, 0xA0, 0x7D, + 0x3D, 0x42, 0x42, 0x42, 0x3D, // O-umlaut + 0x3D, 0x40, 0x40, 0x40, 0x3D, + 0x3C, 0x24, 0xFF, 0x24, 0x24, + 0x48, 0x7E, 0x49, 0x43, 0x66, + 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, + 0xFF, 0x09, 0x29, 0xF6, 0x20, + 0xC0, 0x88, 0x7E, 0x09, 0x03, + 0x20, 0x54, 0x54, 0x79, 0x41, + 0x00, 0x00, 0x44, 0x7D, 0x41, + 0x30, 0x48, 0x48, 0x4A, 0x32, + 0x38, 0x40, 0x40, 0x22, 0x7A, + 0x00, 0x7A, 0x0A, 0x0A, 0x72, + 0x7D, 0x0D, 0x19, 0x31, 0x7D, + 0x26, 0x29, 0x29, 0x2F, 0x28, + 0x26, 0x29, 0x29, 0x29, 0x26, + 0x30, 0x48, 0x4D, 0x40, 0x20, + 0x38, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x38, + 0x2F, 0x10, 0xC8, 0xAC, 0xBA, + 0x2F, 0x10, 0x28, 0x34, 0xFA, + 0x00, 0x00, 0x7B, 0x00, 0x00, + 0x08, 0x14, 0x2A, 0x14, 0x22, + 0x22, 0x14, 0x2A, 0x14, 0x08, + 0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code + 0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block + 0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block + 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x10, 0x10, 0x10, 0xFF, 0x00, + 0x14, 0x14, 0x14, 0xFF, 0x00, + 0x10, 0x10, 0xFF, 0x00, 0xFF, + 0x10, 0x10, 0xF0, 0x10, 0xF0, + 0x14, 0x14, 0x14, 0xFC, 0x00, + 0x14, 0x14, 0xF7, 0x00, 0xFF, + 0x00, 0x00, 0xFF, 0x00, 0xFF, + 0x14, 0x14, 0xF4, 0x04, 0xFC, + 0x14, 0x14, 0x17, 0x10, 0x1F, + 0x10, 0x10, 0x1F, 0x10, 0x1F, + 0x14, 0x14, 0x14, 0x1F, 0x00, + 0x10, 0x10, 0x10, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x1F, 0x10, + 0x10, 0x10, 0x10, 0x1F, 0x10, + 0x10, 0x10, 0x10, 0xF0, 0x10, + 0x00, 0x00, 0x00, 0xFF, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0xFF, 0x10, + 0x00, 0x00, 0x00, 0xFF, 0x14, + 0x00, 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0x00, 0x1F, 0x10, 0x17, + 0x00, 0x00, 0xFC, 0x04, 0xF4, + 0x14, 0x14, 0x17, 0x10, 0x17, + 0x14, 0x14, 0xF4, 0x04, 0xF4, + 0x00, 0x00, 0xFF, 0x00, 0xF7, + 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0xF7, 0x00, 0xF7, + 0x14, 0x14, 0x14, 0x17, 0x14, + 0x10, 0x10, 0x1F, 0x10, 0x1F, + 0x14, 0x14, 0x14, 0xF4, 0x14, + 0x10, 0x10, 0xF0, 0x10, 0xF0, + 0x00, 0x00, 0x1F, 0x10, 0x1F, + 0x00, 0x00, 0x00, 0x1F, 0x14, + 0x00, 0x00, 0x00, 0xFC, 0x14, + 0x00, 0x00, 0xF0, 0x10, 0xF0, + 0x10, 0x10, 0xFF, 0x10, 0xFF, + 0x14, 0x14, 0x14, 0xFF, 0x14, + 0x10, 0x10, 0x10, 0x1F, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0x10, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x38, 0x44, 0x44, 0x38, 0x44, + 0xFC, 0x4A, 0x4A, 0x4A, 0x34, // sharp-s or beta + 0x7E, 0x02, 0x02, 0x06, 0x06, + 0x02, 0x7E, 0x02, 0x7E, 0x02, + 0x63, 0x55, 0x49, 0x41, 0x63, + 0x38, 0x44, 0x44, 0x3C, 0x04, + 0x40, 0x7E, 0x20, 0x1E, 0x20, + 0x06, 0x02, 0x7E, 0x02, 0x02, + 0x99, 0xA5, 0xE7, 0xA5, 0x99, + 0x1C, 0x2A, 0x49, 0x2A, 0x1C, + 0x4C, 0x72, 0x01, 0x72, 0x4C, + 0x30, 0x4A, 0x4D, 0x4D, 0x30, + 0x30, 0x48, 0x78, 0x48, 0x30, + 0xBC, 0x62, 0x5A, 0x46, 0x3D, + 0x3E, 0x49, 0x49, 0x49, 0x00, + 0x7E, 0x01, 0x01, 0x01, 0x7E, + 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, + 0x44, 0x44, 0x5F, 0x44, 0x44, + 0x40, 0x51, 0x4A, 0x44, 0x40, + 0x40, 0x44, 0x4A, 0x51, 0x40, + 0x00, 0x00, 0xFF, 0x01, 0x03, + 0xE0, 0x80, 0xFF, 0x00, 0x00, + 0x08, 0x08, 0x6B, 0x6B, 0x08, + 0x36, 0x12, 0x36, 0x24, 0x36, + 0x06, 0x0F, 0x09, 0x0F, 0x06, + 0x00, 0x00, 0x18, 0x18, 0x00, + 0x00, 0x00, 0x10, 0x10, 0x00, + 0x30, 0x40, 0xFF, 0x01, 0x01, + 0x00, 0x1F, 0x01, 0x01, 0x1E, + 0x00, 0x19, 0x1D, 0x17, 0x12, + 0x00, 0x3C, 0x3C, 0x3C, 0x3C, + 0x00, 0x00, 0x00, 0x00, 0x00 // #255 NBSP +}; +#endif // FONT5X7_H diff --git a/keyboards/lets_split/i2c.c b/keyboards/lets_split/i2c.c index 084c890c40..038f37a4be 100644 --- a/keyboards/lets_split/i2c.c +++ b/keyboards/lets_split/i2c.c @@ -48,7 +48,7 @@ void i2c_master_init(void) { // returns: 0 => success // 1 => error uint8_t i2c_master_start(uint8_t address) { - TWCR = (1< ERROR_DISCONNECT_COUNT) { @@ -226,9 +227,7 @@ uint8_t matrix_scan(void) TXLED0; error_count = 0; } - matrix_scan_quantum(); - return ret; } diff --git a/keyboards/lets_split/rules.mk b/keyboards/lets_split/rules.mk index 0efa785505..ff159e0f06 100644 --- a/keyboards/lets_split/rules.mk +++ b/keyboards/lets_split/rules.mk @@ -1,7 +1,8 @@ SRC += matrix.c \ i2c.c \ split_util.c \ - serial.c + serial.c\ + ssd1306.c # MCU name #MCU = at90usb1287 @@ -73,15 +74,3 @@ USE_I2C ?= yes SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend CUSTOM_MATRIX = yes - -avrdude: build - ls /dev/tty* > /tmp/1; \ - echo "Reset your Pro Micro now"; \ - while [[ -z $$USB ]]; do \ - sleep 1; \ - ls /dev/tty* > /tmp/2; \ - USB=`diff /tmp/1 /tmp/2 | grep -o '/dev/tty.*'`; \ - done; \ - avrdude -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex - -.PHONY: avrdude diff --git a/keyboards/lets_split/split_util.c b/keyboards/lets_split/split_util.c index 226dc18816..b87bae38b1 100644 --- a/keyboards/lets_split/split_util.c +++ b/keyboards/lets_split/split_util.c @@ -21,8 +21,8 @@ static void setup_handedness(void) { #ifdef EE_HANDS isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); #else - // I2C_MASTER_RIGHT is deprecated use MASTER_RIGHT instead since this works for both serial and i2c - #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT) + // I2c_MASTER_RIGHT ish deprecate use MASTER_RIGHT instead since this works for both serial and i2c: + #if defined (I2C_MASTER_RIGHT) || defined (MASTER_RIGHT) isLeftHand = !has_usb(); #else isLeftHand = has_usb(); @@ -33,6 +33,9 @@ static void setup_handedness(void) { static void keyboard_master_setup(void) { #ifdef USE_I2C i2c_master_init(); +#ifdef SSD1306OLED + matrix_master_OLED_init (); +#endif #else serial_master_init(); #endif diff --git a/keyboards/lets_split/split_util.h b/keyboards/lets_split/split_util.h index 6b896679ca..3ae76c209a 100644 --- a/keyboards/lets_split/split_util.h +++ b/keyboards/lets_split/split_util.h @@ -19,4 +19,6 @@ void split_keyboard_setup(void); bool has_usb(void); void keyboard_slave_loop(void); +void matrix_master_OLED_init (void); + #endif diff --git a/keyboards/lets_split/ssd1306.c b/keyboards/lets_split/ssd1306.c new file mode 100644 index 0000000000..c25a355bf1 --- /dev/null +++ b/keyboards/lets_split/ssd1306.c @@ -0,0 +1,508 @@ +#include "config.h" +#include "i2c.h" +#include +#include +#include +#include "print.h" +#include "lets_split.h" +#include "common/glcdfont.c" +#ifdef ADAFRUIT_BLE_ENABLE +#include "adafruit_ble.h" +#endif +#ifdef PROTOCOL_LUFA +#include "lufa.h" +#endif +#include "sendchar.h" +#include "pincontrol.h" + +//assign the right code to your layers +#define _BASE 0 +#define _LOWER 8 +#define _RAISE 16 +#define _FNLAYER 64 +#define _NUMLAY 128 +#define _NLOWER 136 +#define _NFNLAYER 192 +#define _MOUSECURSOR 256 +#define _ADJUST 65560 + +// Set this to 1 to help diagnose early startup problems +// when testing power-on with ble. Turn it off otherwise, +// as the latency of printing most of the debug info messes +// with the matrix scan, causing keys to drop. +#define DEBUG_TO_SCREEN 0 + +// Controls the SSD1306 128x32 OLED display via i2c + +#define i2cAddress 0x3C + +#define DisplayHeight 32 +#define DisplayWidth 128 + +#define FontHeight 8 +#define FontWidth 6 + +#define MatrixRows (DisplayHeight / FontHeight) +#define MatrixCols (DisplayWidth / FontWidth) + +struct CharacterMatrix { + uint8_t display[MatrixRows][MatrixCols]; + uint8_t *cursor; + bool dirty; +}; + +static struct CharacterMatrix display; +//static uint16_t last_battery_update; +//static uint32_t vbat; +//#define BatteryUpdateInterval 10000 /* milliseconds */ +#define ScreenOffInterval 300000 /* milliseconds */ +#if DEBUG_TO_SCREEN +static uint8_t displaying; +#endif +static uint16_t last_flush; + +enum ssd1306_cmds { + DisplayOff = 0xAE, + DisplayOn = 0xAF, + + SetContrast = 0x81, + DisplayAllOnResume = 0xA4, + + DisplayAllOn = 0xA5, + NormalDisplay = 0xA6, + InvertDisplay = 0xA7, + SetDisplayOffset = 0xD3, + SetComPins = 0xda, + SetVComDetect = 0xdb, + SetDisplayClockDiv = 0xD5, + SetPreCharge = 0xd9, + SetMultiPlex = 0xa8, + SetLowColumn = 0x00, + SetHighColumn = 0x10, + SetStartLine = 0x40, + + SetMemoryMode = 0x20, + ColumnAddr = 0x21, + PageAddr = 0x22, + + ComScanInc = 0xc0, + ComScanDec = 0xc8, + SegRemap = 0xa0, + SetChargePump = 0x8d, + ExternalVcc = 0x01, + SwitchCapVcc = 0x02, + + ActivateScroll = 0x2f, + DeActivateScroll = 0x2e, + SetVerticalScrollArea = 0xa3, + RightHorizontalScroll = 0x26, + LeftHorizontalScroll = 0x27, + VerticalAndRightHorizontalScroll = 0x29, + VerticalAndLeftHorizontalScroll = 0x2a, +}; + + +// Write command sequence. +// Returns true on success. +static inline bool _send_cmd1(uint8_t cmd) { + bool res = false; + + if (i2c_start_write(i2cAddress)) { + xprintf("failed to start write to %d\n", i2cAddress); + goto done; + } + + if (i2c_master_write(0x0 /* command byte follows */)) { + print("failed to write control byte\n"); + + goto done; + } + + if (i2c_master_write(cmd)) { + xprintf("failed to write command %d\n", cmd); + goto done; + } + res = true; +done: + i2c_master_stop(); + return res; +} + +// Write 2-byte command sequence. +// Returns true on success +static inline bool _send_cmd2(uint8_t cmd, uint8_t opr) { + if (!_send_cmd1(cmd)) { + return false; + } + return _send_cmd1(opr); +} + +// Write 3-byte command sequence. +// Returns true on success +static inline bool _send_cmd3(uint8_t cmd, uint8_t opr1, uint8_t opr2) { + if (!_send_cmd1(cmd)) { + return false; + } + if (!_send_cmd1(opr1)) { + return false; + } + return _send_cmd1(opr2); +} + +#define send_cmd1(c) if (!_send_cmd1(c)) {goto done;} +#define send_cmd2(c,o) if (!_send_cmd2(c,o)) {goto done;} +#define send_cmd3(c,o1,o2) if (!_send_cmd3(c,o1,o2)) {goto done;} + +static void matrix_clear(struct CharacterMatrix *matrix); + +static void clear_display(void) { + matrix_clear(&display); + + // Clear all of the display bits (there can be random noise + // in the RAM on startup) + send_cmd3(PageAddr, 0, (DisplayHeight / 8) - 1); + send_cmd3(ColumnAddr, 0, DisplayWidth - 1); + + if (i2c_start_write(i2cAddress)) { + goto done; + } + if (i2c_master_write(0x40)) { + // Data mode + goto done; + } + for (uint8_t row = 0; row < MatrixRows; ++row) { + for (uint8_t col = 0; col < DisplayWidth; ++col) { + i2c_master_write(0); + } + } + + display.dirty = false; + +done: + i2c_master_stop(); +} + +#if DEBUG_TO_SCREEN +#undef sendchar +static int8_t capture_sendchar(uint8_t c) { + sendchar(c); + iota_gfx_write_char(c); + + if (!displaying) { + iota_gfx_flush(); + } + return 0; +} +#endif + +bool iota_gfx_init(void) { + bool success = false; + + send_cmd1(DisplayOff); + send_cmd2(SetDisplayClockDiv, 0x80); + send_cmd2(SetMultiPlex, DisplayHeight - 1); + + send_cmd2(SetDisplayOffset, 0); + + + send_cmd1(SetStartLine | 0x0); + send_cmd2(SetChargePump, 0x14 /* Enable */); + send_cmd2(SetMemoryMode, 0 /* horizontal addressing */); + +/* Flips the display orientation 0 degrees + send_cmd1(SegRemap | 0x1); + send_cmd1(ComScanDec); +*/ +// the following Flip the display orientation 180 degrees */ + send_cmd1(SegRemap); + send_cmd1(ComScanInc); +//end flip + send_cmd2(SetComPins, 0x2); + send_cmd2(SetContrast, 0x8f); + send_cmd2(SetPreCharge, 0xf1); + send_cmd2(SetVComDetect, 0x40); + send_cmd1(DisplayAllOnResume); + send_cmd1(NormalDisplay); + send_cmd1(DeActivateScroll); + send_cmd1(DisplayOn); + + send_cmd2(SetContrast, 0); // Dim + + clear_display(); + + success = true; + + iota_gfx_flush(); + +#if DEBUG_TO_SCREEN + print_set_sendchar(capture_sendchar); +#endif + +done: + return success; +} + +bool iota_gfx_off(void) { + bool success = false; + + send_cmd1(DisplayOff); + success = true; + +done: + return success; +} + +bool iota_gfx_on(void) { + bool success = false; + + send_cmd1(DisplayOn); + success = true; + +done: + return success; +} + +static void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) { + *matrix->cursor = c; + ++matrix->cursor; + + if (matrix->cursor - &matrix->display[0][0] == sizeof(matrix->display)) { + // We went off the end; scroll the display upwards by one line + memmove(&matrix->display[0], &matrix->display[1], + MatrixCols * (MatrixRows - 1)); + matrix->cursor = &matrix->display[MatrixRows - 1][0]; + memset(matrix->cursor, ' ', MatrixCols); + } +} + +static void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c) { + matrix->dirty = true; + + if (c == '\n') { + // Clear to end of line from the cursor and then move to the + // start of the next line + uint8_t cursor_col = (matrix->cursor - &matrix->display[0][0]) % MatrixCols; + + while (cursor_col++ < MatrixCols) { + matrix_write_char_inner(matrix, ' '); + } + return; + } + + matrix_write_char_inner(matrix, c); +} + +void iota_gfx_write_char(uint8_t c) { + matrix_write_char(&display, c); +} + +static void matrix_write(struct CharacterMatrix *matrix, const char *data) { + const char *end = data + strlen(data); + while (data < end) { + matrix_write_char(matrix, *data); + ++data; + } +} + +void iota_gfx_write(const char *data) { + matrix_write(&display, data); +} + +static void matrix_write_P(struct CharacterMatrix *matrix, const char *data) { + while (true) { + uint8_t c = pgm_read_byte(data); + if (c == 0) { + return; + } + matrix_write_char(matrix, c); + ++data; + } +} + +void iota_gfx_write_P(const char *data) { + matrix_write_P(&display, data); +} + +static void matrix_clear(struct CharacterMatrix *matrix) { + memset(matrix->display, ' ', sizeof(matrix->display)); + matrix->cursor = &matrix->display[0][0]; + matrix->dirty = true; +} + +void iota_gfx_clear_screen(void) { + matrix_clear(&display); +} + +static void matrix_render(struct CharacterMatrix *matrix) { + last_flush = timer_read(); + iota_gfx_on(); +#if DEBUG_TO_SCREEN + ++displaying; +#endif + + // Move to the home position + send_cmd3(PageAddr, 0, MatrixRows - 1); + send_cmd3(ColumnAddr, 0, (MatrixCols * FontWidth) - 1); + + if (i2c_start_write(i2cAddress)) { + goto done; + } + if (i2c_master_write(0x40)) { + // Data mode + goto done; + } + + for (uint8_t row = 0; row < MatrixRows; ++row) { + for (uint8_t col = 0; col < MatrixCols; ++col) { + const uint8_t *glyph = font + (matrix->display[row][col] * (FontWidth - 1)); + + for (uint8_t glyphCol = 0; glyphCol < FontWidth - 1; ++glyphCol) { + uint8_t colBits = pgm_read_byte(glyph + glyphCol); + i2c_master_write(colBits); + } + + // 1 column of space between chars (it's not included in the glyph) + i2c_master_write(0); + } + } + + matrix->dirty = false; + +done: + i2c_master_stop(); +#if DEBUG_TO_SCREEN + --displaying; +#endif +} + +void iota_gfx_flush(void) { + matrix_render(&display); +} + +//#include "LUFA/Drivers/Peripheral/ADC.h" + +/* Returns the battery voltage; returns the number of millivolts +static uint32_t read_battery_voltage(void) { + if (last_battery_update == 0 || + timer_elapsed(last_battery_update) > BatteryUpdateInterval) { + ADC_Init(ADC_SINGLE_CONVERSION | ADC_PRESCALE_32); + ADC_SetupChannel(12); + vbat = 2 * 3.3 * ADC_GetChannelReading(ADC_REFERENCE_AVCC | ADC_CHANNEL12); + + last_battery_update = timer_read(); + } + return vbat; +} */ + +static void matrix_update(struct CharacterMatrix *dest, + const struct CharacterMatrix *source) { + if (memcmp(dest->display, source->display, sizeof(dest->display))) { + memcpy(dest->display, source->display, sizeof(dest->display)); + dest->dirty = true; + } +} + +static void render_status_info(void) { +#if DEBUG_TO_SCREEN + if (debug_enable) { + return; + } +#endif + + struct CharacterMatrix matrix; + + matrix_clear(&matrix); + matrix_write_P(&matrix, PSTR("USB: ")); +#ifdef PROTOCOL_LUFA + switch (USB_DeviceState) { + case DEVICE_STATE_Unattached: + matrix_write_P(&matrix, PSTR("Unattached")); + break; + case DEVICE_STATE_Suspended: + matrix_write_P(&matrix, PSTR("Suspended")); + break; + case DEVICE_STATE_Configured: + matrix_write_P(&matrix, PSTR("Connected")); + break; + case DEVICE_STATE_Powered: + matrix_write_P(&matrix, PSTR("Powered")); + break; + case DEVICE_STATE_Default: + matrix_write_P(&matrix, PSTR("Default")); + break; + case DEVICE_STATE_Addressed: + matrix_write_P(&matrix, PSTR("Addressed")); + break; + default: + matrix_write_P(&matrix, PSTR("Invalid")); + } +#endif + + // matrix_write_P(&matrix, (host_keyboard_leds() & (1< ScreenOffInterval) { + iota_gfx_off(); + } +} From 30f450749201b9584bc863cb08724d8f61f0463a Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 22 Mar 2017 15:11:03 -0400 Subject: [PATCH 125/181] OLED code cleanup --- keyboards/lets_split/ssd1306.c | 52 ++++------------------------------ 1 file changed, 6 insertions(+), 46 deletions(-) diff --git a/keyboards/lets_split/ssd1306.c b/keyboards/lets_split/ssd1306.c index c25a355bf1..a68165f837 100644 --- a/keyboards/lets_split/ssd1306.c +++ b/keyboards/lets_split/ssd1306.c @@ -209,14 +209,14 @@ bool iota_gfx_init(void) { send_cmd2(SetChargePump, 0x14 /* Enable */); send_cmd2(SetMemoryMode, 0 /* horizontal addressing */); -/* Flips the display orientation 0 degrees +/// Flips the display orientation 0 degrees send_cmd1(SegRemap | 0x1); send_cmd1(ComScanDec); -*/ -// the following Flip the display orientation 180 degrees */ +/* +// the following Flip the display orientation 180 degrees send_cmd1(SegRemap); send_cmd1(ComScanInc); -//end flip +*/end flip send_cmd2(SetComPins, 0x2); send_cmd2(SetContrast, 0x8f); send_cmd2(SetPreCharge, 0xf1); @@ -379,21 +379,6 @@ void iota_gfx_flush(void) { matrix_render(&display); } -//#include "LUFA/Drivers/Peripheral/ADC.h" - -/* Returns the battery voltage; returns the number of millivolts -static uint32_t read_battery_voltage(void) { - if (last_battery_update == 0 || - timer_elapsed(last_battery_update) > BatteryUpdateInterval) { - ADC_Init(ADC_SINGLE_CONVERSION | ADC_PRESCALE_32); - ADC_SetupChannel(12); - vbat = 2 * 3.3 * ADC_GetChannelReading(ADC_REFERENCE_AVCC | ADC_CHANNEL12); - - last_battery_update = timer_read(); - } - return vbat; -} */ - static void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) { if (memcmp(dest->display, source->display, sizeof(dest->display))) { @@ -438,18 +423,7 @@ static void render_status_info(void) { } #endif - // matrix_write_P(&matrix, (host_keyboard_leds() & (1< Date: Wed, 22 Mar 2017 15:14:33 -0400 Subject: [PATCH 126/181] Add files via upload --- .../lets_split/keymaps/OLED_sample/readme.md | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 keyboards/lets_split/keymaps/OLED_sample/readme.md diff --git a/keyboards/lets_split/keymaps/OLED_sample/readme.md b/keyboards/lets_split/keymaps/OLED_sample/readme.md new file mode 100644 index 0000000000..839fd42841 --- /dev/null +++ b/keyboards/lets_split/keymaps/OLED_sample/readme.md @@ -0,0 +1,32 @@ +SSD1306 OLED Display via I2C +====== + +Features +-------- + +Some features supported by the firmware: + + +* I2C connection between the two halves is required as the OLED display will use this connection as well. Note this + requires pull-up resistors on the data and clock lines. +* OLED display will connect from either side + + +Wiring +------ + +The wiring for i2c: + +![i2c wiring](imgs/split-keyboard-i2c-schematic.png) + +The pull-up resistors may be placed on either half. It is also possible +to use 4 resistors and have the pull-ups in both halves, but this is +unnecessary in simple use cases. + +Work in progress... + + +OLED Configuration +------------------------------- + +Work in progress... \ No newline at end of file From d1865db599a92695baa1434803a41204cd5e5ca6 Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 22 Mar 2017 15:19:01 -0400 Subject: [PATCH 127/181] OLED code cleanup --- keyboards/lets_split/ssd1306.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/lets_split/ssd1306.c b/keyboards/lets_split/ssd1306.c index a68165f837..3c7816bb32 100644 --- a/keyboards/lets_split/ssd1306.c +++ b/keyboards/lets_split/ssd1306.c @@ -216,7 +216,7 @@ bool iota_gfx_init(void) { // the following Flip the display orientation 180 degrees send_cmd1(SegRemap); send_cmd1(ComScanInc); -*/end flip +// end flip */ send_cmd2(SetComPins, 0x2); send_cmd2(SetContrast, 0x8f); send_cmd2(SetPreCharge, 0xf1); From 1f7b8a034362f1461d89abee91038df885be4ca2 Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 22 Mar 2017 15:45:15 -0400 Subject: [PATCH 128/181] Update matrix.c --- keyboards/lets_split/matrix.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/keyboards/lets_split/matrix.c b/keyboards/lets_split/matrix.c index b6e59cb7f7..1b65019995 100644 --- a/keyboards/lets_split/matrix.c +++ b/keyboards/lets_split/matrix.c @@ -210,8 +210,7 @@ uint8_t matrix_scan(void) if( serial_transaction() ) { #endif // turn on the indicator led when halves are disconnected -// TXLED1; - TXLED0; + TXLED1; error_count++; From ebb46694e500e08ea1d39349d957182270e835f6 Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 22 Mar 2017 15:45:45 -0400 Subject: [PATCH 129/181] Update split_util.c --- keyboards/lets_split/split_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/lets_split/split_util.c b/keyboards/lets_split/split_util.c index b87bae38b1..46586fbc00 100644 --- a/keyboards/lets_split/split_util.c +++ b/keyboards/lets_split/split_util.c @@ -22,7 +22,7 @@ static void setup_handedness(void) { isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); #else // I2c_MASTER_RIGHT ish deprecate use MASTER_RIGHT instead since this works for both serial and i2c: - #if defined (I2C_MASTER_RIGHT) || defined (MASTER_RIGHT) + #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT) isLeftHand = !has_usb(); #else isLeftHand = has_usb(); From 732a7f2be9b197ed22d20bea3d4dcd8013c8e077 Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 22 Mar 2017 15:47:53 -0400 Subject: [PATCH 130/181] Update matrix.c --- keyboards/lets_split/matrix.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/lets_split/matrix.c b/keyboards/lets_split/matrix.c index 1b65019995..81dfb14455 100644 --- a/keyboards/lets_split/matrix.c +++ b/keyboards/lets_split/matrix.c @@ -211,7 +211,7 @@ uint8_t matrix_scan(void) #endif // turn on the indicator led when halves are disconnected TXLED1; - + error_count++; if (error_count > ERROR_DISCONNECT_COUNT) { From be0cfbb97e5577e331e327b4e729b1b4c4ccb54c Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 22 Mar 2017 15:48:56 -0400 Subject: [PATCH 131/181] Update i2c.c --- keyboards/lets_split/i2c.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/lets_split/i2c.c b/keyboards/lets_split/i2c.c index 038f37a4be..f1a349168b 100644 --- a/keyboards/lets_split/i2c.c +++ b/keyboards/lets_split/i2c.c @@ -48,7 +48,7 @@ void i2c_master_init(void) { // returns: 0 => success // 1 => error uint8_t i2c_master_start(uint8_t address) { - TWCR = (1< Date: Wed, 22 Mar 2017 15:49:21 -0400 Subject: [PATCH 132/181] Update i2c.c --- keyboards/lets_split/i2c.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/lets_split/i2c.c b/keyboards/lets_split/i2c.c index f1a349168b..755038f5e2 100644 --- a/keyboards/lets_split/i2c.c +++ b/keyboards/lets_split/i2c.c @@ -48,7 +48,7 @@ void i2c_master_init(void) { // returns: 0 => success // 1 => error uint8_t i2c_master_start(uint8_t address) { - TWCR = (1< Date: Wed, 22 Mar 2017 15:50:18 -0400 Subject: [PATCH 133/181] Update i2c.c --- keyboards/lets_split/i2c.c | 90 -------------------------------------- 1 file changed, 90 deletions(-) diff --git a/keyboards/lets_split/i2c.c b/keyboards/lets_split/i2c.c index 755038f5e2..fbf2f3b767 100644 --- a/keyboards/lets_split/i2c.c +++ b/keyboards/lets_split/i2c.c @@ -161,94 +161,4 @@ ISR(TWI_vect) { TWCR |= (1< Date: Wed, 22 Mar 2017 15:50:52 -0400 Subject: [PATCH 134/181] Update i2c.c --- keyboards/lets_split/i2c.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/keyboards/lets_split/i2c.c b/keyboards/lets_split/i2c.c index fbf2f3b767..084c890c40 100644 --- a/keyboards/lets_split/i2c.c +++ b/keyboards/lets_split/i2c.c @@ -56,7 +56,6 @@ uint8_t i2c_master_start(uint8_t address) { if ( (TW_STATUS != TW_START) && (TW_STATUS != TW_REP_START)) return 1; - // send device address TWDR = address; TWCR = (1< Date: Wed, 22 Mar 2017 15:56:45 -0400 Subject: [PATCH 135/181] Update readme.md --- keyboards/lets_split/keymaps/OLED_sample/readme.md | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/keyboards/lets_split/keymaps/OLED_sample/readme.md b/keyboards/lets_split/keymaps/OLED_sample/readme.md index 839fd42841..02888855b8 100644 --- a/keyboards/lets_split/keymaps/OLED_sample/readme.md +++ b/keyboards/lets_split/keymaps/OLED_sample/readme.md @@ -15,13 +15,6 @@ Some features supported by the firmware: Wiring ------ -The wiring for i2c: - -![i2c wiring](imgs/split-keyboard-i2c-schematic.png) - -The pull-up resistors may be placed on either half. It is also possible -to use 4 resistors and have the pull-ups in both halves, but this is -unnecessary in simple use cases. Work in progress... @@ -29,4 +22,4 @@ Work in progress... OLED Configuration ------------------------------- -Work in progress... \ No newline at end of file +Work in progress... From 91776772fd5600116e9d02c614813c427a3d4219 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Wed, 15 Mar 2017 16:34:10 -0400 Subject: [PATCH 136/181] Remove line for hands selection via EEPROM, reduce tap duration from 200ms to 150ms --- keyboards/lets_split/keymaps/hexwire/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/lets_split/keymaps/hexwire/config.h b/keyboards/lets_split/keymaps/hexwire/config.h index 983f8e352e..11adbc454c 100644 --- a/keyboards/lets_split/keymaps/hexwire/config.h +++ b/keyboards/lets_split/keymaps/hexwire/config.h @@ -18,7 +18,7 @@ along with this program. If not, see . #define USE_SERIAL -#define EE_HANDS +#define TAPPING_TERM 150 #undef RGBLED_NUM #define RGB_DI_PIN B0 From f3e3ff29a346bf917403672f8dbdf08c9f3a83f6 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Wed, 15 Mar 2017 16:34:57 -0400 Subject: [PATCH 137/181] Add Makefile in keymap dir --- keyboards/lets_split/keymaps/hexwire/Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/keyboards/lets_split/keymaps/hexwire/Makefile b/keyboards/lets_split/keymaps/hexwire/Makefile index 1e3cebb145..1e57612788 100644 --- a/keyboards/lets_split/keymaps/hexwire/Makefile +++ b/keyboards/lets_split/keymaps/hexwire/Makefile @@ -1 +1,5 @@ RGBLIGHT_ENABLE = yes + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif From e5c5902e95840876f1e51c3e8e0a93311676fa27 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Thu, 23 Mar 2017 08:46:10 -0400 Subject: [PATCH 138/181] Move keymap into config file --- .../keymaps/hexwire/compact_keymap.h | 23 ------------- keyboards/lets_split/keymaps/hexwire/config.h | 32 +++++++++++++++++++ keyboards/lets_split/keymaps/hexwire/keymap.c | 2 +- 3 files changed, 33 insertions(+), 24 deletions(-) delete mode 100644 keyboards/lets_split/keymaps/hexwire/compact_keymap.h diff --git a/keyboards/lets_split/keymaps/hexwire/compact_keymap.h b/keyboards/lets_split/keymaps/hexwire/compact_keymap.h deleted file mode 100644 index d9d063fbfe..0000000000 --- a/keyboards/lets_split/keymaps/hexwire/compact_keymap.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef COMPACT_KEYMAP_H -#define COMPACT_KEYMAP_H - -#define COMPACT_KEYMAP( \ - k00, k01, k02, k03, k04, k05, k45, k44, k43, k42, k41, k40, \ - k10, k11, k12, k13, k14, k15, k55, k54, k53, k52, k51, k50, \ - k20, k21, k22, k23, k24, k25, k65, k64, k63, k62, k61, k60, \ - k30, k31, k32, k33, k34, k35, k75, k74, k73, k72, k71, k70 \ - ) \ - { \ - { KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05 }, \ - { KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15 }, \ - { KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25 }, \ - { KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35 }, \ - { KC_##k40, KC_##k41, KC_##k42, KC_##k43, KC_##k44, KC_##k45 }, \ - { KC_##k50, KC_##k51, KC_##k52, KC_##k53, KC_##k54, KC_##k55 }, \ - { KC_##k60, KC_##k61, KC_##k62, KC_##k63, KC_##k64, KC_##k65 }, \ - { KC_##k70, KC_##k71, KC_##k72, KC_##k73, KC_##k74, KC_##k75 } \ - } - -#define KC_ KC_TRNS - -#endif \ No newline at end of file diff --git a/keyboards/lets_split/keymaps/hexwire/config.h b/keyboards/lets_split/keymaps/hexwire/config.h index 11adbc454c..38b57266a4 100644 --- a/keyboards/lets_split/keymaps/hexwire/config.h +++ b/keyboards/lets_split/keymaps/hexwire/config.h @@ -30,9 +30,41 @@ along with this program. If not, see . #ifdef SUBPROJECT_rev1 #include "../../rev1/config.h" + #define COMPACT_KEYMAP( \ + k00, k01, k02, k03, k04, k05, k40, k41, k42, k43, k44, k45, \ + k10, k11, k12, k13, k14, k15, k50, k51, k52, k53, k54, k55, \ + k20, k21, k22, k23, k24, k25, k60, k61, k62, k63, k64, k65, \ + k30, k31, k32, k33, k34, k35, k70, k71, k72, k73, k74, k75 \ + ) \ + { \ + { KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05 }, \ + { KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15 }, \ + { KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25 }, \ + { KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35 }, \ + { KC_##k40, KC_##k41, KC_##k42, KC_##k43, KC_##k44, KC_##k45 }, \ + { KC_##k50, KC_##k51, KC_##k52, KC_##k53, KC_##k54, KC_##k55 }, \ + { KC_##k60, KC_##k61, KC_##k62, KC_##k63, KC_##k64, KC_##k65 }, \ + { KC_##k70, KC_##k71, KC_##k72, KC_##k73, KC_##k74, KC_##k75 } \ + } #endif #ifdef SUBPROJECT_rev2 #include "../../rev2/config.h" + #define COMPACT_KEYMAP( \ + k00, k01, k02, k03, k04, k05, k45, k44, k43, k42, k41, k40, \ + k10, k11, k12, k13, k14, k15, k55, k54, k53, k52, k51, k50, \ + k20, k21, k22, k23, k24, k25, k65, k64, k63, k62, k61, k60, \ + k30, k31, k32, k33, k34, k35, k75, k74, k73, k72, k71, k70 \ + ) \ + { \ + { KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05 }, \ + { KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15 }, \ + { KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25 }, \ + { KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35 }, \ + { KC_##k40, KC_##k41, KC_##k42, KC_##k43, KC_##k44, KC_##k45 }, \ + { KC_##k50, KC_##k51, KC_##k52, KC_##k53, KC_##k54, KC_##k55 }, \ + { KC_##k60, KC_##k61, KC_##k62, KC_##k63, KC_##k64, KC_##k65 }, \ + { KC_##k70, KC_##k71, KC_##k72, KC_##k73, KC_##k74, KC_##k75 } \ + } #endif #ifdef SUBPROJECT_rev2fliphalf #include "../../rev2fliphalf/config.h" diff --git a/keyboards/lets_split/keymaps/hexwire/keymap.c b/keyboards/lets_split/keymaps/hexwire/keymap.c index 796a1fcab0..f8370490d6 100644 --- a/keyboards/lets_split/keymaps/hexwire/keymap.c +++ b/keyboards/lets_split/keymaps/hexwire/keymap.c @@ -1,7 +1,6 @@ #include "lets_split.h" #include "action_layer.h" #include "eeconfig.h" -#include "compact_keymap.h" extern keymap_config_t keymap_config; @@ -25,6 +24,7 @@ enum custom_keycodes { ADJUST, }; +#define KC_ KC_TRNS #define _______ KC_TRNS #define KC_CAPW LGUI(LSFT(KC_3)) // Capture whole screen From edfb50ea5616c9361e479ec41d1d2c3d72f2f51c Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Thu, 23 Mar 2017 09:42:32 -0400 Subject: [PATCH 139/181] Initial commit for Atreus50 with working audio --- keyboards/atreus50/Makefile | 3 + keyboards/atreus50/atreus50.c | 10 + keyboards/atreus50/atreus50.h | 36 +++ keyboards/atreus50/config.h | 163 +++++++++++ keyboards/atreus50/keymaps/default/Makefile | 6 + keyboards/atreus50/keymaps/default/keymap.c | 270 +++++++++++++++++++ keyboards/atreus50/keymaps/default/readme.md | 1 + keyboards/atreus50/readme.md | 25 ++ keyboards/atreus50/rules.mk | 81 ++++++ 9 files changed, 595 insertions(+) create mode 100644 keyboards/atreus50/Makefile create mode 100644 keyboards/atreus50/atreus50.c create mode 100644 keyboards/atreus50/atreus50.h create mode 100644 keyboards/atreus50/config.h create mode 100644 keyboards/atreus50/keymaps/default/Makefile create mode 100644 keyboards/atreus50/keymaps/default/keymap.c create mode 100644 keyboards/atreus50/keymaps/default/readme.md create mode 100644 keyboards/atreus50/readme.md create mode 100644 keyboards/atreus50/rules.mk diff --git a/keyboards/atreus50/Makefile b/keyboards/atreus50/Makefile new file mode 100644 index 0000000000..57b2ef62e5 --- /dev/null +++ b/keyboards/atreus50/Makefile @@ -0,0 +1,3 @@ +ifndef MAKEFILE_INCLUDED + include ../../Makefile +endif diff --git a/keyboards/atreus50/atreus50.c b/keyboards/atreus50/atreus50.c new file mode 100644 index 0000000000..0ec63216f1 --- /dev/null +++ b/keyboards/atreus50/atreus50.c @@ -0,0 +1,10 @@ +#include "atreus50.h" + +void matrix_init_kb(void) { + + // Turn status LED on + //DDRE |= (1<<6); + PORTE |= (1<<6); + + matrix_init_user(); +}; \ No newline at end of file diff --git a/keyboards/atreus50/atreus50.h b/keyboards/atreus50/atreus50.h new file mode 100644 index 0000000000..de06f255e8 --- /dev/null +++ b/keyboards/atreus50/atreus50.h @@ -0,0 +1,36 @@ +#ifndef ATREUS50_H +#define ATREUS50_H + +#include "quantum.h" + +// 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, km0, km1, k36, k37, k38, k39, k3a, k3b \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, KC_NO, k06, k07, k08, k09, k0a, k0b }, \ + { k10, k11, k12, k13, k14, k15, KC_NO, k16, k17, k18, k19, k1a, k1b }, \ + { k20, k21, k22, k23, k24, k25, km0, k26, k27, k28, k29, k2a, k2b }, \ + { k30, k31, k32, k33, k34, k35, km1, k36, k37, k38, k39, k3a, k3b } \ +} + +#define COMPACT_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, km0, km1, k36, k37, k38, k39, k3a, k3b \ +) \ +{ \ + { KC_##k00, KC_##k01, KC_##k02, KC_##k03, KC_##k04, KC_##k05, KC_NO, KC_##k06, KC_##k07, KC_##k08, KC_##k09, KC_##k0a, KC_##k0b }, \ + { KC_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, KC_NO, KC_##k16, KC_##k17, KC_##k18, KC_##k19, KC_##k1a, KC_##k1b }, \ + { KC_##k20, KC_##k21, KC_##k22, KC_##k23, KC_##k24, KC_##k25, KC_##km0, KC_##k26, KC_##k27, KC_##k28, KC_##k29, KC_##k2a, KC_##k2b }, \ + { KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##km1, KC_##k36, KC_##k37, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b } \ +} + +#define KC_ KC_TRNS + +#endif diff --git a/keyboards/atreus50/config.h b/keyboards/atreus50/config.h new file mode 100644 index 0000000000..dedcc8caec --- /dev/null +++ b/keyboards/atreus50/config.h @@ -0,0 +1,163 @@ +/* +Copyright 2012 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xBB80 +#define PRODUCT_ID 0x040D +#define DEVICE_VER 0x0001 +#define MANUFACTURER Hexwire +#define PRODUCT Atreus 50 Keyboard +#define DESCRIPTION Atreus layout with extra column + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 13 + +/* Planck PCB default pin-out */ +#define MATRIX_ROW_PINS { D3, D2, D1, D0 } +#define MATRIX_COL_PINS { D4, D7, E6, B4, B5, B6, B2, B3, B1, F7, F6, F5, F4 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + + +/* ws2812 RGB LED */ +#define RGB_DI_PIN C6 +#define RGBLIGHT_TIMER +#define RGBLED_NUM 12 // Number of LEDs +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 + + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Magic Key Options + * + * Magic keys are hotkey commands that allow control over firmware functions of + * the keyboard. They are best used in combination with the HID Listen program, + * found here: https://www.pjrc.com/teensy/hid_listen.html + * + * The options below allow the magic key functionality to be changed. This is + * useful if your keyboard/keypad is missing keys and you want magic key support. + * + */ + +/* key combination for magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* control how magic key switches layers */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false + +/* override magic key keymap */ +//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS +//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM +//#define MAGIC_KEY_HELP1 H +//#define MAGIC_KEY_HELP2 SLASH +//#define MAGIC_KEY_DEBUG D +//#define MAGIC_KEY_DEBUG_MATRIX X +//#define MAGIC_KEY_DEBUG_KBD K +//#define MAGIC_KEY_DEBUG_MOUSE M +//#define MAGIC_KEY_VERSION V +//#define MAGIC_KEY_STATUS S +//#define MAGIC_KEY_CONSOLE C +//#define MAGIC_KEY_LAYER0_ALT1 ESC +//#define MAGIC_KEY_LAYER0_ALT2 GRAVE +//#define MAGIC_KEY_LAYER0 0 +//#define MAGIC_KEY_LAYER1 1 +//#define MAGIC_KEY_LAYER2 2 +//#define MAGIC_KEY_LAYER3 3 +//#define MAGIC_KEY_LAYER4 4 +//#define MAGIC_KEY_LAYER5 5 +//#define MAGIC_KEY_LAYER6 6 +//#define MAGIC_KEY_LAYER7 7 +//#define MAGIC_KEY_LAYER8 8 +//#define MAGIC_KEY_LAYER9 9 +//#define MAGIC_KEY_BOOTLOADER PAUSE +//#define MAGIC_KEY_LOCK CAPS +//#define MAGIC_KEY_EEPROM E +//#define MAGIC_KEY_NKRO N +//#define MAGIC_KEY_SLEEP_LED Z + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +#endif diff --git a/keyboards/atreus50/keymaps/default/Makefile b/keyboards/atreus50/keymaps/default/Makefile new file mode 100644 index 0000000000..e8556d0d6a --- /dev/null +++ b/keyboards/atreus50/keymaps/default/Makefile @@ -0,0 +1,6 @@ +RGBLIGHT_ENABLE = no +AUDIO_ENABLE = yes + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif \ No newline at end of file diff --git a/keyboards/atreus50/keymaps/default/keymap.c b/keyboards/atreus50/keymaps/default/keymap.c new file mode 100644 index 0000000000..0a77613c56 --- /dev/null +++ b/keyboards/atreus50/keymaps/default/keymap.c @@ -0,0 +1,270 @@ +#include "atreus50.h" +#include "action_layer.h" +#include "eeconfig.h" +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _COLEMAK 1 +#define _DVORAK 2 +#define _LOWER 3 +#define _RAISE 4 +#define _MOVEMENT 5 +#define _ADJUST 16 + +enum preonic_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + MOVEMENT, + BACKLIT +}; + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | - | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower |Space | Bksp |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = KEYMAP( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, \ + 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, \ + KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, MO(_MOVEMENT), KC_RSFT, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Colemak + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | - | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | R | S | T | D | H | N | E | I | O | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_COLEMAK] = KEYMAP( \ + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_MINS, \ + 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_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, MO(_MOVEMENT), KC_RSFT, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Dvorak + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | " | , | . | P | Y | F | G | C | R | L | - | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Esc | A | O | E | U | I | D | H | T | N | S | / | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = KEYMAP( \ + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_MINS, \ + 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, \ + KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, MO(_MOVEMENT), KC_RSFT, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = KEYMAP( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = KEYMAP( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +[_MOVEMENT] = KEYMAP( \ + KC_TILD, KC_EXLM, KC_MUTE, KC_VOLD, KC_VOLU, KC_PERC, KC_CIRC, KC_AMPR, KC_UP, KC_LPRN, KC_RPRN, KC_DEL, \ + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_LEFT, KC_DOWN, KC_RIGHT, KC_RCBR, KC_PIPE, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDOWN, KC_PGUP, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Musoff|Mus on| | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = KEYMAP( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + +}; + +#ifdef AUDIO_ENABLE +float tone_startup[][2] = { + {NOTE_B5, 20}, + {NOTE_B6, 8}, + {NOTE_DS6, 20}, + {NOTE_B6, 8} +}; + +float tone_qwerty[][2] = SONG(QWERTY_SOUND); +float tone_dvorak[][2] = SONG(DVORAK_SOUND); +float tone_colemak[][2] = SONG(COLEMAK_SOUND); + +float tone_goodbye[][2] = SONG(GOODBYE_SOUND); + +float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); +#endif + +void persistant_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_qwerty, false, 0); + #endif + persistant_default_layer_set(1UL<<_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_colemak, false, 0); + #endif + persistant_default_layer_set(1UL<<_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_NOTE_ARRAY(tone_dvorak, false, 0); + #endif + persistant_default_layer_set(1UL<<_DVORAK); + } + return false; + break; + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_LOWER); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } else { + layer_off(_RAISE); + update_tri_layer(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + case BACKLIT: + if (record->event.pressed) { + register_code(KC_RSFT); + #ifdef BACKLIGHT_ENABLE + backlight_step(); + #endif + } else { + unregister_code(KC_RSFT); + } + return false; + break; + } + return true; +}; + +void matrix_init_user(void) { + #ifdef AUDIO_ENABLE + startup_user(); + #endif +} + +#ifdef AUDIO_ENABLE + +void startup_user() +{ + _delay_ms(20); // gets rid of tick + PLAY_NOTE_ARRAY(tone_startup, false, 0); +} + +void shutdown_user() +{ + PLAY_NOTE_ARRAY(tone_goodbye, false, 0); + _delay_ms(150); + stop_all_notes(); +} + +void music_on_user(void) +{ + music_scale_user(); +} + +void music_scale_user(void) +{ + PLAY_NOTE_ARRAY(music_scale, false, 0); +} + +#endif \ No newline at end of file diff --git a/keyboards/atreus50/keymaps/default/readme.md b/keyboards/atreus50/keymaps/default/readme.md new file mode 100644 index 0000000000..e911968dd9 --- /dev/null +++ b/keyboards/atreus50/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default Preonic layout - largely based on the Planck's \ No newline at end of file diff --git a/keyboards/atreus50/readme.md b/keyboards/atreus50/readme.md new file mode 100644 index 0000000000..f0be255a09 --- /dev/null +++ b/keyboards/atreus50/readme.md @@ -0,0 +1,25 @@ +Preonic keyboard firmware +====================== +DIY/Assembled compact ortholinear 50% keyboard by [Ortholinear Keyboards](http://ortholinearkeyboards.com). + +## Quantum MK Firmware + +For the full Quantum feature list, see [the parent readme.md](/readme.md). + +## Building + +Download or clone the whole firmware and navigate to the keyboards/preonic folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use `make dfu` to program your PCB once you hit the reset button. + +Depending on which keymap you would like to use, you will have to compile slightly differently. + +### Default +To build with the default keymap, simply run `make`. + +### Other Keymaps +Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap, create a file in the keymaps folder 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 **__\.c__** and are stored in the `keymaps` folder. diff --git a/keyboards/atreus50/rules.mk b/keyboards/atreus50/rules.mk new file mode 100644 index 0000000000..7770ea2a27 --- /dev/null +++ b/keyboards/atreus50/rules.mk @@ -0,0 +1,81 @@ + + +# MCU name +#MCU = at90usb1287 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) +EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) +CONSOLE_ENABLE ?= no # Console for debug(+400) +COMMAND_ENABLE ?= yes # Commands for debug and configuration +NKRO_ENABLE ?= no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality +MIDI_ENABLE ?= no # MIDI controls +AUDIO_ENABLE ?= no # Audio output on port C6 +UNICODE_ENABLE ?= no # Unicode +BLUETOOTH_ENABLE ?= no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend + +avrdude: build + ls /dev/tty* > /tmp/1; \ + echo "Reset your Pro Micro now"; \ + while [[ -z $$USB ]]; do \ + sleep 1; \ + ls /dev/tty* > /tmp/2; \ + USB=`diff /tmp/1 /tmp/2 | grep -o '/dev/tty.*'`; \ + done; \ + avrdude -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex + +.PHONY: avrdude From 0520341ce48e45ddb53a8b26f8710417af6279e6 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Thu, 23 Mar 2017 11:25:21 -0400 Subject: [PATCH 140/181] Cleanup keymap --- keyboards/atreus50/atreus50.c | 2 +- keyboards/atreus50/keymaps/default/keymap.c | 196 +++++++++---------- keyboards/atreus50/keymaps/default/readme.md | 1 - 3 files changed, 89 insertions(+), 110 deletions(-) delete mode 100644 keyboards/atreus50/keymaps/default/readme.md diff --git a/keyboards/atreus50/atreus50.c b/keyboards/atreus50/atreus50.c index 0ec63216f1..225a51bcce 100644 --- a/keyboards/atreus50/atreus50.c +++ b/keyboards/atreus50/atreus50.c @@ -7,4 +7,4 @@ void matrix_init_kb(void) { PORTE |= (1<<6); matrix_init_user(); -}; \ No newline at end of file +}; diff --git a/keyboards/atreus50/keymaps/default/keymap.c b/keyboards/atreus50/keymaps/default/keymap.c index 0a77613c56..8ae096cd83 100644 --- a/keyboards/atreus50/keymaps/default/keymap.c +++ b/keyboards/atreus50/keymaps/default/keymap.c @@ -17,7 +17,7 @@ #define _MOVEMENT 5 #define _ADJUST 16 -enum preonic_keycodes { +enum custom_keycodes { QWERTY = SAFE_RANGE, COLEMAK, DVORAK, @@ -30,123 +30,103 @@ enum preonic_keycodes { // Fillers to make layering more clear #define _______ KC_TRNS #define XXXXXXX KC_NO +#define KC_X0 MT(MOD_LCTL, KC_ESC) // Hold for Left Ctrl, Tap for ESC +#define KC_X1 LOWER +#define KC_X2 RAISE +#define KC_X3 MO(_MOVEMENT) +#define KC_X4 MT(MOD_LSFT, KC_ENT) // Hold for Left Shift, Tap for Enter const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Qwerty - * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Y | U | I | O | P | - | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D | F | G | H | J | K | L | ; | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | Ctrl | Alt | GUI |Lower |Space | Bksp |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_QWERTY] = KEYMAP( \ - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, \ - 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, \ - KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, MO(_MOVEMENT), KC_RSFT, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), + [_QWERTY] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, X4 , + //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| + GRV ,LCTL,LALT,LGUI, X1 ,SPC , X3 ,RSFT,BSPC, X2 ,LEFT,DOWN, UP ,RGHT + //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + ), -/* Colemak - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Tab | Q | W | F | P | G | J | L | U | Y | ; | - | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | R | S | T | D | H | N | E | I | O | " | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_COLEMAK] = KEYMAP( \ - KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_MINS, \ - 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_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, MO(_MOVEMENT), KC_RSFT, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), + [_COLEMAK] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB , Q , W , F , P , G , J , L , U , Y ,SCLN,MINS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , R , S , T , D , H , N , E , I , O ,QUOT, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, Z , X , C , V , B , K , M ,COMM,DOT ,SLSH, X4 , + //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| + GRV ,LCTL,LALT,LGUI, X1 ,SPC , X3 ,RSFT,BSPC, X2 ,LEFT,DOWN, UP ,RGHT + //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + ), -/* Dvorak - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Tab | " | , | . | P | Y | F | G | C | R | L | - | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | O | E | U | I | D | H | T | N | S | / | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ -[_DVORAK] = KEYMAP( \ - KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_MINS, \ - 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, \ - KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, MO(_MOVEMENT), KC_RSFT, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ -), + [_DVORAK] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TAB ,QUOT,COMM,DOT , P , Y , F , G , C , R , L ,MINS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + X0 , A , O , E , U , I , D , H , R , N , S ,SLSH, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT,SCLN, Q , J , K , X , B , M , W , V , Z , X4 , + //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| + GRV ,LCTL,LALT,LGUI, X1 ,SPC , X3 ,RSFT,BSPC, X2 ,LEFT,DOWN, UP ,RGHT + //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + ), -/* Lower - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_LOWER] = KEYMAP( \ - KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), + [_LOWER] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TILD,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,DEL , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + DEL , F1 , F2 , F3 , F4 , F5 , F6 ,UNDS,PLUS,LCBR,RCBR,PIPE, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , F7 , F8 , F9 ,F10 ,F11 , F12 ,END , , , , , + //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| + , , , , , , , , , ,MNXT,VOLD,VOLU,MPLY + //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + ), -/* Raise - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_RAISE] = KEYMAP( \ - KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), + [_RAISE] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + GRV , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,DEL , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + DEL , F1 , F2 , F3 , F4 , F5 , F6 ,MINS,EQL ,LBRC,RBRC,BSLS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , F7 , F8 , F9 ,F10 ,F11 , F12 ,NUHS,NUBS, , , , + //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| + , , , , , , , , , ,MNXT,VOLD,VOLU,MPLY + //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + ), -[_MOVEMENT] = KEYMAP( \ - KC_TILD, KC_EXLM, KC_MUTE, KC_VOLD, KC_VOLU, KC_PERC, KC_CIRC, KC_AMPR, KC_UP, KC_LPRN, KC_RPRN, KC_DEL, \ - KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_LEFT, KC_DOWN, KC_RIGHT, KC_RCBR, KC_PIPE, \ - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDOWN, KC_PGUP, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ -), + [_MOVEMENT] = COMPACT_KEYMAP( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TILD,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR, UP ,LPRN,RPRN,DEL , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + DEL , F1 , F2 , F3 , F4 , F5 , F6 ,LEFT,DOWN,RGHT,RCBR,PIPE, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , F7 , F8 , F9 ,F10 ,F11 , F12 ,END , , , , , + //|----+----+----+----+----+----|----+----|----+----+----+----+----+----| + , , , , , , , ,PGDN,PGUP,MNXT,VOLD,VOLU,MPLY + //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + ), /* Adjust (Lower + Raise) - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | Reset| | | | | | | | | | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | |Voice-|Voice+|Musoff|Mus on| | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' + * |------+------+------+------+------+------. ,------+------+------+------+------+------| + * | | Reset| | | | | | | | | | | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | |Audoff|Aud on|AGnorm| |AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | |Voice-|Voice+|Musoff|Mus on| | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | + * `-------------------------------------------------------------------------------------------------' */ -[_ADJUST] = KEYMAP( \ - _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ - _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ - _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ -) + [_ADJUST] = KEYMAP( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ) }; @@ -267,4 +247,4 @@ void music_scale_user(void) PLAY_NOTE_ARRAY(music_scale, false, 0); } -#endif \ No newline at end of file +#endif diff --git a/keyboards/atreus50/keymaps/default/readme.md b/keyboards/atreus50/keymaps/default/readme.md deleted file mode 100644 index e911968dd9..0000000000 --- a/keyboards/atreus50/keymaps/default/readme.md +++ /dev/null @@ -1 +0,0 @@ -# The default Preonic layout - largely based on the Planck's \ No newline at end of file From 63e47a642536ca7af22ef353cf7d19677f48b013 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Thu, 23 Mar 2017 12:23:20 -0400 Subject: [PATCH 141/181] =?UTF-8?q?Add=20RGB=20support=20for=20Let?= =?UTF-8?q?=E2=80=99s=20Split=20v1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keyboards/lets_split/keymaps/hexwire/config.h | 1 - keyboards/lets_split/rev1/config.h | 7 +++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/keyboards/lets_split/keymaps/hexwire/config.h b/keyboards/lets_split/keymaps/hexwire/config.h index 38b57266a4..9c8c6d7f40 100644 --- a/keyboards/lets_split/keymaps/hexwire/config.h +++ b/keyboards/lets_split/keymaps/hexwire/config.h @@ -21,7 +21,6 @@ along with this program. If not, see . #define TAPPING_TERM 150 #undef RGBLED_NUM -#define RGB_DI_PIN B0 #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 8 #define RGBLIGHT_HUE_STEP 8 diff --git a/keyboards/lets_split/rev1/config.h b/keyboards/lets_split/rev1/config.h index 2f5bde9531..5fb87cf5d7 100644 --- a/keyboards/lets_split/rev1/config.h +++ b/keyboards/lets_split/rev1/config.h @@ -63,6 +63,13 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) +/* ws2812 RGB LED */ +#define RGB_DI_PIN D3 +#define RGBLIGHT_TIMER +#define RGBLED_NUM 16 // Number of LEDs +#define ws2812_PORTREG PORTD +#define ws2812_DDRREG DDRD + /* * Feature disable options * These options are also useful to firmware size reduction. From 8775a13658146b7ffc90ac20579c1996bd51e909 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Thu, 23 Mar 2017 14:46:58 -0400 Subject: [PATCH 142/181] Add RGB support --- keyboards/atreus50/config.h | 2 +- keyboards/atreus50/keymaps/default/Makefile | 4 ++-- keyboards/atreus50/keymaps/default/keymap.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/atreus50/config.h b/keyboards/atreus50/config.h index dedcc8caec..2e34e0f898 100644 --- a/keyboards/atreus50/config.h +++ b/keyboards/atreus50/config.h @@ -61,7 +61,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN C6 -#define RGBLIGHT_TIMER +#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 12 // Number of LEDs #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/atreus50/keymaps/default/Makefile b/keyboards/atreus50/keymaps/default/Makefile index e8556d0d6a..d7b0fa7fd8 100644 --- a/keyboards/atreus50/keymaps/default/Makefile +++ b/keyboards/atreus50/keymaps/default/Makefile @@ -1,5 +1,5 @@ -RGBLIGHT_ENABLE = no -AUDIO_ENABLE = yes +RGBLIGHT_ENABLE = yes +AUDIO_ENABLE = no ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/atreus50/keymaps/default/keymap.c b/keyboards/atreus50/keymaps/default/keymap.c index 8ae096cd83..415405ec23 100644 --- a/keyboards/atreus50/keymaps/default/keymap.c +++ b/keyboards/atreus50/keymaps/default/keymap.c @@ -122,7 +122,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------------------------------------------------------------------------------------------------' */ [_ADJUST] = KEYMAP( \ - _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, RESET, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, KC_DEL, \ _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ From ddc036b69ea508750f5129d9a43fee484148716a Mon Sep 17 00:00:00 2001 From: Travis La Marr Date: Fri, 24 Mar 2017 12:53:55 -0400 Subject: [PATCH 143/181] Refactor Bluetooth Handling Refactored Bluetooth support to make adding new Bluetooth modules easier in the future. * Remove `OUT_BLE` key from QMK's keymap. `OUT_BT` is all we need now as there's no difference anymore. * Made BLUETOOTH_ENABLE build option legacy as not to break existing keymaps (Falls back to existing EZ Key support if on) * Removed `ADAFRUIT_BLE_ENABLE` build option * Created new build option `BLUETOOTH` with module option (Currently `AdafruitEZKey` & `AdafruitBLE`) * Moved all LUFA bluetooth key/mouse events under `BLUETOOTH_ENABLE` ifdef with selected modules output. --- quantum/quantum.c | 8 --- quantum/quantum_keycodes.h | 3 -- tmk_core/common.mk | 12 +++-- tmk_core/protocol/lufa.mk | 12 +++-- tmk_core/protocol/lufa/adafruit_ble.h | 4 +- tmk_core/protocol/lufa/lufa.c | 77 ++++++++++++--------------- tmk_core/protocol/lufa/outputselect.c | 6 +-- tmk_core/protocol/lufa/outputselect.h | 1 - 8 files changed, 57 insertions(+), 66 deletions(-) diff --git a/quantum/quantum.c b/quantum/quantum.c index 582f8920b1..807a7084a9 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -294,14 +294,6 @@ bool process_record_quantum(keyrecord_t *record) { return false; break; #endif - #ifdef ADAFRUIT_BLE_ENABLE - case OUT_BLE: - if (record->event.pressed) { - set_output(OUTPUT_ADAFRUIT_BLE); - } - return false; - break; - #endif #endif case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_NKRO: if (record->event.pressed) { diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 903d57f1ee..78b02a0deb 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -159,9 +159,6 @@ enum quantum_keycodes { #ifdef BLUETOOTH_ENABLE OUT_BT, #endif -#ifdef ADAFRUIT_BLE_ENABLE - OUT_BLE, -#endif // always leave at the end SAFE_RANGE diff --git a/tmk_core/common.mk b/tmk_core/common.mk index a86dccc616..2b0fda5f2d 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -93,14 +93,18 @@ ifeq ($(strip $(BACKLIGHT_ENABLE)), yes) TMK_COMMON_DEFS += -DBACKLIGHT_ENABLE endif -ifeq ($(strip $(ADAFRUIT_BLE_ENABLE)), yes) - TMK_COMMON_DEFS += -DADAFRUIT_BLE_ENABLE -endif - ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) TMK_COMMON_DEFS += -DBLUETOOTH_ENABLE endif +ifeq ($(strip $(BLUETOOTH)), AdafruitBLE) + TMK_COMMON_DEFS += -DBLUETOOTH_ENABLE +endif + +ifeq ($(strip $(BLUETOOTH)), AdafruitEZKey) + TMK_COMMON_DEFS += -DBLUETOOTH_ENABLE +endif + ifeq ($(strip $(ONEHAND_ENABLE)), yes) TMK_COMMON_DEFS += -DONEHAND_ENABLE endif diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk index de0cc795f6..5b15779723 100644 --- a/tmk_core/protocol/lufa.mk +++ b/tmk_core/protocol/lufa.mk @@ -22,11 +22,16 @@ ifeq ($(strip $(MIDI_ENABLE)), yes) include $(TMK_PATH)/protocol/midi.mk endif -ifeq ($(strip $(ADAFRUIT_BLE_ENABLE)), yes) - LUFA_SRC += $(LUFA_DIR)/adafruit_ble.cpp +ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) + LUFA_SRC += $(LUFA_DIR)/bluetooth.c \ + $(TMK_DIR)/protocol/serial_uart.c endif -ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) +ifeq ($(strip $(BLUETOOTH)), AdafruitBLE) + LUFA_SRC += $(LUFA_DIR)/adafruit_ble.cpp +endif + +ifeq ($(strip $(BLUETOOTH)), AdafruitEZKey) LUFA_SRC += $(LUFA_DIR)/bluetooth.c \ $(TMK_DIR)/protocol/serial_uart.c endif @@ -54,6 +59,7 @@ LUFA_OPTS += -DUSE_FLASH_DESCRIPTORS LUFA_OPTS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" #LUFA_OPTS += -DINTERRUPT_CONTROL_ENDPOINT LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8 +LUFA_OPTS += -DFIXED_CONTROL_ENDPOINT_SIZE=8 LUFA_OPTS += -DFIXED_NUM_CONFIGURATIONS=1 # Remote wakeup fix for ATmega32U2 https://github.com/tmk/tmk_keyboard/issues/361 diff --git a/tmk_core/protocol/lufa/adafruit_ble.h b/tmk_core/protocol/lufa/adafruit_ble.h index 351fd55ae9..b3bab3ca09 100644 --- a/tmk_core/protocol/lufa/adafruit_ble.h +++ b/tmk_core/protocol/lufa/adafruit_ble.h @@ -3,7 +3,7 @@ * Supports the Adafruit BLE board built around the nRF51822 chip. */ #pragma once -#ifdef ADAFRUIT_BLE_ENABLE +#ifdef MODULE_ADAFRUIT_BLE #include #include #include @@ -57,4 +57,4 @@ extern bool adafruit_ble_set_power_level(int8_t level); } #endif -#endif // ADAFRUIT_BLE_ENABLE +#endif // MODULE_ADAFRUIT_BLE diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index ba49284c9b..d71748ce3c 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -67,10 +67,11 @@ #endif #ifdef BLUETOOTH_ENABLE - #include "bluetooth.h" -#endif -#ifdef ADAFRUIT_BLE_ENABLE + #ifdef MODULE_ADAFRUIT_BLE #include "adafruit_ble.h" + #else + #include "bluetooth.h" + #endif #endif #ifdef VIRTSER_ENABLE @@ -602,18 +603,14 @@ static void send_keyboard(report_keyboard_t *report) uint8_t where = where_to_send(); #ifdef BLUETOOTH_ENABLE - if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) { - bluefruit_serial_send(0xFD); - for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { - bluefruit_serial_send(report->raw[i]); - } - } -#endif - -#ifdef ADAFRUIT_BLE_ENABLE - if (where == OUTPUT_ADAFRUIT_BLE) { - adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys)); + #ifdef MODULE_ADAFRUIT_BLE + adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys)); + #else + bluefruit_serial_send(0xFD); + for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { + bluefruit_serial_send(report->raw[i]); } + #endif #endif if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) { @@ -660,24 +657,22 @@ static void send_mouse(report_mouse_t *report) uint8_t where = where_to_send(); #ifdef BLUETOOTH_ENABLE - if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) { - bluefruit_serial_send(0xFD); - bluefruit_serial_send(0x00); - bluefruit_serial_send(0x03); - bluefruit_serial_send(report->buttons); - bluefruit_serial_send(report->x); - bluefruit_serial_send(report->y); - bluefruit_serial_send(report->v); // should try sending the wheel v here - bluefruit_serial_send(report->h); // should try sending the wheel h here - bluefruit_serial_send(0x00); - } -#endif - -#ifdef ADAFRUIT_BLE_ENABLE - if (where == OUTPUT_ADAFRUIT_BLE) { + if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) { + #ifdef MODULE_ADAFRUIT_BLE // FIXME: mouse buttons adafruit_ble_send_mouse_move(report->x, report->y, report->v, report->h); - } + #else + bluefruit_serial_send(0xFD); + bluefruit_serial_send(0x00); + bluefruit_serial_send(0x03); + bluefruit_serial_send(report->buttons); + bluefruit_serial_send(report->x); + bluefruit_serial_send(report->y); + bluefruit_serial_send(report->v); // should try sending the wheel v here + bluefruit_serial_send(report->h); // should try sending the wheel h here + bluefruit_serial_send(0x00); + #endif + } #endif if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) { @@ -727,6 +722,9 @@ static void send_consumer(uint16_t data) #ifdef BLUETOOTH_ENABLE if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) { + #ifdef MODULE_ADAFRUIT_BLE + adafruit_ble_send_consumer_key(data, 0); + #else static uint16_t last_data = 0; if (data == last_data) return; last_data = data; @@ -740,12 +738,7 @@ static void send_consumer(uint16_t data) bluefruit_serial_send(0x00); bluefruit_serial_send(0x00); bluefruit_serial_send(0x00); - } -#endif - -#ifdef ADAFRUIT_BLE_ENABLE - if (where == OUTPUT_ADAFRUIT_BLE) { - adafruit_ble_send_consumer_key(data, 0); + #endif } #endif @@ -1130,10 +1123,6 @@ int main(void) // midi_send_noteoff(&midi_device, 0, 64, 127); #endif -#ifdef BLUETOOTH_ENABLE - serial_init(); -#endif - /* wait for USB startup & debug output */ #ifdef WAIT_FOR_USB @@ -1161,7 +1150,7 @@ int main(void) print("Keyboard start.\n"); while (1) { - #if !defined(BLUETOOTH_ENABLE) && !defined(ADAFRUIT_BLE_ENABLE) + #if !defined(BLUETOOTH_ENABLE) while (USB_DeviceState == DEVICE_STATE_Suspended) { print("[s]"); suspend_power_down(); @@ -1182,7 +1171,11 @@ int main(void) rgblight_task(); #endif -#ifdef ADAFRUIT_BLE_ENABLE +#ifdef MODULE_ADAFRUIT_EZKEY + serial_init(); +#endif + +#ifdef MODULE_ADAFRUIT_BLE adafruit_ble_task(); #endif diff --git a/tmk_core/protocol/lufa/outputselect.c b/tmk_core/protocol/lufa/outputselect.c index 5d2457bfff..0df5d3b75a 100644 --- a/tmk_core/protocol/lufa/outputselect.c +++ b/tmk_core/protocol/lufa/outputselect.c @@ -14,7 +14,7 @@ along with this program. If not, see . #include "lufa.h" #include "outputselect.h" -#ifdef ADAFRUIT_BLE_ENABLE +#ifdef MODULE_ADAFRUIT_BLE #include "adafruit_ble.h" #endif @@ -34,9 +34,9 @@ uint8_t auto_detect_output(void) { return OUTPUT_USB; } -#ifdef ADAFRUIT_BLE_ENABLE +#ifdef MODULE_ADAFRUIT_BLE if (adafruit_ble_is_connected()) { - return OUTPUT_ADAFRUIT_BLE; + return OUTPUT_BLUETOOTH; } #endif diff --git a/tmk_core/protocol/lufa/outputselect.h b/tmk_core/protocol/lufa/outputselect.h index 79b4dd35dd..28cc3298e6 100644 --- a/tmk_core/protocol/lufa/outputselect.h +++ b/tmk_core/protocol/lufa/outputselect.h @@ -18,7 +18,6 @@ enum outputs { OUTPUT_NONE, OUTPUT_USB, OUTPUT_BLUETOOTH, - OUTPUT_ADAFRUIT_BLE, // backward compatibility OUTPUT_USB_AND_BT From 25f2295ba88627521bed63ec4e5412b983626901 Mon Sep 17 00:00:00 2001 From: Hugh Enxing Date: Fri, 24 Mar 2017 14:31:02 -0400 Subject: [PATCH 144/181] Swapped placement of `Ctrl` and `Alt` keys to match Technomancy's default layout --- keyboards/atreus/keymaps/default/keymap.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/keyboards/atreus/keymaps/default/keymap.c b/keyboards/atreus/keymaps/default/keymap.c index 04ad66fed8..ce92e89c9c 100644 --- a/keyboards/atreus/keymaps/default/keymap.c +++ b/keyboards/atreus/keymaps/default/keymap.c @@ -15,8 +15,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QW] = { /* Qwerty */ {KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TRNS, KC_Y, KC_U, KC_I, KC_O, KC_P }, {KC_A, KC_S, KC_D, KC_F, KC_G, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN }, - {KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LALT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH }, - {KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC, MO(_RS), KC_MINS, KC_QUOT, KC_ENT } + {KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCTL, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH }, + {KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_LALT, KC_SPC, MO(_RS), KC_MINS, KC_QUOT, KC_ENT } }, /* * ! @ up { } || pgup 7 8 9 * @@ -27,8 +27,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_RS] = { /* [> RAISE <] */ {KC_EXLM, KC_AT, KC_UP, KC_LCBR, KC_RCBR, KC_TRNS, KC_PGUP, KC_7, KC_8, KC_9, KC_ASTR}, {KC_HASH, KC_LEFT, KC_DOWN, KC_RGHT, KC_DLR, KC_TRNS, KC_PGDN, KC_4, KC_5, KC_6, KC_PLUS}, - {KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_AMPR, KC_LALT, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS}, - {TG(_LW), KC_INS, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC, KC_TRNS, KC_DOT, KC_0, KC_EQL} + {KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_AMPR, KC_LCTL, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS}, + {TG(_LW), KC_INS, KC_LGUI, KC_LSFT, KC_BSPC, KC_LALT, KC_SPC, KC_TRNS, KC_DOT, KC_0, KC_EQL} }, /* * insert home up end pgup || up F7 F8 F9 F10 @@ -39,8 +39,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LW] = { /* [> LOWER <] */ {KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_TRNS, KC_UP, KC_F7, KC_F8, KC_F9, KC_F10}, {KC_DELT, KC_LEFT, KC_DOWN, KC_RGHT, KC_DOWN, KC_TRNS, KC_DOWN, KC_F4, KC_F5, KC_F6, KC_F11}, - {KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, RESET, KC_LALT, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F12}, - {KC_TRNS, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_SPC, DF(_QW), KC_PSCR, KC_SLCK, KC_PAUS} + {KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, RESET, KC_LCTL, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F12}, + {KC_TRNS, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LALT, KC_SPC, DF(_QW), KC_PSCR, KC_SLCK, KC_PAUS} }}; const uint16_t PROGMEM fn_actions[] = { From b4ac0598fa5a69418d79f78c0cf323307d5f5f5e Mon Sep 17 00:00:00 2001 From: Travis La Marr Date: Fri, 24 Mar 2017 15:55:02 -0400 Subject: [PATCH 145/181] Readd bluetooth output direction on standard key input. --- tmk_core/protocol/lufa/lufa.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index d71748ce3c..3d7a8cc43e 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -603,14 +603,16 @@ static void send_keyboard(report_keyboard_t *report) uint8_t where = where_to_send(); #ifdef BLUETOOTH_ENABLE - #ifdef MODULE_ADAFRUIT_BLE - adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys)); - #else - bluefruit_serial_send(0xFD); - for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { - bluefruit_serial_send(report->raw[i]); - } - #endif + if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) { + #ifdef MODULE_ADAFRUIT_BLE + adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys)); + #else + bluefruit_serial_send(0xFD); + for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { + bluefruit_serial_send(report->raw[i]); + } + #endif + } #endif if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) { From 43eee52cba8db46e9f305a56ca6623428e28cc2e Mon Sep 17 00:00:00 2001 From: Travis La Marr Date: Fri, 24 Mar 2017 17:14:57 -0400 Subject: [PATCH 146/181] Add BLE and EZKey module defines. Also restored serial init back to original location. Was getting junk data. --- tmk_core/common.mk | 2 ++ tmk_core/protocol/lufa/lufa.c | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 2b0fda5f2d..47f6fc5719 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -99,10 +99,12 @@ endif ifeq ($(strip $(BLUETOOTH)), AdafruitBLE) TMK_COMMON_DEFS += -DBLUETOOTH_ENABLE + TMK_COMMON_DEFS += -DMODULE_ADAFRUIT_BLE endif ifeq ($(strip $(BLUETOOTH)), AdafruitEZKey) TMK_COMMON_DEFS += -DBLUETOOTH_ENABLE + TMK_COMMON_DEFS += -DMODULE_ADAFRUIT_EZKEY endif ifeq ($(strip $(ONEHAND_ENABLE)), yes) diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 3d7a8cc43e..4cb23ebc80 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -1125,6 +1125,10 @@ int main(void) // midi_send_noteoff(&midi_device, 0, 64, 127); #endif +#ifdef MODULE_ADAFRUIT_EZKEY + serial_init(); +#endif + /* wait for USB startup & debug output */ #ifdef WAIT_FOR_USB @@ -1173,10 +1177,6 @@ int main(void) rgblight_task(); #endif -#ifdef MODULE_ADAFRUIT_EZKEY - serial_init(); -#endif - #ifdef MODULE_ADAFRUIT_BLE adafruit_ble_task(); #endif From 739249ff0d707a9702771236fcf22538e3a7106b Mon Sep 17 00:00:00 2001 From: Nicolas Guelpa Date: Fri, 24 Mar 2017 20:18:59 -0400 Subject: [PATCH 147/181] Adding different layer --- keyboards/xd60/keymaps/cheese/keymap.c | 67 ++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 keyboards/xd60/keymaps/cheese/keymap.c diff --git a/keyboards/xd60/keymaps/cheese/keymap.c b/keyboards/xd60/keymaps/cheese/keymap.c new file mode 100644 index 0000000000..7380093041 --- /dev/null +++ b/keyboards/xd60/keymaps/cheese/keymap.c @@ -0,0 +1,67 @@ +#include "xd60.h" +#include "action_layer.h" + +// Each layer gets a name for readability. +// 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, and you can also skip them entirely +// and just use numbers. +#define _BL 0 +#define _FL 1 +#define _LS 2 +#define _RS 3 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* (Base Layer) Default Layer + * ,-----------------------------------------------------------. + * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | + * |-----------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | + * |-----------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return | + * |-----------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |FN|Left|Up|Down|Right| + * `-----------------------------------------------------------' + */ + [_BL] = KEYMAP( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \ + MO(_FL), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \ + F(0), KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, F(1), F(1), F(1), \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(_FL), KC_LEFT, KC_UP, KC_DOWN, KC_RIGHT), + +// Function Layer + [_FL] = KEYMAP( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_DEL, \ + KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_CALC, KC_INS, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, \ + KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_APP, KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_PGDN, KC_END), + +// Left Shift Layer + [_LS] = KEYMAP( + KC_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CAPS, KC_CAPS, KC_CAPS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Right Shift Layer + [_RS] = KEYMAP( + KC_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; + +// Custom Actions +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_LAYER_MODS(_LS, MOD_LSFT), + [1] = ACTION_LAYER_MODS(_RS, MOD_RSFT), +}; From c0a6c5f80601ed040be0adfe183c9b672aa7fa50 Mon Sep 17 00:00:00 2001 From: Nicolas Guelpa Date: Sun, 26 Mar 2017 15:07:19 -0400 Subject: [PATCH 148/181] fixing layout --- keyboards/xd60/keymaps/cheese/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/xd60/keymaps/cheese/keymap.c b/keyboards/xd60/keymaps/cheese/keymap.c index 7380093041..25919a41f4 100644 --- a/keyboards/xd60/keymaps/cheese/keymap.c +++ b/keyboards/xd60/keymaps/cheese/keymap.c @@ -20,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----------------------------------------------------------| * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | * |-----------------------------------------------------------| - * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return | + * |FUNCTION| A| S| D| F| G| H| J| K| L| ;| '|Return| * |-----------------------------------------------------------| * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | * |-----------------------------------------------------------| From a89ee25db8eb57b902e0fc1a16166d16af0dc721 Mon Sep 17 00:00:00 2001 From: Nicolas Guelpa Date: Sun, 26 Mar 2017 15:16:55 -0400 Subject: [PATCH 149/181] Add files via upload --- keyboards/xd60/keymaps/cheese/base_layout.png | Bin 0 -> 23729 bytes keyboards/xd60/keymaps/cheese/fn_layout.png | Bin 0 -> 20690 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 keyboards/xd60/keymaps/cheese/base_layout.png create mode 100644 keyboards/xd60/keymaps/cheese/fn_layout.png diff --git a/keyboards/xd60/keymaps/cheese/base_layout.png b/keyboards/xd60/keymaps/cheese/base_layout.png new file mode 100644 index 0000000000000000000000000000000000000000..211c4c731e6a90587fe1024d996a73744479b123 GIT binary patch literal 23729 zcmd?RWpEtJwk{~Ln3H5v7P$c2{QB%2gHl!Kw&Fc?kqqTv!kg5Ckbn(T^Y?;Nl=4pw!Tiz!o2|T|5vF zVh|}&Ar%kMbAYY|-tyYRi-P;5xNVY#t+V?3O^t-Z?SumT>; zm7R~N$Gw@*Hqb-mz6Rlapd!uXB#=<(El8B)Lj}8H!(7NkDt01DIXnwA%%kVQ74~am zF;Ai=^PPS;s||Oi+ASaEs=n(R@HU!FYAxS&)@ZUWSH*GFH8eDUy-Ef^{Bal%p?R1Q zoyjjs{p|~4k$^xHg22E1dK-UY-?f1WG|Mv9`y?eTi# z|4N0nP7ONe5Bz9H+GcbXLD*}!_seh2|Z!?>Pp{}1YqqRGFCtg4+{p0UpHsFB3#=Z!} zohJG7dS);{A;mjbsFMHIzJdXI0A9PgJrIVZ?)T#$wc)M%_2~?wbsb>Do~aH3eOEf_ zbGgx;Y~TH(L{k5>m`{67Z>{l*+A{Bjn78c#(IU6FKoODJ_;O1{n4hG;#+ZPIjs0u= z;$5?<>_0Ds$U|30XAq9DOHnQ0?&V>7f1}+Q8yB~qwzew>OW&uy>Za-Q$!wv7BsuEi z*F**4aTY!Qm%C_-1sPh*vDD!Ey}RUZD9x*dL~}^i`<_3V=a5dqeh?~U@;&8i_-WuV zD)lT)K09<~08dh9V`D=%T~{@@9Y7M;2}a`YjltuHghgl0FDwLawcG5^^?#KDKrj(s zPy{46i53Bz44~_zykQKA@KG#l@v*^d=Jdd@-%E%B)@UWfbZyNp?$)epZ7bEqzzc7V zruR49w}&$AyVKRbkB!0ly}h{e`aYqLwJiBT27`tn5e)}|LtTqTi5I42XHU{?N&v2B z7F@!B7oe&PrBj&&49`LX(N>Q?QNCjM10y|fAjlRx8xE(9z)TFvy3M=0Rr6e1?R~Sr z**@E8x`f@SY@XxGO9t-i$M43!(%v3$hZ&2{_0gp(1x6u|;54w778&b#3<( z&Eer8OCSE-n22&C!CKU^`eYVksnHY33)2XJRZDv^(d)}M|D%_vX*|{Mlhx1h(@JaJ zm(`KV3wfWNo*fvCF053!P3@-YjYlF+Rl7;o7Z!@z^CVGj+mCVvBG9N<0GgkIdT!@r z9>0$eu{y_=sgq={ozLrabzA+uDuC)|#dNHRpX#>f4Vu;3tH9ybyew;06l?F-CIrM3 z7)SKHXC2i8XVoxhz^v~|Z;dY8!inxGx>YS}jSg=Ij3}*2XON;`=8>Y(%d&+9=qP0c z=*$Y-U|;Ie>QY|nG_-t+&WDg%$rQi$T6Dq=2@v+B&4$;9KW5le2$4ot`r2jLv73bw z;AScmy4yg)eUY1)TN%)$rKz-AK9d~x)Qi5EUG%8*SCA!^| zJS552I)C4ZX!zEcTF{c{>1)irk@cNt5`+qA-IGt5?DFXA#gDD5_+9o`q3O6R8XV*0 zAr_{!58S>v*hqJ~x0V7q9ia|4dNiz5w66BBe21Do8*}e8N5j5h7Z^fS#ek$3g|FZm zqHOxW;D7@ZW}ScHhK3$GESvZ4jKYV+=r-O$R5|y90Ef^;fuVRQz-_nB! zv3YPpAKR3jFd#n{j@yjSq`7bDi_K{?)PaH728*5QogKQo3ZZ=8ZCTfQi8FFx2{#DlqFc0li-i zy3ykVX{UMh(EFV;$PMcJPy}Z@1ApMrssN$H>AdQIH&PFg!r?>jX`L~D3do${V=d3j zKDuTndA}3<=TazhG|=O-AN1KLs!ADA9o(!Ft8OCWel0OJhb@lL8OG3`jF@z=!z3O# z-s8ba9MD>vyF_lQ*_0)%vT#u>#OPpkskaNh-~2}NVBz}^s*#1N(-?7=b7V3YSJRw8 zh(NE~hCAsgmlEB(z4#f2d3MefqdiPb*U(i|O#KkS6?M1Xt%(gg0cX+qL&sA;{rmtM zv}Xy2b5-4lmHOR?$g#bB=mv%f8E+y%w+d`|J4qL>3&;G=5AM6B@SAdmS}akvjFo62 zSl%I*^ujFgTqJ#l?0vgnl)>DmL3PsD zd~D&buYN8H>_%M@U;O|d++|0Y(A;*W2(bE>k6af9u!JloAUhFdleQf|m{xY0-XUWi zzN!>~qPa*C6MjbFveyUrQ;4*=P{JQg4o%#QUfhg7j%ZlWTSSu0T!_nN3>aCVaAY@H zJRBkB$&j6X8!kF<)=8vG&v~lRK(b>jiTAqVvgr%VLg7>2iMunfQ#u)%KB-?*eNlSs zgaWO-hId8E)vhh{B_@A8PNMgb8|szB37Ua77LhTN6c&yM+hYMUgcR3aDRc{)yGet& z6?DSRgC{#lt2cfYf{k(}6qSICZ_+jh#kp(w89q34Y8$~gIWSuWA?!GKxNcBgOK=#u zXj9k!Q0u6%Zz#%`Ei{{18mX#s5H!J{<1l9Nfqj20AI9TUqz%<2zmz{j&vZ(=k>?FT zJ9%i`*7f@i`HUxKBvuAKD&1?I-Ih%$)**@}`@Ww8rdlpm2X?+`-QIvB5?u{0pEIoF?%)5 z_;whBRUFW=$UgXW(8J2B8HzhQq|XF0hhLYEmT>q^6N!6WO+s9QcV6Rmby-?x`13~8 zRtVO67Tqi9d)eB$p~c{wRpP_saU+g9i2>*$zAF=P zn>2&et~!NK2mO(_>xy^cUlgGg82JTH`)qwYr~@v|$TB1l``+I=qzrIF0Y}#vtS=?&sO1+7E+I)3RS-@ARen9+vZY2a)e{5>Z$)l zp_CP%-w_>^Bu};r-=OfW<)_*aW9cDN2+72IGMr>}dnio6rzFA#YaQ7T1Eyr`RYvwGC|SBzn5y=NoNB zeA)e277h1xuNY1hN*&)`LF7%bk~|9Wgy=}>v#9cF+*IJA;SrHo0;~JrN5at3FT0`8 zZ1)trmXm)tCn;s=ugVP~cW*=AJh{Za6E*kVQN(1B3?muG+CewN4rNKYWMIhUja!fV zD7guUPQ*HNnFXN|@wFJ$#hu*?Fo`>6X4hn^0rpT7z-8+7a;WD^y6TMq@Dq3#%K$ zy(#dbOT7@&2E4N{rnq985lbf=8P1Rio3EP-_8@w0a=SgtLFyC%a>XSiPc|W7y`G(? z@5CViTNvs`)m0A;hr8$=<`)IBnRvULIN~lsvlJ2G{vc#0iDeu^BoFtb%o}7&;0mO% z;ij&~lB9$}h4eph#SFCHXN$38tx>+j?^kYKeF=y6?+=^^7phm)PUMdn{Ys9@*tQhv zAdV7I9QcXaYH9gY-HdE+toM2Zg|D-J-6%g~t+iyMYJaS}Qr!9&D*@mE< zh$b?RIN{>5J6Fug`QdZ#r}x?L(;rpTQ!Zlfsu>jHmF&(Oh8OMi{Iv%t@|0?BHeN8opkRGI*mleI7{07yqM0$9g8PeY$wj z`>^J;wV%fqGy+A8!MG%bC>zy>xyaVW%OP{0S4Y&Kd8CY5^AUolNC{jXY0N?AC-OWJ z|He$&WbpS1J(ipAa{l}1HO(-n1}kCpZTH+`{LjfXTe9g@M0;y|v{l9d3ii5bW-#+; zcnr{{sLufQuapP)2WAK`Y54pb9Y^D-z3y`A%Uaz|M&C4f7>%w!LQ6^PilnZ1QHZdl zFe089U*@cotc=Xn#!#;%1-zS@UDv?h9Gyw|%$Pqam#{_G0p&|KchqL~ec#1e z04#y?^VtCXoFqfYjyo;wD7>L?Ql148-5}RuO;4UA{$o-S#2}f0(_Ro+^w|)R6pBJ> z)!+#d$`E>4CF;b=QclZ0i({Nj(HPBj z5T&ZZQ^1k_iBgf1LBPqB=q1|!25V`=0|J$X6dQ>D28NYjn3z!iKhVA4P%m{5b0Nxb zfdI!>(V?%kmO_re=YerT#+YLJ*nGI&#n6e_kQsu-Nk^nbhg0!#L(wmMf&<8y<;N6n zNa-(Aa_5eIg(SP(i*#Jg-nKgyt9LvCbru(7L+ z2r^_ylE+>$LrpLVJaORy^_twadld>Q8z}v`dBGlhu}X-jTROrV$H~_u`jKB}=?MjM zw}W;&BlTKICR>dR#1-zo|PG6p@~rt_Fnw?HY_-N+z50`r9vP#pj$Twjc7h~ z@`DdUn(PuuPtM(jW}^cb)(tw(MKZ5!pTWS0kouWi80QJ~YVZa}0^faqVZ!Mb{OPJ8 zpnlsC6?KT>^0RR7>{IiZOb5X0jpgSoUpW-O#Q?WL5G)8qk&kIDOX6Sqb3+^cn61j$ zn6N7oh}VfsRoiM2bVTdr9eg!9V=Du5M)aAXt zYHd9YxiJ(t{F=r#LNvWf*AMeb0u03j$C?T#zGSh*E8}%qA^r_h9HOMrg6E{66f%^X zU$KYPTX{7$$ERt|^>_n>H2d3@X{un)f~YQy-L??JbS*h$>((yPasf!QJpFSIB55|K zflVc;y4U@@m_b)0qEGz7iEfhe2azm&B%T3+8a{v}g3oxsyJ?YBv9p(&JL324H0WqL z{|hJBrrlr>7hMUa<2+ZCTTe@9rKb1g-n|7LF2W*<^4(d)NPj>h%H3kE763O<3F3g- zt19MnQEBmWVH&9z_@k=_J{HqPH`BSaG|d2;ujwg`T$5x{@5m zY3QX2WV~Ep<3sYt#B^X2>}^xxOlWG+Nuq41ffwgrnz1BQ0i(3~nz~alGON$;BioKq zww=Ia>hk%2@(O6B{`R5R^0vzp>LgcN0t8>NLOZ9LjufBvakZ8~Ng z8^3&D;T@G)b)Kq_JF)s;+&qCDJe@c3>TSL%FH^X~v>4}I{!|4sn&XClJ4()YYkgWr z*mO0^luwo|tDAv6y%~TdB8}}6RJp(L8jgsBzTjiN%UN0?352lT?eQ=U{Z(|_0Mj*O z^l*~a!fQ^>A`U1j$6cl%`-)MR(f|Te1NRUTlX#q`AGEepvw&Q0x5wP)o+LoH= zZuax;E|Rv@6HG1dg?TI&D`f`IMexD`F7f%fQ*91wq!RA=v~#<_`gVes>wc?&6iMRf z4yOb2ZfUge@nfs(5LYWO>q0*oT@l-{MsLTXDe&i?M!32J>LkxLfo;*Cn*FBVsm>36 z1`h?VM=dY;OhcHK#nEyGhacNFVbBxciKJD1hN@Zh9CW!B=VA6HP>K^F0*FOcqp}`z z`x3-vj%^G|w5_rS$JXHNhRyXYghp}LLc6~a3?Ig!l)LwR@=6oyIlzUd_S3Z#-^_nL z6l(&EYD`6$x|N2T@sH6`|GJpTcI=sj!-2tUDB$)LdfbGA#hGH#jFVj;LPCW+Z$jPD zK0EN{Q10=3s1*mJvPNr`vXbEb2a{2dfCbf|DTKMeFkU(dw7COJz#LEIw09{EZ}9AXF06kW0pt?GNFw+nNeBIKu}BxyebY8U5I1MBWk<% zQRlpA!(oS}qWEeHQCl0!=}K|bsH<*#34+fiWD`LTCF{OiaOx-JJfB2PobVLwtfK`d zfjn*cax0W`syut4yys)R#%{wG=umb2;$d(*Y;W`1*1?8he9$o~u}f&)*4n;#@+Vyu zD7%HY*7cWgvyJx=pKx&c8s#+_jc1)3BAe2Ca98j{L8t+Z{o6bk-tFL{(RE^|hO2R- zKiF49-KCL)F9@9ch!{;2hVSkwU%(fJv$=>;}iQ&Xh~OdtG8K* zzAnk~Y^PosRY(Z%rGepwkR}GyK_FI8wf|yBy5(r=dVlS$#AQtCIGMf9K&1(25<1PK z(p&F8R00|>w0T<-u2ouOZIjFd6WJoQKQ93+8JpB+;B?qH2tW)4)oANAtVJ0AymFG&y{VV zNBy~<34mCFQQ>9sy8imbYgcRC;oCWON> z0MsaCFOFvm4;E-u2u~@J+F1rDPQvz9qL))STRxH(11uQnk@JYG`d|;n1-+A}Be|?) z@(M&wtSVuxss7ye5eIIf7#KA1*zx`?u!0i6jpE5@n#!j?18(3B;r3x<)P{W@s2p&* zov&P4Ev{$^ygjqV5((sJG6i{APH<8T<^!Y!XB|*4iVgRZkYny?K*a{6dS0Jszv<() zDCApob;Cwjcc_Zoj{h)Y# zzEL=(2zY172pXM4MtYG9E)pQOCIdot5H9I`(2H!4c#qmE$whj)sK-TfYQ<_@`}Fi= zd-st$7#9~e^7^7;L^7go%kzk!>+SWYg`M4SUoh17=bLFPjG6-o)6pzcO~2b&iO0Pt zMi%?^vQ#&EaqsU>b3yLEl$KkOJLs#Yy}RNZ_hkJBy_Y&4Frx!H(^@CCm8ucRboItp z@5ig%F~*+fkN4ZH+kTyMtE=r!&yS7=)-}Q}?^(QgbCSPx|E&3cr5$<0M*pTpeS(dw zxCnvGbv~M^_PLql5EDupg)d*;VlaC$G<}>!q8+H$dX@B^)myx7u0G8N>P4;BaaIKL zl|*V$xgV$1;N8)%FRWq{=EREWdL1q|xZn{Gc9Yfh`l1-SHRPukyC(`=ZYWS;e6GJx z#hc>P_Plz91|P$hr)uyk0DIN42>2C_r+hC658v-kAE!H;G_TG0d$OA{Cz;n&4T>fv ze*iTnhyCH0i_?SeU|?ef7(mTwjP5p%Ds-W;cLsO67{F$i2lm~f7L52m{ev5sdWT?| zJayrRfe<~FD-h?t?TZBz-pup>V_@#UEab`I_s#f0skqhW+hWXw?EsAY1WQGGg+!s! z#MIOtaK@;gN$ya`k1QG2Xj@;(7ujFp{WNH|$E#C;;?u-kn3nC?B2wiSXP(ep-}}{; zJsV8yi&OAg_sb0-cXxNC;y5CKVc-q*eM#GXcQk=aY~(?vKaonIuC6XXh2~x1Y+C7k zWo>t4dwaX=4mGaGDMiZkyk3*K-oA1n0Z?hG6R$~Crw5Lic7*(4Z59}KG;=Qa2hwTQ zPA<)KM(6XD`U2&*$9*KW4<9bh@+1Qbe8?XLBhb=w8igep0k^1r&)-KTvdCt!KQh+) z2x zQ0ZA!yuixUySXfDeFzs<3W+e4ONcO8m3Th+X~?GeX-tS-pg$Qh8v_5(_=?Ymj#~GD zS`xLkp~*xVj(7#4my#xAFB818tlaG- z&9gl-7ll)w&7faCk+T=(qsIVhHZ29@e%Dp0Gqg$uZsuKx(+K*$xv4L>_N1CP$(1hhEEvUOWQ4?&3_=;L=)2>ikuNlQ7Z-h{B!UTxCV|7J!tm-Z zsM$z;tE=D=ywS&6NJ_lyag?bD+~HJgf;#U|;4wLM%u%Ahox!QRtHYq4GZ-0Cf_er| z9OW%7CTn9!>%DTot1X4yF-18*4HqH&KHz2xmUI3xZV>A10Xs1Mk_LaY^)ODaT=+v) zZ3X`UB{t&iO4odDdmJsXT)r??q`pZq?HSpo?*i?Bka zSxd=ow>x3uV=)^N3>Xkc0(n`bZ>ExL zstlxdm2$+)aXVEZ?3wv_lyFt@tTmz#0DlaN#8tUa6vUj6LZx$c&y!oH_ZKb+Em=!S z#5HhH7U~hFP~wzS!^-nl)Ep-+sE~;`9#3px@o;)y5D&6HiCynK+aTZU^@MzxwTH@# zfas@wDH$+w-0iNz>UgK7j=!scDml!g-^y(=WtB>7ZkHkx9$JJ7x{J87$aMA#C!TIN z$?xck^xbQ?=IGIHhI1ZWwG$3QUnWGcD{%CAI^w&MT{u8dz?1(>`(|x~pm}s7WIQ4Bi^}INb$yOO`5h*%e z{ML$5o`V(+CQC@4m?w{hwh-ZNm3`j9!XN2{DRWowgoE?D2Qn1`#U-a^H13;yvlO(L zvE()qNejEll*3#^%PRKXckIJ#H8v}qu*t!3JnxzbxXcun-4RW|>&wNFN6#0~IP1H2 z!)Ewtdd6Uf>>kCr1`i#?w>N9-*gpt8@B}~bW%bUZLe7ayi?;BobgQ>{e8UtkrVRI% zP{TAo5$yedSWAc(Rf5EP37aQE#rWRZOX^$jSS1m*7}YG#Z`{6GfG45MDq+D_mJ|o* zFj%MaOx-AqnnaS2#>BFDr4TdBcv1A5Ybg(WuvP;#9-T(!(FEct_8PJN67dyeF*?k5 z_)D_2yWRE8f{_^+yx5mg1+D8n++kwGs}I>_>4@fzM9bF~rlG6(6T*{k6a_{-CUbI+PK^pJwrHcS_{-KAz49 zXM8Mw3PhQcOhYJBzFhqB4&wQ30%X;KJ2-w>O(z_RiuuGUSohqp)0?RcBYVJ277<=> zs!G}b^6)KCdD3olu5D%WJ~YvRJrp^zqt4M^C3JYxY;-JZP_z1Mq(7Wfv*iDJlIkK8A@m$pj8Bz8l=-4CI);b!VfQ{ z(imm)S+OV6gB=MO2B0&Nzpah3Z@lUd4aB=y^CmjuyEEpBdR(DLj{x;yojADEFhhhm z17hN9cQo0$c3J4mEY5Ui|E4uu6lhK2>khbfxR*Ruq2rVT|2P#&6Gw+%%J@#+W?zehBR7*p@EVj=Z_J zXpx{Xd&vA^VD_lLE>C>U?A*b;fr*661`G!%`u@avFGp0DtItecGQv~z0uOZo>rb|f=*DzZ$(I_wF)NakseSc7!1Sy>pte8piGTR0;=h<- zXgjz40C{UpWhMGAZ`K->ftyRgYi>2usYSSm$wc^)|5D+6eyxGR&n@zr5Y=O5R4hb_ zzhFq9uTbwsXoR=zjH-VX<0r8fgnh-(<=)hWZ*Z+uEuYVsE7%>E{$?!8;{t<^W-~{H z{r8~%;=UDaf$bG?S$7E_F!8?~7O_Bfdon!)>~HNVnIPbWR%qtFe{ko5U>Rh+y^_w9 z`GS9IU!?5qEn6GZB>JQG_<%!bCZ@S8DQe_D+Xb6}EcyT5>E}^^B`{;hh-1eXhg(S1 z@QtD3D7&!q(^K7Rd`^*95OnLzr%h%HNexU0jTTb+%Rrb%38ACxk#^mumpHaqzHlkC zyPG7F-EXZ{fy2Jc(m!i5Nj~E|1Rs5CqkAg;n+q?G77VizE@8&E$hA0`J;~6Z2!Tft z_7AaOB`07J@;$bY%g?NddJ*6Pxj{#-{vk8uxj|Ibb(&1DvQ)Ie0Obk%_i*HYz|>}F zY==2Z2_{_i${=5D2Jk{(YcCr4-=;xK3YxeW*s;TV+q9K~c@A7XIJG?ZKUPnX0kjdJ z=76b)X9zSU118sDL z{$zJWAfNcpu?>}!zwog%GPK)%h$DOgYM7{8WHgRr0S|S>V^Sw11PviJpXYTEq?JYO z7|?UM-x~L1W5>5TH1q!+I8N4n(emg{j|&_0oQWU z-Ul~jON2n`g6+SfFY-qKn@>JmbTqiw??pyp3Hh|-0TYcdpa7O4y-aMK!Y@s!;s}iq z8coZT25cF!-j)kYnc+ZtBbfL^CKQah)l&r3jOWdpxCytP>A856^hTWgKhwyv-VU920$J@yHDF^#w?S*Y^ zF@95ON>x38u4(x`x+y96e(v*!mef!8YdHxiPBVI14WTV2U!I2bik{YiY{iphOMt%r z3&u3xgN~c~{M)ww8(-4S@j$5+#tZ5ZFmK&*`(S1(eVN!DthpIYZjpa*?I@ zpa3B4JZnXBQLH+iloEAMGbvVC-ju3Fuk794&^^1h)=|xL;)2WAbtSCS4Nl8-X2rwGC}s|}kj$#GUsztYr%j&2S(uqoOtM$!6PFITo8tMl1GI`t zI6Jc<67q%v`|K`rpsYew44rtdbS^>U8^YNANII`w1QogsP7nUEXKa$kJ-m_Ai6$pCknix-BZYt=Xv4 z97fI2RJQhy!%X`~Fq(u_WyX43yER~dO93Bwkbd>q5|^yZ{|lhU<}xYVJ)2ZoJ8=Zg z)*NEL*Hsw|N9ZgrTa5uvF!gCj)2a(%90Of-kjYI}0Hv|a8O zWU8z`0nxJCj7@n;G7##kOt!lzG6DN;19vxEqCs9c&)BFrojk<8pkexWIPP=R2i4}d zKkRmQ?ePhkI!bq=!wDWkMDHa$4{AE*j>g)O1WB(Yutrk$(Z0ZxYaEci#00ukM zEP$*??f3Fo#9u)tTOO}W`NfJjLtidr334re)eG@4^9}mhOrbdS zp&bjx{ogD_Csp2U(}9n(yTm)obiO+pc8Uwt-wBCk<>RoSkdv?>*#-H0B22WU1|m$E zPJiY5z0P%|N)Ll3B|`{fabq*dG!{CWmuY&k`h*DW3RFol-W3qzZ}6WhmXwG36Hy+$ z6$&-Kmxp3D-9MpVZskYTCLhiNt|UZTwd(cK-2|y@1-%R*jWzYz*!Nw&VGDn!(SyUN zwOZ6OPIwMNYrq@sAAF|UI~N-^V2jNc6m$GKo!Artm_v!qwi8UHYamORp;fTIw1^0p z<8M2F$kWm0wp>^LVdwP5(ve@*dB=#jx~VPRT`jXayN0aD%%r7iVZo4`&RRH;`Q=$o zhG|)R`9<9t=v6%I`!q-%M7mA2Oy3$%Nnj_MrQBBfIKQXsa~Yj?b|Dlpf0iDyISNp_ zl;c8ibT^=*={9QjIw?kwlo**=&N;82)}RKIiY^Ov=arm zJIFPho1-oOG9VBMw5lgTx^(Qtbw8Zd2Ng zmW^Tl$6B}i;=b_E6b7BeK5zpmUF)ONy`QPOZbX`W79lg^bY}t!{ ztgo6`TFvbrA$jOPNw6~t5=s!)6+8)~E^QSm+_NW5S+x-Zv?DTc^cz>}TO)CNsVe;{ zmurj`zX_Dfgj{kp8r^wAUhmDYWB%b8xEtA&#Q_|jS%=nZGV-nN;kB~|Duu4Yla?56 zX#0d%s>8qSfE#=QyboMG8;{2~OUokU1T%yt;z=X8x)q&yb7ZWU60M6@$q}r+@=NZo z1N1+#DQ0~+4KQYjOoKGZhvtI#e3J&a44StZlTu-qtMlfq!=l9cy2k*ck|K!jv~2lU zt(qS#0Ft)ObiQiOmt34iIDxGRh@(fojrJWuI?jOD9-{GE_DBIN zb2NW8Y!_xa!y9%3G(dCCvkMN)iek?ze7pcAAM2Lh8Mh6Iem5YRbCzI(lmlroL(m}) zFZia?_qaLb(_Lb~7BqTG*pHjCF^|}oP!vh;9Y-4b3E4Usy%j2vwjTb5UQh|LT7CK- zF~BT(eVo_`UxB@8*=K7Gk*3q!+dWG|aN8F(+l?}|05pWqvfgO)U=DqxlF&kuMFD0wGXH!`0K=i;L0P#CCF)GDR%R>cyQjzo?=nQQ31drNu$pU14_Cy4jd*Hl z8wT@kz()_xgEd~(xP_d6GnPyKv`}=HLU*&x_tuP96vUte$kaAS%APl0$30@@{%u|) z@&09AeD4ct-NQ0AYIg8efeh3QD{WKQ5W9 znQ`CHj_;P1L^7mY=&`npl#f*ev~@^}f_anW(Mj)S^!uA*5syDJnuCS`RL2|L6@WXY z%T>z<+2S)yLe45KQe64|RcC@kFh&LQI!`7xf$#)HBYIA0GL(!EfjRKXse&*Qwt&}H zh)^&5oup)Zfu+F`oSLZAdbXLEdWR*fM2$3@L5jC=rseADxgr?N_oBXq;JcD+tR({7 zY)EZ%8bt5PsdzDAQY8XkFPTLLiE#6%#uZb2r3`Q^54fASccXri)B+@<#&s<`))`;3 z>Zx_o_ z9=(&@kuI6EKv>v6G=1@7=_idb?mrFlW@HqPgLlUJAe|ROWj(ZC+8?2kR!dvx9hj$#izw z_VY7UI)!YhQ|yYbq}AE%QeYi(x`65f}>Cc2wCny42|Uc>fWzOmlEA zc6@FQ#>)=rM_wU?!n#(<#j``@kp>$6Kx;i`R&_o?Ve6XW0t5y>oO$DozZ^{6NLk6F zCfA<`HURS%vJJwZ2LH2NQ0^D9eeb9CI|%z#ZS@X_@0twWjs2~ROi>xwZWWoEocJ3m z2O@NfKp-%u*9c_!9jyaDFC+nhdB&dk!51Ne~dEz$+y-R#N#de1ifb%4Fsu zA|Fou^N=NTBBpLRlViG}xw~&+ zl$-)K!72Qoqy^B&k)nz>dw??k=0%z6?=t_Zo4nw^!SY2{t?u|a5S25|=>2;q_#ZVa z`k#jNO+PtI8N0O+n}ZKbXgH=5$Rw_Sb%rFU5eBBF#T)Z!j9~$N2EDrjVa^}N))%)@c7{o&Tq|ee17oBO%4dkn0L1;!>0uZ&cC(^j3i&fhTfoXjYE~yvE@>5EcYh z=-^)zv+TfPDR`@5myHdbEb7r1&+C2%qUKT_Zk6yqQL}+QFz=ceCuAx9wt6kVY_p){ z=KY=80p7xOjL_#m-FDSx7&r?Dpor)TDg`GERK=$`{hmF{l;HU4OZBv_YOYQ50AuFG zpR$@#F{>22;hWTdR5isX-UFW;W2r*5_cXZyug+$+U08B&{}TCkfc2(B&eMFUo13?9 z58M7o6r5hbB1n$O0q|ssKT-4jLS=(rftzJh>RJe`HvfgHW{y>=xOcf+Tf@P;Uh+Y? zo26HC>e_}Vjezz3($bRckbLPpP~gXkye822qN(of=vZ%3(%+cmLqI^#=6PebOLAE$ zx&wIF8c5amivU^|l-1A6Q>76LKh`&;N*k!sq}+dmsgfR=)1wJgE!S9+p{S$5_ys>h zWJZk|*=uTRx7GZLSgk`>F9vO&YKB((xL2l$M|euV z+@oXrzT7R-+O>KQ*|4)xS2!rD*ixz4c>KHGlo}dsbqa`Whkq%-6`S|T6>-4n(H&qd z$`=wv9)vC4BQ3R_5^3vFb;3jg?I4mT1s^dDINdMtLqkKa#%ODIhOqSMN{=Ev*`x(e zB4z(9FfA%rPxp#&)t%D=rb~w8KXE=GC;&KB6yq=2C@T}WE!+}ZEvxv2y6?otx>Aw& zA3-?mHdbo%2(jV=8tR6twOd)>_>R8-=SXK>^mn_9G#uBR6(fD!W*m#jiCnzfifJ6}}SAKKW^p=`sL{1x-F&%l^p zrmyak-sq%$EB@e6rU~>=yPku1JlSX^k3JkOj>Dn2qp=l8abload4RRa-sR{G1liTO(C)T3Bdpa;|Zi_LCoa~cJwdnPJQn@ z_bKw6=$Pa3+R?H-f3%5!(V$3%G0*YCjr3fSBx?;$wm@%edReeO>Xd&TsawGZ0~QlS zVE5m+HLcPynb5HHlK$9X)fcjOq1a_fG4q<8GY}P#Vf^~2HQ2P3nG|r&A9!hiOw?m2 z`tarqnTjm>0MqR{UY{SzJ|7Np$kY)cO4T z9;RkBWQDH*CtIh@XEnNymgM-r^uD6p#-Tk0Wz1777kWHkK4KV5JF-1foRoB6dl|8( zH`^QM9z|g7=W{$6OuqL-)H5}1KgJh0g?X!W^MtOeDa>w88g7}NFg`U4-7zl2`Cfqu ztDp)B5HCazd#ADxa8eY<_5D9pVFxO8g+Rd4JiSmJFo_J;FvK2`9r_UF;DM}ViOy&j zbM}+}Ke4vF2QetuXiAh@fJB+jKW3{1FkB{WO@=2|F%t%>0X)EU2nC`mb4ZTD;`OyRsd=d}8`q&ydA`F+9p^(8+}G?Fr!1 z+4#Y0<8tWs9UhYa*u%;EF>WG?-i%P19g(=zLcJqVETiF;8zz;Qza233#Tm(cBZ~D5 zAkeb*9~_Q?!0UHFxL^I?f%UpqM_ppzYdc((@J`IVm!AU$S#nOJzP-*;G8DG*z3vJ8_8MsFCYv7sDK$fXGLb2L^pVJ@eHESPFk*1BG?I0WKAaD~+Ao1vhuBSdV zAQa&&D%Ig)X8gK^r#^vwx5iHBC8|`AlqGF{AcoWro~S`2sYsJ+VW|ein*gk~G(R_i z$Ul(h6eXO-!5P?ovxb-YNo}{?{>iZxqSMrsF5IHzebTZ)y~uU!{!;cjb~6?8y}p0g z===ukoeU$y%sMmp@)02$1|hm#?sRg0x~yQJDtt6LE~Q2mVYK{4U+@CiMy3<7PYE8L zGR~<|X;hdTD80T?g8I>R8WkmRgwG9QA2}g*@94M)HupjtD4%R7rwSD7VSN$@R%yr{ zDWxX}=1QE9&(Ls4gAYXQk=2;PF@xNN`621oMV| z%1L4uftat)bOj8Ry?}aY$#a1uD7Iy#?$2WdAB6zU~6;JN$Zq zB|h6Eqh;WljsiVNhKktx)%B$E!6^n%{sra>e}skX{P0Sk1LO)L`~V9J_3K@7Ve=xx zZZ50P1SHuN=OEFeg_V=wweCPR&wN{1G=Jyb(hxq`1BR*2j+pFrd$2V>Ol-3!7gq_o zJ1cGL~a|P3PxJg!k`X&i6OzvTwwX!ES-C#M+V}988mJec&wfF_O6t5I?y+C z9Q$Ii<+*3c9t!=%gXEsusKdHJ%{n2zJ<{t=Fn4^o{A9v$W^7>m!NP!Lx%8WcoQM3&n_z5aCoKE|+MU+jdml1wIM1G8 zu8xiKqa$w&15eSyqx&>&<>>D!RjVQS)hj|%-q|B_w$+#Sr+h*DHb~$>C7qQ0<5f=H z>u_>-&2Nj@)U;z^4fJ2sf-@n9wWPr!`$q%{#Y(Hn2Sm&$*jB-g7HGa>>jrOT$C0Ry zsb&dl!W30CJ|`H`ht(m?1F6z|t*V$Laqqq4uq5pQkJMmuf>iR|ZZ35xo8*dST51H} zXD=f;1w+s%5I?k6To*5wi1Mp1h5qEPPz4Yc`a&dBeEySJ2$u^8Ojx-uy!{JL{)3ai z05S+=V91&fe-au2D?qz*gsp(I!XJt-xgsbKxzd0ni2aSA`2S7!77>CbRXD~d^iral zl7c^hQL@|?Pm2EwSGoxjM|!Tl>vV-GWugTJ6&rgN<}X@9Pyu333F1ONi|ttI{i!h6 zDVl*n5x?=$Z~TxdS$rB&!Ia^ra;pywq^L7cKqBC&j;#5&_W}Xmy)-cHusTsB1jMBO zcME}FBgEVTN@SZsvxS;4tT`TyAT?tt{UfG_UEG;0RfP!HB3UnC;c2~@+`oQK zOdLpV^u7yt~?y- zu74vmvS-hpeczYTFg204EIni`%p^>n5Xrs`A^RRm$WqxUN|wo*CHo%PWz9bJ@H-u`@b{SvLPbE;!(}z# z-|?r~2Lu~a1!3lNM_qL=4EuS1mj)E(u%-{tp~00!OhBvADxCa+4y(HX`?Jc`2G`40dWobzJ)7H zZ}z%ydVuZ!sRwXprE*#<-&g_ygfS3==!$s`MD#5<+-JxEQ|iKnW6&TP6GLwYEDMH+ zQg*ZYZEbh=-FLG>&o7dblPhmIbepDK)?X}Jr5N(ucbArv8y~6kaoXFO3OZ%sEl(KD z`QU2WZu=GXQJ~$g$I{PK{)1Ty+bnR)Nxc z5FBmIZ-(y&Ob$pC3X)g0a?03kx%S>-bnd>8k;CuYf4ig73P+He9$%On+gC22G(kV7 zYWth{YI%)|Vp=&CnK$2`_>1&UIU@aMw~OE4)#9QTLA2i;+3rLv&VrixxZ(z6J`I73 z6+EL?qbzyd`EFkS0D|xIo%!_a%(B6}6meTW=>Ec+k+;CHtp25fh2%6P(zS5K$ zu4qu;Ukd#hX|x@wKwl6^Y3Db$uvi8mws~ey$P@v`|6fhByjI1XdjsaEx8VEPoys3f zQIwRH1_`x_8(@1s$XUVs$zDhaOK3Ui)>pLiVswJ3Y^Kk zve7O9Yi_EpGp)u7cl}STDr(1FZ^1~`P4*R-DjOX75N3G!wP)W$;SS$;fuR?f#p<$X(Um6~=oMH#%xauYx26*|f)WT4tJv0a;iz(ou=>ha2pajs8km*e}L%;R@=E%^B z;SI_ksjXp;hi<20C7-OljBxN_m83q4TLtpRENWcg8zd^cb)wC*uAL1+;*g2?pP{oGDZ(co33@K>A4|ua@D3 zM|j-wwEN42rU7J`#LbZkkFUY4Bi z>Xx~<;*98?OHFzrN>y~{FM>e{Xj#4qQDN31V@&P(b=Ic1IxT|ySXLGTq^N?8ffhwogr=d=Oz8b_>qqy-mzw>lhc0cDs4!=n4?*9at$tb9oSJZbw2EK4yir`LrmoRESL$w|1%K<&(Yx>cs z8tCI=Z--OY7}QN?w$o`qIO(PED8%ekyPE{M^5g@Pl>$CHYA>0))^{MW?4%s_?P%FG zA_V#2R-bH3@KF32b34karXlL#&Ciy7Hk3DRj*qlAQj2$Wk54q@e7>n6mtxxxY*l7I zcS+jrM(qoGdQ}F0s<}BhM`;Pn4j+wCye#Hw=bd7fw(%JvSp6S)W;jIIDBt1)0YCiv z6KaZAqi<%4ONDz!Q;~!tXw&Ct$%F;q8}5}buyZbPpWynCPz)9T+)D3B68DrNL=zs^ zSZpI+d8dCY%(i`RjiyLuxMyPl9(py7Ew(Mq=lu?tm|n+lo!I@KxbD^>FY3`Qf%v8$ z^UD6KcV#O0hk1icL3%K{cQ2 zHvEJAMaZAd!fO?;ob(>cLXm+}_IR7x3S@-6M#Y+`B7 zor0b4r!5UaUti*fjw(-NKGUh}l0|p*%a@Q3Ozo)3itQf~!WDw}3T_$dY>f7flSBVcww+G5oJNKVYTHuy(+BcKCc3#&E#A+Jxi03Y?I z0vvqVb$U=sGvsaF-|EPL55<8!i#aX1-_y}=0JSVgN+b2h`FuJaoZF!{V@v)>k5&eE z(EPjUNA_(Njdjl$RN>*pj`M`ZdL>U=B5rM;DPg0EEm=S3#$`JWhj`zlHu^yIiS)9q z-*P0J1gR00-?v97^j#{SOdvr2cP5{PJ3&ROW)BZN?Kz`XGA2?!zfJjvp- zfejqs@2@mF`s<9}5{wF{e?3FR(H7%X^;(G6=bvXFRP_chWb^}vT9u#q;9iF55x9#5 zd+cs^cb^FBNZ#4m5to(i>5P7`iii+B!It4q4@zu=OqBQsX1UXmt*&xzWolshxzt^^ z4H?zd)qOiVJE<7-MX&sTD=H~b78&N)tA23KSB=FB>w*V?>Y5SS4Z>@?F{k{tw!+~KSs4r9SCvdX z;Jb`+a&kyBGoB>~TDjzga~hi=c%Ppue2z^pS27E+WcuyzrE~mJKDwC3gjJ7wnl_kx z42CT?H@9kRY;0#vC)3^8nMqbwwrXzf?{853v};LMW?v|K;h`l7J}kT#6MTD$SVuM$ws&P%OkU+waub>1*7o}Rz<#2Gqa%Z^p5DNxkj44= z`68F`x8zAr7~?vG6xO1mmSu+tq_&xwz6g- zqn_;?7@BCEKKJspl;6Q@IPAA--nJRtlEk4H>ppKO_M`qJgt%RXA+glZsnbVuBiz@k zia$vDl=o2%=r9PkZ+onm$&g~y6c>ZN=&}AM^!tm$V-JNZI?d72Qn0M7j5eh6%F!&s zLr2g*F48!7K>TS^5~Zf5rt&!U*ldI$(ui*7Xy^5knxce)ZxgL;ZtBbH^Bpflz~Bx^1PM z)m_!mp;ae9Pp@K&t*(Znq|ewe1TfhDS|V@*91%@8#w=2!7ce&e;JLAYWo>7HxFz}0 z^P^_KC-^|hy>A-rnm@*MxZL0}fJK1CL{*vnSbbwoZ=NjKI@!R~QTPO0MUM9$WsS?Z Imk{3n2fLyuP5=M^ literal 0 HcmV?d00001 diff --git a/keyboards/xd60/keymaps/cheese/fn_layout.png b/keyboards/xd60/keymaps/cheese/fn_layout.png new file mode 100644 index 0000000000000000000000000000000000000000..fe5ae99e0fcb43078ec978e8ebc8ef7068c3b5b3 GIT binary patch literal 20690 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 literal 0 HcmV?d00001 From a32436d5a16e1092d71b3185f17fda303d8333c6 Mon Sep 17 00:00:00 2001 From: Nicolas Guelpa Date: Sun, 26 Mar 2017 15:20:44 -0400 Subject: [PATCH 150/181] Create README.md --- keyboards/xd60/keymaps/cheese/README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 keyboards/xd60/keymaps/cheese/README.md diff --git a/keyboards/xd60/keymaps/cheese/README.md b/keyboards/xd60/keymaps/cheese/README.md new file mode 100644 index 0000000000..8a5b97c036 --- /dev/null +++ b/keyboards/xd60/keymaps/cheese/README.md @@ -0,0 +1,13 @@ +# cheese's Layout +Customized xd60 keymap + +![Base Layout](base_layout.png "Base Layout") +![Fn Layout](fn_layout.png "Fn Layout") + +## Programming Instructions: +`cd` into keymap directory, `make dfu` + +## Features +- Media keys and movement keys setup like on the pok3r +- Lower right movement keys setup like on the fc660m (fn+direction for home/end/page up and down) +- Caps lock can be triggered by pressing both shift keys at the same time (and deactivated the same way) From b6b85ed41397440417106309bcf2b7ef2b617976 Mon Sep 17 00:00:00 2001 From: mattdibi Date: Tue, 28 Mar 2017 09:56:07 +0200 Subject: [PATCH 151/181] Added italian layout --- keyboards/ergodox/keymaps/italian/L0.PNG | Bin 0 -> 152470 bytes keyboards/ergodox/keymaps/italian/L1.PNG | Bin 0 -> 130416 bytes keyboards/ergodox/keymaps/italian/L2.PNG | Bin 0 -> 126006 bytes keyboards/ergodox/keymaps/italian/keymap.c | 223 ++++++++++++++++++++ keyboards/ergodox/keymaps/italian/readme.md | 15 ++ 5 files changed, 238 insertions(+) create mode 100644 keyboards/ergodox/keymaps/italian/L0.PNG create mode 100644 keyboards/ergodox/keymaps/italian/L1.PNG create mode 100644 keyboards/ergodox/keymaps/italian/L2.PNG create mode 100644 keyboards/ergodox/keymaps/italian/keymap.c create mode 100644 keyboards/ergodox/keymaps/italian/readme.md diff --git a/keyboards/ergodox/keymaps/italian/L0.PNG b/keyboards/ergodox/keymaps/italian/L0.PNG new file mode 100644 index 0000000000000000000000000000000000000000..491a4f3883148a4b6ea730c545a1dd4d69c823e6 GIT binary patch literal 152470 zcmZs@1z1#H)HRMGph$?KG($*tOM{ez(x7ysw4}s?fH8j2sLK}kh5H@zMt46(4x@prQNyBDBS*V_}1r^XJ7h4>mz=(;|yHZ z?Tga-f9x3$VHGRkd$Mg&w;PH0=iGZjBU_z+xiCNq0)48tv24Z!;84D<=^mn5BtTS zt3Kj?LV0Z`l;R!|pbk~W*ZbF(hrf~MWuD48dW_5?*=E5J_N){$)p3`5^~$oM`ybiq zXv!Ecy@MHly-ebkv1k_37A0n=vZHJCI2kL6q-J1{JK3IRsjX!gZ$F%yb~1CAQMqFN zdv*fNnB(f=y1!E$x?tI0j%mM1a8 zzhvdDMzvtI3Q9`f&Sb;PMq}CPJ_YwsK3fS2rcvuk6}7T|a?~sI!;s%*?&U&t%7DCd+wO}T zOyWm8)V_Q1fMA;7@7)~o>#mK$#bP!#-paqEVC2i!p3FY^78l1*Fj*M&doWRezp?L)iB!#WBlmYbvjN zW_F%UzdrA3x_kg3DQ&hC3d!K~ohDk%lf1&@erB61#$w91g5?Xza^IT$Ud{V%Mk#J) zwm3!D%x6N9#2qeL*U>r|3NeWOU05vtcf`V%7PGF?&3m3u*&$3Ea>kcQ?p4Y~76nv; zvuiAI<~>W)b)TAE+&s^)mhDfI^mqR3Uriz|*d5V7GhT2^B4|CkOJ7^5s|}TvUJmw! zWIPDOS|Kt_rYV>x9H%p*7i%h=GdOfOo!KhcdWh+Lo8ZL~7Jip<7$uu-(?b3e5;~`z zcIae@Tu)YS^h+{_zt6~(%eIg3&DlY><9?7--KT*p=NGZ1K4<>@X~Oot5C?q6sRYfG z_;Ko)I;ZPvx8AAfJjEU*lPxXo3-N2Iu28b?iouM@ocmIQ8T$^%NfMs%1F-11&rW8u zz5Ou}$$i^XrBbmauhU5hJ}|zivPnR^wOs10?6VhSd5t0sbt z-yOm+Ai0j1-pF zf`I!VlszAwn=Us;{&}Q9WqO_TN3d}Me+A|)`+LZYqS5sk?+l) zL)OtT`&De%3KPdm^=`${(Q`q1)N|G4@)O(UJ;5(y5qUi_^xX0i1cYpE9nSp~ai81b zvcp*DB#SKX_PB-p-DJD)y~97ZjdC2N20y=JSGd9270h^tbL!1DY_r^=7nbU&HHdUS zN%-!@7t(wiq#V??rB)H`HqYkvdLbSu(rQPZD<Sx#so$2tEZNSueNwR z^RyZRJ32czd6Z=nMecm$lu6B7@cI*j*qLBYS-XT@(w&+Wdv}r}CW;&M6&G!0*{{^q z6-W90hC&%`oDX%EO_yc^8w{Ejm@EMp7?eAF^}(M%$HY&)hW_q-5gjxw-lAdObgpn5 z*!rQ#BJCitqKQ82=wfT4(Aa`BgR`{-Up2UOaKfES&T`}RVnP%(21WpgUx@h@f%`XM~|C*8?-&3oF->GHTu zzJ&OA#)B}@gb8ZYJgGi?Z@@Cf`jU4BB2F&Gs$GmMRNQ6~s>^X!+GV`Q_Q+YDBx~$q zD>T7Ty`EpKQO5-=uO+s9bq&3zZ?N$5j`n*9f3a`1c%OUUcr&p#<$^aeBRt;Cmt{L6 z=49f&9URxvXAHNaZbWjp&Bg*vXiB@}O{QIkz=DH6uN5H&pOwaF$&8%0cT=*k+bdKE z#5~?g65HV3e-wX+>CO4aW^=^ZCDgjipwWZQ1(G?mll9|=%BvKi?Bd?3DPj`t55eBq zq2n2afA?Hemo8T6&l3sVVq-n@&k+%mB~yxacE!jK+ws`E&U-V1v}Y>?Y+Wr83}BU8 zOq!i6+f3I%ldwC|^{v;f51kE~NXMr6nSRoqp@w{BycERP@fyRM-+m@nD0YunWNPb3 zx1N&}2VGrVRIQoo-xyCUcB2ONnk@CLWTDQR-)Q7*XAo*wVD*BdhrPk&fzQSCcQuA8 zJoG1YoRM~&UwjlbG`@8&ae;uRz0d+D+BD3)+Nr+j&w$;#@qdP~J^DA!654@ihE#g74_o zEfB8Vs$iE&hQM_BRCkD($2pwFb4fNwPBsxCWnf1`^Tlf;x!!h3V)XKsKzAT-0}8pU zl2;pKJ}gQ7Gu5Dz`2BGctpx|G%oIytwnd7xl4E$fe9 z>Rtw)85`brq1I}9`E)2GG_+017?t|&v0ZG?jxzP+N)4SI7`j^`9lj+n6j+ZyyCR~> z$xuO5US1v%uV-#<-V1`=Sm_%vJLjIctE9zTxQCaQsb*YhsmoD;86)Gf5(F0rg--!? z8@;&@AW7!eXjTCEvE%iFCXld4%H`bN%~a%h2PE6FyVDDwwNq;CAc0=F0U#OAr z*x770mdAO=(rOC|3YM*H6*;Eoz7P#+)E@DEJ5!jjHh@;uDN@SzL}V@Hz;ryYoTUKH z1X6qe^&J2noyUqPoLr6`DQ}c>-zQ?Lt8?nEz6fo}f29)C=y9at=?2nW-eP+yxk^y( zBexrmJyFddeIYlk<4wD@z8I@aZmr3u2zYLL9KEvEapFkn%J`0Mbsl$FpwM&u^dS|u zz?JUsnAjw!!QGvF`nqy?yAR=H^>-h3 zYS@Eq5_2b0j%yT)RxXZBm%iF{E8mcsC6{*WF#^XWD9U1gn@71IsxJQCs+iQ*ftN5o z#W1U`+`0dvIO9XA6b6e690dw07{{9o3;jqp;?nR-8j+)o%|T3Yb~q~ts*KI{Bh z|3kOQoE_|WA#jM7XA}8~aPt5;*sUxroxYcHx}fd<^uZDJ&2rP3k3niSrVJ8Z_=cH+ z!;c7G{0wb01M@DrQl#DGl@D8_-=E^mDv)(@54rXMw$qURF@$}%aH!QW;)BS{qoCbHFbF@#K958R zF7rN<#Ky*U`FtfUqtEe@R3J8-Lj5TUfXANC=U$H6nB0L1#a7U26&n;8GO52-p{jSY z?D-tc02VgPCGV=EtLw$+*@u2trWunLg27|{yCE&wF1oCQ0oJ-U%YGPTJG1ty4Wrw| zpMDQ!tABs>mEWs|Jx@=|<=5O3r)GLzC|hx%*!M2JcUnQxgo&U|!REq2o^j0G7I#{2 zKs?-kAA~jx=?;(n&8D;QwXd~BdH?Lu8JDNZkXSM(%j{WpzU68b#CmrceEIT4L0G-c zZHFEtts@q^F22vIwHxtV_jQ))2E?6mD%9JGU#+jjO-NZGBqEmZ(ZxaZXupfB5kGA^ zvDIBuIU(SqLW2_n;6GY2)j$1beSC>j#Cl$AgFj*^LN&-};z@hU*KEbnaUN{Uys-jx zxn>iNI1aYL;B5#HH2=;FTjs;j1c(#oyI2$t*L7TbM*=HdNI8mi?^ ze0C2HWCa>5aB=EDU&u{>`VtmxhE|b&0lbjUZb~KRRZJNiLd73o;oUs3_uuI6*RVunu{d%qjUQRjdeJ zc#QZdMd`lH1=SM#pOH_VQPbq#Arr74kyATdGSH{=Sv5`&uut`H=u(29Q)Wcrg>Pdp z_1ZNoV}eoz&E;dAL<-ei!r(bQIYf2R3`0TVJYD6x0@)9+zWz~Ay_hk$yPsP{5avH+ zmiU?G4HeWj5>;=-wiq#a!sh=N??nPuEra7&>h`T2jrBDAnbMW6aLpZ^?UdQdq~>cK z?4guVOR%>eGef)ZX*$HoMRFbY)IUhd=>cHgOndoX8DicYPT|-@jz1a2nk|L3`Lm#U z^Y&iy!Ai43!ht{50!JKs%)IAGF4mePI%ZAb`idA?&(-mlE)wt_4-zK>>XfLZN|` zwBYZBm=_{G`NCQNpdnu-KYNeAZ8P5>zuTh96laF0#JvkwVCu4_RKMzluAJ&7YK7D>;xIUz> zaRc#d+`joU7kb@H&_1GZvp9b`Z#i>wTCaLq(A4^f!BNwY+Piyu@BRIq!4J&`?o(wh zNjNVR3l6UruyK*Zk`TSQyTnGH+CIrgvt}j{{x|Mt7Dv$tXy>IhnC9Wk2nA!w^ousb zT93+55`p5r%%pV8(JM}&+nGJCyL0Kc-}$6)MYlqdBwH+xHhx+$BRdttU6djpo%b@x zDca1}A(Bx5F*ul!@Mvps(VPNyWZwT&{d;B`<$9p2yls|y$dijunn8its)B2A3AxjC z#n>M=@J~N)PC@PX`sBvAYja(3WPHgTiF1KHZ<($7fpfv$i;~klLq7V$u{Z4t9ZhE5 zeg7jnP|e*!|3W@$ImnEAy`+fE+4v|Ac@6KUD~a)1jav_hEcP>>CJ768LMA4!Nrcmjw+niy9}e%i zC`G;7o)XW!ZborklGx%TS3U;^VVXA(On4^#1Cp3XOg#Vf10F&WPInVfxoUp7;9BWI zjPz-z`$7sg{X^m;VLhLg@D~gl;AdsrIc|rF;+$tDu0VXQ<)LwT+L!c)ZAROX6)J~pdXLktB{0vQ?JF1Z%6!335czEyh5rF zh6pF1*mYPonVCtE3hE(JjLXZj(K18^V1y?JfoO0`u`uCIyo`BO8Y2<;(WK(cR z&R^bx0U)#AJ=yLTN`p B)uZh@8ZW6?|B(NPC-GUPs@^#@HugCwi`vrZ+Nx;RslzxuRwZH8OE!cP&ER-%xCF+112n}YwT zYCnJe{BSWhYBg1euIS;zF&hZW2XV%VbC2e*OB%Hn%_{8sNMig~7KV53o_W(8 zD=(w4w7zrx$NbNv;TBJn`=8&NnSJdo$`1cKenHU1uT7U2KD5#8m%IF-k9kA=pnY`Y zsqL8qRI9Wtk1f!}D{^G;<272Ad%KQU?z#{AYn3{0Ha~HWm(V;l%j-|3OIX%7-j_SC z;(XIyLpEb|h5A2AR&RdoTPt9j_^z!yUE?0|?#A$6H64BBLzj_htsLq)eq9qOndUL4<53TRyZMk!T-qmLk^L};c+<#tCpopHZqc_~Al1a2q!Hcog`CRX z1xdXLByY;Uq5l6&6?h@s!78NIGC%&Au^;vY@th?(E-7c48rJ7P-6hN2WNq`wR2=B< zJoO+#5}uROi^9Wi)ohp>H!SSzv1Il&zE?hVH+$i&{wSul`Pb4`s%ZmOX(`v&u{xLD zQ>#$#faj{9p5GQ;IHSv7 zz{0&d8CQ2Nmgr|Hb=^j90`;r1_-)rtW__{|Ys2YMRuDWd4CvD8<|w!2i49bCO_fDR z2O_9fqmmWT1A(wQi17XkQmXrF$s*|yq8ek%SW4DQ0ZOH{ZZXvtbHMG zc0Du5kk*wCMRfG^&16my&c>wSc>nJF!lEV5T^cG=6@U+qs|T*h=AK(x!{#K}raw*t zrek|@&*W_`vL%8tpd&$SIr|NdT$b1{Uqblx2kD(hkD|vGb{`zusx&tdJ~kYqOUI>k zP4*XypY~T3jhFWo9m0KaE9j@j>b=qGDCWJ0m9G4}{bz348hV8hAxH_B^8T2(tdqLmhyBqW__?eDfJB#`K7uYzm})han-kI34b`Cy2!dYf z(T<-+kZKC$V|gYE&tA@-UIZr_$FAg8S}Xpc*qg6c-bpd{uGWSK&dpRNiP6~aKWK=$ zCHFVtVym>)I(==jNf2{#ZZS!6h+UJ}3E zm>eF|<2ZH|k7A5#q>)x8wLFGJ6e~QC8^kp<98DOx*S?cFrzrn+_@&bIt_>*ug#PMB&yz1 zE=(Q|172DK++1=AR7fi7|kEQOCp+pC)ODU}()2J5*YWGmT(JbA2g- zT!m`3!j zM2Kt?ptbq)Sllsojq$t?;XXa+hQ#HVFKwXecN&_*xJw&I){KSlfOsxLh3-#p7kJG_ z*XjKVUUyLCysd)d4q}C;+hzR z1Q&Bo@H&yqMp2)p?%S8ENtZUT>%6ODg7f=3+F9;Sc9S$q?YG>UT(%bUA%ax6A|vtW zGj&4=Y{9|B7@+bZe89_Ukiau*PM}m+;@hqJ_F@ife4|GLKZRc!%8YznY zaI&kXVyS@k3`XZN*tvM+@2fnN!1DF$*CPVeHTR2JOU>b*UrJoQ1qUMmB}{PM$-LoD z-h_@hp92qO#w(UwcgdE${w;73+{Yr$VF(el*cJS4<**Q0)%t2~H21@-gFa}P%G3dx zDW8NP-uPk9_5QNW6%o?kS&jo9zv)=gS*wr!;)VS0x$8Ea^sYY%PT#q1lNhq==fiuF z?3?GocHSix(tr?XvR9NwwzdiO_$Nq!QY_}eMQ`#&K83Cv*g5ABVCNj(%j_N)sTaNO zX&+ctjIo#;N@36ZgDNEAUiofk${n-d$qLFQeXZSw^b46jv{M?EL#<#u;-!z4c{{Ui z8(&)p9}{iSF77W%)@4H9U^#zAA3B(`Ec7)ddh5S46P*qxXX^c-m22Fg@3u*+8nP{5 zH}?V-B`^eU&aIxRE2h|%j=4v|`r~&A!EmP%RhFNy(}D}8VF;Q17`PHZ3PHhMiDJ+? z#bGR3wNx+13g^9X-M9y;HIj1SPE(>$!ZTJzKKgE7WqX5Caq( z-Ps-*X1sBSu#jYFx1iU>`FfRt?nZc#cCp`frKlfpmktT;`^jZfFt7dtwnq0)px z`=aY}H-39sn2euuMF7J=QxXZAeXWl1;OKm1>b)LXG~<9d#Z*ZIdF08UVCS@9&a2A# z9vvRppfBTH$Ae&_;swqp=B*t2Q&yLb?7C&$AG2LbU5L zSw?4RX;|=g<4N`35$jf6lS(7IVwJ7GzsZ_Xiv<-f+Y1QpLp7DlK4CpvU3Wd{X^;4k z8J&M;1Uu2Cfh_6ru6ic<=z8zyvdv`WyGYqicQX>Tb?W)PIl&Ud!$S;T?mGjavgB3b z;bdEU^Hj2_8R02DSU&zC#*YY8YnYops6x)gSGvyy;esg%_4kRs9I37fdvC{!Ilgt3 zaynL8Mh<)&GOd{I5#MdC015sWtnNJB>S9Il`!mK}<>DtpTQeqIrh8)0BN75tBh*|e zzE&EW-xhSzBPAOm6Jq(yC{p7_|60<{y*PT6%unp@x7rfEfS!_{ z3r;TFM+jp~c3xQRsv%{Pn~El*M+MLfS_>bp!bV=H%t3Z4x;8pt?3=V$>qoOgD&i&0 zVi9m0Z-*xSsJ7(Xe37$ZbgLao`(b+16KtBgCpgGR+h^ZLj1e@8b3{!~GkUl!w)YhM zAN6$a%|-cP2L55>^&+ZSPo&pgzdy7^8)d6o9h;*sIZt{V%F7>kyfqQy-JMY!hLJEo z$=w16ktrbBXz)xj3707nhxpviZR2hiPv^kqsQw7~O2YC=g!qJ|S*K{ctcE7%7S>kA zGS3d>r|t2~AX1#JG-ad6m$$a)YVpTbLVLbA%jB^3#%wLHOvma)D(NGt%Zakky(dkD z8A6UChAWMi7$hd0CDmhEi5fkbDGu>cB4jPIo5_Tpea`>lgeA;h$Gjs@k}{Y+CzcC2r`}l;CTyZ3*%GxK^-EmDf+mWV>b? z9}%LZrZ_S?#U5E35aXpr=&wu-(E#Urt1M3fkRjgd<(Fm`P#blbkFd3$~m~^b%UQjh0u0#jz2Qo2Tv`& z5dHEv%HJu?uQ1&dn~5yc+4k)R;^aSl0**QZ#~VLQ0q)Dg4s96QK%)hTnE^CuqMJUH zD#Tg+a2m#%Q*TYgB^31J2bpiI@|`{qs!(S>Klzz?F;My>If@?NI#3N2|L_s;A!?zJqsT*9SSk1o2_?) zfdJ;?G)>CyYBClz9!Q0Y7=7lmTWhJWR!4EYj0IgyEXy{$xz2V!j|w48(f`<730Utj zuBple&`j`(0pyBZQ2#!V=X%d%88y=?>1>7hw`nz&}KaT~1N40y%Wg;r1^-Wlse>d{LysCXR6ntMQ6EZZ{^5YlG>A3J|53 z;h(#kZ?dN}v)~TeG2Tx_pVY#oT`&H|UNX|e?ys=c*`h2MljCVx+#31GSqLx-tLL8| zUD??H4bVM5?7J^M_y<|u;h95!5@pvFnqUQ`^xf+3lT;+N`^-=O^hPyU(C317&Ilj=~_5@>E3*nO|2wEY}>ju#2DS`LAdJrjL)Xj?aiPsb` zA)oWQP*i08gVfG_C5x;WKB^^uZk*T4Msk;Vx`)?9goJ(Bu)dM2X%a+w%~=L-sC61p z(TM0rF)1FJ9lq&)BuP-bfO_fC#sKpd^1~~W+xQjgMwm~#LGLkU;WASor2@Sa6?k9N>+e94NLE{rwyBY>KNWBmbKC`S>r?CmpJm;TG zG}yMF^Rx___FH zB`|jV5xEIcelzBlVJ-D1V#FmAI66HpP(MFknDwu3yE`D?1aB?`w_)C<_`pfd`!=$u z`lOd4OV(wp)8wzRCYX^I^i^1{E{_Flx2Db8n<2*%C+Z~zZ>ZLP(ZP?4!y&@?f2oF| zh~RBsaMo|hCam0@&Zu_qf5+oND5mo7R8c^gjOC49^rV|_OPY@igNZ81R54!cPN_l!&2|@xBFM|iea7Ty_^dVJK)ruN5+w>4s5`We ztPq(YWsJIz|Mj+E>PXNKoc8Dh-6ZCe<8s$=h3QHLDGI52et}I|Y{7dj<8@-%kivp; zE7c$1EI9Z06gUQCriqSGSN-qM{8T|LbrfZq0-JXF-LvsC)4a8W;0)>v?4 z|J|czaDn#mE!DLeXC~y#*=aZ_U4;1Ij|xSrOhs}K$fDkxb}O73G`idiNM$)xJ$Vde zEj!hl=F%6&^!Cd(z$JMDe_zA6;%6p=$0SWvCT_pbFk(9}wYa6-Cg<#2L1@T2Vd?x! zI((+PySt#VUN($0?`kqhAWsydIBlt6=H?gC@9HmgE+&fJIV$W|N73x1)sFr5`&>cWxnGI)D%&UEXRS&vbv^*Ua! zxRb0-wN0L)Xk~M4BhUkX1>)PShu9qzOzIj}m3H$waUbdq0?EcMKc2QP4$ws1g~@rb zADnlr6T-AJzO0YI3>-zu0^TdNI?Rthym*$I>TxLVeq(q)>&Ni1;v?D&0iYj+ULI9# z|G?F?>_r(rwmnA0U*$$)o&hg}UY5C4M%pdo<@8Z%Taf%3kVLx%S$5s-8@4vWFo(*XR9IcKyV!!Ywbi%?AY?? zO1G{-bgu3lpPteI3Ba`WTYt6Xx{0a2fg>(sp6fDJHIkg&%V*&>mrqsdvVnPUm07;F zZQNBpLs9(2bo=PUzK*Les`Q#{7ArLoGpWtgpSH#Q$J6 zRP%&u)^ZIoE@rP*Lm%a_2heR@hc_Tw*#Kc$(LfKb1A6tXK;}iDx>|1K`KM{)voCCk z$$qK(<9Z|LS1T~pTLG=rsBfr|$Y};1e09D5Y@H$3a>=|umg{T<>kc#!ha_X9!I;zZ z3KLghYZQ?v{Ujt)e8w}4O>I-RQhxf$eR6d1lZRhz?eBOqw{0+_*67r`hKjL7J0YjW z145qUL8XPfPVyT(Gt7jcE{7!gPi{3d+JAs~9&Z?5c<;>}6kUiimpiU0RMzr{@k}`= zt*z??^*6m}o~cna)#OJG36BdVcpk@SD~R_`LBxNbHLMVm#Xt}x>I!n2)hHd3KH|Z_ zX{Y0l{6}LH2+nL%xl!w{r{v07r{vznK*=4XIh*viv-GQg&B8^zl4pz-F-n1Wu*1GR z5A*Ex>2fMj4dQs2S~&Exs`KEaXjVh8_Iabo>CtF56fKvWES%Iser(zI{OlDDeDR%^O)=~CK+C0fnolwSsVBna=hXe#G&jFExZ1^U#^ zARCnyyPeRz$-@7fi=g^=0A%ZBc7vp~P8$@C)^S73qSV!8MV1kEhcIQabU!n#cbNZD zWv&&K%yg?i)>_OPp79pha@Ul3fw6w1fPwb0S20{GLXj9t zZ^(M3)-+wJUL@aHWHWns%zxg!WuMCz^?N9_$U6LAW_jKUTDJYR=vaLan7fvFIj8mH zG*qflp>wP&B3p5PN`-ZNE|V@(c{xqEXoS8nwi|4H+j zR+TX+GXAG>zK~R3H9>n|o@xGv@%%}ZOC-{(l7Xp~{{G)Y7^7VYG7shb*k~zL)hIEr zhevaiRMAPQZRT?Tm#$4o#WvI9>M{(kb*@nri=rTqx+50{)! zyy7;$+m+SzsBY=G<<}yEA9ZAC{ayg19rBs9O&MTa3mMvYK95Qqfb zYz5#GF`F(kM=9-@8TM3^?~9+QjFTbYMq?}lQ51S^m7m1$m=kP41~SYrTqt2BozAUK;U0s zDvYX05L15tnH$DR%NImF^F^B>pM%?AnzLk_JS(#)i+wRH;sux1DN{lhk1rjXIJ$sJ z3*MSxYEScC>bh*> zT%o(+T*r9TA{Uusc+0R=mLfgKY_Te=xn_g>N&2yv4pn?cZ@6C`KT3NU=o?O0a{w2i zby{y^7pS%_;AX3-rk%Q3@72D6#LqkZ{}LHCme!sdXh{mL0D12b^ZD}@*2hB?j37>2 zD(#T*S+N46$sShZv5%H4dWvp1ls2SC zTuXxNz%b!eIBP*jjMLWMB5YAP1YKrlytTSNLQnJddQkq0 z#3B=ZaDf$gDC7_yh-V38@CvE~&f$|A)`yS_ER`UXi0{Bc8VWjq5%d*eW*zQnasJNY&u-L}hesfCzln9~Vy<#VMNQ#(n0c_Z?^ zE28n!uTTi4cMk^u_z@)>-ec)e#W*QRC~>fB#bs-}Yp9Uau4&<(={Oqy2(OW=Z^~p- zjq_%i8O4CwX61kyA92d|TL-G@BdG|n{JtA_e>ri@KDt=9x%2!GnC8`M&!mhbY-N3k}=r8u+L-_?> zn+~%fyP;j}ZU6-|>N-GLMka5JXeb$7{H})43AUej4gEn{@=UXMiTtA)dK7?wGMF$U zf#*$Qf1**0$pK8`f0{@{Z5(pF;88eoo&4+;?V10&Nd@(;QoVYNdIHb+dD;6v^lxgd z!mO+XCt>3}vkL>FU(e@Hw{=GWu*nLu10C}?p_<8b&~f$rRVA4>@?G0L&wiyP;qlQU zs$<~`on*^huD{x|Z6HW{h=cqD{CR%ei!Jy@s%O9$ltKBemz0#CI&SRypTVz-lGn3M zwgu#UV!sXq`R;2F(|Sjek%T?u4wCHviZ|+LdS!MBnXVRiB?=#+8U|m;wcw4b;)W>> ztKz5Nr1Z#!n@gW@ohq}z7x+7KT0cB2bgR8n5;q+uOZG&?9VdReY5$%W55pKzoYeAW|@CjuxtV*gTBS*3I*hu7_(&$ z(cwd0=ej8WHW)qa+?|~{Ceye|OXaMKLV=i`;^ErxS0(kpM)?Ga{LIYb8CdnlRfxlI z92c=s<%>QpA)Nm#*Kn--{mYE&!382=dn3K*Go*^fN|gkt|Ux^49Pv+i=QNUv7Sb~jm^r#ph89?0V}g&^M&JzRj)JwJJ%k=Olj zyeo{f;G&IdU%1DoYkh3KdBIb8oce_GF90rnnHf6Jc+tnAty^tZgt$LRQ!~kcF_bH% z=RcK;bXe??1v)A?YEfH`QCBT4_`uk+4<#r_;mvQmGg1O^&EKwntp$4g+KTGXx-t)o za)kB|o&urw#ZqJCKVP+5QmmWdO;U+fcUewt#Ff?2hj|Bt0Qb>D@XwSz!LHM6p0Smj zFvCqAY$BM~Melg!)&!!QTML%Zr?Sc8&ACGqPAQsyLP!~U+W+AO`4|EzIbnFUn%g+9 zf3e9RXy{;&kuS6P(CM`l#(6|{sJ9wWTJLaG#_GL{=aomv2uH+?b1-CMR2__&xhE3a zGQ#V*x#RN(u(BwTR_&NBFHNuoEUqhT-J(5g=P!;yIX#=M?(h7AH#ILyl=rQ?RQE%j!AQ` zBBq1J7j}nl;(UIGj(sW4Q$$VzVQ(+Xxjr@o@Bxl%eee-RAUOUM*oTk&CW5wfyX*O{ zo}1uf{(a-LVgFN%J^TfR2Ez}F`_~w^t#hU0yn1(r23VoZJ9iDyP>jG};y5BC4G7{d z9xK27K|-+&gpDKFtM@4tem4smzEn)*K9e9C(x8uWxGiK&ndP~H_RpY=IczwIGuSY9Ot$e%2sLd!$DeODb%CEbiZV^ zf9>W3B!}z`GODML|*JGN{xBDj4SHeMfQ5>=C(Js~#;0=OCRrnL>ZMobng%v~?-<@+~o|x#abluK_ zF;n(oqEmvRaC8ble$tlq%dDG7ms?xDY4%Gi%3@LcwzGLvY*^tj_!B<@fSGq}0jlay zAk(okFxiHPKcG~vuj(_B^lgV?LN$A=Zdu$P&%D8>Sh}k-l_GxSv)^JbmzSWq8|qDp zjsKz9e$y)i`(qtXlmCDi&*LJ6+v1pB)M+cr+tXh9&(ks0`AkhrpAPkF@EQ6-{8JY9 ztj6L6IGoMFt;q<3(%ke$n<1ccW$zFuG? zGxUXJbxgd*A3D61FqyTI*wKSm@FwakmDf-7^$WsGg(AxRp6G+CV0h)hk55Aw>qpc$ z*Jpuya#__9Euj?tphw*)_(OaX{^*Qi4{L1NA75nYK#w0-T=_tMBMJO2)=uEfafPXC z-^h_O%7{B2{=;LT#mFejzs_OV54e+$s^eWA`W+x=)2{{(Lky9Az7X*b_mN2Cjd$!o znVu#yWLc{1+ z7z|}?n8+qn*iQfw(Sw=hx3ewyGMGN-;;Sj*hR7rV+i#iOwFVEV5*JGB#YfY!s;$5J zLX?|si`&jVl^-PKQ?geh5BQa@_?>VR%Y2~w9uP7NUBVy1Gm_rCI-T!6{;srC9$J|#cD3!KsojM#Pk&*p;Rq)Y(8~VP z0e!!}Q{Asm2Y18Kt9dS3q|>O79Vw%qFxbKGC;o!=uU}Z7)_YKr-fmy1-u2ij#^gcy zpo(^v5qT!XL6`N-{s;b*P&93nWHC`_IMaVhTQ?L8f8n;cOsC9Om;K01zRyE0S!*V- zq*z(jWWy!R-D$EbiAN0kQVZu~XX!mHE%*U^01vcJ5{Wy??g9(OU=m-9Zk=m6xu6l& z-31$4-O0X1v!v<~cp)k?l*M0fegS>LT#dY?90t(+p}<(hxBv?wq2k)3g2 zPSG!VMVng?)Jrr!n%KyDq}!cI3HUIe5(S_Pf^7}3Nf5x)A{~HcX4fB^+vUXd+&Zz% zxkU~-;3#X#e~uXvF|V2;NI34@>q3KaSw7+!2DjmCJS_na=b;8(m;CMN@*wr)w2l=5XXSNu}~3DiP}IAW{hKab=&5$Pkq>=}XCYxO_=>w7nv3`|Y=>uL(!1=xR%;l{x<(Tm~3Wr@#bMq8tnHk zsK+^reZ^>pIPc-!l~ptP_h}Ly!|io^uaBPG`e*y3xCi5q*LDf4a|#3>Ua;r}BS$Vr zdKeji!ftc16!2-Sbz&be-l&2G5TQFKvB_JVMC=QykRKW&n-`g70m+!7C2^xp=1GQ2Kgz@ri0CG!7R$<`;DvWga=HP%QsPrX+o?3f{o}4B zz{Z-jDnXnZ(1ljS4a+`R*S%@MF_|O6rxeM(ZFcwD75KD^3(Y7{>8q29v^PEy-%_4= zBizOpX!!%!4ir;(&ZNxn2XrI}DVbUK)#W&B29vza+BKAOwM$ZG)X&#eS2t*BzG!UN z$f22{jM)sg&$0dv&R9nTxHz=3-vY}&3A&i~^Y4!l_gi7W6LB0b2|l=E`TpkoFhLOB z2TU(y5ZW6+JB@9dRM-+ow6jumhpy1!oSog9Oa^5SwgJr-y?bmAHR?nAI9ON|vzO^T zbNeLT1z>n%;ySO6%{4)jX4K7QN=<`is+Hd6o%HxCt(9Bu8H~43W%TgtcdJvviIKO{+$Je*U6V|iy+EtF2`3mw5bAxXK$t!{+3Zj9_6_RbEotsz7ql*7%w z_~dqPD|>SEbr%HRgqD=t0>UU=i@J2LyQf)iYN#0RXgohQIy$psiA7x8V4;b>K#%A` z#}nY#*JJPBAwdf)!c?u$!SdMH*kCH2qMY2AZY}#^00RQ$4Yy87V>`1;j>Q+Kuls+` z@2w>EVRSHkJg231T7kb1m1~dv)z7@6n*EUf>F=*zrXqM!%_r&U$*fz$cf6A95U6i-UWG3=Mvk?vni6ziEMzzy&O*kW_m6y>@-0OHb9L?hUkzO{j0NsDv<{!#$ho3r9&?NH&c$VAI5_%Zd(_|( zjyIwPE1WCdFrKT5q-8Hvc|K6~i!rSqOc?Gzs;}Q@)8X7a-a#`&M=j2q_k0Tuq9XbU zAA$eBj{w%;fwR5J$bObl`v=#AzdkKKh?S%W;N}?RZlbhgrc@V-u6983#dyP_z3S=Do5!n3rH!lzxuF z3^g3(kb1_1g4hlE6XyxRb^rsLFzl+dU)qU8{;J}}YrAPRgO_dwU-~Dd_mKfp!3^j9 zsJ}1VRh@Xu9OB0k*nC__Y4^O4#*vKodeAboAqy;rG|TKJ$Sq20UBnM}RwEDyrF-m` z>}??&-!+dhf$JL2pEzKQS+kgLY%-g4(1tf%7QEXNx)}j2d4!g^1(y;FRSDErYOwwL z+oxNN7N~&v!ncZR+2|4!Z_7=z{GR%Mpt*W(YkFfkMT+n2;{mWVW(&-19#Peumra-J z58QE@*&yAk&2IrD*c4ixy4Y^R&aN}Y<1Acf4UXCg@FKB)b5dOnI9czi_g5^{>cZ-I zv!~e+$MhX15rJ$qS9}{I`dH%J8+V8B-6qBiHY9nT zZaj`?=7cwm-&CWdAwdw0{2YD)LM%MHzkf3yY=j;|fkdEq-<~pR>BgFgJ;xBGtczAa zhS}gbY~(#dS9`o^?u$8#YZQ$6?*i5`d|FWef=d+Vs{e?r_isZ0$B;4HoI!AN!neP5 zbm531udS&rNJ7)=0*`qwYL>vOz&y_R;dUa!6UhnuV^SaMYB8oyQt1UXL^sFxtt+lt z_GO1|&UUnh$3>9~4&TxDtn5iwlT$t1-Hochyt<1D(;FXK`E%90BPJZRi(;GR!KZSv zvFy!A7Tv0mrVaK0Qx154Hc)GdPM<%@LtARmGVuYx*xB+Nls?GA&bC&6m;h8dT%gV9 z;QwAOI$Z9tr=ivGbqW2Gx5u8(E4ERk(ljP!3-Qwa(|?l{%EIazI6Yp(sOM_x|N7(d z_bp4NT}sddxr<>u*WqM@`{7SR^R}=NR~}|IwtM<}!*!PRhkm<6t0u< zu}I&nmmU~cNDw@9br|JxzdTR03Nye`aGtRx$f`$DY@sZBcZe zZgVf9q$$zEaI+@NYnQA6*Syd#F=|b~1cSj0>~M7z(P_LTH0WOnR9~pB`hxPeKX0Ro`p8mZ5k2Xk|&+LF(OsH z=9rrH-ol8Ob+Eiu$V2g%b|-wgg(Z%CB&BjM;pPRJH0hqVB5r;v|G)MQr!&{Mm9h64 zFYfyZX9{!Y+;ubmtRJe`|2;;>{eg<7*%{Dhg_A#Pa5iFB@&D5{XzaGK{n~}kbw!4T z5X>G5XKiz>HTxgmDroR%YbQ)E%F&2%vJCL*Eqta`HE1kLb0yAp2et2aQY{5L)VAps z3hjf6U%w6Ng~$84(9Og59d|V{ep5=cc1H-C`4>EAhQex`SB%0Jry@wiaYcD`aY<`7 zW0#UEztyQ4>>p;h-9PC)`Z*>+?naN0y5abw0e@AdT7l0?_Sh`s&>NTMm-;6VB4PWD z^0)gSzgTjE(dXDx{42^D=IhDFo-Je+sz+-c4^WF^JtP7Z9b8cS_IR7(9;_Yj(4jwVW_-W>B&%!oKhhpz zjY7n;=-4y&S9GdEGu<4Diktm@5sWntP*5-ly4i03w$6?zUP<&SrM6)l$) zywuPh$3fBCJ%&|~pNWh&VZ1)!@m^isp{V77UCS>q)*!L1i$3DhT(C5dGP&EHKr`Uq z8w9a_6?Dcgpqrx%_raI#`=ICAggG0yTZ6W^Op* zz~HgIc}xb!a5Ye*Ga;Tam$d%XC>rN3@V??|=pIN25)b*$0pt?3rB-$r7C!krZ!qA& zQ}eU2z2>HXz=whuv)`QX|mmnOvv)`L#yBW=p^g7 z(XOPY)1pcA_PSrOFHq2fFe$l%t?z$_jX!Gl+={J2lgKiL3QPk$8Xkcsf`!DB-}HsK zPddW&EN45)tKu|me%UYmmO`))&p&Rz|95_Fa{tDb)1qvy!2+9bSOV^+ za>M^T2`}z@yV6_&a$X9LIPjXi=gPEuXQ)ODOa;xXzWwxAxqt)9ldMa0hR2HibAM(& z>zf@)U(z~6lQ|981G;GfGU@?QVjpqc?lUK4(Hk^2`#>x7x2t_uqlxs_8THDRk=sDN z7424Pm;Tt)G(BvsT{!}LX2M5fu?(%a6Hy(xp{vm_IVw@T#y8LzBf{2+^ubHDB3NdKkFmzk@kT+-eZIr{$EYx$Ee zxBSaneD9L>H;d%5Qc@6QC6l~cI~jMcJM`WCHS!8NJpDnRGMR{R#YRo;ck1^MgtL3ue8R0uS9)M}DB!N%I2P9sK`k_n_I$L$S-kis z-oc#=L}d$%-gL)h6noTx$G;m_y*Dp~6T3Cx*8=SpTG#~tkz!gl%JuJ$^Zd9S06>HD z1Ec@)s>8QAlaRAzjt&XInE=*v^65V`o-VJ)4P{LP&P4>E^>K2 z3&*m*Q!~{61kz=y$gRm7kiXpDFrDu&jzb)=RPi)$_p-+F48SPwnq$gHxCp3feCbWUe1r4I z**G~c>~CP)_&EGp7uX<1EdQ<_!E_J>b_Tp2=uKeZKz!4RoA=AQnm8DWu$AvTp5sNS zn~i)b=I~RLpxC0JqN+cszJ!ZTf37E4?OjtFo#8I^q-$-~>c`te2UXRe5vUw9+bzy` z=BfoB#0^{q5^}?^4=pVO2d~dpC@l{bsH{d0WYJka2-DkwLYZB#xO`y8@Zc5B+qt>V zA+`)!5wEd#DTOGKCsxL5eGZy6W>!WH(%L!`o3?^|4zs{`@wE|g%J0i(tDXiaLC6KZ zIgCiO*R>__OU=Y`vXRgA%fF#=?*Jjp1nppe9Eqq$D92F`5*Y*Kl5#VDSM*T$)C8bGWR5ET)2GJ zW{22)>eX<5JFhp_;E!?IDYRJ<8*R(v@3vj4Q}yh$`6SMNxbQFZ$MEJa0(^#irSTZ~ zh1r^sNaxausrQj4iiy}B*cHy?iaa(ND02=K#}{i}!la%8is>0m>C63h;+uw2Qt^B} z$9W{Q7msQsQOdeQRluV@R@ytKJohrr!R08@l4bwEesL>U{@0b>WXDy5gEre3I?*=0 zimg!b%jt%>RpJaa@-#`*Yv%PNHh9#kM1)r&Gdiemz7!KeKs|63VhE6M)UTm)zd=#3 z2NYvz(qL1KPS$=v{~B+5)d8Cw@UME>&wc6?t`lyV0|M3~?YD^`v%=cnFuAjQL*e+7 zjfuCyf&ixT7xE5ArOW-G9Y;`z)30WaQ{+czYrc2Lr1G)3(=x!NIUUqoYh;uU%3~W{J(2_g;4Da9H#7dc8&#TZ zt^%a!R~=Iy z2pwnIOBe_>W!l{5q>4y`6w}QhN=$D0&Z*HM9yyWt)++@OeAd8ja?U>U9OYQ|0(M^# z529)%uX1RhgJh~o_WjR3dB48_)L}zdO&>_wWv=jUt+20A_xg+-F{y4|&_p zZs|l7QuQq|;vB_RFZx{s=nWwzg^a#t510?qcr*&dh?n5N+%@a;B_CcZ$?^F+{IO<^ zdsp(q>C5tT)uWN!V9Fq9=6LVc)!t8y{t2a*Cz(vgq$Te@`z2uL&v5rU`mbg?w#cWa z{*B9W#M$U_td+#co(WupJry@q^Q*YoXO3DF>}G5H^>ywS6J6!RIty(&BGD1dGYHD- zFF2ERzm`KmR2J-rpuy?7pPl}c|83|Z4jElRz zNlSP%)1l8OJI9NI$vGA)VR+_F;)^3Xv;%fUaY8_Y#}At91Z}dv0ym$uI2NrHA7XNL zy(F`HLefo#urAqCZoLt>xftqgwfE)`EX4r0f@rAX;gudN>ck5ouI$+{aCd1&(9R2yP2szBmQxU48_e=7a&= z-M~*BE~;b4Ov%3|#VufLGc&u0RnHhCHp8vlNvBw#qkaaz`T5?9?%fmZlJ)5j zf5BPmsy}&7j0Pqwd8Jxr9V$du8)p`!>W^oI76RGOuNXJ-`(t%S zm#R&2ezK?tr(KA*!BhUw&mr6Pu;vd}w0F#+I;qV_X|Zlh?%g88?0BV)%G?eMSJx9a zWE(rV&u|E|I>RMZ;fYond_iM0MMwF=*Zr|H5(Xpe|2Br(8q0%)$j2^3OdK_IwB5fk zGqjqA%KfPaRLslivfX<{%;ZdJ5vmP99W%58MC-!tG=BkIGV;tH_VnHf#yR%XJ1l0q z(~?xh9THfd@B7lQkyPUzDbUpKu18jtS}OU8Z_=5an{Yf+ufmI8-^d!tGoVvR2BdCh zD>I#t*D)rP)x7tr1{b!+J!-L+KNwMo#ml8|K&Ymqn5~wo_1`7#792qgy}S|BIZ6$fE?qZX`co=RhitaGAtH9a&12UFbDx*% z#|bSV*!{nq4Owu;--O()|2w_lv+lA(q`?GloF08ioaVPP+c8-Is?`01??IB?rkq=1Bak!dE9c#T zDMO~Gr(ip>mw~{eW#4=AAdnu_Mww2!tSuV5G>bSv%tto}*bnjzMA%EBUQ5#-`;zGW zV^5wB3F#ymrjDD8&t9RosDSmckSmh+P6&BwYUbCE;pB#&&q~>*zsAT_kdl&unZ?}a zld+}6UdyjR)Hn5Pj&(_NjE#+ZPv%r+?D)Uja#n>lSImNN&MrPJi!Af z^FXrlqK*{G61bUdN)0?r_fI7EQiRi4@#*ZcRww`bef&~v+gpA|X#V3PGKvICunQEL z2&lu|F$&}BDtJ`Xo}eV&DRK4XdaA-fb9Xa{_TUy%ZUP^LYlx3$Q=ZkLru&@}IMI9( ze+k%~XVM;M1>C2U%ZnDr5}G$*4x+JU4o2Anc`rhoqCYIuDRwh!EeV=cyd^wEzqDoqcO3B6&134i+Z3#Y);MW zvG+H8q3h#C=ASX181dx;U~2F*MsR_H-tXmUhUpvaxj` z@R=-lhun#1*WU`pFf)3j`RUR6tU?d%v|8%@&{A82aKs4aC&6;apgcP{1{1^g_ux9E zc>!V(Rx&bE%O>AgmE5E?$L)8SXuR|D1}($#ubO_boz@f@39zL|B9 zMpZCr<+yej-vIlJ$JXu_I{*U`U0 ztTPa9OD18*K5>f}3%a_~Q=&I!Gjpl)?|nSsaMyu4!FtVh&sn?NBKcH)Ku~$O)hS1U zo8-C(4NdVIK4lFAbb*BR&*(C-G0YB2ax3ADs1I;4+8g$v!KvfUV{7@2_YTzXD!z%= zqeR&aa>VCcb+rYGy}e%nuzSU=>7qMRhAp;~FT&cvxg*)~*Z3c?Mf2-t%h;Ec-Q~SP9lQ`ldA7AmN{yJg;?UMCprRy`L+e!0yXgSE3WY zP0Ky&J&gIgEDs{Tnk7NWpy8`r#>rq=-^wgeeoIUri55^Pk)K(LVS_HW5VPYPJ;Kr< z_F)mX%mTl*IcG<~L1&d(sof6(U9f4!az+$>r>F%o032{!Z+{eI%0 z@%7w5m&9!@m98PoeY6$DEsg&X`*|lz++6-|aD@JVxJ8*mVnFH+co}NCIu=^=s~%3z zD}d%KBEDOtFH1#wc|=AdAY>D3cAHZF;O*i!WgB{{`BzoP;E_QbT>0pIAJ_r`fX{TD zoxMlS4q7zsk5?9YQ7q)Q&TW0(Q}e7E#Sv-g$B@j_5M0Hf-_WhR!t*_LlFPOqi?!8J zCL9DG@1B4O54}0&pTG-fA{Bl$!wPDKs_)NBr#Te$zRO_+vLg&zbm_TL3gdNTfL7?J zRc+v2XjteHKBzVhTEZj;4!Lu`6cbBsmA;%d7Yer3i}*8Ci*eXnWl)K2p+s_hIDpHR z0z)48d~-Zv$}GN)ZeC`&HzI5gHfZ_R?nkF9k`2gt^f2%Ed6_`0K^XXY>;FxEk=Teh z{D;_nvC7%lgA@V{&-M3{_HS8wBt~%vr)-;rf-}WaUobBpE1MDQ2?*p2(7a1{ta|Uh zyPL|2JEv00m)_KyYY%huil@9EFI>X=u$c4dcazk1PpHz*L)1fhUtg@UA80hM|1lVu z(c->1)~mWO$VL(cKubsae?u5dc8@xL!$B^S&n+@oLq#+DB_;#*g)2!r*ps{%{|9MM zhLJXiZPl9)H{FK@!c&YR^A&ESn3khi>06+~iTG5@|5jKpe(@ml0u`)%9%Gp3yvYa> zMHwb6i5Q#z6tEgd*ufU1$kkrAMs$Ir_#%d(<{fbnu;rx7)_<%uwXC5;0x|xzTPxNF zB_8)+5Y1^h8SUBbl<_t%Kovk1@` zQCfc1DMxpADCy4pRM-OTZ!&2rla36*!%p{L_%9@f%nb%4@g+Upaa!Ed}pB znJ-HyT^|+!_e>tg(Z!U0=6y4_qBz$B&(^>QRMXbywlgV@ zkah~r)q809?p)niG;I!koh;e9MFkb-uXx3U5z;(Hf)nZ|VPvqCIfXA9dV!MX4uqnF zCo^9-MjWnx{(7#8E59-ta}^r2bC+D}_}|LbaWKCxy3*U)C3gkJrT`5hB9~xP*5GKc zo#EqgmaQFpLJ zVEXO|*tT9n{v9IE>)A^AmX~VdR(IT4u&{O>NWU5Hzi%~kPc^!zED3QFHW_c~P1r7d zXu1V%s%8~^bH1h!JTN(jdTiTH?7SfI4*HNyT4 zGNmo0;BXMzB%0l8XcE+!-2a|9nC?GReSsHU>7cB^92 z7yGic)T#ejz>4ko@Wq5(ebmuWNXIH|VM+%`Y1PHvA0AVXZlO6`Gz8)q9WYE}PKlg; zkx3?~vedo-ypSfHrLp;EGDxT|^Q|>|afDuge0aYww+agT*k<9d01Q=X_>QMe?>>MGa?$8{{EO-;9mn*AKNA0w?|<;3bA|hE z7ss48Hm&QwBd9PWaCi8N0H!tZRw=6LP|sWZ^sIM>_c3Vsld8XMrIRK~LH?6;dxjFMoExLM<;+#j{UZtge z)44AwiJ#?FM8w3Mg?QnI#+zgu_fQ7T{kx@Pg$b7TPNH~Kwa3dogy_?V<{2(ePEPj5 zvXPnP(2HR7J$P8^!mnm~`07CFVzaj8J6_MT>%-&LWgtMGHVP3+GExf~bUPKcKwM z*?S3Jg%S-9i$)|R?Rao|@v-#`ZTBoi`Lm&7t8fT~h=9H9X;+Uc)nZ_5!+kGcPbvom zpZ!t(rB_SvsUw12#dM0UCxUyE1!m{r%aA;?%xZHadf7MbY_sxxBV472kFPKHV_fP{ zedGPEVkPT1qVpuefKtde_(ZdINtafSl{>6_{4Z^OJM|jDe^_(1;%|f(%+k2DiEkx2 zfJG!LjEzE5s+bu4l3QTp`_(X666S>W6qg6Pu9jBbyYY&3lUkqbRu;Ffoe$&c$$R#L zz03axBmY#pJ5A(I)CzRp;-y22=&}3QK)CucN|?bs2qQLm)%7EYteZ4D=(yq)@NchXW|d2{gl$Qo~4C zD{Q1zPPTJRS48DBu?YaUqsMOs7iSh2`?At`?nM0%wD>VQ_VV_iXxrC&&pku+Pyver zWSc%P%;PGbWryU6Rsn9`9OY-O;3?^W=srN+se~}~V4>fNjiUpVFrVZ&gk`DpCTg&V zbn#J(Mw%{eJyhvUNP@#KQ_)k)!6&>qcQM`aZe8;Zk>`-~l1f|#`YlS>`Mao?N5wS% z)0*Av7-v@jkYxcu1;m>;5O1piv9Ow+ju=}d^t;S=e0Hjf?JAsT>?1=%6NTSW=HU(x z59BKxV)F3tFzv#ev1n21IO9eE4WJ@yv+d;`C(B8Yh4pl_qSRCb9pj2FGn2fks_N4? zNY|N!eT#_km7mcHj3cG`by>%yecvInV-ab)c z!pE5l>6^w1SC~#DeHz-SVBt}@9uN?~>+bihb!PQSAhL*F=&3D>Z=Ww|5wXita(?>x zN0Z>EyP+(ZJZ-An`Oe+4{F1wH?e zW&RNVe}{+ugT~vQv{6eqELq%Z`mk_RygQcK-ZBV;P;Nn$!DmsOa2i?{$3GV{X^oma!_Yn#soNr>l|EKAkL+9ul(G6ki5P zeghcrSzNDWpZtHTr&BF7sL{@pOTn70Li_`(vLm^DhiHr=WTj=w>Pcq%uQm&;@(+?~ zxO#QRBVj?mzM&(wyHPdAN&zn}!q^+V$-5S(F!)3^`a;Kxsq@P?1&qoPz*`n~Z8>Rn zJZmfzb=$M)E*Np}As_?cw7~tKX#@YrWuK@gX|@KTeSwyj@{<6QpWNkdaeY9U;*w9E z;=;&K%@2uw*{R+SjFSeu0j#>K@`6~f@)*zs&F-Ra%9HIO{sch8z7Gy6ho**w62taF zPcUM!Y(9#_+gbdg(+hQyuL3H0-qoc4!nT(SRM#%Xsc6V1IY5am`pEsWgxGGD-O|Ub zK^wD=CR*~$CC1YxB;-Wo&vq-AsqswwFqyIeX z&prjIT4#jl%wWNMHG1Qzx=|5Hwa=0HwvauM`YolmO?In83OSDqLUSCJ{#l z(vWZFL5MIz0CS;5$X5u&d7HbXj)P&WJcqrd$?mwI)nHyOB22+EH_M zRnr|0*F&-LgO>vl2IP(yvsgH#7b~o_aW`S1&~oAM&RwN92sOxXg_jZk*Q4ZQ0Yjs-XM(A1vd`Bvh#o@T$XqhrF ztfq}OF!t;C6_Fhxi#sGaEfC=bnUUDrNiP{tHuAAo#LBkv1NofQ#brkxF)<-4eqP}{ z`Hv&a%jenRz)>et>^r(qioj_E&{tU@kyK7bTlv(&X9GO^<;S_aW*K&mNkr3>U|A*K zZnL*^t4AK4w!pem`t6tXv-llIkOBM=JWn|r8pxBMhC1p0tu8s(W`^!~ODm*;kSsu; zmdc^a_CmUQTH2Pn^{W8SrW}I8i!?W99xm0K*Ma>bL~Fy;hcok^RlxB*O6&Adqr;+X z#1+V;I-2h}`&p0+KAGVUazXSb;KSw2UiZY!Ebsc!uybyvFLo0g#tfM~AK@_z5BiUC z-vQ3`yjtactyYHMPfy-Sgd&UFyHm*bz+bNBG2`n-?@VeCpYRO?V0_2KzuSmnjK24oc;N=T$n-uDL*p z%jVQ#X|YP8Z1OS>HUowa+RqpfM-?ev9~}|n&6M{qx10zMQFbW9XU_tYQV0u{P#F0h zpTKWJ2X=6zQO^g)w+p@Li7@1_g|3fKOk6JZ{^T+3X&{;+xEo|LtziH!$-HRv>40AO zi6xkmGcjK~O_zjNfN`9QOReG?iP>Y;jK7_sK}>6SVB}_|98t(*0MFVa4!~}@<#wN}9hSmC!uG9GlTfz)0+F4P=z0>wXM}?8yZ1V8U#jQt z-;%Rv!j~@cMFRt)(Owf|eO4a9@ox6Unvd{OScvLDTdkMy2`{z?Wk*HhCMQDuE!ej9 z>ney0Qtqw)>bK=Q$hxR_2-%1B54^bh7R&ZiiY#a@XF6b-iBk)?sN26D3a>u)G};z> zJ5FS#MCr56YIk+Kn@`-}xkcQw1CJq|HR<5`I5->695qNl)apI`nfATE5-&EA-W?5v zuP0j+{*L)CxTdY1XZGuJiXdx}_mRV)z>s06Q=ara{7fo$kg?vQ`Tla-qA)To*m%6U zG00q4j?RYW#OlDV7tKedM0>7pq4q6}UhFA=?gmoe4tQ1UWuvcz$Z_J!{v-zWoT&DO zXu0WPQP%_eGYE~#9Y{!{Bvi3&6PFQ_XSslt;!rZOUzqBbr0Y|q8)TO?@xuH$wnA*z zpu+C%4qY>wl~Rec1lp(Tx177U>wo6_?tf`p9(^CjgDP$@>4&E3jWV(!;{Fz>64Mj3?4(s@1XFPr*Yu=tWhUdPw6%OV}5`QFg1aD|pd-4!^QPb>zEY2SEi zWRYwtn?s37qSaNE+Mllf-|qwfIitJ>2N8xD4p`1S-p0ECPbrv}0U3}Q=g!vI*_pCv z@aF<{7l;1moA$A94;? zCtZjrsOCDLLnGWE0SflVkDgCO%g?)*N2kLJ=(y@nvtb?cFc!|uCzS5k_uihtt{|$o zM$`W|VCGjZ;&8@*XZ>Yex<8N?s70+Gbc~5t_@2;%Utm9T!CYcc&jIg>JC}dfq?)sKw6&x0pWRS>1NlBTUAAfXryRj&erKrI>wSw0J3Ni=NZJ}vU z?@a{Kxu$m&38G7oK7yb)qg7o(=7dw(n(!+StAXW z(VP~DXzp2kq(q45vdcXycVjc^Z^npZ9@rHlu30LSnU!(@Zd z9#SeSHO$jQY;u&$|H-qn7ydOp|Jh;b`Ty68Ku!qG6Nqq}@ZNomZGP|^(1_~%VB^_m zs@ryX$hdZLxwKgA-6XG7-^uOc=)$wGJ#cYTC}PZc4`>2|*W*LHI*R;1TEtSzT z606X!#Rx&EW3l`hR(z*G0Y;^?L`Y6i23n7IMFjbAlcMpu=bijTqE+A5IT)CK6h&w` zBs3Ka*girz^mETVwlnvl3R8w|>dpSNN?9zJ4-l&~WaQN--Sa232ugoNQd%`yad&yK zH#c=>>En%Rh+UcaaP6H9XVop4WXEWT)%kY$D!6#{P%aQ6+Vnf>#E6TPYQ)v;c8EQ) zW8FvEq&<=`j-#%Ic114GuhQ--^bkTFPFdb0bC^_PDEqG4bFv+Qnx*s<%8_z3w-tX2fMgi$MUk zdaOvR6W|xqiyYpMZWHuzR3$6)W?gll*{GbK{E7rz_C_7A`_p|7y@8ITXColw!W*?j z*Grd^^S&x4bN-dzsR^VIP_#EQj+bKpWL{K41pz*fHCVX0zgcWyJ_mE2Va*-y1c;01 zlN+^P_{ebnyx_gTwTZH%4I8P>@o(S)K~5qwcrl+i2?AcfmnQ}5sUyslTJ{`RS(vE|t7=y@9s zYMKla-ZP=Y_zbYsuzMeeI$52!C}=~Ra=bA~gw{O%LI&1h9sUQ-qllDS zsua*ff8DuojvnVbH~y_Nm7?P({an7;FN>C=71y&S1*?RFVbSxkYtT>YWxiudc2j$t zc&nDa=^f#L^0doLkf-`s#1aah0Nb5$ju$rhhjdo3E?NBM!KPJ=t_zz9#$FZdt9RL} z#mQiod>GH`aW2s|wSwg?@+QG1#l zMZV{e){o`9#d&rxd*9Y+Ky=V+ zU^Tt)dk$5v*wRGn^5)pn02mDfzn}{b=5KlBp^5qXBE95-pkjig@|!wx@f)7e;`)`T zE31yCnQPD=M?dY+qKqV21ko`_47j43_QihO9x`J+vhgw*WJy37v1`kkDhH)0NhYD< z@WqvzU?z%U;9tWC-+$ExZF`u6_>5VC$yJ%dBB)3%Fv=4_)H)(S0M}0Yrvr##0_wk2 zQf`G8-LMjO_beE2*uSlO^tF9~-;!y6COXOeCC(Xe&A_~dIDP*#n#kfADgXrAW{+wQ z%_Oh7v$_F1Z`xrX#5!{EG<|w{lleo(MenD;gr=L|aW)>lFTuH1qX=Gh)vEk#e7(_V zwO(-M=YfFD$8#SITkQMa9&}BU8BmQ1R(S4(G#x%Ie17@)IVgSA7qy4QulH_Q54c+n zeD_82OMlMKQ*XsLfBIcf+7>O?VIo~+A}T6UzvYzTmX9N(E>r&Mb@U+?%+YFp##nMUQ~Z-1Y=F(FMEZ1 z&-4dT=44xFk5N)%^d8s}LqK`YkNqV((Dk3%S=fBV@17w%hY`**iNl3uGXbG2?G*8A zz60Wks7Z+)@(R+5vCT2}V!J*f=i6JwNRQ(^)9lkPaGO@!M6dh!kIk|?=rPYhfDzCS zJrsV2$7X`2h)CyI!LjRu+t!q27$tNNf_RZwK-kmwRv(%jor`mA1po=r)YrK;BL2V| z2aB6if0N^Sgq$pQHJRXsCj_iwSNO;7?7NUMb5tBZ#MPN2Vc5t{HRDbxN2=`34 z(r5_7GAbMNVK&6oZo*XSea^X$zA}~@=Mi4_3!zANFB#4`MY>vzibe$d5fWq`T`l)K zww&+s6;yHrtG(-x`l)3&w|CpdfC!>2P%^6HIK!z;f~V=3wpqcN!BGBzk%2cj;RB5a zJOJdsB2kA>LdK2bLX(6?y)9CRk;z;9-`(_L1yz4;y|#F){Y2vO97;F;dCY=>3~DS% zLTQac-a0D+bMItnv@o*(oVR9443I7ez;bB^jGdg~jyu$?fjZ&wbr=$R-VG9c?lhP2 z4EJ7oT5LVpruXM$G6`mz<#boPPvFaH72ocBd?V@hj|d59V*~*DXLc+q;!zDenP_8tO^qe06p_1h1nm(^dO_PTH+k9IEfE5EQm#Y$TxJe2XQyQ*)J~S{{)9} z8wf?Eca8HWW=p@rQm47~T@N+D067Zjany zhzJ?cnxDT19{ETPDyXG2`zA2#(~WXj<+{AT0%|+3SN(Sl3|x}y5D#|H)(g7R@$m*+ z$D=>rx(FnZodI1$djT!qV+KlxilYt1Uh-SVxt^IDg+|x+E-uwSl!zqpp_J5!uT!n0 zR69p}yuBl1gGA~o#_nJ6$uKxB@l#E786d!PYz+J1@3AZ5yc>sNzprK1khAJoxWLZ@ z)|hcoi(w%N45&tSAvo4^bg5Q)ZIZYk;c9#c;-W#2;(|{LzX;F%3kC#kirX_1|Ni!a z4g7)N>6nFP?!+bBg`TT2je*CN;+dk*@TG<$k|QAvgCV>AOh`_f;v*@qCifP?qj{8q zqGA|0k-UC5&H{-h1I5R^OyB6vW3e`ycM0-2anOxYVkP z8bdr-#1Zkm29cbAZJCqp9uatnWUqx>nwf!-eW@;|*vISWeSp#0+q+!)e=Bqh+jEl8sB6um@dPpSGzjoepP-!Q$n0C8(QeEzwD^R1ue z8QFp~GW+Kkai-jv|7ki&A$7s#{K2`d(A`tS;Ms7+T~p$#uD1>nCo3N)Dyq7cOP{vs zzToE>Uf{A!gF%Hszh3HZ@0QCp3q7obM5F*_adQ>wI$r`XbH2j_Z1_|4O3R@B!#}B4T^; zMf@cNi1;l?g7P6(ZUgs(8VNADv+^B$;4OPftmQ-f`@dZMJ!3F-wy@rbzh3lQe|}P6 zj&Sh=$pi+qxQZzfaHhy_H4LG1M&D%fpAO=l-0H}YrxMqzzCG<5#ZDwXRW^?Fj^V7E zpp^2x>vZe}36Vf@0*j*YCnY31Zg<0?-|RXnEhl!&1)6 z%Y0~4bh9uOIk?qHj@+JS$pRg?HFZjAczjI6~7BbiWqY+ECI%@(x8~iR){nyBz zLn}$rM@U{mJ1Q%u1sO_ z5FiF#79wi(LhruKPSUjF2(r8c>TN9=J?)F3cS0a^agfE;gA-g*@`YiBvS!@7gH3>` zUHwRGHQ*rxZzOB2iXUVJ<`!w2itqj%An;itKs26qj=F*klsr5}k|ba63nV5TYf@Ge zA};hu6U1-WHkXpX_(zSbPwoL>5k#8$0(rmQN9L0;XPKVSkuBj?*llmZz^2Mro0{lzhEKzPSELz^YOMbb%Qj?wY+AwE7Wt^VAOl= zN-eBes=S9t)_8I}2N)Am3iI8^5?#xC)_(zY0_GtC7f$Vbp&6NeXdLl?HDwoH#0p~7 z@B5s}euCee=Hlf$AzAADuIN(qZRk%TdSt5~&OjCYc)}kal)b)eflTh3%Z~TtqV_`o z6sp)$-NW>>P|wXlr-i;H@=B4~{l4~KRUK<%_@f3l|Ijx^0J9cZ2bRF^jR6nWTM|Uu z$!6$RFY*DRQ~mc-9aTY}| z+*b7cx$8yVzEmQRv|~;<3nw)^9b{EZfT&X>B@*BgpqXXYqEppN4*RD2hDozZzlnzyiKWEQJU%~U1JUz7Ow2Z0a5OV zR#$G#yu0!J8ESdmj^BD>Fo)l=m{!b15u%(vWG5n79d)M+)$72Mg!1*``cAi{f_Qsz?9Ra6XJ`a2MC-~E2V4%Z}uj{K-E(SljvEtTxW zPUzF>FW^l($;S#?U7-tmo2EM4)e!t{<30H5yW+J$2*(t-WG3yb<|@FC;me49hZyMP zs!x)4NFouz^Q$)yB0qoW9iMjhCCk3gg-^eIU^W0;M-Ned%YYZl^#p)#%!Q3GE6cq^Dyc)$8uvzGDZ{F;Qpa61&rKt}V64$zmtaR_re`H@pS$ZvGT}8!L zAt#Xc7O`AULm-eR!KSZ3hnEsOC19P+7#H8?oZWkYh$UgUuxRO4lE_qGz4S;qQ74*g zQTs1HfZ9b_hlO*N^E>1EVdoA?qnV_ZTsa5 zNzQYfa#4egO1KAKtGI^DSC)jzfTCuo1#=?><3-Jleo9``Bi@cV7{9WbAO@>uhk>Aq zEG^X4I==VB8Cb0QB3|z~e%tFnR)dO}Y^>g{!Sj|+ENblww;7_#S1ithBdC(te$th< zy4rJPzsJGv9*H(Wun)ecgNhNVX`4G$4L^Ql1ou-snmO@U9W0gJF{cR&7Cx3Vt$#=| zAQuE)wc0`0=`9&`AiVAI`2AJN!kSB*7qQZ8vCJ(`;d%%VL6-olim<&y(k+HX;dO`m z8zRl2y|Z@zNfRls3S|O~;ztN2nbV@q$}tszWOLX5f9hnm-Op~$jfx2H6!+E+nyCn3 z9H&#Sco(DZIAgBU>~sTxPUuH&vtjMRQ6llpr;fu{voBxXRtlX^^r&Jt{B~P2TPM@o zH1tF?K54XZUJD}DRE>6kkCwdn1Z*J{$YW^3e^Tr=AeKlzS5H9onw)Rc`GLzaKx4+% z8Yr&sKorCY!C6SdY`QcAh1#5@v7*KFVzbn&C@%W*wFhmXG?6XNwH^za`=F%;H;S4n zGQ@nPr26aq36J}l_NcgK(x~rDO4k_Y)Hr2#2r@ZZK9FY+9HPEFjtgDvGgS9)iTV3j z>0X%d2d2>~pPFM{HOgmHdpba7EJ3oe!*a`S<^yR6P%%OHj9rt)gz&>>ldS6rgp z2d4`wfm9+z_xh41$UWDbET3^f_d-CxyJ_JwL3mA&s~oz~`2gOiyA9H4$*I10PvDkaR$8rBw4AAJ1R^pSUBNk$&3gVfB_{*V3tL)u$FMYaC@ z;);j}QU)n)07{93ARr;#-7QE9I5dNFmxzSG&>bS(-N;A{-6-7*G1Pqq&-uOYd+&e! z*ShPnJg$WYX7By%C%*BC%q0e?Cj=qUlE{a@qgp1N2vy$Bb$-pAVOwwkybl&3>NgYL zR4qq)U{5bJD{N*mq#1RrfszUc>P%`&f#KvDu&wa4)74V2`inL*R{3GxG0C9EWUjcz#SReG=&3o=w1F70a)#tKVM_7Ee zRjdMsJFR=Om;BR@SAemwVUeEo_)u{cuTI%T;&UbO`%Ise*LqAIY*f=lb382d%rP2g z*;!2f({Tsm4VpLo6V%PhC(So;`u>oEgkyrjabqeK95ow@VA~uJe+MoJj$)O_&an^S z&4gPC(;s{UaPTx{K~q2xt@WZ-=y-N%gh|fbi3Pl?6fFflZcX{E3jp{ZPlnJYs04_; z^8}s+AYYt4xG-48J8D1KuA@I!RvyU#COg42w;}K3pJou%G90Z98{KD0Ga39|^Wtv6 z`0~<>m8!&pE;TReP(4R{)WO<7>pR6Zz+(pMsu>pZOnr?5hg;+O8M@L@u;g~xfm#0D z1#Opgx6>{3izjdv@xC7`v8_f`Wh<~ZW{fIWll}JM?M?S<99oeRcIsmO3Bo^rmY@;G zXgGSp%b?hQ#2s^a0pq>P`*Z;fumpO1dBg0t4!5IyZV@ERP;b=DHync|O5X4~YQdaYQUr$d}%HW=2J5aI&yriDNF`BN$85hWQj$$6i zopqA9`f!65K!U9a4eU4s)F-M^pU?xIu^m2aHkzX%hxn0Dy0fBvxY0LIHt9i1U)aen zI`%RrjWk%QkDkTNLTi;l#xQgZKVd?3RQgDf~&^XPP;*0w%#u%4EZDPAO)8`G-;h;8Fv0LTlIxx+ob zZ@ua)>-63WX!cs5u$Hi{xPgs^wIt%L3cJ;V*5PGen~F*NzNCvjZq!&V}TUHNv?k%cU+ar4`z*?4vbfAO7LLXR>Kb{CpW8xIOv zKaF-*UUA?%PdzM0ZPrLbjCix%TJNysABE9r8ycnxq|vbi+Dab_B=TA(gw{A^^oFY6 zKwt=;RFxQycnnOYwWt~*o)t^DyBnjmD)}lfc7XLwCVgV#c!h2(csEsO&_y{6bolJ1 z6Rv>@c>YHPOk$R&I3y71$A3fxGM95O}2 zz)j9~d~{IVyGaISXmRj`B}sFTPq5I|lCiCDagH@t6_ZVdl5wcMQfl=}DCV;Hf(~28 zLdKOqYxj93B5}$L!jt!spmu4NN#_cDx6AfBQ9-n=gvJ^5C6)hebHp zHcyKeS@cumK1J@w&`U0wru~iMU6hQhN zkEH$oe@A%URs(5I!CG6@lhcE>Tw+tMQ+E+ilzjN=GjlBKB=`AS;6{}3HUu*$2y*A4 zT>$dVukPO$)lWdi$8iyFHcW1#QQ7f)$ER5ilxe==lCS`d4ccWZVp;bFq7fJ>sZ}ee zm`o5aIut*(wPrUaegJdxC|%>&9U=BXYZPe;0@3Ed??N|_XJ*{aGlBs0w3aF)IXSbz zu~x{8wP9)ZJD=JAOPc9sVBX55!<%2riO&bk=ug{wTQEH^uz8*{KG&7*SVZEqT?kgu zDSut+UMfWm;|w{Z8tSGIIfGGQvVY9ID$;CA4w3`uBw?nanerx zdWM_=h)YL$@Mz;xzbe3>c6^7~Fi}z4T}A}DW^)B-7$wG{yz!0ireS=Tj!tH#Xa}A3 zyKd4ACr`{_8!n#tJ^$b+?GuBu15fX57OM@sr7Dcw2JkmuJqh3 zq3P`-Qz?M?DI98`-5L1{iF(eN7n^y=4MYM-JtvG(?;mTH&BU?a{Yxq8G~wZvYfc4* zYuTR>Ukxv*NxfhRKX#gHUMK-S4=g_>4hD51K)qFr;YJO(HjCvOeBuUGhFpXXJE>P( zz1vYtKT8QvX*HWR+d6x1mcm#(lAq_ z3d*qT^%dx}C-@;4Sp5voRI#?%!4qQ1_hcRQjHB2`?bEd!OTf(Y-%e^V4|r}KFr@$j z&579yIMe{tDxGj0iJ=M@2N7ha=)}QMx7(W{tP#i8 zm&+jq2#CD=VsBE&=WR zd{3TEf^J_Gt5Ft#X`LDMi6VMu*Wh!?eD0_1ee_AlJ|w~QEBt}xM_p`LH`r~CXe(uVnM1#O!$E5!CUpz#KZWA__E zIX!s1hp*?dM6TE6j2T5KgP`X9$;pX@exuh(4VR!bKOc!f0>TQAmh=bC4;?JVD==q$FvshFXPh`?sg4Z=wTm5GdYkqI+}BGMXsd6d!UDz zxvZ;q;a_b0)tI%qfev1QHy2jlfy+GnUZzV3aZTGiFeiTJtfggst;^u-==(*4L*6TU z1@oDYZ+`wN_Vn~H!G~`+Hg>Cwjez_x$uI?bY43E3t8i)E_sLJDx$HBBX@&jR*ig+s@FX@DQ~ zDoOq89(;@CT;(eQ{w;B_VRW9(fzNS6;WTHxSl#X4;fhq?mI_rJI{I34WX!VP^_J3o z$C#f6C!sGC_lE>E{YohtNGCGCTLW>D5Vxi*mwk$ZD5ov+{qLsHCH~4exx}in!K}pV z9K1mC8Ni}A^!M`s`qrWm7zC7OH&OCIWj52(`ovq&rX|FkNN#MBRUqdGiazMC>X4uy z)zfsFao&xMjg$Syo6PH8jw5+*CAV^wQK3DHa|8hyz=Rdmr*q}Px43Wat|y`exYkN= z;_fMkT$V=R1BXNJsY>Zv{&y{UAN8~4zI2lwRnB9iCp*af2o&f=KP1cg{hS?F?B}Qm z{i!j@IQ-K3E*c{J4&a(Aw%?22I(0g2P$uXCmX{-$MdU9(VEPJNA+4IM$7^IkopaDE zS*zT>?r`(ay6%Z|QFk$ywMu7DP!Y%NE9n@CM^Cua$Uzqm*x@~SY9AMG2(Tt-0qK|K zQyQ_(79&40m;NMwxw+j4v?~d7DskVweT;lRU1SYfNDujw(`N{3TbJ*`LkOP{`Byu{4{8H4VSK6d=cr)JW!S{4a$N$4t z6@vM)LG+*6_gBCJUmff!{m_h|S?*ZK+uMm0jJxMYoOah4&>L)ts$Xn>{}7 zWmO%|V%8p>8UG_oF(UE;ZDGBVFt9cz2dFGHAEnsq|G$eI8xHz+d{vWD<`3JHFLN!E~Q-8y5ZQ=fK%zjdT+=JnRJ;(-4RaTe6#evViUrx#Z`v32nVa zp?A)iPV$wdf)jb7o+(SO?X2!D$`(uBG14hDE$?+R>TDo3*}ryB{*USGa5Zhlq!IR3 zL1T`5foS)Vp+X~KToQUW{}C2hc;)+g?Uepa*J$YffcSHd`B}hMT|f4^}$N|kJr->N`@b3Ym)~D z%{QjeAj8~h(B8}Gcd2{ocn9^#PIiXf`8(Y5GrCmU)&DCVZJ~jdk4!K(6o21aDfK=T zD-7?iN8a-axdJr0nn`y&(6AMt6>lK@Tt&`PsR~mrb_M3nn@){J8;IShcB|W#hxk|S z?cH7L8M#$B8qqxQ0=P;~r4X1u-j-cGwXaa%t&4p&y84soAn0?{?LWP^3WNq7@^4Ac z+wQ4bj)sHy3UEbhYd#Fnm1pnFZ+iR%r4AjrEr;8VY%9itygct`(r$dSzcG{GGOy0z zThx_f72dnfh~3)Go-6Pu(DqgJWTfQ#ig+L}3yi50Jd>1o^J>mV-L_YiZe0li-(Ksl z68KppIpgqJbK2n;1kJ$A?0@s)MPsj=fd8EA{Kb^?1xK=581F}$>=M0tv<<8ZKiPlW zuPWNl%plu45O@g+if0)B*NbtIud-PW9+7r)Oma+QWvQzXkMVt)e^kpfIU|Dl z0wTGJ?GiPhdI7r7CdY;RWv1BaCw9*G9)o6urEshaQ)d9nF`ww$)ijgJvFuc_^+Nxa zVIDUq9)RyIjKOz|wt3up5xZ0CIsp=$=lyQsoR&M!L(Por{h*9*&OtZ_Nae%TnjT69 zW5l=*mFvfG(Ig7h>jm3B?p@AZ6fQ@$OEv4FkQRq$lORJ?Ab7ZrD2M_~Sw?i51^uNs zB0^{kjASh+5%}GkvXcnG>o-Zy&w`@bIiTLCS?IEY}Yumd}|yp zGF)4Y($M0*N^WTCD?l%SL83AEA47)z_}|G1cYOA#Tn`jS)I=_&Cn%jH0BG`j$Yc!o zM7WpRrLVz+Pdz~indt_$a=k8JMLPx<@qf*Qy+<&jb=r7eySUBn2msJg>Cv~4S{J76 z1)C)>BOiWA$m*f7 zww8t1xK$sb`x=%0?zN!!4XPUP?=Qw3G;CN(l?zyN zsE!L|2bk^=Uf@pxs9xgEVDL9XtFJN}WbH1o+;-5{8guj5QlDem*L2@M_sR$oCi% z@MrWFrVs@*Wl?h5vh8P^9obm?gbiPuk4WU2D`%~!GZJcO+@B~f*K53WJsj;{O8(0+ zfcK4V)h)32z>B~!rOnR5{{p;Fe?WfS0xW|REZ>Bi9(SC>TTx7_`p{euT#)iq*pHBp zP@U49}09N8s&MNw&>VP*!MtNzwXHmgXb+1z>(~1^mum-wd9@l`@ius zM-Km7NmL(`d&pjhTwYrvRLDk?(1Goo(()1vc;m#F;>7JA0aQ<^Sp~oWoS1f2+V3qf z0)l%O1@~v|+9{<$(=fCH+w#mU=&3fEfIgz%q_X41ZhAUbnv_~P^qu(+g&Eqw5p94@ z+X!;i*MPVKwqZ@Ll$$<+7vDfbP6m*xd1o~3rwzaQjXM!q%~q)5zoS-UEC<_UB(UC- z2qPak$Ujuj(8y7$GGu5X;{U~t+B5a3MT&==afnkTt3kQ-dWbQdICoKZs<}DS^2;Jgxo9Uppb$5g(59vQ$#T#Nfo`1= z0TKy~*hk{@AyP_x(z&iLf07lR=6nNv+D4zdpa!KT1VbBo0CioQI zh(YHO42N*%s1LKQks*It4kp^kE;v|XdhED7N!w{@B2WwzZlmV75lM$bf1Ry|GCjL0 z##$mM;8VozhtQWM4ZLIUr6je}ugqF`_0xtgRiZn>M!ZoCG&DiOF3u~h!s%5{z+Pd7 zni+$Lc%XYf5qkV8=}$v(r0 zLwej=oOBG^44$m&W~Pp>4(RZOM?0ETtEwd&N*HH&diauk-8_cFD<4dpxkSf_S+2N zHV!_Os7IGz1HU@u(dYetXv^$tgnffsk(a*&4b%d<5IaYW@F;4)O=ZzF8G5K0(GSTtx(UbG9VeQv}4%&EN>0j}PonKm0B2foQ*!*%{l8!zO5eU4cfU(2k%-Z{<2ONG1=RGv@$>u&B>F%DcEnPq)KE542Ib5vr)U&NYQe7MK!!tQvG0{gK<}tSqkRoFGX;slCLMS>EPf1AaJd~ zk!ge~-3ddnI2k}1^l>-FyH7s*`xdieJWsTJ{gC>#vqE8Ei+kQ5wr?2e^g9X|1pKHR zDf&0feseeN&lcuMEg5$c%KSCWs-6HRs8rzAZ1>8gxJ~X_!0x+|GW!CQa z6aiC^&tc85I^NHaWTLqb7>|JEpX%w2fdrv{9zHP4yhC>-43h<%+w<_{@E<)x8-`{) ztFde=Mu(hvES=}jQ1X{z7x4m?YUX0Nruf(_!%xAX7vlQla&F%e({rb~!roX|dgStG zx?y|lQeA;YyTVHC+!Kh-4`g0gPCU}PNyKG4k#j-pS5a5@`Xq0u-n*^s5gKmT&_R$Q z%oXc??E{grb07#Q>Rk_&y!f1EKq0ek7KA41`pznYaT0&&pg_R|9?Bj=yqY#eGC)5Y z>iQ6XB5wYgDwZtTUF;qu7yJi-+)-}c(;dg`_Y#B5?J#Hk9(~`~81@~+YY~+62w{Jh z!n?j_n-rtyqOAMhyyZk|@s{;>;H8!4(d%YnK=@o_&H4_p$aFh*I4gfv6Yv;AOV3yk zl2wfwGZgMd$45P-bkt>h75urob-_f5U)<&0K5{BVD9w+AC8vPtKF=_{x8Sjk&$t=I zIrF#1i-dE}1h5R>oFY8Js6nkC)O$U|=2L*{q@=}=8Z0Kar@|=)6M84`8jSy2F`Pk# zR+qwbOJn!J@%6rk!Znq+kGVDZEJ6F>U%$@?+u^P~-0K4ub#?CAo{kHPi_AV;z?cN0 zYO^`0*)U!b4Xiamk^0f&im%=+!o9al+#BS-yp9|@Pbi=sRk(^qb>`jfHg}=zaesg5 zxWOSNYj=?DnW&7n)zkIe{e#i1SYRam59oOxR6!}pJ4quu@7%c%`n6orNv#a8l4wry ze4<}YU&p^~^y&Rp(8FrLA7LpW$!NC#O#gRk4>CME--sQQe>&yRUcrPGb$xm4^5Udm z@p-j!;)Y~y0w)V#3}5_X{;BQw<3>?8$B9eDW@R1_B5jM+iB|Ja6Z`g@u_Ojmy55b4 z8(hNDS+vU}zMr{M9FgrnWUtIl(-nTNpI4xZX+DCWT>cZr3QbQH{tff%`0IHJ`b8=h z%%$J%D+$rX(2E}gCLpf7K!KJSRVYG)l8*Jo9(}rDD83*2V@RL-@*l#kq|*t(;pY;| zDn3_kNmt?*e}gM<1yXh^jn(~5ppfyinU|PwN658OUhq`sXBHaw z1xAY%{;Tl;2#d^%FqpwOFe9Z&eW0!C=>oD5^Qn1VtN7r1uY0eq%C%2 zJ(sQCDoW`;kJ<^SPiJ^%*9QC0Cl^zS&`jzkr}+YIrcXR@bPL5l1V%4<97dwNWzt8K zJTy<`la(L?z*Fgix`+ws| zdrqSu0Gwqzk!vL$XZ{0i=yeTnV446&tJGss?bR0m`vnH1_EPytq@!y8(TZta6N^y% z3|yufXgedQV}V@3s**RTY)S%(lgU(-plg8>m;wJq;$n?#iZC36J?-lM?AYm-hO6|^ zONi!1@(>##-0H9f7>3=*B4*XIdez$=zEhy)UNQ#kXL)Wyh2H{-HVk^0I~-KlS~DCv zx3L3E5Kw?Z|9{w!3XE01F#Q%67LIlm`;B)tmrw`fUha^+7LEM{402x7Kly2M&=vI> zq-T$T;1LTghsM!HNdT3-WJwFS(>l&iUU*!f0f~MA7`M-8es6rqWzFNdsVTy{n9N^O z+t*)#b4F@i0^&dyUGXuwqD;_8q-Fpuf8GYJ(xAv&1_pU;n_w9JHgBDs@W;&z%+P7kn5CK1dNV>HE!HO%kt zO<=vxU*~f|Fz#Ur5rRKyc=){asKXIXGTYUt+|kD&#LqwIR%Wb)aHZB4 zekd@gN*xk<6Bc(J-}hY-@}(A%pux^0!K5u=Z}-mCE;a7N=lqiyTQ(ZM8+reW4eo?* zMQYgl{NK;ib1(3>Ute9xSHfq-XXv(fM?pNt$ZU39_UPmO;nG}uYvCyO*KtH%at{Sl zv8FsKdDgJKX~0tva?WRa{|=Ks$Dnng9lpm>HHYDG9|yj>*jd0KMEE)8_F~8HU;$WP zoFRy7R_3Mt$cjoVgQ9cP2>`+{G3qle3W@O65 zzd$jBU-+4s$%Q+z8FhY(3gvLx(N=V|V-Vw32GsTC4nyg+$7VHB+PaK)E!@ zv_A;=%Zt#%=S?FT&KmoCpo3?FOz)w9`xpc-nyL6+XM{F0QJ1oO*l?$6emhN~($ZN@ zznfVj6xm%;bXyYeAuc4k%#x#I?)Y6loxM1}Rd!A=c`fY|&%jewo-a*dy0vS@1+TVA zs1Yu0Xzjw`+RM1K5RT|JtqtW5QbK|A&;d;Ae%*sBbIG5 zA-2DNWLk_CJ>>M97hVsBl_hYhPS-$GVbJq}XC=n<#k1Da4I;>fbI0{yYT`#nGne{# z(E6IZkGV>`o|Q=_`^)Rbu`Id=iaT4;qh;plP+ny8M1yg5zt@(j4BL^A!rES$R^HoQ zHAL-e8CV;Qk3&$YyesmzN{40Q;M3-DfAm~jFg$$M4=H|4a%0!x-jM%X%xCV-N`H7y zzf!hbQbkb)3yJ>6sF~KUyqE6lQdAr5??tR`^h0dzw%Zq?OvXaq+42;S7Yb&>hk&F6 z1&7qizQ#SPX$mXWClz1MoWqodo|?BF0a4b7U3R!&wx!4IRIl^m+!6S9z-pO3%5yW# z%G0Y)kYiu~ z0qLQv?aDxpRH649O>S6gTpR>4#65IpzG8H@1>FE~E_xQK{d;5FSl2H5WA47kVm{1b zOj)}r&yhW#(d}04Xy$6a+ZDMygfo*DTKqUA2sp5mUpj}plFk!MgBN&haTHI z@+@%Y926mrvnYpJ zf0WA{`-n~N;xtMed9u`aE;}7Jt_$l-$iWp1yj~AIx3vEB__0Q@w(ZZtOZrDtz|LHi z8hTcOFa7AzE~UPB#j`=j-CM1EsUh}_H%{ieh>+t`)voM!4jCAUpu$fTeW^uZB%KX8 zaC>$G#%xS!4{m4y5m-29wHlDd3SA6`R8IWXt z_YtBKVLrPVLcHqgGzDL{??JQH65%B$!%vENgSJGdiGs)Ajlx@)AMo)IQQvakQ|XO>J^7*5%H`3lFo3uY!RnBSxCoC;)wc_SNr>L3)I1CvKu>ku;-7A#O3qEIOKAyX3g!yPTv^e2rduj zkOhnkiJxx=*W%Ht%-{NOL4`aRT1$@*R7CIG`uC;`^)m1i)I|w|$st2TcYNDAu$_zL z6E!wgPmP|OT}yJ_tBv-E-o%HX4#>d%%J79nS8AkCSsbs*_>F|cZ(qB`vYu+lB-eVd zL5^Nwf`vk(7pnDM#4Q;Nuqx!}umzQ~Wp3vz52e`fLl$MHRb11>Q2azfLxS;9wu^Uk zc^yL~e^L`c>BJ3vsmHI~Qu<|@UgZZ12)NTv(kvcU)F~eNedc#IjR?uY&Nth-Tq-iI z;hMXeqQ~HXkbnkDA4_H|rwaMPx`@ESZ;@YlgwlJ?J&|qns=P#8GiIw%=Q$X5vKAuf z9iz*AtW*6{%VO0V+x3-ih(6g9+BPD;YBd_x^RBtE-~@^D9PtsK1wcZXumxnw(8o8# z5T8;Y4UcP2s(|Du?6lKk32LuDJ!hzpEl0_Dw)=E=1AdWNTzy`z0%g{$(2;dLwN@>L z-l*>ehuY%?*&@oehg@Z12VM!~7OOv51xuqrPXY1-Te$A~hl{#TWnsfx!cBN2p$4Lu zHsdT5kH9%gTN1gPN`ozxq&6fIT)7^sejuqMl`}aM`b$|DS)^K*CSMhJUOY!~C^%Tf zX+7~g=R87djgl8KSkdxRyQ1cT*`@smcjM^WhFQDpFg=v;7W(WLXxv0-4|iq5!g1TB z86M`qZ5vMf@fR`8iiF+tr1sQ0LR!coc0N74T+8QW^7~@DFL0@&9~%h!6?7Cx&DExy zC09DbsG2J5f=sh@$21-ThtZx^Y<^D+Yq(??fkd19Qe+^kix5sE$a>oGon2AM_TuW(70``Jlr@fDE2D;0jNS6>N#H_>DKA&#l5l9i+%3v(* zh)$Dy4!Lm)U&{-v}Q-TRYAE(rQOLHp&XD#rX z4SrEH*g+xnTWY;(g$E@r`&lS#&`~Mv_a4gIw3&o&EUL_OW#O*yY8arYl?k7ie{js13A z*ZmktE*M2iWqD>|JC)NBc67vNR$qkP!;)@@zuxuD(|pESBX5D;!?6dReC34RMY_C4 z{|bGw<=NQjx1_w7XZZtgezW@C2nV>KM82jnzkrc1l4b9aeHhGH!~(1j??a=Gi%RQt zV)gl3r?cVK+9TtoW`)mkC4~+Je?dI7D)$PmI~?yAmM>3EBlu|b7&U)nC<%VK_jwyCY|>zpkUKbU9zt>St#acU6QQIyoV zE%O?*YFP|QuTO2a>pxdp?mwTb`8+XPm*H>WCd;?3OLfzl%c!2T#I~s^UtwK4`bqA) zXKEVT-mF>lvURwE_c|KCYOfHx{(G+NiqKhcZTMp{NQjC=KIC<;Lb6mjlSzWi>&`C2 z+1N5~b`|A@+0{vh9;FufGywuUI-ol#dLL@A5yxKShOyj$plOj`0RNdVyl3@4x846* zXmROvj*#CQ1K#94J^jR|u=d~P;(v##V330I$IRPUXA)@Qw_B{c zefWw@nbNU}oR)fdHfuBdYr;1lwV1Xtrac(`+MmOj?M17FKAsj7kL`lz^?2%GZ_(!( zVVdl7KbWWo6*)R94PrWTes|rV*lq3?Ef{mUvq$(~Q2blA+C$HaK^Bx}E+!_mZC!Hd zQSKPV`(Z9+-Cg|`huJ^j(I(GKm7TxYqaZ?R!kzCHNG8bH@omUZ7&q2b@xqjwcwt8b z$xAFeI}lgWp&nsRJ>41worGV}>O32#&|)=|vhKlkEP*HiQF)I_?h947G)A_f$@mM& ziyh@jXmnmnBXAG7=;pN(Q}O|vbUjHm>w-a~7xG8(_+xonV=A>v^ellE{YL_GEK zB`fy)r(K%+^dviOXAS6W;St5&>-(R*bYFRyM|Tm=Jwag$Kku6PppkUc51n2AP7Z{_ z;yx+NfV4>!uSm*#;MVuca`Pdz7>3K-G?A*q6(V0%mlw&tFxFPc>m?V0(e>>)@qozejrsGbJLq+Clh}>8e zZ8F*MWt#4!xP*;bv7Tj;pIB8RD|(p+eR@scC)%;`7-*NIMmRQT)%WoBp7IL?;w=x~ zdetHDQBHO;iL`=_TSj(U#RM0z~EPNGC|tp3Aq@?~#C z>Dws=1RRU%5w-rZOoJ&iG2mUOK2z5+JJGCr9|if-=|X@>`>-ss%DNQU55w|(`LdtH zoCWVp;8I`ci$LQS$e)N~+~1ez83_pO$pON2K5@#0QmP(uCK06(@>w z&-a#k;>$-jVXFR*);2S)-{1ABt@p{d=I`N(c@yGe2W7+03gG!_MTy1z@sxu)dk%9) zX7GeexQ}AGs~!&KS|%Q)fDXk!2QmnoBD)gx^S;z94N8L;n%=#sq4@o;H&SH3Qs4i(H+$}F*~qednVzS5=KehcvYNJP9+7;cWC>7~n8aVB9t zeo*j{*U0wNXNZbMC%F&l;3BjGC8PS~;>R?4aVPOvmZRvC3n@XISb%Z@IKE7!))B&nWIhC`;r^ZF|F;W_7%Lm)%sYd zs>r$wAx`Haz1UJ#@#;`93^GCqwSkgEynEyPaul6AG?*GB3cj#=llLC_UAKv&-=c7fwNC)Io+&&T94Dk!@5hf1 z*N3#rt*0ky62zm$$nwlgvo0u!JnF#6IJia?X_of$?hpM?eYP&c)|V*2uP^0qPz=sM z1S7?x>0tC?#}>AVW4kDKUuU1Wg^nVt8+)q>u^}0R_hfOlj61`ZP4UM{m-##}-BcpM z&l58C=PGg>=I_t!Ix`DcpC=QVqu&?pqp3aQ=SuCpWB*&LJs`wn8%-am+i|~7RA?|Y zSWl)11Ylmx{#kLLaSeX|EOm#iW0_Sa=Vo_I?^iALn}2Ir8YR$0EV~v)I}Y@ z*XiT>t{pEt zjEpPRU|oD#tAfIX3+?L*fp@{gqv-e$jN#aelg-LPj#P%>0+(E{kPc|qIya~Tu|D7T znJ@it@!I;{C(DWQA#w1dXI~WP-4r@|7Dr}S`*EYL1|O%bdf>a;!FPqP;8N1yQWdtd zMG@b)tOvwJTo*eK@r1WY*GtWQ{+PK9ZV>z_p)-S11vP|UJ3PN0C2;7Pdib7(_9dZ5 zmP}IC(d{wpNAIe^gScNkh)^mOHU*xD*3X2R83OSeg3Cvkw8T6^^#hlIqT@fTOCfIu z>-<{zouin_M0*cicW>Nd-RW z|7dI5uxo0QfED@D_HBR)NyHtB1bGwmWCVYLZ`oBmdo6bCh4cFvn5UF{j#Iq7Ay{Cc zzrH1&YM=*78N+!Gz!FkMPmkv4+->=vW-_*e4D{UY6t;{r6vzCb+unq@=uxzqHBCB+ zIvX5FHEItj1Qk#8C1?@P&x}eSPws!^g{*0qxy-FR8plAtM3bxSOovv#csj1%sOs_) zUx5?Ub!M=YcfWOe|MIqQ8JPQ}BILr|thyfqkKIn%OHSHmiJ22L&Hla>;pgusYs$gv zSBT1ir77|;e}E}~4HPWe;DFnU`pW36!lQ%)JSYPbdi@h#W1KYYk2kL0A1VSNG%}hp zbp5_vS?lFf##vvDIhiBV9N=~ZdE(mw3Iu$!Pg?851dntCc1hAjp3T0#nh4%BZQ<+1 zN27}D62Y50)hSkbd6oIvWo7+)RZB{_+n}~Y^N9NDT1|Y>vp-|Ew;{+{p3Jhg6V9D^}$B}q(3q2jXy|D$oX_k!9WybRkJn+^ji!G@MH;v~|c%x3`GbfrAMt&E3 z-h{GX$#Ujs!%K^C{LC&|{MHI3qYIq=9X;B$1W1u#kZtkf+!P%7u)L8%4nZ5mH|YNz zxdI|5pf!>p;!cG8;nd!&i`p<^mCi9GDH&q~eY*R!{F9F{NX8B={Vc6zFIPf*kJ zt^QhqM09xGMS<2GvKOJ$|-a#qKmKNO>&I1K2-;}0>s@+9oNSf8v-C<8Tj3%9M zksZdC`jad~@bI9o2Hp*onTP6+mx23f;5*pNCaX$4a@>5xY}ef533hHcwjj~90W(xz zJc92ML#7Sv!kDxJ&3r$s*AZX{$2Bz(@mII)O(>o7&b(Nj19_f{{wLu)Wi8oFMY&9e zg#Glj=yX;bVJUD^M4CLFdPOTk8H)boFPy&@y`o)^H;Pg#&GH=tx!B)3!nVU@?9OSl z82jPzjn{Fb3MmJ!*`BMRRzI8JE09z%pV5Ob^Ny?u+)>7qaN0-Ps5yvI+uLVxTV!n2 z+C~Nnwg+n0(Cw4&w%xnlKDQf3{@NrE{UJhZgab8>(^~&d9EB+b{Rf?I(T@~)5GrM1 zk+8kAa(l$7_0{EDAqhp%W5!2;0=9MRiX^Hp(;|f0V8=Ii1KdoPi}<#282&JTH_mj1 zEUX*>96TL;(K6oUKCpq7f>iiwzg?L7I%)IwyQlS&>dK7=#XvCqINcMIR+VTzn{ezc zEIB?NDB$=63hs8IbCnwb_?p{iA1d zi%rioRkgzXrpL=KjJjIX=pg8{wttq$sCAdxQ-x!>uVm(AzF~^#`X7LbcRz_{w@4)0-K5Tq)3Y|&(!s(kG5xvLHO+EVXc@I zs$W3-nVOC=*NJ#7WI0w;{O`PK!`i?*EZ6w{vepBI>^-Uls)PtsP~?V6(Z>?7$Cd#) z2pkdB^9vv3l-jBVH29<79bgebg9C#$c7ugb*T%5;>a9JEs*f0obu)|GD)cdm~Xs&)c=NUW}FE=2WeQ%4VcpxN4RZhi!C+fKu$ z7ASx#KWGr#yq2X4wp#%it@@UF@63&REx+sZ-8GhpeqWq!DQ{mG2lLv|H6ArL0PHgB z*XOFE<+Wm}#dbjuPP^2va4(U7VQ?_!YK^xP)E7NvYTlwCx=$81IN~2Re*K6deGjq8 zr?Ne1TUpc=z7a+NNqWo&N}R)bitXKJC;P|}AZvzt&t{CZb!;t&L{ZqTIJA}#2q*vz zKSkLDuF@iGJ?py#@))?SATu{7U=+#)3K2Q@n|vDEdvSYPwIDXVlpZNoSC3&)m15Ry zm_h|n7dIsKI3v3)C(0BBlTeb@vn4=MA9a}rby^zfk*ruYdb9)DD^J&T?5dgEnr~kB z_`w5vwHrLjlPT|AiU(%AZ(FP7HZ#2aP2EIBN_|{`+l|{5BhC_-omcY zQWnNyR!SIIdFRCgV3t=vs05m~jNR`=xY-6BGt%ANy$4emT`sJg{V{W5K3M}P2@w!> zR{#|oh{KZ8{6SXK4hJtxpps4D_n@U18vbb-K37l!koCm#rnX>R}B8~*EWS{L-i zKqb^&NEdd3OQN-XHU(MM%`+|3`gaTXyAh!Ome2!x9s1ez>$uzXAO7qI=LV!rUWk>> z@4r6r?~l_){qwnJ-@(2EL016&Ifnn;y}PAagC7@^I#>)Tt`Bz)c;?F@a%nQ|f(1?# zbWCK_EiZU(l5|`60NtAbVFxDd5BGA5a`KCn^ffTwdp%@Hx%*MM=+JO~yifDw538Qe zRoF#ak)a>=^h{>bqo23Z?jXbB<)Uv-#SD%x6D>Gb*rWJu>(9TsLJ!_^E(AS2u)A!& zfvOQb!;V^52w_nYOxio*7Rqf6AXqo<{`?p@(0%hA>o4(fUy@`z3hp)IRi(^>fv~H6 z3B1*trAMdRBh37+IrvGuxwr4lDu7iewPks{D4zp1i=1V#updxuaO({Qx-PQcxboCz z8?J8D82=ks69`*e@45D%dru2EQfZ(kzb`=}I}qE$4H<6KER-y1|X=1P+MI| zYoKnJ7xAtab(&0rebQ_&QD)A;>DeqilBq0?oIl+@<@(x*v;;VUHG)?Ewb|3f5aV(~ z)zEA(k#WV!#HPk~f675RZBKLG;u0_Q8zu^}tq4FCK>23-{PHnI1&y;peaB9)(Ua~Zv*?T1N9qC(u%9OR0e7kyo(Zh19)w|`8Q+&#s=rZjzi=4%9PU_o`zX*U9 zua`2t>P1S{T9rSFFo9T7f*v7@c8PGIUilyrieC1xn505(yx7c<3M~mj%p2dfZu#Fq zEZa6*G_FOHaSVsWPb1xO?7AO=-Z}k9I3-`1(1TW{4&^(Aed1u=wcj*n40}JFr7F#7 z`9}u58|UO}SA2(xtnRb3)@L9Jwe#1&rb+z$Z5=VD6N`L)CjLX79Aaj@49e^&1R{55 zp%xAk)aM)2)og4S;q`iHF)TqX&VODefHQA6Q79?qFHnQ7tDyuw2xiFlkK%WtkEapd z+rkrmYq1w3f5a}9(u&oUm4^zBghh{y<}r|n*~=nF=xHIO9lr2Rx|~!+#SwMrTe{p| zI&*Sjg8EqQdd|C^M98#!zR=1W!Lan|$r2?21E0(j{pXr_MV3yo7`dIo-%r(wbX;Nv z7Bzto|4`r`gXy$d^5kXB1{_aH%;4>bfT^BqCZwZ?WWy$KcOQezf+yCcs zJ*r*AUw^u%^RYEwmMx7I%RohB400&x@&|JP*_SHsJy{iw)wq5{f$R>A2U7-~3tm}C zk*klw$IBF-^PCxYS$UA zc{J$nNzNg*Ia#SMdoek?_o^SenRddxY1(Q1mHUne!S9M}ZJ3G8F^DxFTT_jo(vG`e z74p>!KjjArF05tZvhL5Q^L4vh1L!{g$R)+zY@TLFKICOMk?9s{dRyfvnIG~6PObki zz4+X4?8CWRs=?(Y*5&B=T1|M;aBBm5-O-#7M0s?5Wct#j_(HReh}F%O4pZYpO?%`23 zucRu@S~Tdo24I8E0u?b#bVFe%pj^1>lIqC)EWa3~{81%8kILhCKGK&S9Q!RTiGD-4 z`}pt#S^|L-`n#=ODz>8MZ5HQ@ppWWY9t7Iz%J=6xn-W-68C{@^@QnusBv6)y6(eSY zCYU~y@evX4Nb30&a^RKscocOw<^$-RTpP>V71S~H8pn_FcZ@~jLYTg&-f0x8yg|3Yx^#a&sGY?Gk7Ya7)LAoR1X zyQs-?9(aqWJ$~a$O>HzMb%oT5B82+RjrmdghUzt5K#B&wj}}(unf_eZpVv%0`>+(K z^}{MRf!ouI_hd-^1Z7|+kn#B@5wr#1Bf5wPLgX)){}|9=Z{|j|T&G{l=#DO5=C=$7 z&6v9p>OzEcIF@2c81cxfR@qpr9wL_k_l5&?_{$9cXB$%_AW!!Nd0G_x-Ij>CFx}%+ zJlO*rH_kyh$F*NVx{BH1$Vu<{Zr{tHI zCWs?$thd<}%l>k}wM^Yz)W>5&j4c=ac-Na(gTz>Oh&zd>4z4jB5Cs4RqQ4i{o$|#& z2xqkDHW+0l7h^h&Jypm@G{}9ll&5|D&vOt?bJ!0LT^9~l#{7XR7_09X?`pU)=6+cm zbO(IjFF{L>FPT@_vP+Fn1m|`x?f+uxt)r^^y6F(|hm2Qwmy5UfVdiVJ}-*=4P{|w;lbKiTfwdS1HmKg*-f%@xrKD{iL7BVK_GN?2j zAj7x4B@wiuVnvqB`zeY@(wq1iA?nx3(`_(c;zx~1v<|{F28aH zT%3ST7ZlxEJ)FYZviC|2T*OhPO;(V>s?N@KVv+E*#r9fF<|z9#Pi<(onE62lmCq) zLZ}bDlE6?77Xh9qhjqbEh;JoQ2-l;+pgwwkp|&u9$Kgx%Xr@Rh0%co1M^#IZgy+gm zmIIvA<^IfcXp~ElUusGT#1;(Q0$;l~IA2pa=TL!};~S`{1GwhKs{7(YHvi zNVRx?jN#mJCVMoK9x(H5|K<#5{||ddRe%r%T6|e;kv2V;y=g_N_U$25`~0fedhRRe zZT$0Z*j080eJqJheL5v_VmP-0#=~{5{r=raDM4nSNsM@&TgVuJUq!s-}q7a$l0sTlZ~t?NY57_6q-}jA0RzaUBtt4*f<`+0B7wr~aF5I$ZL_ zN(EWV<%TD(9kPQG7?T`e~}yb_-1p82)gv@WW@hpz5Q17r`7l8hf`_?fiWH39}U_+e7nQ} zkIp>@Uo|!Bb2ngc&8edW-H%0zIU(i4IAe?FqsO!@?UhQY|E*9c|0zv zYxG{m*%aQ!7iHaYQT@syd-L*;areh2Pv-z!41wRH(ut@)#9=bcMNjvk?R4p)S?q3o zDA9Db%pl_~)2%lFiDG(g;At%D^6v5BWc*}g)$Q(S_-XT=Z}Vm49obR)M-JKzIn2;J z1Q%5lvllXC3Rtx3D=X@dFQkw_LS8Kbn&Zm@Q$sPV9EIldE$t}m&dEgE;4FYe(V$?_ zF3F3}mdrpnRmA&lkI5NA01dapi0IXvSTm{X|PZ=SeNGKeaWrWh~xRk7YXLB^5kG2i|)* zF%M%C4|mrGxj+5J`Zr4?Z^bJ&gPVQ=^V`1&3U^5I&*?^iR!Ab$PZB~Eom!We7oQFs zsXoABaljBvQiq|DLcdIZ(Fq>!b=XlWGyC}AHX5&m97Da;W^j}Ynx2J&MT;v2j#|ld z39s{&c9<;OG|x8;Gh~pEWBFt9gpPMb+M^ZK$bUvdw#!%iRP~E-TG;(>HK(@&eZw#4Q3D`gKP}H02FtfdAfsn(Nj#-95`P%69rR z$Nf`?Tb{~Btp?7f#j5O2A9NQg@?QIhE3#>rFVp(>SB(Wzm)Xm}wtsPrQ8;eeFL$V z8GqP2jVK6MZ;Zq&+b0w0g&Ai5=#kJ6`}NsT5d7bWvx!`|PR2 ze4O~-=QuZlBSyUwI#UVpn5qD~UnXeU4>mCdKi|#jT55qI>kRDlUk$nSre!j2sS_Q| z6jFQgMOKmQPM4dH_aN6e?mQ7aQt{Z3enh}ReT_fi_%FoiChUfK-k(LcqK&u4jMj6- zg_n@fYbcQIrrQnkl(5cn04=;GLqI@qtO-+;@OFM)?6Plj|Hn?|oQWuFLfC2cJK5$M zYwcV}_+n%Wa84}P;=YJon@(NqSJEsC4A^kN1De z8*PK;Q8W9cX{o<(%&89+ddGZ!K9*xvH7dsn+yY!{PnOPBouT4K=_E1Hb1NiXuPY4N z73DsmD582xe;4F*Lgp85zQm*P8W+d*NI(Z{P!sW~q9zf#BumRA^7_2SR$ml%!bqH%j7B7F{D?4eg`bwcA!5e{kk z9tq@uv&7YR8)hpW+tF_004?F_igWcM5VkJF}NXu(Xk6=W!-AZ8p)L)*y^zpb3TseR~y+68)dMfRwvwsQBU85x# zJn!Wb+v9dr$xsR^TA1enLFJxR9`iNh8zJC-FUvy74%U0$(^&m*@rQj6A#?7=}qiqYQ3VP z)Av~QKl6EqYZc0M$_iaS&Hk#ACAZic!+uq7jcNGm>UoBUSuf%dvZSESdva8a+HLDc zi(y1JH0!4--;b)lE4+gO^g*Y*L!M(WV{dS3UKzyotXPzeM&2tywi9@sS0aeO^eM#( zKOj_G`sNJu8Wz;Be#3U75IxPxs>uKDN-4UAqd8v=qdh^2TWH(x*;J;p1~WER0tFiB zzqXIgp`0lj#^E;mmhtFw8wfqL#cQGC98Qt8vZ;i;t{dgLUchV_x+ZOT7WGlY?PY@Q zvcUD167<~AGzLF@vo*cy5BaL`gsdgM*0wLj&i4xYk?D{XkT))rz`>dOFrS4Mu$%pJ z%xE_BV77ef;w2WE?rbH6yXZ@V$-cyzI=4dA=NpO3#q?hsg4Ds&!k>*ICfQB6UMO{U z)qKFaKRM*a$35(WVk0Zf_4eb8(}*lCvBwa+*hs1se4IOl*rPU^$yXNBQIB%wCaJ8$ z+43~}4_G6zaRIWX1nY%n(l-ihz>K4TEH+^_-hTb4+2AMuJU70bPsho{Qw4ju3H*Cms%SyH9FEmMd-E(5*hvciVn~7s(~sCHr$#a^w?p@Gd%)Mwd#-su}Kg zmuAfdKjkVMYLjp@{yG;c(+7>N}EJBmWnW*X1r=Dk%a5fc=0RFtxCJf2hKRZ4 zsEylnv)hilbTk=`v3Z;38KiqN_G-W()AhE+qnG`2+M(lWhw;uP@18Xyb2Q(NT9L5R zL|{$Dva6)=g(B^&(z1<~>2qoScw?>ANYbjWOM~Qq?yK^7AdV||_UR=bwK#Z*!|H#H z%TY{daDSR}l)&;|pG9Lqdx!CF+uu1Sh~~%ag2OUPsH()uoaAmwB*j$tv{`-wii73s zOQ&+4$b>-NCyxzS1C&E2S` zIo05IivqO?rhxt%I8<3Am&qbMUxRD@AqEE(Q)B&0?Ua>b=>vG61VU1rA*tNpW z|LZK#sl;S)-L{>R1sL7i28xr_gC-!Lyh~?sM!x0rKj-tm+jigsipqbz>SWBAVVPE% zv%r*Yr9tt*xwPAgjFCaD&o|XdX=o#h{oL!SM~tzTzUY`VKp9LR3^nYH;aLMWgSnTi zg440MfQU#VBWZi|AzAcf@iP2V^U!o&tkw}uC3s>43($f8I%gd>;2Bb4vMG6*gFOC= z?t%|at)BZ&x7)mTZEN-KdMjM_A;r&j+O@WU^?Z`2NU-k2%=m0`Hk|*}{g@JaF^JV* z8O9*V7PW&m<6Ok_f2}U~^tb_!y@Dvgn1e>H-3W_AOz@f&j`|16k$42R_*3G}R-nO! z7m%jt!ztVixu(m(Fu9z-{mWURDW8!_3?`xDX{xamxQ^Gs=(8Xpb-A;B!FTCYHXr&j z7;}|lhZ5wW-nRSj9I11jT#SjxP;682Zty><+r%=G=3wNCFz~3ll*tr~q`g3o9s{I* z1eTm{@KktBz+*(4LyZE&xdB0(PdsbQwL3rw*Wl!39H;~@TNIdtQ&C}oA;EMcg>MNT zc@vmne$jGyJrCGBB6L=-P%_kM0%&IpZ4>t6w9qMwSEyrv2l}(T57}9xmrk>H#l>*0 ztxwrhg8HG?#ccWFuFshaL2-df8X~TKqtq%faBBMm(Ab|$L{R8ppb=R-XaOJAr^ui| za*~RyYGJtJ!$7%lEj#IDt8&xAew!}0hM)3X^1Y;9hc}!v^?xp(yRBVj2pyc%*mej1 zOjOKXt3Sq*9IT@P3dRH@<4juK42spsO1u4Lfr{V^$w2~0h3yDVd6h4;9ikM+>ZbAk zP4LK4xRmw9;bHcFBlcyV?G3Kg6I|4d0=Z;Hhy_ZI8aGE+NxHgMGPO4DKRj%tV}k3E za@RN4Kd7~xum9q@sa{%yc%m>LBjOh2gAkp0yfEmRR?1A8nHw=Q)hSR?Lr|DsWGZ^$ znRACh1T!yxF~^?#2o1*xz<7)D<#KGl$08_3E%0?%rxJ3MVpi*hTZU;?eOq zL~JlCD`tB>Iz^XV2r&LLQ9twSzzAEvRjtDqvjlz;g3RJ~#)AiqoqL9Bg0LK4vt^b? zqha-lUKjb$u$Zb|XKHgnQOZ@~rT#jn(-5@hkRh~3LMYWENS~pK{2dtse1!iC{{&vH zqpkXP7d0$-Z$MB7?11yJ9(zd$QY1t|&o+tLpn26SxN}^5E~YzOuC*M^EFsXPp2FtVi9f$;q3R>Iy|$~)*TRgPqRIBAmdy}LJ`S3ioQ_TUJX zy7PNu8UA`nx%Hu9)kO=$fiB0svl^DfOWuH!>aD-ya!vi!c<-GdBPrw$vv!Hz2?~KVp9Lq=1Es-$~QT)zYOw)GO!dlU@BTbxo8!`4S z;K4c3Q-*K-liOd-%s$bv0fa}Maoj;WDKEZyC&4Xc-;!o^nV;A7~J>F0DYcx zTg0=8f%#{VRg}~+vlNM8?Y%`dSyK+W)HDB`K7BXVq+FRJgdcOat?ME0Bdo=gJ*u9_ z!~!IZ^{DQ70uLT!%dQgQ1U=y=4q0dFbUEF^e*48I|uR!kYc*Z(s6u5I)Vj$5K3%?2i{G;rn9E zho1hV6tqm;iBnimCmeQj0R0_8o($IoNaeBqVL(Zd z`O3e74mX5nC~F{gf|>_W(0&7+Yuudh*8YgNeMj8YSsh#(n{rGb6-}Z!N+p=g^j3Bb zzs54tXO`UA0OLRK#dv=;GvqEoa-1-y`E6_D4fwm9>>odI3Lv7k47oe18v* zC&RqN97=mvnIZI`IyG9&R=o0piE#uQQJ+*s%cm z?d;>Cr~O&7lJw2Xpy1FfPp7{{bbr1dpr=RTt%vC1YQQ1ej->KTIsHy&3jcA+5f1;B zX74+>2xLG7jcZ*Zkks{hxrGu6MJFjMUGLq-I2$QvC!t|L@Z6jr4C2$#@oX?jIyG`$ zF3}#h{p5;14q99C?e8|3MEN@(;dM#9m#9(DhxyX@tPecUj52kUc$_D>3q1TJsZt1? zXDgh;vs^iRqjDZIw0a|5%t+m0X^0XDEJ$CGO(kQokb7GdnJ`3d>aBOH4=wf*F3Nz) zJUEnMF{!A-J1eka6?I(#_nrYp!-HQtb zYkbh`^w9ukgMzv(t!L=9b|q&S|sdM(y(>+gIc3G_&8P^Q3=a zmw1*hGM9S-Z4iUk<#M0z^blwV@R|vyQgx<#lldYPnqb0H(tdYkc%qqHXOQeI%exll zz)SS5Y)UT52n%Cq%?zGY_=ZX(^JoBWz^Bo98G@)vO)F*D)AU}j9RYVH1+R?p7B(*# zd@DRw8^(!mIsT@<*!mtt(#l+w;{Q@;6PB@&qjL)+Lo`aCWu)hClpzX z3RC$;z<)b-vBjx%rz2=+qO1&klEL4l<>mXC)v(7TN&H2+QT z*(Lq{`r6W1MFiMw^3m12yzANvGCX)Nc0yJ}S2&${0BA)H?xlB`ajOpCi)yo(R%?1gU79GPA`(LM+HMB ziv+q$v-lTlH<>0Yz#z6XSREcyn?WVBEbgRiRra$N^Db$>a8mo8Lxy7brQ9ZDpkh?~ zEc^$>G8kx@u-T)$-Dcc>lZyLo?&Dq_v5EJ$mK;?8SA$<`ZUX(`k|*))Kb+@GN^v)q zeUGuRXfxUVz6XUbV8TmQ*l;Qfm-WJF@e?()4yj*Ap$v0%)P<`(A)=) zBRI4pgrk1&#?q#oUQ88dO<$1-8Q;-L{@Y;3-;oU|d;?LioyoE8s-1x-{I7&94nr1` zlmwPGko(xc_)bkdBMzT?!yEG@&AE-UOG*(0Um43zLkijYliJ~%w0fll+>fW3%r>{L zeh&WR=x#it%!pe<-(x=^;^!!8WRvX$5_3@)dN&zOtc+wH^7fC>aFX{cY{?$Ny|w0- zsXPW<{mnVWCqjt6vhy?(9K^4@PoFCYFe01xxVeIS7KGp8vkzoF0xtH%GnS8c%m6K4 zce*0O^#EgAzVfnE!JIg15l7mq<1RjMw*ha7Qy)Lm$3D*nQV=DbcF^jAOcE?4eGA!} zVOe$KNI8{)khnXpQf1GgOmrc?A~5x<-d}UT09s(Ent2$-zUEu`Rh3UlJYKV}A@xX0 zV9F=@UoZrQD*!{xmvKOi%KjOZB{RI>W&;=9Q@||S_5MN{s5!zYEccY|39Z)+hAy=g zdA!J9rV7KX=nTQq!Zi4a7L%Ww@_)%Aa;8jwGi-30 zBG3A_)zPAV@l%!wnx=pgx_)ro8-aw!gdlNBGIc`1&1g!N6)bHx%UmGpSVg*j_6o6n zAmXTz#Ltu>3S`L%@S*B4!PaIAOAUc3k(cbZ zYZ3R1Oz~ngRBk@FT%cKMfN(4?Nf59^ZTO9&O6GO#$~-^(0Gb#wq5JyxXvkS^JC90P zLhW!k=p9P4P!D^XQRjzDPJioO$WPgKnd?`JwB5o(2vpx*ek@DCW@Zs$Y5c6_(_4xi z@X+8hqbSnZR4y|T&}HHxi;0cJzAkrV5j14N`Tf zc9&04!X}v%7n4j7w`X2qw_#QhC7*5DB?)g4m;vrPB;zcyU}LZ^s$ptkK}9V;Rd=PB zIdaIRUql8~_Y+!{X`muu999^+$d^FBNB#k$>Uup@K{BDdRuHfLq)MUSL_{Sx&K@{- z!q@UH!=LTF|ITQO^G{%TT2m?3%%6S?K`I9p;XW=vn0P~cdr=>aMc>Tn{kc@DJSUzS z9xoG!`Uk>0;HduQWkQh0K*X8wf39dF)XWJQ=VYZgJryb#BkM+*LRW z6O>63Yf`>?oeRgXLX;*C)RkV^AaXcFffRZ%tEuS&%m<{$bWsmJu+U7Y_S`EJ$@PUQ z^N@-?B!GvRlB4owQqAVJ?@>EwnA_dV>5sY8kXJ1df>Ys2-QCRNTb-7p5}wzqn&|Rk zLYBl5@R3!i&GDO@Qe-01{`DM7gnq*c2n&K@ulMS`M(*z2oYdR$2^klCqzOdlwPv-ayv|9Nz0PTQ zn5Asi1zGZgBt>E6-yO$+7nVKf1DKXkoc;3_v7EDq2>D5gV2)tGU09Hk1jP2qVxBB- zS&$z?7^{IPMujAO^Rg`xIb&ezIvtXC$Q>-w$#Q@U1Uqs2*|OsJ;Zn()Q^$3Iw?b?x zLOxZ2cwY$8y)YI3!*^gC=Fs1p5n`(4{|mnpba{N?pCu=9S2ijqVs~z(Pf74XQ=qE( z4!DO6bVI*V@zE{B+oyUcFcL4cs+BtW>lnlhGiHy4_J!B6NZ+a>lO_(9)59b7gW0(n z38D9E^ZD*mMkd4PSM~If^5A;-Bo7kaT?4$4a(CO}XFRek%kwI8qyoNIWv>I2*swKM znk54BS1qhqbvx2iInK~COyqMm!mL6>RaOh)r{?x9Ox$=m-VqALQVn2RMpu7hMp(Vg zq>mog7dspnK8F4ntX12N&N%~iJi%ZaFo@p0&Lipb?qgY|q{i$FNi3MF40JNa`w}GU zGgfcPv*`LCy~Nyhl3(fso&Ir)9k5PFi_%a!_x|cyuec`#tVCMsor9~1dM~R_T%bUV zin5QR*evEg%?zSOq$OHXJ7&2~zC()_y|2owg8H)NAbjLdwD{Sle%qBmHLFc!-BcAS zohSX(Z9jz6fh$=@@$xF`kgH^*26e4FNfIp;rTj_i4~G zmxrUj4JDg{YDK_zLubug5KO84_WJk-3=YzQ{|lyL1LH2b!IKSe8t(^5To;4tVyA%q zD^E?r?s&xBABY{4*FU|3yzDcEWf*7gyg3@@ckJxXW8l_0?JL<6?)dc&9<|%hCTC-_ z>9GSG2K(N{tO59fd0dq60EIf&N}xJ@cJbVo&t&hsp|)+2fa|oR4(!Vn@%HMBTBTz3 zeTdhD)544vzeU-a$$0QTFj!ssEzA=7>PpOaSu2xII(vhg=5FR+$eDyR!4HKt(rob# zs-tJmo*)X+5?VPbT45Bz-%h`qzoFDJ5Pbik>pwg|bLWzccwHA)oGP1aL$EnlumpN8 zEzU#4(|zG34pp;2q3j5MdgDUT4a}jg`;_9HT4?Biw6rM6 zyMLcKYb={MWj*mtu)|0Ng$pB>1~|Lz7<*mQfbH$~SEh2}g1ZAj*)Q@Wy159!y5PKY zXZsSv-XiY=*e!F661W!@!%FO1N-Fc^hJ09op`l?NN))_l24GE>PzMk#L#umI%nv!j zu_c5v1+Alf-XF&7gHT~j1uog-f`%B{b5jXNRhky%zUutw zcr~dIn30#occ@Ee?ERt3tBWc6tlK1Yn6|&)yYr@MG#An2O>U;YDv9&yd_HAuLW+6< z%9v@!`PMH6BN{Da4ZpjLkCzYcBsV{XiJwx!(La}_sKsJ}>4RD|0@YkcAsCQ>1Y)>g zib~#WbUWR}o4%;~;*Uc#YKmCrg9J*Qb@^|zcQ0MkX^Z~Ff%*K!*3R3fPEdy_I0n?ZKXN4g+& z5okV46VL{wjWKs^$i^haSDrpF7beI*(i2`4vrRDZI#cdR2$x_Wg;Qq^R+mk~64`<* z@mHE>Q^8KK4=RUwP(}67%KCN=w-cG?DP4TSe1lWk)QCEve_->`zfR3!!er!dJ)wo2J=Yn-M0&U z$T)Xu1)gK+igym&$U;iJ%otGfXQs)w+)Iw^V)6&<>&ycD942YmQe2=uwI15?vY7qF z)y!9&YhaP9PEK1TH+uNRPtA>R8+YM2!8{gMZ&<@BMhn5~<;$S)pucs_ z`Q)c;B`VQ;e5dd?r6&?1jffjU{eG~>6et8)GZpg&-*3~rJ52f>iK~*w6wOVO=_N_V?=GKJI8#aX=>UH%j1#N4c(HA@jQ@)pmF@ayG`CkHCNo3y&|e zM-7*0l&3=#Wg*A<*eIh2GpZ>jGT~zM;>ZnOPnSkW?gy_F ztpkh#Q9?n3nM94~Vonw4^L}wFj9>sBuiw_RQY#(#5;hpwvEwU5Oqxs>GJlWz5*@}V z(!a78PT~^H_;Ju?35!Rzz|w`r?x3}M1F&5?P4C2JRzLR1GQu8i&Oy5;t^_A@V9SkB zX?b>ayj%*Puf>0v$R~^F0Ac8c1Mw9iWi}*-7%?IaY42moQbwlQ0Er5kZMHeQT*^I| z@&Edd&7{1(lTOUDS>*#Qx@@qpn@Pj9E(ui>^Lbr4WDB!nU*(tcP0%s%lKc;$w0p(! z>TDRsndnO4GT$H(wEk2p&rkl(Vb0|=9fN3dA+2M!2h)R=xRCEZ=VjA{vhVf}jpkRV z(@zRpMX0>4dEFtfs$)$+)gZmrW~{|0j{wgGJx-4pB?ka;Q5JEsx4CzN=SaJS9g9}i z6we?87AO~+vuxf>KIy)BW@8Q3O36k3NUx-=Dw4E(gK9n_cOsj!>>sUQ?=t|}|0g((R~I4edd_SC*&g0SpS`_Z8aa_`g3HufLqB> z1x-k}co`h8w9qD40shqv81YPioQ5wO@BSfWG zg-)6TO6VUaYI70-QGn9>*HP{sKyJMV{DWuqx_!weZ1yItfivdn@KzPQ=|c4&WAbw7 zrd@sl066d&T+LjAHPCa%lgKZ>ej$S{!}Pa~CYRNKBhnfGdK`ObE#3@C3E7p(W0uTI z+l7<9HM`mR$mz3aUjE4v+1L0-2tqf;#SRP?21qeGOwca1LREbm$u~g{7!wiADMhH& zPk3k^o3RfrHxvPt@rV9VkoDWqu|9fZ4hT=H3UQ%EciLBifYWn2X~$uTCt4is6wHZ` zWIPY-lrs5bsjp$7i(yF2Pr!IM9?rWUpZCnpdS(i*SmNyn4|D#<68M(=GK#bG1s`FL*aiO_4!yL zwgUuBJ=`&hmm}r56BZdYDMb@XzV6^-Rd~*qt}HygYPXT6qd~e;MvFyG^t#@#k|)+H zbc-Zg{LHA7!x*_n6lUx#;4gMknM@-yQ+}Ha4<%TT#OPt1|p|>j7OIw zaBuwun|~@39VpA=f2I(s$k>|af=`PH6R&zYW3_n*eZVLby6TXI@=tZX?C$nX+BuJ) z2y`^YT9Wr(k68Nj5B~ded{IYHpJkuY6~8uN&$7(2KyJZ@Kx2hj;_ zFs6XkZyb-$kA_Z@gKm#BeHtbl5s9mHkYO0t}{I4doYTv~Zl#xW*_y6i^)>&Jn zCH~&d9xf;$FB2K;x4kg2s6RLyj{qe7UxPJxk98p-6h87G`L(968afs%6XSm5l6f%N z4(u~#JA)iV@F>}aWmkhwfbQtC`K83ns?@NsqBMKt-;HCS zlTiK5AG+t4T4-LzPEXq;#vEMQ-M+C)k9n@HfBjN&vMG52BxyJu?)isqH8L7gro}*A z_()K)@>t4AH*uk8^B)G2VWaS7aUA?;G~!WTlX0Dygg9H0ObkIWK%A8TD<)oxJpX3k zayU9vKUAY!=3-l7=Xq>)K>=BeTU+gynbMKikB!2=$|53DB!v&gJ3>5oKA5@p*RFih zZRe~KJa~i*4{HHB^7PJJodZF2&i(}a#0PNAz2MO|w+<_|#c4iMGkK((kwbyb_O++h zz;ViU=btWLf{|U^qf7{Tf&xOHr^$=Kr>i@-r@rXB3WzZ~zJJnVz`UFSW&|pd70a-8 zXAFyr-jIkQKyT3ITbWkL=d;J|NaJ|j# zar?CK#Q@|jHR2KC$i`}nLR?l)m%&Kn);cx7b754zPi-~bUD6nN^2;uKh!<`D`1JU- z;i-DA%zZ+p1lTkyCJG?G9*{8XCwl(SI{{TyS=l4cu_-u$8-MGfvI&tNtS|Ix-n_Wa?dUW`i zCk*B{&-r9@#QIg08Os-ipP`x?fH2gf>sOZ^=r8xm76dc!6Y;Wxp9cWl<3n7oS9{pS z6KXMPB5q!pg^A^ebe<_c5$4U4!b=-yMH;gC_Hk77K%6j#}Dl634PQaWrRG=Ax&&lQaH`f+GA%QFQiu(OJcFi&pvP6gmJW?TZ z{5<|&9>$}R7(CpoaB7eH^-OO!V&2X^e%w99Y7fjI1DR6NhKDi!&u5Okx39IGCIR1f zriXynj@|Itl^9k)8`k=u)J=D7ihS19Ts?c8&HI|JV4v>bvHH2G{{W>UG%1N0zoLUv zC(f}|xr2$=fmsQLu#}QS6>G+N`v{ePEA{6YJ`e2M!NtBlC&t+JHq`TKNbEoxgkS4O z{3|xU%8-Gz=W!a#K(-9*qY5Y?X`E{P~qSpuqJo@erUo^bu$x73%4!)5>tf znk}7{u*{TH&NfA3c88AHN@-!J>V~Jad>ms~;t#X#BhzeI*uiP#IO3h-r@=pR)6;l~ z?_{@)G2mNM#x{={hT|WOgS2ZtTvko|9si~L)5IfBWqcGfAdv^w zoq;;i&fVStCo4{n6kj)AkLmUq3c-LU^w#4@qW>w;?t_Kn|EV+VnHnxCA`S1-^waw4 z1>gZ8zx8U^w2PaF8_OK>z`r@%G)eo3-sK##Rd&cqRvp8LZ^yyRT0Jw{#bL&mvUu>g z7N$mv$+Y&yAN6tAdATgB$S;s)WoQLb{~6K`xBP3Z`>}0z=MG98u1fuDsVge{k|52F zontBRwx7UfN(zO#ZGuyo{=+IRHL8D*sKn~e_;KA`u5K_bAoY(I-9-e)m=XozRN>M1 zH4$8Fn4Sa*FFc86GZkwZ0hVZiDq&8-)X#-7yV_@)Rwt%Ui-H$pJjj!tDM^_5=y@?Q zxQ9}lnbqtb$K9CoO%cdm$emGWSrj`MXl8^soWHRZHtC?_?3~9I${{)(qTz{rlXq7j zZZ+rs5fGk1v;{Mt!{^a%nD8K)l9m95-I122xKXgb{|6WGJX0poOCU?3e zF?fgm&uA_i#@{{o3v0)}UmOKA3v zOM0C=WY_lk>?dsMB8c(_9ZJ7J=D~3KeUK!hBZ{9Xj~DVB`ocfBLxLi^(u-(z&l1A( z-?t`j>Mog;e=_;Mv2+93e}f-PWxaS@z&R{9I8I?C6B@>oZQBDtNH#{@a-#((Q-6tW z(P7*zDwO8%)VJ&Dg#Hk+_g9WW!N&c>{~B~|=Am5sQv%r)1RHP@0a3^kHeTyV+j#OG zQP)kn@aPUNgn#ZO=XLc8bvn$E7#)nuzL-TSI1$`29(ZN9i>ZNgdCQL6-L+6)nziDC zuA}vu@hxy8u6wo*5@+bHRQ^4_%4Xx!2Mj6*qBAWD;$)Lh1V3xGX1+esA>g>`#gH@03T)&;3@ zxPFOF;8sIUf~ZhllCK<_V2MLi+P2P88T`|)aw^|4WJ3$UJtjN!UxGW#sF~U{wNm9# zpoHK~5?_b}sQo8j`p>N-@BLLJgo{NOfVZSENN90-7!VGEr$X$dyHE~8*}61xTlEk5 zu!93{J*mKJ_jTvT{VzEReH-ujupKa(wR3S2x^J(x9M}~Y(T6K4qD;p+Q~X!@mS4(` zQuBM{f;6^Qd(K$!3_~wgP?6E(3MPWgG7VIlJ01HF^GI=(4m$I4gK45hdPLDZKOvSf zq4SNi-?2e?71%2Syxz@c35DfvdK>``m3)9Q$8(;*&{H68!w?bT0DVTHoZ2|Ke--`s zma4jo(N1`LITQ&k4jH3*__>-DR(+_l4_UOmh3oknoiFrJJq7gr_}-PAwp1m3Lh&No zYHYj#_oYx<1{Q}9{N+g!6KmtBS9#hwW`cWv(ef%dR=_>lM~UK}O_NN#cbj1FFvuTI)mHC!05eiQ8`EGLG+U;tuh(8iU|{{?*qr(?t52SY?|0}*alawu+2tk2D$&O9ffuU} z$$sm{E>}*!WSl4snM2q)ULB^wa-^Pj5)CWXrQ)hJ+ghlte!6aCCSIsjf7uM?CzKHB zd-xu=LdGi5hRO_pM*#$&|GpC8&zTxijKBA#z@Yi{rm4TSZ=~3z*3aaV=x>j8lI4c= zlY@G}*+{+E{oI_~=B}v#bs#Z?Yu=Re7_U%0Bf`a1AyS34T=Z7DJ;y9ZidCAgwR>9s z8p%brP-5mdF@7+Q^WXVX$K{pbA`ON7pHT5oIkCiN)h{N#h=$niDN9&sl4uTE^q0&m z8m7CesOnVeZyJz9c0?r$)fX${BAT40)m#)7)`Xa+blB|&si*CKd>`fBC%9yXT30H?R zO0;&tMe>qO3--N0L+uTJH8r4Z zqUs_W-SF4p2||%T&|T#4R5}p#ufbUm7>q6+VSXV5%$XSf;P?*0r z6d44E2=CQm89CUR4pB9+izOtGHeY)%DNrVY0qBqLD9U*8HfZaMPivm629%FH;;-8i zNK@odj@hnLe92hB?j)I&eKH=gs{~=H6iDun&&qQV43m9ChraPo?Kq;7OyM*ikf*(U zY&|LC%C{%T*+xwa^HPVqKn@#;B9~T{g@5BV1!FwQqV!|KWAq`x3-Xt6@w z&*wa1AinqB8rm8 zTC8zOV+MIe)e|jD!jM*=v-|dL;;A_?_bF6HqDbqs9bz#QtAt(qC&i)_KP7d!o-{=) zDIMDtCE`NxVDkeMx-Y?^3afeXKKZ1%E>nZc(#YT(2;tnI(;OhiS?D$TvcSgfM4K4W zh8gs3>^v}j1Jmy?1z8UV%OPS&zwcfnH>}8_#3|qVAVX&{keU|vUyq!Z z7ch;11YwG8#K7L(d-FriQ+*C`4fRFBKo0fht$RMRwH&kh;wLF8hy5p9n`pMjBUsW> zjyBGFj}DC5(VB5h3%|p!);GP679=!1st=SGuqgD8c-8D7$T6RaOmTOz_0P{CLnZ=P z6l^DI-Y0e0QlQlkz6-pS*^5M;8fGnJJJ=&*Pne z3psv!cXc$kax?ewn6)?>8~GUTI@Whk+Jo(2Jz+vJ zHk;?s@9NPd{bt8v7!)X@#;J{s8mD^RE>w!&bCjnaVM4E9AUW+u9G-0h4y(TZOBO9u9z#HwQ}h&K{(JhV+f3%U zJ)d$k8;V|1z)SX<4drSc$b?*-`4#ZA8S0+@+-)&+cW^Y0Vm~C$^&InyZKB7Ug5e4) zpfrA%fj30t#f0wcj3gqPa1)vUH|DA`@lKPZ!EQf^{f4lB0o?gYXK z%MqQ6eKDmfVyQ~lO$34H%Ko%pk5Ja4RzH&}O85GTYkZS#fhxiEIMctyY>aUNamgx@Xx5Bgpr{#e#klwQIU%qguV38!+7@3BjDtN^5{VpfKli}?$~5y%bS0@wHu#0 zl(<=Y(rQo6%P2tRXt7vE({@0JZhDA(W}5xMzmnWKU)46$tilhBTS{R3!EeH}8-r=C zxdF6`Ab0KxGD(=4D8*saw4zh2cRoHzHD9*bo_ilwuN!y~3T!ZeD_b0NDw(zFq~3or zkA{kY@&utsN~K!H++p&K#uLMLJ9GI~tNp+x83gqv;#`j6qm4u`4$zW9#F&*u5WYYU z%z7guBCw&rcD{xXH8K0?=3?~U$9g$tMB_(UZt=R|-=nh=nxnW*gk~!Cy}&qPS9uD2 z#B~9w5elpBFk6V89wrzYMkdiIeV?u`2J^l_u6lgLKQLF1?^YW1R%B8?84o4A1vOKX z94H}u3BXS6t48sYeVk#JL?$ke!+)A>i_kw!RMqqvn~IPo7H=R{SIeNuXsRN^W4m&K zYle?Kw5NC~=#}y?4IyWYP<r?qvl_$8kOX3oO=RUwYAXyI|Fe64i9kZo~7x2{af0e zw}@@=N2~P2X&94=YeM{AmlRq2DG67rq3#2?he)qbjl~fxw7I6^4~P(94Wsgr^>81i ztU1_4)OU%ch%N&y5-tAZ8T+hEtW#e|<2`U!R+SP#G=gG0Flz3_5z6t|tdzCyssU_z`~F!4 z2EFP=hS>J)PF@EYx%v>G~ts>;mh0Gg9$*AqH5TeTBuH5>ivplXx z8n+k7|A1#WxJWOQFUKkaQzga?b)r5vp@f4X4Jw8#4&Z9(>i_qo_E5s89iW`xTnDn4 zm#k2kVWVncC6hhu$?Qg9H$&5-N5Bqe+sE?`vf)5{v;UOvDymKex99Ws&05;J^1V@=uV@fCw9he`g_J=SxHeK7|8 z1^t$%qyeVMHJNyR1t;dVgPqYVg1SeHaLcw!71$AG|F&N;9rs)+ZR%N7P$JMg4v6-y+gEzs zQcwwbS=FW>a_^B_N#6g?-~12A?L}q4kxGp1?Af`TDL!@8FeemWra6Tqk#_ygKHJ)k z^XB#mg0Y5B26~elChJCD9%Fb{e6II_;Sp3rCq{@;6?3n8fB43Ghr2f=xo74++V;VI zW=<@{KLBui^ZS*LALi=i-ZpBHbbKwf$tlaQOvOc|-3UO!W-Eo+c+UmZhg#t#Z7$8O zUsvw7wAC58ok$Snk?+3NS?;7&A}Vh~=W0Zz zgToxS#u`4&*ltQ5-pN3GMX?vs$mPGEK2fmkh-MLY5nLoEv=}*%wL~i7G36p{GA1QK zi$`EeG(JH<^Ncb%`pUv=npWEKuB_MJRn{Lo1#cAYGU%ds57sgERt1Au2F=9bNl#k` zwf261G$T(G6l1@WVJKmoA?5ro(Xx`NqV`FFlTJz{H%fLVT}pgbKwwq900DOSO+1hn zEK=J0qBaQu&Y?`4S%OxgHuGY-1E&sfIR+9LP5r!#y?gMX@C=*S{~e|^yiY%Lz0__j z0_CZ%KPYOR?D&NhmB&i=2`U0y=NJgwIST?z^Qro0hHV{^6X@Cj7zOO@gBYnzF0~W9 zPv%GNnO1DTfCkmnF@-!+;G_J2N~0i-tf(@tqPcBuekbH;w+}dtLEq$AMDU-Dr1XiM$)p=6$YW(bUfN$WqJ%z?MhNlw&xy;O;Ya? zdR@z^?Ob4Ks#njDD7Z&K7Xu-W{-BBybYc)3AcPlYEPuqqCBWq!BmD+r|585I6@jx2| z9_yTO8PQ)-<}-~EDk#uc^VFgV?syJrOsUUrAU}x}_g;DN$;=mn)kEvscTLfK0eH za0Mnkx+npNMp^PaQH0U9Elkis3)JFlB=k-V>N7V+g6pF`GlE}7@+?ZhIZ8nfYfmZ4 zGy^9M_*$<)-oFyh>L`}(cPT##4<6q;eI>B+vw0X5A#1sPQ#mkQ!mq}Q?+(%gpIYLw z$6`M5 zXA4;JOe6x$tDTk1;&U1sE{hYFA?cli-nCrVA2zcKiTN+1 zl~Kc}{l?KCTpM7@lFwYe+eRV_MYs3HUu&n1KPfeO}tqX#A=gpF|!6#S( zMJO%#z`xyA@a6l;NToQ>TYPy30J@JX&USA&wZA-nr-yCD?E@}eS=-rfowX9b^_l9s z@qXutRf-?G29M=Vb$D?4gCXpP;MXMO?8!^5m~D6AE=^~61bCQVb*g{!;s4GsM7(-o z^@^hQoQCtj8PR5G+Ntv(?Rq+cvyS*>RW|ykV}Do6y-t!{zBu+>TZnDs2a+c9b+rJ( ze@8l^TcP=2XO_k!(+M!M)&yPx(FUFuI)ouedZ&~6eMk+>=&Ux4i9{DY07XYT+|bQc z`>JYb5*H>?LEExePp*(<Q1?#LzxPE^XYhtE6F2h^{Ld#H%{JR0Uj$g=XImJPMowo{pWUXk3y5 z7tfS7xV_?i7sygu#Ka5(C?fvxg>=%z8^>n_{FC9W`Cn?CjR zM?i^TkG)E6brwk_dws5ZhrSW~3saHQ{Th|bAt^M(Sv3>m4URB}fK7tK(16aC=w8rM z{nw{hzwv)R-2u%%>H2SNmNas>oX%7g`yr_Up@9NC7jdhL>&qv+tsG-7n6FG&P-=O|?6?AjFZ$7PI@)LfiZ}D@#30qbMKvT26XI@^%Pt#U%dH)7h zyM-t)FVGu8lPv7;1EP3u4ZinQ*8+VgpZa=&R)(*CK+)voWSiJMXZS@p?0o%a(}e5| zR_LB6yv_-8OWK?x@+-XTf?iNNrVb2GK2`nN!3*ejUbBwXrX7A1KD6I0eqJu6zgWL< z5h&cP*{xtZ1Yf5x35zJbSqIst3=M=iQ!Og1va*%v+lG9D2#X5 zH9M9H^hQ3dEb2lj;>dc4)2nTw#D1sV5`L(BHC8o4g8q1s7&h~=X={8bUo96>=~OVN zLBT2lE`kU@&I;28L#~ZG`zcs5yVLRzLDz_7QK2RDYPN}4S(Z4kHuO^*lID%P8>m~Rd%3!!q;pRq(YX#t8-Sl_p!G26rw7wcfYCoLm(Ts;U>&qO0(4u}r!6@z zcGN-GALV~PHzUgV+w5xM)%qfJy|JHWdnV1xu>GiOIYTx>I_B>mOn9xM-qW*$Yg~a7 zCVkxq?rBZQWZkUJzq@~23gO+`BE^vKE=_MWmwzTJv8LyJ08F(9lp@+Kp--+Px+L3B zfET&QdmqXd9)G@LHndvetdbagU0i3-U;LR_hMh`&7ngVGKh$q*d=k-Qcxa2zuqG7L??`N>QZMqKqj-M z8kz08SenS2@1QeGkY!J%7P!XHF~3K9IG^5ct)Gc`I@W_1a*RJxMl!+ANFzu(NO%BD z<`@__j6qUGaU?ZYRk7|{8*>O9z&8sjPQHBMd!EZR;VcxPud*s0SF3PorO7Hj z*c0PE*ACnjS>3#7o@k_FzmlJg4Jse}meQca6|pRiZ*xFa4qH_V>F;!WiAc1s2RI)G zUw<}bA{w_VjP_Gk+a0t|h6nJ;fL@ZXbU9>~`^p^{W@)6&%?s|HMS?l0kXhruLZIyv ztOA5y#wkqUt>(ebd3cLdGy%R)EV1+|I`|7t8DN<&nT*O$o-&5h0NjqQdWqzhK8-SC z^}q+M;@E7dJRyf<{C+5lM&(t~i-8WQ4tNvFiP?sVb(&g#mk|?Ogg*Nso7R1Arc2N& zhfgH{=pTH=4ID;OJi-Lb!C?9W^A^|(M2IwG?bx%+Cki$qE7ZW?deh*Q0Y6X-re=d) zrU~EZh9jTnUZNa62J;OSzonB*o9U=r7Z2`=lJStWnhsuaMCvrIz={XnQ@dpPOrlMCO0L#)TDBUVL~35t)eQatlCzW zzCoG(%s?Z%>2#?G5siCT7uWzm&9JH?4%ml!>7>X(HkZamczA0pCRxG+k3q89mMEi= z^LqZiM%sB?&A23l%XTY-kfc_hsjQKsy4c#ESLnbTn9zfnn=itm5qkzsM)H6eT?(Tx}J<99>;qh{E;{MKTz}ATRH5sl~tDq{i?P zeid-sD`B0pa;i>*ZKuBA@pC7qr6sv_RbV9iPdcdBpP9I4R&?KgK$9jwlT5NkT~adj zH_+jp8@p^EF0govd24P_6q@RGNsdLJZv1H3-1V{~#>#KN)5pd?)yr+57_l^2z32p@ zGMu{U^^h;$w1ZE@&S1DL2Ds(+Lkt9^m$V;goq!pFJ5C!zUUS)TUVC)tx7X@&A+0%{ z_r%pwz>()wZh{l=4YQ`Aaia{w2MB-;IaZgoNZMGg^@n4NhdmHVq7nh?^Zp@r$z|ro zbxjz0IRag0;(vQ&3i(1YdX}T2( z2$1C4p$q4uXaLnJ*487C6 z$IB`?wssVL`4Am={GxG7mS_hsmN6@winya>6jNJlYN7ooy0GZJ>*6Eh>XcRUove&H zw%#AK$2(bFYK!j=3wcA)R7+1a@@$}>Gq90so7;w=eY6d#&f&@tFm0B z0O+G{?$8C^q@mw%rX#OvbG^bXC6Az7@xrGTcl18*oZiZ4Iyh4T84K z1svOU%&zl89msHuGd6^9JoPk1#Ii&7TNvx*PkYPxRgNQSZTxL=4}S(@Tc-MOn~KGF z3OrosH&d?ksHa!-WyA#Z*-u0C+tJ9{kzus-AyBN6YLthEa1p!*0+7|YR)jxc#&V{9 zkC+XY!6i5$Eu$#jTVcRSJoRhKXx0dC1Ca_EW){=EcDJ9Rl@J@T)$Ow=_t!jZY$w0+ zwb1L%y=OQXM7F{f!xcw*a25Q|dUhKeN;Nf?KNrGbZybl$F?QDioi8j~{Vt}rTE8Kf zw#8u;>jhmMVI=z>JL2*DN?sLLl%rbYW|Ipw8_-M^ot)Yx5*2qc#w6(OzR@ea zU6G@(+LYtL?-?~sp;hYXrTcVgTuP*}comuB()#q->QQ1tGKzKyC^0DRT*=+zPyGu-XUba#E)=vMhadzRw4v^Q;%<^t zDIQDZ?Z81RWgm~bAG?{BRTH*(rnkSEYgs)@w$qKruX#+8#Cki-T&;G>?52Pw&4|uU zz1%jbbdoeTdU75bfn$B;zr}}5zwQ1PwfgplIolO6N*mI+$O$oGmE@`c&|lwPd4uDJ z3&V~Tv?t9lNu)yFcz^m*?#R~4`@PTbii#>|OXA|E{g=QWJ&mkCR&ubW}rP>ezex5v{yk%;q}OqtHYkI&3wE0wX>>^7Q0^n9x7bPr6kr3M>e{*k*8> za~(7*i^r|G){lX0Oi9FLHHCWyu!9VizSP~_To*JdVXSBQTrNB-U4cZP-rph~Y}j2Q zs=T;6#p{Hn<zU2egYd}rq;Uki`ZG|(GWks7ZZ4cd=}qp z2)!eF%z+a{{GbMVQ4i}=KGp?l15xkxI6gW4r;iVc-&fw)p;?&4&ow@`fH07_clGv( zQd+LQMXQtNvX+XE@}}d08XP(<*8;26+09AdrB6^RB<8XK==7hXfZV!|?Qn0`{84jG zx^CsjPUOQXJ+NIO_xRHQP_pCgq*3vT@nqW3HyA?jRdr2~pLqD|&5hpR>2*mkC|RS8 z)h$&^K)dXyF_!lTu07{@&v6}>Bd@aB;omLv?~+O)y7m*qfjIT%z7-y5R5^8<6;Y_z zO(7IvlX{MiDaavuK+$_!(kW80LWV{q+&1-s5!1_a^oq0URgx-^0l@fYk6$LF>*14o z{z7bTul3A(?Oq(u)IADUzR?l+g~B?u1%De-%Gn*6i@8kjC*la z=@-jwoA9ZC?L05O|G3^2*e+JuaC|DkzHS+lPR6^jwTUv;Rw@iAcbv@cuet{N8TIGL z4IUx}9wc9Dvo()rw?NP(y1CU^*Sv(F0dw+T&O1n*G6x>Vv?_;|sgyq3hk7#HPxVN1&Y8&aFIaJx2j zr3q=mVC55<&rnSTaXzrW7`B)Jjcx0*Q5rR?RsU_ogPZ-+uS`nyEoz?!)lPv#!E7lW zphERJ+czKW2#Yc-M^<=Z$o$-jPx3HyNKFs{&GB#+2BM|(am1Mg^Y%>Vr)W$fo zLEMiq2tE23^qM5|^!okl&+d|+H7ft~2Y7m|v3HV|zhjj4*2X6u7oHFZ4rDEI?8F7Q z^w2_#ba%dg4;iJ2HPOk^Xb%i&|7=e*oIy9wDr8SG?y!hhV;gUTgG}uoDtJlqW?Dr^ zZ({IRtxF<72U0^4RwadKd3gW5g$@PW``59#gf`ZBte^e{*6U$UK!PgeMb; zJfaxjA}w@T%P0_a-U%90Z*`_9 zutkxW)(?__pthcP5v&IzH4(EZWUh>q<)&MORq$4wovp~h|3`7z2nLBjiT^aX@+51L z_PIB8Pp}|JnS?QDE~jbJ7(}etw!~8HJilQ3^(a6+#uV)=dXoEyjXdb;!nNyJMnCLA z^sBR`O1t80AMOqQ%C9}kJZ?4xan|{6w`k%#mIhWLG~cz-w%tn+$d^W8{=$WBG6Ksp zh13QjmITh)r3xZ?G8-*&_4Y!rr^UJFEZZl1eDAIn-`V{x;QXBRR6noR8$ds%hOh;G z9&0hQ*OA0=_v1bfh{fcyFN$-{-Y|JT9@%D9K(j5*)D3LTqnua}_&7n_mf7SplB5F7 z&v^1=S;t(W-9amba91SK>Ix*>my&shbf0CpY4n*}*l6T)f1lu{M_jr7*N1#R+5EnT zxZ}O&uxXcadv(6!E?Vp?$@=d7X>bt_+6BrQscU|4uT_7j4`;-Xh;|3J2+D2lI`KaL z(DD2DGOEdDaZNkmNuDb#!#b`byM1efGS45Ab>x5WQGJpOKBo3QoO=T8%% zvvTIu(B-?pG(mtEwCGFA9Z_E?-+PD?Mx?iDgV$~5l9XcMRu~I~H&pyUtULWh=bzad zPaikGte5uLY=UF7Z{U3DEcmw|5f4zbiV6OJ zPa|9dOeu3N8QVeDG+?SqK$$H#%7|;%ol1r73s*2I_?EvvRNV0%Gz=uq}GpKEp z`p^ajTwl-qlUL8yEPKz?D8jBK(c=3T5fW4AJewV8o)~hNd9j0c7Ou{%O9@a4dAU(r zu?|Q`Oe+Ee%1m8iuk1_IP*%)37z_p}Sgh~xgL9FS)~#8>6XV{sDH3@8?G~qOiyVFx zDx}NW%E`syh9a%R3$aPluRl@?O>k2Zv*R6c?uPH)_SN;Q#1q2gVA1kZH|Zdmq|`cy zjcBVYqrs1srkiem)^=h{s-vD)m_2cC4iP{et&RKiD5~i z@qp>74y?hv7+8=>G+17;tJfa#22H-7c`@yLy~Tic?cN@l-9<8z%N4)Tp~L$*$v z>?VbsjMr57mejFWpK*qog5ZLyxbS-iYG34TfUvx{S5A=;iYp0OP@1jsOii?2{fBu# zeK&t)v}ZjMu^cwHs4dl8~#PJCISicA*c=>Kqxpur{Kja(&WD z&&Dm4f`W94M!F|$anQUf)}}CwCoDv0qwg0+J}BFN_|Qy(?RalwTyNL3#V-DwEx7zHtSk){ zUr>qUOv*1mgc7iJT@KZ9S3BQ!-DNqt8CVR?6m0aC-JQhafxtsw={F<)^k6uqp^0UW zJ$W2A0%NsRIJe%l=Z=%zmIk_TqMmU29%@@;b$7bW^V>`8-3%~CQGOm)X6e94U=DRC z1P|a|G$hp60YirX?~&SP6T_hwve>NX<**T=vl>xHS%@!fTa0-0Y(b(Q!7F^y3@j1^+yy`Jj^ib)FtXv4sO%&6tL zVlcpD@IqH!o{+!+q$}B)Ux)pw7z-U-7#U}D(>yeZg9od)(R?0w7T|PRe|D!1FXJQq za>ZgBK5mfMwZaoez$M~9X|waVm(N11fIt$K1+Cs_-c6Ajjc4CU*-yTMl+EiCvao{+ zgfT8jsd?Wi+O{YWm06&1{3R-}0NK-)XFG!gA%jh@z>g~_Vy94xJY`LGlLG;6~5GT_3J8(K3rzy18%Ljx zDLV`W|8g7&2VQGs!zOKI2zcbS&|p3-|Nk0si6L<25(jWeO`gd9;~u#&@s#MW+>PVw zVX%!A`xBmFwLLbav?K6_d$T`VQRKl4FFC*2Y<+HjR#D4n86PoRl|wcVuI>ke2OXWC z5EZli+WpJUU0FQc9Anjug-waK%!9UxPYmt%5jFJwy$J!|yXGR{A1f+OB~xCSX^Z;0 zS-pD<#(?=&os2JNqt^#+syMvr`2@0>{dYcBlYKm-J;lEjwPz;-FTZjXZ<`dk^qcv) zO2nw$`9&KB=P@pc6zTYo}hCDZ$U9PuiT+K01ZtMvh3JTRQ-In)c=#w@g>r? z{gNiyK*Aw?R)bAH+6^`w%@6{;ne7EBpt|7PhiXj!8u!sbkJV0~4Zc07SAVo4jUTX4 zP`-cIVgle67t|=Yn@ftuyj?-aq&~3tYUL6dF#WMt%)MQR4;xdkYml&E0PQ zvGfBoNQ^pXq$7j`*+fTO`lW|qQX`jHJKUZ4Co(I>S?q%h0hU2K5wbz2;ZiE}I(HFNFsHaAc~dx*ngC_YFGclj3{ls& zH)E0Nl&=m~{jbOuynYkes-o;kUYLp2WzeQ!s$_61RlSRCsR=rJ*(wJnnI46erLR^P zol|RrvJW=-Pt2?$>S3Kz7T@=ZE!i#dHWA0t{q`Ta?0<{z z{y3%%O!Iwb^qcsfZ^J!C@u2kyaB3&C+ULoCzvvxY{z#0g*>#;dxntXbqO^^ZvA!u* z41E+Q){{XGxOyi4#^XhelDRle*q~Nd z!$%`GxF-GCTaXEKl{JFV4U{z!;NdZ}rskxWfk3|U#WybN$(5Fjy^+)zKNP2U1LNk5 z{^i2c;r$r`p_p7xQJ{MMRij>y^x<{5W5Y}ZPR~lOZ%k(4?poFM!zoENgJ{LeYV{CF z=;hiF_aTH6w)JdkdlLA+yv%t9n(XaXaf+BrTMm@vm1gMCt!R_ZZB}QI;JExfbNDrT ztg2@KAnTlAOq|Wi_`b~)R*KRsKC}cTU}tFYI2l{9Fo)c`j9RCMZNKdgDjqgqlm@00 zxq^Y71`vp;gwjYL34AUAyKp(!hisDh~m zk2Ehn?`_w=u1%^Z+YjU0zxp73k}_MBaz)R&1kWc=UbiG-4wu7}fJB;gy*BWO1u;d9 z$N?koIUg4MUy2Aas%1V?E14<&<p8vktAk{3mt$TJ%*6%LJJs+7YA@S3;&8^R#2-XM6Pz&f z?0~djnVpzR*I({YXdRv32-SPnp|-YMZ3|LBrLr(fY~}5{!Kb}`I04c~JgYkqOv@R9 z59ox$=eX}osuIc}of+gyHmUbHnhn>9w2bWH*1?bf$x4nP*_|yuC)^KqSxG9Rhra2iHCSOum+FDDN_W9ynD!qC)+tQ72`= z^bRC-saJeFBDR%1JIGT%qn&E1-^P79t_b`Chty{yIt0&$($-gI*Ae}*BzTi{Sj*OM z$%Y~!uJxybRZrxjucAE+8~sq*3dlTi*@*;_>FuM%!YoLen$FfA_&rOLBi8{L@O=Y? zxtj48jHBP#+xd7c{Q5E@s{pq&?2U5JmTrcD{~cW(Ruw|ZyKFi3|h3BTi?a&(zsO_UBGUm&GN(TuT+Ah^em^Rv8zmU zZ1`cC)}@RLyA}~7nnHD3QyE}c7pH-2d6w*?6w4$zhR?aN z$Wof8wCCfw>E?w7fura*VzRSV+Cr8M_b3R!SLAQeZl0(|s+&|iE=%;rw7;B;+}2;K zF~c2IbkTEa$H;$@c=a~k%;c-zn$EgA@1bygb}@B zj}4J`SgmgIntd77;Eso2C0~PiCDw~o``7~XIm$+aYh55_=+vE>LmS*RagbiV!FBS- z>7N7toPpvX*Le#4S@xS&|8G8=Qh!F8nf(rxnm*3u$E~LzYRT#fA8zsQw`cgcrwjgz zx=fxogJ11+8Ppj*wazgF|NE5j3L2IYlP3a-;H6aV&Cif;~*Oan+GW zN~pqQrvA);;YoptE>!>Bt<}B zf;XudSWD*W@k0L>s~7ODM=U(CXjQ0w?OxJubH>;S}-%SpoRN^!S?*y8*Mqpy%hkIqR6sgOsGAMH~fdn+ew!o6D_zr)g6J zGlJ^@ww@zTB4WitP09>)xHh!?cXbfxiR5U;KUj&}j)dci9j4>uj8Rym`{{4rKP9+~M2+c0IKmg(*FJPQFWw%+M zxtBR3&Gj|P2zlW`14}VRt2>yWw26b+iQ)4Z5_{HR<8b#cM^CcUx^{Tz<~(n?FLcA& z09~pR7h6V=Aa9FUQwlJ12{+md({- z*4ESi7;u-_wA!bqsB7soG6|pKvefvxsbfe#8Z7c?U(tVOQ=mPW-ozral8l~@q+&yh zy>4E%5WIE8N8@KWv*Nyd>*E@@W!KzVIBW++skyHZ4e-OXl%mj*Y+5P;7w2>hs|p+- zetNZW6Qy%dYQPh?VOB5cItd|!VZ2E~x{Kz(++uDY#VUt-^ayYr+Os09!XUKPDAAsK zIbx`lMOW^Z`mvW5pNrmw4GP88KuI7)K?i443S6CYK$1(k%$pQ`u9i&(6BaG7MtW*F zGmv-Ss@_uU^z@2SxU8vtoZayk_6w>0X>rr*KNx^n%#^?ZgFAGuH=gVLpx6uzm%<&T zy@st;<<)p;{#E}QsAugSgL4eglgqUZn46Yx12FIHLh6JQ^?1u6kxG8*HjO~Ve?fbDY(7awHXyu#~p_U*@m_DVe}mOG|^_kbF-UQH2f z5G4PJdms}L92PJ4QC)nI+V-e`(6v`L8y-J_GCwqfzN z#VyCmIi_BfVLmh>cAx#L4{AX7!~S*Rg|TPj%YKQn{wQOi3K_=rw_O<#gAO^j;Q_L| zfw8#nnoqT{pNF*JZ#gJWMu)m~u45+RI-U#dJqSH1PkKck+{~3z2<1+uHJH;xU<22F+JeQQr3V@rT{+Q!=e)@>$2xo zBynrcB`9uH83c#-@3jXIt9>Svf7o%uY4qcuV`2Bjjl8~_Y$lZ1zZXZ@1WXQZg}lZHnKebrz+a+to7h7NiFtXPi&ndN4zbYm z3Fmp;3Z*_(*k@X9a$ze^v+z?rJpKvvCermT7?aa@x57$F@4L6vym)a|#%*N*L3f{d zn^<_l7uDh)t8$4(o_>4w+pkVml}kgbNn7V+NpTF{As&4i&DXISn)D}j=?I7hfDcFh zbUKjuQ;Kb%oq`-TzkY7kou(me#)uH8;|E%#(-o|NU8aZS_%8O=~GhO*uj-WYzA7LamT>wR1yCac_i)A zrfGTMInFL`X%pU^zQ%{+W`N7W1Wg;8J80xlCwB}ItO__cu4u7<{EybyzUBMRqCKOa zWrg<@ML6@eZvAlp5yS2wQc5qWm>#-+DN0-2&s7|Iajs#-BZFpMBrDwJqh6wtlcC{h zbyqZexJNMcvX0h3@mTXJzRN}%lV4A;I4MUKL_g>*hRMByV9CHPgAt+u<5kdq66!oc~|eq;6J68VDq z)k5md_)=>f$@8%X`(`hX-{9C$o!o#?Z1qpB~S8}|8bedLM8%P66O?6f7heZ6JH&+Q6>{$>5d3)T*@!c)A;T-_anqDl3>=+v&Zx+yGucp z#?C(guHIStvG|OJI*%{52>UqTrx&id9>&2NGHDi*@R17g3KFamO{?wY8>!Ege9)=9 z0+Pp3dTN(OB7q4-c87f@*#Wq{=RvTq#kKP+t}(yZ)QqVMm9go@6s-@rjD-KoYsU26 z-dPk=ze17eLiu{EVoE|K2zfm(-n1|Ncro|Ih(CBEdeXH}g|S$PH5xs~>eSPc^QSvl z3VH`R_A>b z=|mpe&HE{kpH351MbsPz%z4F|k-HyB#2+&=eM))gz1Ygpv`pyj-iN$B8X&gPb_qjb z@C6C?w&os(Vupo2$BVf&L^Wg^oXD~~*P8BvcpuE4WV!IW@W5++q{VansB&Kn31>&g#*R9cxa$nP!R4SlGRtNS8IzK%DwSxi>9%W~7#Ws-n zZ&%P8gperq90;{>k8w}%l=wh=j3Dfkfm(C_4*^Gv<_+k7LH7Yd3eIO&8@0dfoXI&B z8Fx`dAucu(zixd>i#mTSu6y0S>>DI zWk<1C%mxi12z!@&LP9kh83y#u&$@(GT4&)n`uP&%P;9Cxwe&Zivb)9Krf{bQXgbOym{|eM8KFH*+`-W9 zpG~mte))%b_mMD2bBO3E(fLlpzTU@7PMM)LI*bv{YMY~y&l zER&Yo?;Xx21Eub($ZxzbuYF%!T+DOIZlZT0<$N&6MY)Js{S$u;qBsv=U>J3Vi#`}c zQT1BV^w6CfKYLRAq~N!vcv4B3Hk5Mb8)6)8`J7*#sEzUK>AC)y^H44e$r^W`zn?gB zTbE<{8KE#SJiG!+!^J6?s1@hXVR-ee0KwmMqlvDBm0i?Rv!xRbh4Sgicsq1z@+W>B z!+%`7hFFCI2@8f_m4*#9&qhfmc@=4yW?lr!sq%(JL$6&3$u6cr_~@Vx%fJU)b1HXnB`uc*Bh;Vd- z%q{Zc+J&`#h34w!{AED2!`*4m=J|2lm!KV&s$Wit@rQ=D#SZB+h*Da`wSmSdIA!lD z_WYGQ!9t|L@cH49cA%6(A;*7h=^Nze$_5|wZRbJxOPgeeJ!FSN@V}G1p7l#J0ffP6 zt=1n7Sw5(rZ!cg=wp7{vQTKnx1#%BV2uDCc?1|HeyEc1KxFP_i8na@tntY;`2oO`Cyso^2beqa>Xy=>Nr}y9*SU+w$BOS4cR`nx zRFDLOJ1H>ad9zwUgpsF8^=_;#5p$ruR-licI?d&G;pB+|v!R5K+)|>;YxCZa;OK`-(AFA>X2}}Ks9uIkQntcxT7r7p35XY4 zg909_mw~GNcHY+ONNNm~>zPOz(1uBW8cjnbv{ZZXHPUt{Z@jU-8`Th_VD-Mu zI`OYtEZvWqr{xOcWk%{;*-z}BuJB?w;fLE>J6miJ>y_7hI8&&o%j-83$^$GvmAQOD zbJi<7T)fu$PP_fW#~qgJv$32P-?b>Ih(_xE&s1Qw8Bgya(%&K}^BI&%Zsk90y18(y z7eQA?8i~Td5b=c;i<&2QK^LFoyR}39vr>+53-}5h-#rIj|F^?WJvSH%ObhrDjPAbn zR*x%S(gnkDuavyEa>xX-KZvg$DH>wD3qA+^5rK)Oibg9<;PTf<)3%HHeZ%D4v-ggR z*HuIZVWvEfAsw*r-m(6SwZ)j!8~d06prcydzeJ7yF5u5R2%D|{6`Msifc|W6ymbz| z=CbB&1z)XGvpWKU8*5A2M7?~0!{0JX{|72zq|MUg>3g5DHV?q9^hTpu9b>Nplf#tH zS=N?#2p{GBU%SUa*Ln|6aE*qUfo;jxpbg^AVuHVB6mr4;_R0xLcr#~wz-9^>DIm*H z?hy5)OPE!LDp2itmxD$>Mf2xuNnOzjmceZYzYok;ax(+;;PE>q`~^KLVlGiZ;XEnL zYk|@QZ(SO9h|MoZx&#Fy3Laj7q*>}!kf$>eX=O++JDsDTC+1Cgf^z7bjKuV7y2Br_ zAlKdK5lFh*Zp*Lsg=r|yUCKIMwC+z7IQovIg0@nL(Rt~ssa6HMrO=wEdzjN^(ey?u zxT_2cKC-D@&#b~XVz9^l*GJiTxt*U!2@#*sm5$HC8kjAdT{nvwK6!)EDnwzCsYR8` zBlb!xe;gmMc`+R;{o?f?4i#Idcy#5;WnzP9RJ!tZyvgWydvW^}&n&!4v8`<$C%g*s zznspODE7s7fggCHtf3h;p57JxChk7mP(Y%;ZwTSjzj_~d{gM8t!HZu3e$ljWJvxGB z|9JRWI7R1Mca+;WSs{(VvuFjb%B4cuHhk!l7eD^f0<%-Dz;IJb*&whz^a#K5&d+fA zLGqVO%4|q5KW9L+Y~o&dnXuzzv9l8U_0+aMi9uV5Dk?``4$iV?YwyWad7!IE@_kO4 zGn9^r_;}t}xlPUWafpOdXS$bi-|pf4icftJ&lmk*-FEtSYP_kto#9jO$P`&85i!iE znRMPd(c3MC*t^>K^XeGRkM`#0oJScorePiA$`MFbC-{@#mWRyzhktQB$fxA=i>kUE z9^|=3mpBBF3CguH!&7m8Yb6UFt-TTQlog3{c8Q!`h^zZ+a|VcM4>?iitBTyBEu&wb zYI#vH8~W8c0jss7qS_PFM$flZBu_*kFpE$F&fK0qxiPC%+|Ja~sXmmJJ(3&w}Q`;)jBgtnjRHEIq&F~m~Y z221e1?(6`z<}FTz^+YMjZG@Ye=|`6^r;*~+a?+4jy5=yTAy?_3J^SV%e?v~RAhA?z zoDjh9XlWhONdp(@9two_&^;4QT(Y-;VX8gs5s%Tn)e7YEyo(QM=>RXRvuNSH@!cy- z6UNUYegVk_uX83}W4&!r`rTJwqAZOw-gr!L%_nCL^amr7w_HzngUN9xD$PTs)^}U- zW7PV?jOPmV6vlg7+g3^vRWJ>8=5o%IsizAOT~PHYKd9*<;n{@*cQc zeKfJ!b6zS|TbH?)1UZ5Sq8~oXa_EaLQ$R&ED?L|71)V2RZxTj4uu2T{#D=REc&~}h zh3A{=59%tUgkg>P7fT@P&&KZ8!rK!}Z|?FkZ}WjzO+%4GOq4^petSFKC_N!zp4mEE zkw~@b7c2eXlS7$mc$R#?Xu6m!`qc*@PUhe-%vU+S)ZqYnQ%;~m=Je`4jR&5^zjp1I zXZTyWaJnY;_nRrvSB>b5N-2O+g*y)L3e=+pIhO8*)^ixJ;pU3?B7b6Ys**Ha9qqw04@==ce z*R77DN!t*M0~I$>6WjW(*qOJingVw&wlM1Z3!4DCa1~Wz?XD6qpC6rcHCalTt`&=}EWialUGA$hmB#2yjEAGX0`6YF)*@e>uy@SXuf(ez*7+6N#N!G;~Ciz{` z;ug0=k+k62^;y)!^~&MI9DT%i?l)%0FE4YXt0=$z#U&c9=In@}b_dzH&8Gd^4Sf-P z9d@}3=g$wCyw>;^^pHck=(IG*Z3{7CQ>J}g!V38*0>UI(PBjU)SZ`6A>Eor`_b1=y zqAv52iK6&aV&o|^7z9f68_Iqt6L^$BW~fzn%Pto6uAwcMHG13cb$C*mPi?P?eo!Z; zY`WtSPomf(`3Zd;x`?cMK`*>O;8b(x)^i7aOq9Q{nx_LcKTN@2IXeyi+G+G$cQD`a z_zR|sd#-R)1$J3_2n)DaP7B@9IMPRTuHSTSM?yUCV_&Zh3;*AYKQDe7vi01+AK`NI zz#wuw(DPCYXw>JP-j4~h^FO#%I<}2hA9xaYG;dnGSgb@J$ZJ6@3jZ_ z?$t%2Yo!kIUC9s_C5xqtu96BSPd*-bJ@m=)kO|7x?#{JgGacG1;FGI=u5q%xxCdNp zJ?qUr2TQH2975$m?q&T(qW>~S0-IX9&f6pxvshOGTwy-6p=w0s7$aa6svN0L)n7S4 z1Z{d9YVhy`<)0Juh)9`$x8`1$N!-Tfhxu;XUZg_u#ewwT%qrlsCdF|_AK8+B(8~4f z-P43II=lz@a2cWv4GkqwF|qY}p;f`DI5&tZhC2GCCWh(eR6gjfG+6v{0Y^QG&oD;5 zAVbvCu%2DuNdnJk`2m@lIb|7xn!RmwNNVT`gDweqnJrRvIq@o7+@@X8DVn9H-Y#k| zPK;VKu1CBBrt(JkVL_s!Cw$DE1QThGWUcLP7NJ;ryk3Y-L06WQJq|JSO zqIc^Z+)N-(7%CVCG9AXZHlXkAC~+1B^gBrNaJOCdKTUtLk2kHRLjN7?B>#Elyt5A5 zDZrO!`rhKrI~rj5I9&{AeXXoLY|)QeZHf|JUEMdkx^yKcY-W%eh->{Co~7x^p8fH} zwuM~k7SEPQwHWjYS6Dp)kbGqqj$A;@AHuLlUm7d{Y>Pwf+mXDnin7C8=70EAUfrVp zH(FL%-VT)Z>ddNrvpx_K{W|Ea-wV7)&8YD&WpA0-@Zk27(0%STb{OSD62#G9u$dwR zMz(S9B%|>)?4Ey@@6(xKlXV)F!DzGzko=YH2JKj9m$2VV-(Kjn{np@{3!)eO^EpA6 zJ^HFsijkS~x`C7)WsDf~PTz!{|K*a7vd0a7{Rw;iEQ4UB9P{VU|3}qXMrGAL;hyg9 zP9>zJyG2C0LAo31?h+nAknZm8PI*AOJ0zsLo3qjPf7UslT+0u-o_p_o&&)M5zw7k! z$ot`F78f!XUmvBmmj-(b+mm?XNSp|nOGC_lH&Eg}Y!_QcgMb=Ee-|sDcY^?0Iwwp> zf146TTMk`3oKv|elZg2&#gtLE8-vGc_Ooh@v9u0+KjH+V0x&UE@2DOnN4j-MwX-04 zpZ;p~X^>m4fsMf#=oes6`gIeOwbm!J_8T@bJ0^^z>y{JnsEBC0;~)dQYWd!LRt?Xs zJbFBA2NWN-I8lqiVSJPUdGeiYT5b}d6gb8<%SDzdof5AtEcGC!BGA>MAPmYG!y-kww zW4h5Gih3Uw@{Qt-)je~M>KyYNychg^8)lz5d1HIs0-z}u&fuZ{wC|b-^iaryyG&u1 z=5JbkOKRAb13M!cSf`w;z&gxr>kJn>Ae#Bc5N8K6Ti^au?rf?%+&KxvPObW(um7u` zdm|gUJlCFEcd2ZZ^ibO#U^M!bHGsrX{1HaBx55{IoP3R1CXhe@ywqPtUk8c7VUcvvo7uvA$h_I^xr35i7s#oyNI zOrracmNgus+7v$8n@Si1axjju_~42nPVj0AVI={y`77gWyGUdu7!}|D@xDNGw#9n;ehT?wSv0SZ zCWdqtSwey`>S(ckNi~RWU|kd;N|U=O5|RY^8$vdhu0f_Ruq3_nbW>1d6bm;VKg8Uw zg4%YoO2uD~klm|gKbdM*V%PZqSP0H%%ex$85T2p{w#82W6VEYyuqZZY$$;jC1I~w6 zzDyVwIP60TQ=xf1V1=4)I($S(0Rum#Q)v!Q-JsYX5@%Wkc$s+Di5r{(o;M}O9g*q+ zvkCMlWehdk-sQQJMYN(?W%|17bu;W^ph<6>?n2pAH9qGAwrMkZ8bZIc)rJu2nbX>5b0-GR)Wl-~Ha>r#FDheGm)a~a`pCasy(N4*<^u&pLNsZPM0Jqo*pMG-vzm`b}U(I}1GAr2=qr z{T~y>$~((Ff81)ZlfTnZKv1k=*cjdp&K-wwN!(CyeP4~lu@6HiP(vxZx)N6kgT#Cr zhT648#O0I}bt~${Dh78FicVfJYcu~_6W^Qv6YdG-Jf^&v>{{E37R&Rsv$4c{M{y^vm{D%mn9{FPj#qab-Ve@iV5wq(hC)Y3God2+1iS&Z zfl#spx%p~N{&8#ArQFAQ=}g*ttQZiEdtE8%B6K0VlGmUvtAN`o|3T0KTYbVu)wh6> z@rIV?8PUg{C@374Wmbw3_!!RoB#$SI`paB`-!NqK8D7HRf%wZ5H*X00ZJVE*Agcx&AEWSMElCx?1oGH;sH=>7ktO{ zhDH#Orz73n2K28o-a;tShILAMG{VCP7wHmm>lWgr?xsq)b-wrs^Od}gcjvsVS838C zI1bDo|AYfV=yu&`U083Of~$iC%ALQA9k3^m{^rU0a}|_ZI8qP$H`BTdx3k}1VM(99 z8cGt#{GAhH#K|TelamMqmMc8a`W$B$p5<=u>gRL{eG|>IUx&ix5XHK(!1$Or-IHdR zeE}lDQtUZ!SE*s9$bT+qh`eYgzn+t9dM;588UqLy^X~FLGwPn<7}I9C+nDr1!KV~R zvj}E9>+|cHABn_B2*jM-UWr9qCcvz+6pK`aO3;(+x7fF3uGziMC*Ms%apU;DZUhM> zyi-*o4;}|R9s>7OOZQP#sN5YsAafbxynBlq!Ora|s?wPkf;Z8zdhXm6z==z_0-vGH zS)yKB0lXPFEH2Px>^dI-=MkIJZaVTIfN#e_+dctIFC3)2d4;DGCWyg&dQ)`w8}~^6 zC)fUrJ}dDn3zODepRQN`LwlGp+$Plo2M%WcROYl8tmG6%dZ2$ol~3CQJ!{mhI1DAg#0+8U{6p=jV&6IEZY%i6h)I1c+CMISF^|`fVv7?2;z&QWBGNZ8O@7B}w zTU)vHm{$@9HnnBTH}(Qq3!}vpuEL{c_z!-Ys{~DE%l!7OHFV5#N7x?nO2jhTr7~J zw}4tW0Xzf~_kIWye}`Tw0t*dI#k%bwLKWvn21+Z>{p{FgT-&EIR<}!UNi0=L3(`Y=(j4ir+XB#| zlhU`)(zhQY$)kycQ6^!Lh3249PaC8q6$+D!2=tFCtxn!O!jzst({!>|eWg=w0SN)1 zrHlaWba+-?p?oj^i>!v)%%iu}ORG2eXjONRYB!z0q^&yI$h+9I2WJsu+tguYyMEyo zBH5z;)!`=>C^~PJo&LHlyr&g+R?dYLEfz0=li(l(n2&_l*)lTsdS#;i6#aZKUEO}Y z+D~u@XN4Ek05X+TZNEniPs7%VAW_r75}|9aG1$o4&Lu;sH^Cq*LcVx%T`LBZs7p6$ zSi%W9{YrRa3Ryx-2DyM4SoVYT9GuN)bqxFv;pZT$%p5(>8U6soO+DoU?rlQXbZ5^n zFE7B)wdD!ZKkQQUlI>=6+9uqUfF-Yj$`CGGizVVrK9Afc>h{AlB2*CZF#7b_LZ@#h z@cXQoreh4*HH3f81A8i*i{{m;g4%^@SC(9 z%|K4O#pQaMvgupIC+l+U zjklKX9J1|{b*l{}$D9OTiHR6i0fhRpU*)*hbBgr4zI58A5B|DSJ6dj6CT3pgI{lVC zAVEOD>TvyhRp}fV;T9Ckhslt~p*X0VU?%QK(hf@^N#N3Q!d-Z%><7(8s0+%;I#DxB-3A98uPF_@B=^jW4RjN+YU8egQ$`;w4LY*$(*; zs_A^rf^#6MM;NJ~Oa$9o<#>f4@@)NA$RK3`0gDCq$rmHzun^Y@HnLX#YTlz74%OQ2 z{QVS{BL`~KBIk8H*dR!cu5{P!XWcf8Pj%21AqBpCGWeLTvp*2Fb@<%={=k3b`)xk)tngGqQ6lrzN&*&If!#r((OItm~ z&y!Aoldsiul$@MQ{0)Ct#7iccjBoJh6>-XK>e5(2gFpR!f2Oh0>P==U9T&jz;ar)M z$E-VPxnPc8Edp+wSB{B?TprqY(x8?~ZzID*y9|nU;!g6DAmToJG=dKCZ_Di7(Jgc* zx7U8U^eYh5$n=r~y~_-fHo>XKd<(4JiB4(L`ZY$|N=i1dLM$3MYzlKss<3rESf6>= z6@MCDV!=?V;kB0y!p=F6xYr&_CaJddF@A;n;);5%i~p$byU*PuZeg zSHb1jw{W~M_-blu>%PW085E;|MSrqLz@SvsG3C4o(PS}K-oH`cr`I@whM^RAX|!9j z)%k|9d;|CatL>@l6w3h!-ziTfz$}+oZj%rO227R{rF<#6C35Z36z*mL`(=p9cDx6eKm|GDU`o6HmpwmaU@F4W>rV12&|jCG=G^~0}E<`r20+v<3`N;-h~3Ud!X z{mJJwPS!+2`(HrD=e)P9Sh$cklFlJ#SJubz(~D9-thoLXkn_zcRe*?(0n_~-;Wv+f zfLeOUK_+_G&l~}TZ!4CzT$UpThiC~UK1>jS8$5pqiz(taE-r{UNks`o7)FtEjgWEC zH`3yKaCx?GI&w7;g}G#@qb3u9H5NsbzqZs(5n^x%Soro)FT#D0LaCBaRMa5tWelE8 zhx-T(c14MipyrP}aVfg#))0w{;FyL4C{RX-M)aJ_r;9E`M_B$p`lI)ZETRRD3gsTA zx)NH{KHsW9U%s((@jv}$y z_TfTHd7z0M1r$d13ZcKr?+Ya0EcNb0^<3N64z85vySo}h;{%z)qr5yEkkHK~5!d_*Hh+cNvpmt~gFd z%f&zB(m$4Dyn=f<4C%?5x0E`^TTGU=y)fzYeD=t#fY$m%h>wJfB{8q0j1s2eO-ReT zZYArt$bSX+UK7x)p<%Egf=ET3lCx{v2#X;BoOM_k(m8w4pdI3k1rv++d1H3NN#cR%Mmf=@#Gwb5Sj17UTYPtOQmqliV>6I4rinnXG51q&iq-dcY;2 z0X#j=N})x{NwYKj=S*zbFcI8xGrgLwEGAuowvcf3HO7ryJgEEg<+yVxw`gr*%30O z#^Av}^~`hq^#`+nskc&}ApiY>7vRF31Fm_F{^nx;_t4}>`FF!g0+bG=1;34Fr2{7C zWe@rb$3brCdm}<)LNM}=tVxFV%ZIT zp$Z*ha|tZ5Uh4|xQ>Mee8iDCt|DUmg|wD@B1g=V`^%ic@x?-Xak7rVCJiA6 z-J46zVv?Y9uFfL2pLrPoD%8IKeAH82-z{{TM=3qxYoPg!ES?Qo`#~$epBpB$F6yaT zt|cj@4Y+z}*H}0IYi}FK6DFEluxvsqTm70wtTnP^YQG$0P;}G>K2>|iGOQk>lht+) zJvxL5n*3n$O`BGeQbr!+A)xtoS?yrb=~|PRn6AJ&l)y5^DF;leNDzUdUbn3l>nsWD z8a^|IYc3r;mN`hPZ-7-BE-e-`HGx%D%X^H4i^tuGX8PE}-;%;6`*q(X3+y#FJ@Gc4 z(t!OKzyty4Umu~?qlXCGij3oUj+#?a@`Tw+5XRAI_O!&3=eU)qRFp+_5d_tGrK*5p zU!g#jOS4S(oB&P#@*;6jrq$(0?X|Lc(E|+-q!eRfp`I?&)Z@?>e16K5H}ly~X<*I} zF@8Hj#iG$@n{K94^>44R7*!eeVntSaK6}JzE3gu^8#rr{vDfYNf+%^8sXT+WXPwTq z-Lr@oME?ed{7?IO7uyG!*yT6t4=1JAv{47tC;n%iKw9-KSCRT@l?f`xurK0D@n`61 zbBm^+)x7 z_X&P%NMR}y*+0oUMe_vFKhLX#8%2MM5-&QbhYc{T6;wnezE1KHUcY*ok)jlE(>F}B zj9VRV0pb*fCLFrYM{>Qt(8=t98o4Q)+{O3PcWj)V9WTfH-i!z+*%q8nlB2a;wkpbn zpC`n|vP1)&WXY*K4~sW%AGX&ZCcDl~J`j0^b2Xa7|KyU$1UR_|eS(}Ahx(^Ir??R~ zp1%-cEH8E1`qRHZBTgLE3^7lA&|mbO9Zv4>d@ml6Nig6h$Z8y>)#BBR7dQy4x4dSv z@jwBAEFqBk4WY-6q`aQ$DMX8IB*nPsRr-uCRo~O1my^GDgMsWSWhNl529TxA!2R*| z_P7qxW*rC9f_*WH3*_33z6$QbxfU{5p!PBi9gyUhIe z)P5?{CHddnPPq%54=8x!05Z%QH$HYfBRWSSeYSZ8W5RW+gnAQ8mGX+{Y~ZaEj;(i@=*$}d;FC@?#lsL{?a{dlA20+t;FJx#zpATF zc0?J^`yQ?agAvkpyu$7nSzIgp@VQ*K{=IGc`csZc0v=Oko#Yl_2Fc#dy{n8(lI8fT z*0mATa3LjR+;`Pp@IU|I683tNJbe(`?8kMrb`Q=Oz!0r|?_h+_n;-xU>iEE}ZC$Ie z->)koaIK8@Wl)xP`}2#bJnuFr4Ff5pW9VWG7!SD#HO~YDF+QSMz;J8T^qIzi5i{u6 zt#=v`mUj*-qqGDld?Qq24 ziQzptW<$DXgNjEhGp>O?-kV5oNPuGt0xHrIAYpO!H2}oN6B~=JzY+l zNfp^tE?Mu(U$iBrkwh&v!M|De*5>O=7u!rqxj0tbZ&qgIfs~r6-_EV!={&*%*#Efn zve_BRmzf4uEjv{o&`4Fk={*g$5P6TLJxkjRujY*n=_!1e>DWN>M$0qSuJ>xb*WXvU z>JB9@0^pd6o*fTz>DBr6;=|3;H)VVFE6)310KV4cd928!-Kca$%%OnG+@>IV*DpL> zk+yR0s@-6oz36&aG)9fM=kIbnsOapS*{-JbjN?wg{PKR!j*n?#2N~Z2dMkpZ-55ZA zg;d~{s#)}^*KT7SVKeJ_*K3hJoh4Z=HQ0!hcR!r8s+-*1t6vnzI(sx`zdTj#uTpcI zRUSlgm+<@C@YnyELr-MZ%Z?)9%~{l&1A-H#wD9Au(beANp2v#gul$%5V^+9Q^~&r? zz;~js>f!jI-4fu0?^E}mFLgZEHXRr}4Tm5kPN`u11-T}$;M z;4?B@(T|r3m$r7-dt0IbufmtF8A@x%ccZSEV|x$e@)Ti=devV@@79Yd4kn)$4=%m% zBX?kXx{lg?%6H^4G`UyCRgZ>$O&Hylz+KJMjtS&uJWOSZk-6%4TOCUKrss{O^B2P2 z)&m$fp?1$5PqgCkaCz5M|Hy6o%9opw@7t{SyX1fC! zvZ>sqcCI@xhxMgu#W@WCHF;-&!TJCqTR*IY&uKTyM^2?ujcLuX%J#{lnJa3@Y9`jZ znF0Z`-}Yt5JgH)bl#*xurRDCrT;d_A9nmUfrPT$%F$>RKxJa#K%rxuaLy2AzUL88_ z1GdLXFONII`6B`U@$W)#$QVJVpQ%`E8;^_A6M9f-ilc>YMG8N4S)on9pJ=w$gf9vM z!zA^gm?Z~x0DYB|-xcp_2J(pG<>GFUIJtoec3`cr&Fl%N|0o@neb>Afi4V|wL*ViV z#hWx*eF8sq?teXxEMeP?_Fxd2(8dCYD19<(2@d;68;o&x2i2=usFQ#YZ8N zzxu@nCPy6{Ikyu7gMJGXBl%;mZkOaozsr3#ZV^>mT~g#^fa?J8ecn zTGRyn#wfn-i_HfZaf?(gZeS(!plJmO#426Ncx{8jOi%8V`lmXu7ccoGax_BI#^|gcN3R_3F(+u)r&B z%)AEheS*6rR4Sspb_VulzYN1)3R3YFQHy<|&q2Qso$N2 z<#VN6+~L04CY)!lZB02Q9s_CSC>|!=ZJpO?0nRUKudUZtOQbn@xji~oGk|WH$L5R0 zEBzCXo-^GU?im=VqWnKJI z$Fl8@W9NhN5}@zfTx<<145oQnSZ;2%;p}c4OLRd3GJLKu!{pa>BymQ!UO3RDt!@Y! z9Ch&pL713*Qc=d$6~8+V5RXuY3)V(XBkkG#8w5~ar@}+IVDgA2b(B8|&{r=1q^jCz ztHYF$BzFF4x;ksOob}3|U^wQpSAtt2`PJSr;;6jgei=rEi`ncyeyfjz(Qc6c!NQKMD;Ew2Vw4mBBrlWTX>j8 z#iui0*ej|pO#yU$2l04uSRQ7)@TF~s2S#vEN}lC7yJTYuT|tc^*zy0}c4 zuDYA?j(KME|D?haeH<{Zc3LJk9!E4E0KL~a4LoadUgD}XH2oSN_TFKQ;#2Mrs+#%r z7Xm+D-;t+dPv#)E1}kw?Vh*~vs_@MOXUZQXs->o9e0Y?r9XP6Cu0dneqn|~EqLUcj z1AZa%P)-LuYD)XQH*hy18ot{1Ue=E%sNL@|h<091133tBATWJ~{e0t&);cq5`mE+* zURK+Ym%DR|tG~kkWM4|6i6l}q`_tP@HwFA#*fxK@H$#=F(b4_FZ75A(*(oCvN z?2No8c5mR;Ge^;FO_+s)zqme3W-s;_Nogzh7s!$nW?r{(Lhxp_A+lSF4RGP#`qJF< zfFWY*wN^*-1z~oAZ{|DuMmdR<;4S=A9C|@bADP(ivuG$|?_JRt%pDlbw?uUI)W&PK z4}0Csf}Y!q?Ki79Xa>Q*r)aadwJ|ry&2R4ezbJN}L^8scf#7c+VyYFFHw!5wbv1}> z7g|(T7NgtrzRY?p5B@`Lva1pHO*tKDtFfDJhPt zg`_grTNtL+L*ch@W1*3{+(W5L+gHY~)7krn>g+2hDTU9(KVirbaa#<+R&Rdm*F+Fo zpC6hUGM=epqkBVLq=)Ubys}J3_5R)5K9p$rbqxymikJ|$uagCafkj@vHTW=9y!K7) ztWCYq5?AZf(Td)4hxysBKilI+jc*6A9=aU=G))=rRqdJkh*)f+LMhk&q3vyp-=GKZV;4e}5+?+E69svB@KT*IjUA>X-S5=x^DkBPoigI_mO$pW^A> zQ3W6$&XlUsW=6TgqB%iZln!e(T1$#&c*Hi^AgU#k^LYiek_u=ws@)Lz&0qg1Tlk`} zT$c>b~lLMtzy!=f5{_g!kxqOBC64gUn z#o&#NUwOus#gC64B8f^pQL~mT7tV3NeBlr}79+dISksy*QA`AqFLe}yJMQ@AyUT@I z0kQ)E#GwYbx!&U{1(V^-4PL}K)ljrmmu8l%TVeMNiInRJDX;e5e3BF=wtw!Mi-+$j zJI~*jqoXwth($MJ&-ofVajbQY$6S7_TopiLJN{Z`$uMWFhvH=N8QEuyZZ39xPbJ5_hxnJ$u~ zn1m0h4M7U}e!@UD^Svgn`QofQaK@FOizMX2_2QoM51&Qeu`^kN4Qlpq8RI8;S?bP= zhQ_3NII!@sw#Ck5{DU}hh75=nN-b{#3b4-rfgh`XzqXqnu$7ilu*#SN^9q;kUfW zYmOISRJ=$CK7Tysdv0W@0r(UFcZcH#8^rKD-zVo#j|ccIhB63QYpd}rvP#{T!yodW z!;{z^t|x=bB20skyZPECh51tWu@ur~19Q&#PaetZZD(TT-n><;w^X&*o6M)l8M;pA zk9%3;^n6y}addPoY<0DDJYziji8$DiBw2B_pW3FL>#Kkf>2@ahNt#buyYVDXxlq0~ zT_rg*jK2eT%_Mp8S(HxvAg&m!;lb$PQ;l}3S)hxZX8rKBMwjwM7y9MgQ?e3}F9J-v z=R>LIh1+v5J|mecr7#8z8&?lCwWi3la;Fb8pZhsXenEaRj=c?RMSi>I&A5MHsGCsW z_fSX6N?yd9yt9+G-kvh4QoQMAW!gU;3*Ee$1N`@EC!JGMK+f8+go6-8;ECb=^~q=g z>R1ol57#MN0jUusN-*;xNarHX)8kAuE&QD-_j-IqyYXBn_15Q4{0l|FMoUjK1`=9O zZCso&U*gxO9i^wc?k~;e6I6T-TSf2TwBB88a$#da?HoMbq44FVb>3g?YvQbu;xekN zk1^siE3}8|6e<3o*=Ohzj~|RbruQNfa{B%O5ciL9Upoicb-9nVf13zFlTb*%BNCZS zhDd@8i32~wG=!dCE8g&+4IJDpF;tG%6)XR`S`VFR|JkQF-)e)t&@QTxEEf~MWRYY zEPG&=I|T7NBXAU9ua16|SHRQaPekm`)`T4ioe>VY9&r6fdx9 z`c*yba4Tv&$CV%w`iv!5h<=2Aq<)nCQ34Vp5-So%?Ep6aYJawX>Hxqx)re`Sgie3h z=x~z=qKU@d<~LDyeSj6*TvR?=U@%hEOF%I0A!&>^3^AJ(RD7a3d`JIV5`nzqUq;ty zl?%FP&0m_NMuC*1!))K*hU({Agn@>RkWc(c!b@&$rvg^Chdp5Q3#VSVt2^HFNzmER z{5NtVL&MvNWWV-QSI=I0V~N#%XnN%AA+4mx&sX?5%?|Oi@Ri(q z9^;JH9>SBQKbfx6P)Bk`z7!ILYpi)akP1#xj~Uv%t_zgH*+1)7s{>!_{vzj?)({qt z@UiXjGN<3nQsG#dYAdVK-Z~$%=@_|MMd$sZmGxS^>x<7~qc9lb`&x%!ANj{Dlc7Xq zV>cdH7?}AsYB+|2>K@|Kt=gLLGy4SfRrN9jw#+}1PdO(I`}6djAG4gblWVzf7z5?7 z=UIY-rR?XDd_Mn9>ux~YnJAaWP94VoCH-r#oic55%tWC)rG8*+Ec)o((S%|U8{0-O z{`@_b&i8imyA zcpJR?<@Pt%Qu`0cXpNWelP21eMvps%!B86sNQjh`jQrTx?lt%8}E%9TRbYBOg$LPKWX z;{X&R;JG?c{d4M!!@@|3e1y@)=^%xi&qE<#rOs2`YFNZs#B4r#(5Eb(B-RO$vghm*&jO z;+G!<++zWA3#R%@^ZX9LEsyX4pT$JEkvSb%MPRneQ@g?X*X#F|y@@QziIZSpWn5t% zHH?Qd^L;bmtG~bxTOF@r=}mCjOJEQ2xi2VUqyb{~WAF&WI|RBO@o|ns}WIX!s&6;M*W%{wP=^q@pBEH|q6ud|4>FsrYrmqAcvy8b+H#_3D zE|_NrB8p`tY(gK%fILCu!;z_t*1r<1^5Adi=c}_@(dUR-@b!o0vqaY!=QvsgzCdp? z_N!HBh{B`2(WobxV%$uda45^`_6qDHoU7ESH|JGrc6i%T0z#D0lu0p3V>f0h*Xl@1 zVAK)YBP84>gN`KTG$dZy$jj=XJ>Rou`r8v!X!&RUhVcn;6CAZ}nA+UaNb?1!;q(Z> z{7(26?T@AhG4yi?i~^KpBJP46yXT!e4=Tc9B0`*H#3BlyIQ;F)z-#)#%rN8A)VJ$YOVV0%z9V@;PfC~6Dg_q(m>j$)?_oFR-Ty?}6HkZo4i|DH4-Fp*8yzU4npTeGPT+JMc z*IOF6*9$6@hmY+4saL#@;ucus!uR2EQ(NcjK$R_%Lm%`|$pH@h-syOL4W zDlz&aVRNdxRM7P|iG`AGGv9TG~`8I{jW0w*M<#gveV90E1d_Y|m&}i)G-1+-P5)#8jM#DXt z%Gz+_t1hZ;lGr|wLN+Yb0Cj?XH&p7&GddDkxxnt6o^QU}UECa4b}0)zTf9jzJ@inPn~o5Fq7cglms%FU9AU49U) zWfhW&=K~W)rc8^#r{MAdNXdRzIXL2Z(sdca@*lV)& zk%bRdQS?|k;n2ju8lcgobpB2W zU5QOlk4s4yE$y~asdO1*#&Xi8TpQ48#Ep6Yc$3rZVg~;Da0i_ul-llI6c19+MtjHU z{9b5-%TE#etKvLhFIa5}gb@sxuPeX_SR}fW_Z-YmR8Fl4Ck+apRA)h|Y-hi(<7Z5Z zxU=hIi(=0NwaRnWMdd-mqyKSvb9H=VH}x4`BP#v#r}tKgJH;gU?SGP*m$642hQ9!H z9VrO|f?1N?ux8Xsn@9Zfavd+X)vq*!Y!jyBT2L)5hPTkuqaz?PVz|3EjNyKzxMh6# zgRk|t8QmNq&v8l!a~E)3mC{ZQJcgX9@%e3q*KT{zWbnUM@$aoHh*mDQUg&tH&DA#E zJLiKBiM6%OMK_D3m0#7rmrvA~3~Sa|te_z<2&bl4a%vaU+7*gva|-U7<9TlL&73n{ zYdLTekNUrj5Ol)q+8890TBge#)hDRqiU9SR4mcRVJu*qiKpnZ!vE z212z2zF2G2mJr5;KYL95WXStthGo1%Y*y*m0nYYqtS)S81kpOf!CJFej5n+=nnPMG zD1psvA|aLO;-kFox{&cHMauc} z1CaI9Srg)LRqyN4k)-rxG|Sb;ute%x(K!u^2;A+YE!p+b{C)$5f=p_TiOEWB^&bJHvop0E7!qqQoP|Wv z#MMb)l)f-v+)^qnS+(U3VXou@CFH4Kp=TpAV;fBd$JTAvIr@rTLd$Fw2IS2frhfQ< zrgpwqj3T6B0A^>N7y6JNFXn)KocLR#r=)pvUjaI|(i_gnS-h8pikUnQC4l;6Ry&NY_=F3%YfES+U zOB%mA5Fz;}u8-H$%YcidB>UfGoh<_aYgE?4m8c%jL(F&ioe2w@xb#au+p;M1>pd+c zisK@nk!)kdK!zYd*V6-qP})6#>A$g$`=?3pQh`v&g$^$To2lNGVXKhAkxkR4EpN<@37z{@xTtEo?VDP$b-{j|@t9l=r9F7uTedfcu+GW~r@P z4x7m&Q=c^>c>VMe_QRn~1=X+T`z5h&qT7End*P2}Ey=;wX0N*qkgwRI(q`}| z9wr#&L#AzdYDQ5SA*%UTwR4PW_1rOhD|_o@$`>Ek(-ZwQYHUh8WL(DAbAet+9rulu z#mVy%4Oi&DaEbOWT*A=8_BFZE$~q+VxLSxExKzb4L02sbv_RcUDhdPpWasI zF2@)iSSQ27I>Bnx%uk({y;H6DNJzM2F*B%21G@thv~fv&WJo^-peOh&_3Mo)az8*z zj(*()f9)8mSjkRvg+%6`C#Uoxdp*%es`Pxh@CR5)4Gjp3l}{L+-_xD{460gg&&Kh? zMozSp4{H)5N#=eH45_oebKvvZrHCZq{Ip^P5fEsq9pV^t%vx>*rxtdNkx1!a)Y0n= z*CYMXC8W~uh4&bg-Rf#F$&bC87|+1uQeZ(Uy^A!-7t2}@-l|^#oMH`0;BPognOc&I ztLtCf4fUhnHX2A6n7ZV!(t{Hi`+c6S)ZblTXbx*lGH!Vn$uc)ZK&;LD7SdB-c)d{4v(J0diQ+jPUNrf>N z8}k<*@rL31-}+ao&~z?9aulx>A?TUwT%uVsFP@>Q@FIeQ8lfN2-nic9lrZ7fD#a)hNoz>!lYk4O-fS!{X3m?M1pRfFyN$Ocisf+a=YvB6H+&`Kshs~` zJc8LN9M*w#)_#pmFtm`c^K<=Cn>{yUL+V9<^mZEALm6s%vs-+Oi}dN^M+E$X2l#7t z`jYE|r9`TnoMwt>s@gjur5n z;(RdO{_n$wBU2*(_sUXLEt0{mFF1Cn-E2XY7CHPGRHChRW8fG_5H%=nZf%t|KremmYhq*S2Q}-Y>CSWIl(sDpw4Iqjf`bm#6XadDj--ALC0#&?sotklH)g8 zxssd{eY~)6WGBDhX3-uNL198JF#UM_1pP$)ZB1PoJxM+DJ!4>v-lWayLXap(5+p5? zgARTV<^XendBA+&Hej+TOIuyMoB#d0aPlj!%b4|yl!OFuz+4(YM%4S&yHrSx+z1Hm zjK&DC@E2bX)XFt5B)F5vKzHgNqPE;uRz@Os?y8NzMU~s@o14ASRn@pi@D<`-%)H5I zh7N1pI|N@&Fod|_>=bT*P7t7^6JeBc|NZvg7kp0pxa4}6=V>y;VL7d_!hnNgJfu-$ z?s;BZ$TJ5;h<`JfaCULQPQ1&a@u7B}-E1Nx=khgG3{d#|nGt@FT3aG|)v(gl&eyrp z2y%#2y~+CmZl+?>a25(#O>dyJsfdJltAxUfEJ3>}Z?W2n+svqo<`>zW zutyaYd4t||87l13lrUWw9+TG3Wclj`y-5eJ0`E)A=*kSAl{Pe{WPUS)+ zIwrvt%UPvH<_>|*i3#-BvohKmRnq8WHc*O7)w<|&GLT2t}2w9 zJ#K&a%TzF)QP+DU@v|6lKuJji$0`@+@0nP8uTeOx6*AQWU%Ur#d@6QMyJ3WUbu;c9 zlSxoPOuzwFATU%JkisIr32R8`sz*DZ*5LnevLcnejyX7oPT_h}P11ib~(gP1^UAWjhP<^zZfqzTdi8GuYc z79bm`{RUw3hhIL!Okc`u_z@PlX$c<6>A}Tj?`Fp8bIX3+DB|Nt0^c>vP}e=WPWo9j z+kS?CzQH#(bZQSLy^-5X?5lWzwl?qE$8J7lIueXQ0j-AL6&hZ;6M-TN9C$rbcj#6vMD0+8@O2CQL^S(fjCd z@(rrz+O6@H836IM z)8oq0+Quwx<^sHAS9^<#N!XWQHz4SLTLuq>&v-PNK2$|Fjg;_L!yPeU8hKd{_0p8t zmI!mnIC^WfCsa-2wc!{^IE^Mg*UlpYkqZ$XUAt~x91<^B1E{7E;nBwb$Rtji zMInPnyZi&)NDKvR(H45H0~3%^=@e*bXwKP0EAWw~Nxk{D@JhYoPPhRu!_~@7=&TLw z5{pdsbHGy9fdN8$-eM+Me^ z@&E`LrJmsD6tSDnW2oBL3I5Aj!Bw+I-vDzTciC8TmK0?FtiYwD0I&&^6T1FXzx84fs&Qsh(V=Df5s3UmJTP! zT2{p^sYR7f6yD#o+HASFpm9C|wAx$RS+04QjbRmqJCryTIwh2+I+&Xay*^YaCBMH^ zh(1%K8`yfwWw&ZPGl|grX24MN27FwF5dJOFD7(z($-^3ZHb*kz0S~p#w)Ai0MCe0} z5*&pb?R)ZbjArwz_WOVO0fB7Bh#CGen=PQq7fq7Duc$A3>zMGhr=33R^lsI&Ak+2r3lOzu{$HZ0Kgzwf z>3i`v8?E2GNdB{o*VZexI)QeN~zuWBh=xuz*7CX5&Q(iW^-27fL6JdbBTH*bAF}_H}A37nZFTW zPMs#@)P;+aCcbssCghU#UjENGb|9S6Xgq@e7exVc+6#+Tt!;XrBQo2YH*bO*y+r0l zb$I#gs*RjLUm5d92cW@3urViBcGVtcG5p65QiLFd?bZ4mx$A<ttW_mWB zhy=n3k1mZufR!({M}FnIFntnsjgm_j692DjJsh&Du6~W`y-j$2b)DTCie9a8H!hA| zU5?-3bG7JP=X0cGxtvA$D%JbM)6?0ad%6&qnCRr4?08#UwTqpN^HcZ%`ggac08i%) zpRbWrr=0JLeu={>yG9e3qyf;cfN7Y)8_X{3<@)~r!}K6X zNjJ(?QMyZ7MCp)j5CIvwyQM>=I|QV=8$`OKyI~}T?(lz(`uYCu`^k21*V482#mspf z$2(r9gl1ymN!_Rr*_5%eUFeZ#$+PpISKE49C}H=dS6h^&$W_eq^JAP?bQ5>96cJY^ zss}eX?EE+;-eeyz6m;6leJ_{1Nm|c^GysIo4_9Go0e1FykcsZg56Wx zOaUNY6*Qz8&4ShtirRa6QQAZ@%yFqQVU#oG8A`)y9+WGBaXiJk zS3V*?I8bg0cB6c}?Jsd)SZ-g{S-qC7zdY5ve@PljOJry(w|ryh#Q_&aE~A%-#Ix%i z*$ec$q^0Dwox*~OJMYh$*wK#q4~5}S`q|riTtUv(sAx@V9V;<_Fn|}hkzhMDG{A3v zq#4=HGMutOCh*jN|NT7w3T#=}@A@8`@$rOe=-P)~JLuvIiJH%G)h8RWV;&NN9P$-$ zSa`y<8FMqrlRv-3zdC4c`@b13^Z)H>5L9$6qEv%^V<>0MQ-RPhxn{Ssvid;{bBN@z z2#?h}M&@bKUt(g!T`FL}au7a7*_UV^pMGHOdEf?GVkAK+a}8_)mfLS@7*MSuC{=Q# zV}JD=8sAU>2`KfBXWM#xW|1FV#G#;Fysy%dl5q6FYA1*=*^%6X=F@4keU^@Lx>K|{ z)@BbA*&g~Lbw9i|IGw7Ft{(G0iMQA~K{OBCn|RI@6Hm9g0i|JO)| zWGJ)rLJip=5$dC;n0o>E9#H_eMq;UQgw;B`aFO|sI0+Hmqs9u zE^EaF5tH(q@TtBI$@T+$mV+`KTdMOI&C2)3PPV8IDeWnavcm=Y^{DP%U?|m=jf=q^ouHEgouLV!)O)`iF?`C ztDRCo66Q0fy+ygH68*fzs1pv0^7DOk>}SV*VpS4i$G;c3(<8Dr7*;%_BwyOFMAB>j zYRAeCu^R%}+U~O#Wqi_a-sA@LkwL!X$dFg=!H%`&CIt za&SyFaQ~hwM=>_Q+LEDZznP#TLQxmBtR-Maly#(gbas?gqT3jY)z73e2iq=E%EnMF zdi!R$QQlu7TV4`DQB)?BvKj`9s++Ue znxxM->HR$fHc4AT{b#E`Xjf6~jAlce8y8wUlLbYcpLNq7lNViZ0bAQYG0y4(c&kIY zfiS2MVswA1H2wE+c%dEC``WWwGZ~R)6T_#XEqD84&O=NVYnP6;ucL%Hsy9bF!mDkJ zGnZk^v*GHb^x7EIYGtoOgM%x~$|0FZjBA$74P=vo$u&^5baFfMs*@%2Y#{0PLC z)wAy7O`H$&Rryx~symYU-K=rL`MwILD#+Te|L7B!xy3c2;1BSZd zieHR7^RXgEPZ8nU7{NP|+q!@!a*5(g!`JY%vjkyb;TNo3-CMQOXh|E>GvjXy*6zj@v}_;E|9_ADZ+@vA**8yM*8`q+z^nn(`a?uw1&m+) zG0!A)43fa03YIg3Sf2zPY_>Bmm@0Zx8s(+y`RWo4*Az)IC%c=lzULkEabVU1rrz0F zi~jbbvZAC`KyLUzQ}(svQX+GLs`YN)dpi#K9sOXEP*`!qNtZt6OBXrg=`n>u?IHi< zM#|HD5uYu;-Ts*>5L2y@6E|Fv}SD7)H|m+zQh&!5VFAv-v#tpqleIjFtKQ zrRczg{aSjA4U7$RI?^gvqN6roVGy>~On1m5UNkC)Vlw~p<%W-Dz82JHkv*s4-Cr>{ z#x@623xzoq@`iLT7L#laq8pw@f$@J+61hyHtC?Ip`LH^BKc(!ymN+hYsfbmn^=nw8 z`$t^rzAzjnYGZeQ*Ma`Auq|hYK#Jo;JMSN4*3%inBHanRKWdGi3VXA&vv1R6W-K2M zGzTbn2>YRzgU3mSIpqJ(urp};vF?Sv!Rm8HD+UBmcM@e(pgUa-HEqd=xT=k zm?!}nvFLO^u-`NYPdz>HbDFLEf*lPA3~20WrP?=)I;#=%8b&VJdS{(AB#(f)Ijy=HQv7$i zv|bvXuc|iBmnN7|VJLo{>1FKhr`8yms2PN2?mZ-@iO=ftv?{6G zuLpTA7K=0^<&rK+z*hkDfqY@{uW)-HTSBP;YnNB3qynPIbkRma&d@z6WRk1| z>`}>_eX>9ejFtP{N;~09R#ing&DZDo?nf8fjDP08ck%%vrp$@S=V<*zZ!c0fY_l5F z|41!T|C3tixcbwspLt-%wQn2BAhJT6GbK2I&;_eeBfP->h+=jP%kyff{e=>_*-iW7 z@E!XNls50T84WAvX_a*8otHqf-}M?PFzO}my!A0ra(ValYGC{c-WfUU)l9rQbPr+sDIKnOnB8aU+YkDqGf z(RFNnPLB(b{D$~W^4OczP6PYpQ|~WuGK?4oo<)U`9-lMjPt0zL9%BCS(@#j;-@NHnV?L|X?&)uW<=6K5 zGsiqmZjzaqxr{vZ@wz>}_mVGCOD{O*Q5C0eJxcfOXSg+qG%5EuytC3&7Q4LGYH_(6 zB(o2*v;FujCU-SYDv!+GKz*pQTa5AaQBNLWOqUK!{8&QWAKl9ORcSepiP#QC!AsUy z40T{L4P?^71)oYkpd#I~?xqTEL*Io;@?%Ft>X%EkeBAx&MhbM2s?> z4LBBTXze<}Wr0Iy(yaU`OyYdfpY!lhNpN$GD=k?+O;JOQZ}yyoOXMnysdhc>NB4{eJZtJ z_o9j)U(NDj`13T9;H%~~|5A1mcBB>vls2N?>9(Q4(INjY-ZuM=5@VCi9&6wp`gcqIBx<*%!R?h zEQBTA)twwF<>v^Tv5rj}W1C(~|35EPBC7vQC_W3SO5lVt0dt7`pQIj?oXvW%_U4-u zIDK;ci`%6grlZUYN0q8xmhXKT79O0cMnyKwJ!)KajCiOZ)OAe?h5~1i0Qx<5!!91Z zO0~L5XLW3W39#-mUz_mLss~%ct`hl8Bd-dOiDa>j%7fM}YSr~J%~kTWs(Lx$aX+zN zVg`5HPSNUTq~bNf!_63LD0v2UoJKU7Y#xee^?f8rL1iv{b`d2qF66qL)HxrYVkf<@ z=0fJYt3gO3ngEjQ4{BcLrRw#RN;YPmUik``y|>xs&=nU-PS z@rkKhJ~!p-G^(w~QroR$YxHt7+&O?P_uj87tG-nug5k$0KYT!kxP;2v&H@m%e3-}{KC7&uvJ&2FPbnw+t> zA7!zNT+(?gDNZTbe3E!AUV%kRhpIWoF{HtPlgRc&6jSr+m=&QMIqK-hMn*AX;^A$@ zo`JNfB=K`Ku;`Ip{=^jU++=dCv6SeJeEL&lYv2iMc1cFS1s}ro*uy%xUeQQGMPK%2 z)f?z0b^*$f0+>GL7<}MwOW1Lm&Mw-dW+wM_uK0!FzqWq<(vrt@eZJPCDO%3;Tp+1H ztymhQF@P*KGR)uabt$>P$j2Dcr&G@VjuE(ua`lrq=W05lLK`#z9evn}OIjv%O#co2_!? zEY@#Lt3?ht9L<)}PI($`o39=JfH3O#96D2x1I$VgIV;wx4jp3Xt^w&GELHeJdOeR% z1v@0B;{~cR^+8{ilaAbZ%*UtS;WEk7o$bz7ht(Q-h8nwE4^gM>>$z^2e3)wyYRw(Z zaZ^r)GtB-Nlcl2)w@LMPfrI=)U_J2z z9$+}BGq8B`7=HxE%XG>#qjqkUe+MtqER#w90LXO1Irwc3=t>jPg|;kCCtlzW>FR)m z%rcqVf(IP~ZT-EbXx*q<0qSlL3^j}cljN!?3GA1J+Aq`g=D-yv{^&$%E|jPbUt+(O zB9#^Qcws&F0L&tvyJ(Jzz}A`xIy#kIGy6t(W%x^I^HA&%*cX^`LV*ms_Az{I}g^3}qZpz1OwDWgBz$xEq7 z+REvO;ChAhsqFnLG2CbxoyH5isTXLt4(cS|H{~R(`JLDvwpuiy=AGv2Y6A|QMALysfX;ouLDX{BErL)+!by8BDuj^xkutYPE^mJ z)|D4r2LvPdydx8;*O^>guMf6p<;*6GEr$>f7p>j)-@qn~KM3#BS)tUaw+p1TOl3Z% zQ;hE5g&HZ=A+$Mhr8l4+RJvNJAYzRCn$af9C7+n3S|^EK>Ih4d0h*-|8cxCdWpkTY z;%PMhi8y8puUBqy`TNma&D~Tvxs9z&rnBh5wyoiAsRjGrI?Zv;Oa_cO!~#k>leCcO zu3x@5v8HoQO*jNYb!4||t6jK>$Y^0g8dRBxA4FOXzm$#e$)oSnquCS9t{T`D&O~%I z+vutKzt2S+`(wOrQ6`FSI(SMf29n+Aa=kg7(=>gv>CEDc8N8B#+v1TjBGd4uDR{J3#08ZQohZKWThAPbdEUw7xF|D1O{cF`OE{?L;|%QjmxGE=5E zAxb!D=$wGrqBk*6K?SK-NQm-a5h#%wkMfec_z&Q>YB$%C6Hu;sv%>gPYYXo+DZ{Fuif-I0q)@mmt zCkG^vEc$NTWBaBONSBc3d0&PUt!gb40zOfW1rM=NUDZ5M-0WXrRB%KmWbbtmc*8Pss>+JR0LSw*+DMD zg+OehFILloE#CcSzCCFRjq$2%BWoC{!@;tKL1bq+CyCt%awrvNuow)f>yYwpm#uPD z(Kg$J*^uC4eNj$c8db;nr!=9P6s-$~S4H3p@@MeF_&fNC-$QO>oc=-w9G8P)rBXd1 zub1bciZ8q`)l^vrP2Bq$w5-I(ph6K8cT*M4Y?O5lUlV`EWE>7A9!0ilVg{EMLDvUiA1HcS zN56p^%Nk-KSXoIv7!*8xJFiEA(mLPcp}%)PYWFMs@9&I6{0=-iQn>&&Q~vkhvDNvS zU7Z%qRKdC*UzU(!&XsA8`-nzZjF7E)UhO=XauzLJ+~(|G%4Rb-^eME^6#z+x3A-Zq z^AZx~Zm#~i&t+6&(8by6L2p(hzB?Gvgg{=I4-z&G)Ki}U3(Svcp1H>Az_*Hs$~)Ve z6^K3f1v4lzLdIzDVlw>q-OXJ8Um89bFOL!`Jz&yrma!aA0=Zec9**#i`=%ORiTDy% znD7Kavw_U2F&HP--lJqbSw$}L2o;mD0XZ}cc3<2%?0xdr;mY8FR9fJ$R29vt<#5SqgT}NMHYD5~AjAc8@$5eqmBCOI> z{+Jszx;&><4eazub2-5l*5IaGP{%!AZ5VHRVG3Qz9Y*drA8GyV_1DtX1Z=q#NK47j zpFi#F6~en9gB&IQF?AapW1OTa<1eu(7`Aku~IB?zG^be0$Tkui{K*=WDrvqoVi`+Jc(}x4uePT~h{rp_!)G{(WmX{xrFwRlj z!vm++HAID9{h8aa-iO(*?6(zmIbi5aX&ot3Ech0_x7d6;(R`NuYA`7#@sk*60A+&7 zN*QEw7wSF3hH~;o`-mBztsFc&O?|0=M=lN@Og=ty{(Y6Ugct392>*RcdwC9*i?3i& zx~g{&{_!jS*LY5H=Cp>+f8V>GiHP_&y_ow{IQo3AV*tGJR!95%5otd#{FD88@9Uwm zIPNHeD85N}3O!!bYJY^kMy1)xqpR~($tv^X_W}+*Bj7GZ?5WXI?b@EP{t;cxa^=Sb zI+-Zculah0IazgZz#~RNTtHr$agY~0*|Uhp2XGe-#G>~IKT&% zuD#lC&&~!Z9kecm{)`phG8!sUzftW+7tiJA={tvpiHQES%N*6R-MCwVmYVI8x2LQ# z;MJ^r??IDtbq~m~W96Mvu(#42vCP-_paryb3p;YP97uRXP3x}G-4!UGD!no+Hke%7 z<7~a3HQzr8yxl{{gKyfT`iS5Vx5aEslf$JKpEsCqMu0W&WJ{q3wL>f5h#a<>1BKh| zOcb6Aks4?u+yAkh88rXZD;^kpm!TgdX<=5HnurafR%bD_KUYw;djO(=&C{V$L*ims zOQ3u(jL!P5Kb$7n+k`D345;X3HY=kI)eTeZzGkDqVIc7=GrE4KtX$&b>*>AFAm@3t zF>~7X(^S7G6F=1Nm$r3_$+0-CTIW)OXV^`{bt2}M;rpIR!*ZO?ywae41md!iEge*C zm;HR{Z&E!3l)=zA-h9@TXDo%tzWNR3>_S=ivJJxhDlvACKMMVRVcq$2?|{HxmoRdz z%6#mbRkNFi@NAX&V4$VVFXcE6+__52WpJwnqU_kTq?e(BQ#fNWQ6!lfp=OqCCJc|@ z#pd3^9J&_(4aQHFsQC$6mfvcVZqXH)THUvB!St}!g;rNeMC=f05U$_k&|8FrI%>K( zkm&HJcf=7TvntN6Sf}1CFp$=#z7R1ROCX^XI?18v#Jk|#jiISKEH__mTaa*?*))rd z2X@U~+#`f?Od*0_N__r3m7uTbHMmgx41_$CmwbdTNk~MYuVv&+4twM-Z$pg_Uzu!} ziozJQbE#Ad6w@9|tbGeHT9%f_J;k~IHl3dZjPQmlyPKyLeYTcg;oKv2ViH=p1A_o< zl#AUrZz*^2eSWb5+|5;rbTDHIzTz)<+fb^ttDZU{-hiXuAxFY#iEN`+{8mSMzdZeB6d2m2_Mh`REUgRS#FPPD5k|G5 z<=9y_r=Y-}`rZqfi+9NA&s}1;7^;MSWO&cgSK6U zg-5;*YmQ76C~yyhIBe?l_hycdSJro9E^Dl6-0n@NU+_n+ea?}wTjD$zmCA3f<+b)_ zPUac?WQ>8$*aTtRQ!?oC*50lu(*B2@`~< z;?k&jn3i5Z%Da`fUK;vXu79TWepkpAz7M)K@BuN?k9tU2$JhG~%NamlM%i}X|DEb~ zd41eOTK1?LAz9XlRlgH- zyt?oFn~b%IK|l9?v0h`Ofb;fC(6ZPZN?KuU%4qq}R&Av#ke1N1`qEx-5Z%oNuPw!& zAGh1HjDu(7-Yi=EYiCe@Kf#|1R4Y}Uv9kYC>|^usnySHRd#VtyTP=Q#hCb@-te?ws zE=?mMAh%Syc;UHOG#H>@3OQfUZFC;{lwD`N@Ys68O|09-P%z8G)6;yh$vSpe!8tcIxT=ia;4gCzqKrrnbOqcl}xeR`ihXHxbAU>MXt(YVlkHukzq}E5@ zG#A&FWqG_Q*K~W4(S50;5Jtkx0CK(cjl4NuzY@*jQ^~gI9$_m8I>DE3K6U%~NsoVo zpj+a2KEb%~T6C@_f762xZj$3#oJ=SRXAG`DLf=m7o6>J~ia6`u9UjCIzx#Z6&iq`X zxS5eFTyWyX?F4M#(_~G)ABE4U!Ys9GtW?jja#HuVhH{?K%5Dt(xWpy_E2Y^QdZI{b zBhgSKKDDsLR8fCCaV})-4s0W9P3#9z3L=Apo#G$EYiO6}lUG2NW{_I&|?P$oz z+>*%BIm5l^T4%ZX5(qBUJ0t&zY9DTWK~BP!K1O7C7R!_-nq$%^aU+__#ZH zK<`IMERR;8Z*>rFxESpEmjz>b{VkBLyS_%i$3WvE;aMmQRjcMGcCIX}7QtSa}t&ZAq@DJXXwD0;~zI>?^be8rc3y)On!2>>z#;OouhLR6icw}cM zW7~0iJ`;p!uUQqwCQk7M2%2z4nSmYYw%z*>{DC3bm$XD#G6L?%fu?&RLJZ;CVG9z` zq&cXoNqQ%VFU&b0IluQ})y+g(@0w_LXDamB8c!6*zt#g7bOf4`1vdv~oX=Vt$GtcvT6mP7%^u%*jGlWNLFQm69 z?9mLLsa04|IpXt&q1t%2nWlm4c1#hLAH{`i;I+(Z$d~bAd()Qv0XAbRzeuJO5lmXV zM;hxDh7xT0zwt-PraQFjacSQY$Reb6Y0iJE1-ps_GgKm);rT_7z+L;INEt2Z5uMjE z?FlB#Gn(P`N~51$kpUwYSaB}uX)s9{&@$=X&T3TK#WqNeH<&OIie-Pxu<-yvc+%+k z`D5)SLv$XjVdf;>>>ilV+tM^fIbM}u31p%zJai=~lkOVo?YQ;|X?+Gsr5A6fo}pz* zSxY!d>U!dq=(pxt&0r86vgi+GZo=VD0tFpBGp>V%MMMkCI7VzlL4FUX%K-%HOyW-1e{r4UH&k7pgGHiacsOc-Gg)&S@| z_$YV(t7$R3N4ciheIs7;@gSSIO=SMo{rXsBol(6+_FfQfW$L}VO#RtsuU9B%ILa38 z?GhRoHD;5tP<1(VtF=A()nhBMdEe!a88+vu^BAd6><@RKi_V#sSI_gdujkW~R4a|@ z2$XO2$6K$P*ze@9?qe>)KgPe>q?Lf#jF5gGP0T=6VsKm11Jdx$F`sekYUxe>U+MlykqJjkIWviLA^ z)osLIUPNefaV^-zmAs-Nl7@dE%I*E|Wm2Q3fl|Az1|&YnvhlRlWxex8~umo)wI!olf)9HLfG<{TjTa2IOW`=NhW5PxdKe4;3^ zvEgsl5tahSME>uhs{dcrC7ffjzw%{wY3pk3=(b39{1=SgW`!Onc zb@=C_QkTq&K57@gCaY~UNr#ZIDm7y9%2Beqnmb0Y!xpoEnMR|gEAlg2Q1WFG$X$`L z>MctZtvWdv@CL#$nis~KnU+U3GKdFlX}FXyyY`l=Eq--(h1K^X&jogAi6_*3Cvn!+f02l|xH*L`;^$7Sg4n7iqO6Dp}H-y<>{9poeyDX*nD z2!_h)P|uS=&}p?OCkrcm2rCjhpd3_0FN7mlxYsFWI)~17N^$Ca>7~NgrT)ALsZjr+ zQqU6k3{gl;MhOh@6p7kJ4yrpaI-&^}bZ6B_NWUKJ0sR>ybTtR!+7E35pyckzhY+JK zV^m0iJ7Uc>9YTa~82FZ&Ey{e@P0Q6OG{8);9hZ+zg*ESnT_+YL+!w{*;?1`wp+!k0 zyYlH1G&67y3}J^B=pW#7m7bzQPx8dR&$p3yQ@yoCsbcVH`SqmXn z5yEjI3m>oiFID!IXl0CC?CHtoVDbfxQnnioB3gTS3Nw!{(HdavQQ8GIEi3c^;`{mk zv^^v=>rOw2WG2l*V=_?y6#33KiiHgAJd5wXi2M5Q3_3*$a0bp*>QaVAMAe!(Z`_~Z zsOgx@gn_jkkuwN=lhj4S!NR1uYd#KQ=CrAf6YfzoUi0OO`9|o3*mczwlN*&j*qFQB z9YcQTBJ1$(sTFRYA-bkq$Cnxspp-F{4}`#2wQ@Po%fvM7wHr|03ZMzM3|GzA?-R?T zcqxl1fV9sJ$M?Iq`JVB@Pzq1L(||DO+)P)*O`Bf|{g@Ul`3hJFG%CO>`-roBY%ddM zTnFj;{{5SKfS=!W3uv}OEy5&ev?i6)eHJAj2&dkof;hO+cS8WkJJ8-ET+q%Eon+dB z-GXQ9;`ZJ6pUZSG#d}r$pP^y&?gE=tQCj%{@VKQ#STsB4T3TA(F8oM+3T%R};Awx6 z+0%;gf>Wgmczy&MVCDzaLO#cM8JBlx+PLT!*T+lWOattopHlzj!ZLoTh-9?fUgeik zh<-bp8Rvpy+Eptz5z31B@^LZ6Jb&KZY&t9jTJVY*UY-MFz$bWqdpbqkP>@2uE~iN` zMdm+4S~YPDr7XH@WdQt~e|KeUD z&>>-#fB6J1BessVnM+>!a)>qgV!0i>LR6otX92OJ!Hz#UiHqGDf>_TRJPseEzJ;qG zMJW*wRI&2JSuNFfUbCf1-R@amHY{=hHq|D(*X_1rL*W26-c){PYLd6gVrj_Fxf&~z zOtkwvSJc$#1D^K|ZBw!#?YXtyNPk2VZV?cM9l5Huh;>&bI>poB?|A_I%yK8V;u~8cg4}sDy;vPBK77be+w+7&?3w&(RLbc+olrYkKXHlOk+`0C&Ga8z=n{fS@xU`|b z7O-l;KzjB`M@Y5`P~Vzv&vzH3EVbQ708tiEA$a|OfLshD>~cVGE+5!r4=Sx$b$c3K zdo4611qXe3D!*=oZ_4`^YJ$8wMJE|h$mfHRKOn|!(`dL`p%TB@R z#MdwK4_#l_kG*FZQO$q*Y^l#c8=ue`JnYdM0AopQ*vbFTr;BFS zUh!ggq+J{FB?=r9z6$QD`Tpf;JzJG)Kgp@;&UopP4*=50&cs(f<7Q3;UfkG%ptDPp z0A<++!Gvhh_=?JUhP%mR>+-rvuRVdjCL7-+|62e*(RnTP6g_m?u(4C)1UW8%wpgVY zfb;vvfJ()U#F!1JV20(ECmPr5LHCBjo`@reAN%}nRYM^~MND6Y?g>>FsAu1@mv3|W z2Lfbvt3s;4*04e)$n*X#(UMG#sYlk8Xf4(J;;u_419OB>Hfora2{OfeR*|=jr$@6M z@IKc&UrX~8?;(u}d;_b&eO44(qfk5&0_Co}I%lWLXzHv*C zm2Zeqy(j|}@}MVMRc7M_w9y*Ktgq#za~CojW8Gh2OcZE_30ym6)$G04tB8iAHX$428fQVR1}G2r*n9tGd{}Z4;U7odo!{tdUDvA~%(Oual%DzRrGJ$<~63)Z9%*oF*_u!+Z zs4H$R#y80~^8`LU&7jyhOH7eFZ(s5Wtm`LWFUR&=8adkNi(~GeLIh|u2emqeiLrv> z^8k>M&x1{D;Y;^Yp6tps2%&R%HJP6!0w7jiuU3aC+4{xH{CXGaWc|+>&z1`1>rlix&}~{g;zyZxi`uY;;y>Mo?iXh(pB{jOwt5jN+}t zCW^!+O2>wU6{%&$YPKTyj6bnJEnocD8%#XhctlQ$%VOVZ6#3X#6v@uaW;(vAU8f zdtQ+{^V4OcTncA67V_Mf$$~{20yFC1D_S# zsy<93e4nsWD%_ym2(-M1w4R3^Xnr=(frmt970=adECyYl)3#-03bnC=)Hk~4?@kni zlz>nlW-A;Sv3veHVGyI!CkQ1F7xU)lr!YS{7~rYfvUGx4)Hjbr4j{Vkahl^Jg+q~< zP0_v1BNHmY!Iw~JHdbMRa($sa5a-L?cSsmQ=qV)a4g|RGBP#S>sc!GX_y$Mn4>}|{! z_n4NW-IezZNgHg0zwE8NYQ3YFVB5|D46>2@Ng!i3Od&O(ETwXVNYq3e7omya!I^nu z4Wc}#KYm23(QS(K#(^MoU z7JE3Mcc3X$f2Qf><+VQA;P`1PIX#YPrQ3TbRYtoOYWQg$RNBBC_T(Hykhx=RL)h;% zDmwEzgU;))Q`%)k91uW9(da+v^lNdLlB@sB7$dI_xVZ6m7u}a~J2WM8zlp3%f5CZT z4!noo47JydT)$H9o%Hv`I+fFq{27^BUU!3A)<7DKO(UOzgg|UxA?^Eco(Eg3o5TJP za^qPWs5*nWq?<8C$zv82;njr&Q5ZbZW#!o|Mn8&o?H5i(n>O;KOQ#dnw1rO(MfG&Ft|kAp&7-YJ&Te=x4Z_)sPxAlX$Sm(Qe)D? zBF6*#gT{r##oFr;poqq*@W!~&92Ck0@Y~PItdX3hIyz+W;M|i;Ytkq;)EctLb1Kv6 z9T>z;-_G#SarlL^dt0M28L?`jVZz-W5C16H_K*HmgV0WJF*8hqaI%XAWC6hA|FCil z*X4ddYm6*-^Ch=wm5fIiRwZh~q2`y(`R(g;wL7nFqgSeW14R&Nl!rMQK>6ejr3#F; zcLx1Rw|}2pBp>J#s5%eAIWArGiZ%x9{u4j`4phg^DVZ84M}?(IsRGsJ$8pR}`=vl| zn(+QDgV#9TJEf#ZWHUq{5M`SPCV5C^x?4W(7Lhi0}|o_x1^xoJMd= zD6j7t9Fwn3cJf*T@rqS&CWU{bekfbJoWjGdd(FFXdp^-XB)B^&_j3y!h3Ft?O@ zF2E#vah3l2>s?>A&>m{KUW9~p&sdVnFEEUfsHNBhNS2Z+3a#*y?jLeG zRib$@G(<{ee$awsP#MB2*E=DD-`R;W0XmPs>n9S z_1|*bAF+*T=|U~8dH=o_1jDHe`4l7!>USc?3*EQAya>>!*;j{9h z$ISZMQ4y5&_V=h|C41u=NH1>Ii|40W6S%c6p{fz~9wR0!{KAOGrzj8|`IlqFQKm(< zGTZYzBqSn7PFtMsclShB7YogLVs)ifRtP%O9(nJ~aKwUrD?I$TNm(^L z8R-nZAc24Ynl8!9k5R8Oh{8Z5pw+bIeg)$RUDOBAM0_uZ1r^g(R|nK0u%RiBMa#r~ zXWaNSw)}eL{-&sUfI@fV$+R)5`N4AgO>hdW{lWtvThzwKzsaLeGcUzi6h&Zjg>DBp zxAnvr$a;h>Pp9;su?R=%dG2w8gLS=8b30{ZEXUq-o7ceS&68Mq|3I|5JTrdbI@T)H z$Uvb6L7RxXYY`cj$Qz?g_3gzQO&Qpo*wg4Vzjw^{Hrtz#b^G$o%{`(>RK-G`)V@wv-O2x3&GZ_s^{y zq_ee&($j75G-;`r{ypBlf6=8Bq8n7t`8r#N^GW8}YQY#wcg2x|!!vdQ;ZQ6rJO<%< zZu5@zUelpmJEa3a8q;}K{uGS%kkkF{8s@S_KcNtsB8{L3JT-^xx~D{u2M0DaqT()% z{9(=D6i6bTGtfs96n7w^8=#VW?;b9rp)^sd9#v7H_)V~XWgah<9WxGKr@f^lr6@zk zQX7F=0b@Q>EF%o)@Y`WOoMtbKGsagf){Nx;Qcc-_Vn~iP_mb(qHX-z>*k-J2*pFLp z`z_n^wI30ba?naH0+h32K+9pvTWQf&jx!#Tj@X`Hc*ZYD-Z>RxyZCy+A|sUJ{h@1q zVk0HcA(C)ug&meU@|fF9V-^fEV^ZuwpFiK40Ys|pk@h*3EvoZ~-oCmNz)6NiQBF&d z`?v3ytoR^aZ!yY!^Qwxqe_P+m2T`sXaYdS@3`q3f$<#Q?c*-FRZ@+)RJd1tPQYIy;j5EOV+V2|cT`J0***E_A$S>qT1f&%ZT7gw)K^_o%>Fvb28VZd5yaO}_D zQka)oH8zI5v%?bU_Q05X>3%DeKq-xirqy?+7ZO4|R3>Hq?n;ogy6LeLrE{An?#b!&@)4zF{-r;{7Jd}t) zo}fR|Aj?d+oG&xvI{B4n4m8zEDp3zXrxQ$|e{B9P3#GU&&!Xt6M!vn@RSOKq9E3m` z&^L#bVvSa9ylZej)8f8&6z3-(7L}r$A8`!oh}x150I@>^OI)dK{vH9rDle3*Z0-U9X&d$6w4+Ht`ek6=u zZc1Xl!1ts(%dj{N>83T!Gy}HVwfxu9zvO4>PtD^)9ubloV3@yG$j=1d!Uf=&X9C9F8I&8 z=wO+S{7+e15lifDIN%;3%;^0S)1|iI#Wa4#gApm*_CRb>%tW+$4lj!n z+*Ceir!y0pc+8tuW)0a<5F*H@){zQV`w!cjxj^_JIA03;-6`3G;MKdMXPTMSKh0DA zYz|agaOD02*t&XImxRBO!mw8dvMjZL$4ghI_}LmOIlvp;o!s!ZdiKt8Z=p7w^wDx! z75_U*lXodw77ksZ#3|`n=}TH}RjbDHMdm73_G?c<=LzL*QLca1Pz&-`;vIj(fS30C zl!!|LKK-HZaSMHhsk+fbPF*J9e2LCOkDTe-{CHkH@ z`lrO3rtf_l+u7vl>A9zDCZ&WQ=tKmP@&89Dz|wVKe7$lFsF+o@_Lz?Qvw`mi6SIN8 z*VWnsGtTh$8vnCw`9k-o;In z?RMpucXg^`4qneyE~7?$uVvN_KUf@G8|!45xe0TA`K+Q`7p-3TUapaNArwVmA}cGq zj&FKSwxs)uf{-NOI*`U#dg5T?vEUEUgWv-;x?h0a>+X54J!xD3YCpcQVkO97SZ?qQ z4tM?C7h9;)9H(8=Y zwN}tquG{QHUEj!^3EgO^{$EUFYQoXcWK=*kkv^H%y4@&Rk=HbR?^2k@I7EC*+M^>dQ@;r*~4OkjF!A%0L}Ai7sS{iaP~Xz{pjKk6DfH%W6c z^E7>AOW(`<82!)JhmH^OPg8sbLI014!=u@g0nADuV3`9p5T&86uuCXd@(L2k zxT+HeX=(Y)e~K`=7IPu1N4BVu&iYTRB@>$GorMKT2AnJ(47zwjy}`Ui7!@5 zEpiB?{>3Be|gf(>5K8a zTNxkv#>Y;?2h)9bnjJnq=D+hDmRi0ZceSHJ#^~wrhj=9it z19v09%ZRaXH@%p|+qVdeL3hskcD91^Zr^W&A{fthjfd+BAQ5uuTrl0+#J zxgKfl;w0`7G7jRb+AV$}v@0~_?`Aj}=Vks*FEsxIdI;KdKg_Zg5M2|oY056jrEHN9 zZwQjYBGYbc2FOOJ@mn%Q{0V5JqCsSEcrF(4^FMb$@Y}`g<+8DO zHhDr@q{+P%Zm)2rDg_5nT-u{8?PEoadag`olt zttMc4-ea5E$HmTBk5PFG?hrrPnT!>1IB2mJWU*MjN-moBMv%swv$Ko|Qibt9C<0*8 zMe9W2{*E3N_9SgQQzrOeC<<-VeGHV+sG{m@u40HY#(NHX@zLhvFnt-)#26x$R^!3% zoMFT+t`s=@&cp-ouLsYiYh+IMzK1dFayEdvZLC&+z5c11riB|hTID%Z0tnDWFP}pFU+R_^g;(HwU9^fP?}KZ zR%L;m*FY+S=(UoLgsx}H`5}{gnVTSC{aaHY{%WY| zf96qxy>0a1?}p~h29xR;Fg~((Rr51otePhTItQ@*LkU|Hb{9HRLlSn__1j5C^`=pz%imk}C3ngi}X6IMD|e52ET?%LA_v8K+w z;2HqVBk-)t@iEdv44SnR-NpWlKr~GM`v?;??~&M18yxyiEdC(jtU;0_Au1?P&6nQd z0RNMlc4~@T^>!0YlF4cp@bS?gOU*?uf347Y{agv$_Vgt<#LPv&FD(BYZfY|nt;R!a)^95gMK zZkmGm{Cmnq!X&@agE(WYNIVjV*_kFxmWw1GT+GpkFlm5su@Z>k>v?1T`%Xi^<$}%8 zZ2wK6T1gflbIuuM>h8Q2e@ee8ag(PhOF=7$IbUWVe4QPn^A-kzp}21m2>F9wT2tKToLE0h23nelnw@D85)xp((Y4YD^-jp^ z+V;fzZ7?^a?|19{g*HPVe+BLp zAm&?e#fJZnt+R}(vJ1O44T6MH(jY1glF}V2D5Z3FcXtW`f=EcGl+;GLOF|l?Q*zVY zdDaHr?>lFV^UvWg*!$sG_nP;d*K}L{xzGQ#&)Db}(>(BI=f>^}x;xaSMZuFjq&3o) z;8q&RY;t2!7gf)2{233@ihDdXQ1q+QREn%BnsG9)YB)jEh-wG;h9sYN8Me>>0g+cv zf6Z}RFfwBK2%AN0;Lc>JnE1G371hGxc(vYF61AeO)qiczhp|mSe*{6XL{H%AtpC@1 z$7e?#KM2c}yyglDFg!NHY9(KyK6S>nCo5?F78P}t!fiFpeME-xl7`1@^c#SEJ#;F? z>9esOnuFS0vJVY$n`2dEUL1GC;RD-V(Yrr%e=g_nm-#^&lrHs+-m2)Rgq>qyeprl_ zQ}5p3epZMX%Wc%K#a|@8_CFUsHaDb9wa$SqD<^ev;rh^&LLSTt>-iPPZ6&9t+;91u z!@<$lN=Dv0Gn1EW?0!V%dbm29494GQ6gyaW#N;9v(3{Xt5l?{YNe5h3l4ahfYYDi^ zU7;wDvOMG_^tPDpY+k*CnbP{5pE~>?=uO-^0A$iKP%5>*H58v}4z8m^Yo&Qc5kesq z0CVY)vd3QIxMk*8&a1@X&13%}^}y{&BQLa=#d4~_zqT1de4SrxlyK>x?yLWZ2wws$ zdvZ0Ze=RMqyHPv7V$Uj<2NJ3(WSWwEn&R@5#Rz^V4uuKxrjUOJ7YLzL(8gRNZv(eU>=XK))T zxMvM~{_!kjV<2)EWORP2r2Cy?wYmfDns}wvOolHa>M}4?p452xdYbgs=(u_BKTF{C ztO0QW%LafTvo^FMKo57i6uG%ZlnM6+{?F*WWU=k8C(_(5otyRVg`*_ejo%70a$8gj9Wm!+pqAh^ed*1K$UzkYs`v+h2_Q!a;e&T52St zM0KJs_&q9XUh+gigM;o>a6y}?Af1?WbFfj|_=_pMe&1UM5sBe>!OtKjs!dNFTSIK~ z=Xg&!Lj~-C-aB3zZTuYV7@?Xb?qbIfhJ4axu+bD}I8dn#YK=hXm70)!!lnZ5 zgh<0&EnF70__$1}I!8F5S-=>0M5B7h1dz90x7a%fs{QKDSIBz|-R4v}2EN#sgMOXB zyvF150w8)pUA4-koZpxtcc2sb$Bo$v{nQp}d|m*^Hnx|MivbsSymGLhR)d*vX;B-L z;4-L=+kIkNm$k3ExIq#qxGZ1m({6(+e&lzrHjz$LbaZfjGu@za(O&uc4LjpgsLhio z@!`+_=$ejRiN6J<%SNkFn@SZIfll0LDfb%S*h6izu00dMizEux=l;gZ5YuZjGR z)|n6vwfsLxU;Mzy%}~`3wMv$W;jCaIQk-Z?7!3?q%>8e1HZhUBd#-@;1*Qp}(%#Wn z{Swv-I(lB-R~;S2wW*q0r71+`94yRDm&fBi*A9%Vk@ibEbmv!f)@!Y6f0+m-S-thH z`QoExmb<^}=l1}2x>|Wtt0MqY>k1C{)8LE)3-(z9pV{wFJc38MoaSp?%NAO~RCuJ* z);g>hwG*H`Fp<=IoHV2KiK;z>jFUhRgxc!EpRoFk(x2#zV?0&dNwtTDjO5&Yyn&*3 zmOY#vKLkXjnv7N77K*x^$QytBlD3aXfKLsX7Rl)VwLIMRn6sxqpXyIpavOac6 zR8>Gy$#yF$A}Ece6xV-G-&c?|BnoJKJo>xm<@qmK;v*`tuc{0lsADW>>AycMBaA!g zpi8xFI6LO6ab0}jy)sc}C|!afd%Jju{*R&FOi#-Vrg|O!Uyj`b`xa2sv5_3`1Xu9k z5CFR*{O>1t=%2U0X-A|usXo$5;EA*G0kvqbTRfQI|jjSrH&AdcFAnF!N%0srn`u&e{`qX3A8jbQo%19Bb@BWy`6^d6 zplqY=k_2&JjQX1RBj74=RvuUsZ*%(C*SM@H{8a9b0V(zl==_diHsC({QrZW^QQKU3 zHTO$)@)WE9PV2t`7d)lCi+KIh;78GMahv{X8 z27$r#6hD7+4{+*hA5;+xlz*;HGh~=j>oEOSBkBUu!;Es<3`ev;j+COZa93&j{scf`dgUU4aHULY@-Ea=a?mDqk~G!K>17^wSeWsL*xh z^qv<5ad+_O3;-r$&!+{9(a#f=-%$?B;X2uI5(%Pcv7TkGMdB#=FdYe z!_G2V^i@3JP99z}X3d%pY2m~MT4{*$V0&2xPTmTc^_hGc!u_u|{>*_uGm(R}G8RL~ zAogJPfZEtN@HMfa<#%XqjIh{@`H$uS7_xQG>YznQ(9_bw+V4o|khH~zP9dFqB}TU= zC8h(3q`2fR>C(E|_k)Se_(k^ptVf5%6a+TmvT`?GfE>`1?6+!=bk;_Ac=laeZBr)@ zLPAddzC-qzU3kQIW4`t2>TXXALE=;ONL!;n%-Eouy?mpyV=D1m%p75IIBpn$@M>x7 zOPYzr(-WgbKjv$FX^7)YtmAWdsT%3g*mH5Lu4U;CbXF}>LC;C4b%wKQ z&ke4RMH;G}FYxe!xoDyktNy7qid^f_g#2hM))FI|bXPD@d6F6gidpj-5;|tDK7CxD zsc~ACQrF4LM44e-X$mnZ2x~_-Er|Z~&mO=W1z1he_Ft_G03@SA#P-aY^)JrVmj}md zudfg??=rg$Jh;a)=p^7qFfUD9U0*;?McD-a<>by)M-+b33~85iyEr z!{;zGy1lI~qd@6u_Wp9W{aBc{_07{z+7;m-l$x7?E?uxY>} zAv7+@f4}j1vc^)~N=gBYe-@LG0XrWxtAkR2L3_>4V{xm}mHhgs@@DWW4T?RK!D9VT z=h|d(zWLw*@5{gzT_zIK^}{s}?THFcROgC9RYHp>_Xq9EAbnuEYTqvpq8rooHSS}~ z*RHqkc(e-fJA%1Ll{MrsDZ^LAZ{JM%Q|haE7(hD{V^K;2p<0CuFmBila51_FmdW8% ze|1gquf`}H(&z-FQF`}93!;KBsqCS@vVw1#y)Xa76J~aV%WHG`ENrE>N{wgt)W>g? zJ|B?xzoY=ABT|_A-UW`sI)NPf-d|fGKsY?`=2t5RJ>|S5UvT|uA}0nw^IM|xz`s+f z8&v(5d>3ra49Wbie)LMYCS0pzZJG|ely&4hFWlsCJU}Z=F3>2Afa4|oN0UdmE4gM$ z=fn{7{XB71UJuQa3&22TpUOfl;n5&EiF>>&#&}nbF5%_-%i^jNTfJqTH zt@NzWDL8;R|bPM_cR-S zW()%vmkLY$Zy%}S5C)BuO`a5MNp*yfJ6O~UI*}6oz#`@EynsBOI6ZCk+XP;&qz>I3 zi|2S@i;Ig@nJAjbonyLCE_R6)B)x-`kq0|aHgj40iFWP}T0C#bh7Ns-2VDned z-pKDDz7{$KOP4WHJMcbnR!^r5P6~>@IZaZ&zyPF5a||N2)qU~4Sk}opA7*aL9{q4h z8gx5bxZiqUX;Rxu64yGw8dAh#Q0n6DTB71t4Hp};swLj>^Z84mr}n619ILKXGR?fdkt)TxVWFE_cku#~3OD<$=sk4OZTGCEgyX$CCGt zIOKs!2`{Js?7ZtQb1^&xG8rv&p$!3g6GnE$yEQ{729y!Hr)&vY-pht=lOZ{RO4_xf zj#&rs(6vJ%u^b5?q5in&KnEoD5dZf4F{!X8BCo8ce_)Z-(bBtN8)H2w4(WJ%3P_}N zdW|Cfm+^SVX<(9l64ZIKMluleKI@tNHMX7q*BkqbW6McEV?XfL(A3y>WEw{=Xt18G zLx$e`a~1$O$C<Ln$Ud2ZngQO?~|Ay0k32+eIoFqRJ1`d=KiJcgSHrZs(MF{#Vw6qMjrCDO>#2=4Eytj%zv^g7=;;n}*>Z&MyX77?dZMXYcSGI$`&Rtqx&BD&O}Nj|0qN8wpkt z9sv-Y`dOTSU`}p;toxBmw34ZizVdfHFB8(jB~d}$&gx9_vm8;rYZm?+(n8hRaOLOJ z9d9B=bptiBfT{802>}atKS*XShNUB&tfTMj#&)p?yl^$A=XOS7B7ATm zehummR5nzGlwx+qD|)ROBS01UQnl)O`>=BloI`J!<;v~tZ}C%0KS+HvKs1tP{~aOKxR3;Q(G-+JoX+k= z*;$tie+jeY0S?CLJY*dfm2oVSTm3O0+BUmRx~<{z)1M>0q(}XsyCiiovYd=ZSrrOa!L>Xjc)vAOzKFlPvT1?i z5Uy|DmtDYJovOzaP*^?Z*}sS*GJ{Dn4DG>|8;zC`xW(H|b8!jnO>!P>QPs zgxkud=)x+vqAb9GtZ;kBH>n5TW1jem#Ons+CF6RGnbgYClDc^~c1xtz#^$a8Iddq% zuI{Xx#*I)WN*3_6prH3pbBK#}nH7pkN7 zDF9sGn8aE%LajP&D#dtEUv{=a zOLOZq+3sK3^L-JQghKn@wt{Da zG(fH7+ULA~PH(XB2Dqqm1qPMa$58}%h2u~3TvEX~u+XVvZ}8O}4;QyJ711W8p1(e1 z*!5FUPt>139z9gNeW#lT)BP+eWeB_RC^{NmfS|N=dTY;<%eYtfMN8n}P3BvW9WGC8 z`?Pb_E1AoWchjIL6e+b&m2jy-o?eZs#O`%De7%VdIu(-_?~is8fW8X=~54| z$_3B?0vc3Ra3jc(26)P4&n}Lj69mbPD}sr_aOjxWnNc)Rr>><&V1-p2G-7+lER)l? z|4seGbfxE|7Ij+SdF?izsGq0lw^i!rpwiz!Md+RpjMhA0SOty|0p(p=XZy_HPTJ6l zfC@?L66H941`!*ivg%2oZ5KB84?%(ECI;FE{gBfD&PI>Tcx|wNYUkBlRu$crXuW{% zNb)tmyQ?E)VlIOD)ilLWe^$QxZ5RQEH1R*D15!}hC$%5G$q|Jhs1aD5F8%|&w%>hO=ghTE6=clj{)J4uZ){U6 z+JRm}bR-=7i95pe0uX#$uZ0PtS#j#&3tmzn*`)fnB|D|)nuZ)$NDpo_HTze`THTF! zeZmtF|0UN09_PF#BRseL^SG;rU$#}-MPx?Zp(}<-`dtD?7HG$oS5hKK7IcrjTPSt) zGa3w(mclht^FK}M`pzOXQ**J$I&iS0DEkPMaDw4U{=*@80<39ys4x)-g=jQuP&RI< z){&8qGaFU^tS!cK9|7l=C?T`Pzk{SWm!vL+3#Me~wTKAELK`97^R;J|GYwH-mHsXQ z88eLy`w`6P0}J+mTTdKmVunx51#I&g z?YUsMH2QK)A;``Y@X3-1`G)_g^+*NRq|n|QEwr!Q%0(IJT>`i#7`N|sB;)&dDGq4} zXeU!JaH*Qmi)9j?FLpgxfhDPUL3cUKPXIasK7gHm4jno{G(g`GSOTa^d@xsM>_me; zO+CNev#Y}c77H>C*sb#;B2GBi`sXS2s%gmBzmPlq?J7CQew8%Oe{ZN|RmT&DcLf@j zoZJn38Bnp%F(c9dT^ttYxjX{gx6C8+F$FN$=4DAS9OVPHMY*k&m)0?RgsX^+q#G*I zuH&O@4Hi(xi08^^AKt$@ri#~gq>H1|J+KY2fo0|DuiClQep$q~T_CI!-0kpl)GMv! zr46xsR=+S48zUebgM}|Fctan{@?Ey9UBmHU{UgCNuS|Emx<;qHy&iRc?Lwlh|P+Z2f9cC*Dc}&bD zv?5M|_p7~r?*%6)C@hVJNmhW=Jt{sR41WX=G3%Qfb@8uH>*Ws_|Ccqy>n-R{UbNV< z@RgNTBhyC>B$<{^w{ogZ5iQ7|BMk!1B#i0}Nr7*|1}~W4^p3cBiF777+zRsEfkPG- zN6c0;>Fpb4h3_wZoAgNUJwVM1WrK3qJ7)sX76NxM4KX%Z8_MDsc&q%V2AArCe&2#e z(ze&|aBr_E^Z;=E20-GKmXqmA!Yk{@ot-8D+vN~^ej!YcP5H?ReVUniM~1oj$2etMFzD&S7HxAdlh?P5 zN^6>w(w+ykeUe~;S1D*mKwflLU|M#$Jiah9lWQc`{J5=sp|8I-q1(DoM$_ZI>JYGM z$w6*W=_pmQ~N(mj>BqbRa%1WH9x4~vlp(}W5s;%ARXY;L9@DcUU!gBE3(ZKE_>S1Sf%VW#*h}TK!CE=nq4A*YJyggRQLeXdo>`mTGDxI1E2ZW4r+MH=K z*aOw$)zZq2#RqAQ#VH`#1Fd$aP%Glw2Z6&mI?t?abs8ZcUdb-d^p_Ln`DHEjAb#0gsV9B&lnk z@)Ao|H_!^jz*JmZQZW!6pY~-_YB(uRSN`^3%*x`HKIbA5a@&r#N>iKoQZ$;VDf}4P zilM_++C@jga$-Xw!VC$Rm*ghwmT5T{llbOg-X1U2>LIgmS=;4WZiK2EQdt=Ts@a)d zO^_HUO{Td5trO8vQDR5YjdL2KkGIVsmHgmvnNHxaO>igbW4Bv>nwhx<{8@||AT|1m z(?loLN~7?=!g3d7oBslo=^pl1+ducejfx@VNZc<(NXhZEB*Tf@0#D+`RhXHX)yjgw zB@^9};R6oN4@`B^@r@*K!iQP`GM0@>MW*_)aM_#pJZ%~8G9|x^)T6*IV6jZvBCVeU z-))R6jNX@eR!B%l$)D{nbK}+1dRu>RdBSNnB<{K5g2x4YppOaM2}3@GLk(A~OM^e3 zJ8lnu7Hy>lR6gk{xz7s)4JyHXpKSFz28L3-=ih&F+!$3YD}0P(jI38@boS|zNF|b} zzaK}a17-xFajP&F1F3wwa9PQA*KH-=tMqcx)P){rTRh6)f7gif?O9HR9-2aN#yULJ z0N^TcwG@SyO{&cJt?5buo2}P|qSj^}A#^qzYg_-`JGDMs^bY>|dTF+xTC=Z|OUV0R z%h}hOhGixSFgLS&aBs5&N+$-CIDEiQAT>W znu&+AI-Wkx-MNNr~KjDe;q!twVQPKNi|$P~M%Md4gi zb#Z3*cjm!#|4;gUG8yZf=KB>q1-)Bwp)kq2Qdj-+LpJxmt>YiuTS{M`yG?@d9Kcd+ z;B}k7N*}(5X`;P<5W)r8FQv^#iFlPDY98ku6jPix9fKGVYP!XsX75E~Vk{H;`G~S< zbA|+?sKsqB4BYPsfQ-lmTu8hpPja{Gg+Owbtc|?0``pHSI!-zLmDS{jnZ-D~id~Z= zMYhAdoK=Nm30_yWH(GQe{SMBe-v;YNxSitR}YenT{W%?A|{DAJh#Z>#!leDPyP}S1v zMEh0>?}T2pnz0t2Z$BU{?(!lh8z6O}D^K3C_&NeWI$?AFd;D^m;X3`hLb6bs$) z?A2*kKoE8!^Y;S`{fD!{)Y@M0l~VN_eqcS+II0j2ZBHK9q%xiBj+z%%4@`}zk}?XJKmdMDQ^`->3{bbN`GgKLU&<>ZE1RZab} zsXTy0u$>0zjFCCt33u$p(Gw2>N{*MlQk7A0$F(-Il0T;w#d#>~L4LmZvO-J)q`3yF zDrXh6S+lqgG(#}PYYNY{F{{~|vJaxe}^x_9IUFuwwZPfO3jiIAffl@j8 z^XECcS2?{2qGKFw8&=^B2`6CREhE(W}lr~Jm+eMafn(6gfb3o$qjln%Uw z{soE9web>t#@Fb6!iRbLvV8y!Fa(qGx{Di&wtKNxN&pnj(CT$|2tI=XO=|dXiJ}xP z)zqUm+%`UJeaY0y><0*17e=!hydF!mWP%RC%$f}{fB+;3Sl(|1$@mnO(eYP>TSUBA zR@%a6XFs%xj$zkeQQ_$_x77U*;sP0^JpmSjDJNpi1qpP;l`#-!ben!X4ZyLFL#33X zc?#b|EmY3-eDKP#Sw7+SdKwA4vVwqOu053bKhrl?&Q9Hdcik!cNi#q%?6#mTy5HF~ zL{0B2C~@B6)7t6A95f@MR>1+@O{2m>iT={YhWUXgc8FDP;;S69k3T`C;sAiPiL~B* z0bj>tqvc$+*x8LHs5`U99W(;VxVo0=cO=-8wJe`7ire#(N?HVAeS9CTV3=euKI zE0wco99k1N`8Z!-ahO1;q!AY0&ov3x#72qbo>-?rLbQm7?x zW=>-sk)n_?6XdGSM$2Zvx1|N-z+hReN^Vv>bqncxf9NUXRzg z+HWVJwl@m+Qux;HpR{-UUUGVqos%7@-A`U;86LDzWrO;Zfb8FOCJnfF1wxaOxk`A3nks6xX1 z*0C#z@y>vM-wHz+%`4|YaovIei>KM{*=k&>m7C$iZvXX&2*b`3Sa`Go{QTqlm;}5k zurFatt$eFNjVxXam_Bm>s$m!;8$ogo$?K-V4O8Ikx6WjhDF$I9n8y@A0eOfmfixMthfq`iEl6$ds}L$ zasRHpewWaPSf#6z#^I*&qQ94xemb(CQbzRZ9A#j@I0Zx*ACZ)%K9+r9YowMc=o$J< zkPtP&l7w-pFZXH1r_tUgrQSjST@@jL+2f7l57BN_*|ZuhAled_%0~EY=a(h z@(Hm+g5IF77Uf@zelZjw5%-um{kd6z7c)Usubw}r0a{J$XBPu(oAAtx%r$Ujt-w9n z*p_-XGaWLlY4%|0THrsyJ&1vT?_UGWXyWbp#&5#^L-6jZ63y#}f@x5j2wU!?dIK^K zst)zP335tClJqHB3ti45m?F08SEYx&>#3`)SntMZ2A$9X_ThLG7+3+$yx?KS+k-~g z_>6`GRKM~^KWC~HX&n2nd`EWLeV0p67gk$MDSllgk_UW;aqd>P_7+WHq%SQfe8(hc zz^n1#3EIjFYpz1f=}VfI5^?z|LPgGD7AF)XiP(JIxxcrwWnC%ft?paB3A!JatGCZF zTkEtkB^~?NS~J@LjBKsrxzMlINGW83Ng5Phah1)JoEyVTh+h)93?FIe&z$QxcJo_K zx++xL8PW+-X#pq$5HMY4Z(Psph)+#$U`eoTLIIqT#M;`wFohXriJ=%nEzSYuS9zc@ zd^q12dw*l_FEd$56|^2~sP=b2AH9*mL>ukN9E{<(bE{{IxIpfehyaCt66?lywSZzP zDhIZ$unQcx4L57h{^F$7$bgJg%2NE4uSX%Q17^VABBK>A1i3y*kWjEQ#2b5DvI2i) zW=_yU-EKYul7|$mV4Wh|x7>Ysk-iF6+k>0dN`)GL5ssd&7Kz(72_%d@Hbop+tR1BplA=JZf8rTbSY zrZ?(JHLS`3l=uBb{hPg~pH|e0y`x^GlMYUc-9`UlCVyJ25)Ewe-M9FdErbEo`pp{H z+w58?DGpncj#?TzJ-;8|s%(NJGX2Lwg+M_LYA<2_pBmMV0rFvZB^1}j`T@AFYNqQt zY>YC&Kx*WeZe^V(MAH8s>IH@lCUHpN-Odi1`F=sLE9`@SgDyhi=dX(7`@~Q5kzeYT zZ)hk6G75@aGluxq=M~W>eub9s=;puxFi!rbD((~hakrQ1`}_4j;WaQ}mF)(}pbr$9 zD|^*xQ?8Qoc*%H5a;y$Yt^Ms6fOsZ} z7w4l5kwW!~1xtv-pT~~faN@i0SLX*@E4@EI78>uASu8ha2=Hcy1(Gm2HC^6pSl?t4 z#>_nkg`*5#Wet|nVkA#L_)GBbL|E%DsFksM6)DwCFpV5KH$t8k^`}-0_53;r`9q-_ zryBQ-cA4SEsK&h@HZLN1e+eX~mBRtuvt)$9>tn?o2ycLgRHnej0vTQF>H_;8g39r- z1uz+q1O^2XxCWNLm^^jjC^vE65%AAa?>W0LFzE*M)?w6@CQzHyx!%T`{mNOL=59BMO$5Pyt zW}Xs!3#+B1dM3i%QkU18Il5~x7R#4?y!BZLaPVOjF~Lc-z$H8g;4ASC)Lf|fo7``urE^}jhh_i%Ego-w=e=^cUrw|j zK0p^Qv9*OoKBMhKSODzq^?@1acyp?wCGdM?L=E&>r5pr44oq&rCv0iUXHDyv88}M6Htaoh z9_1Lq6A_A#;p1^f?)(L-)u@b>6MN`Nh@~IplL1~VPI;wvCG?)%BYT{Y4O~*iTyYw^DXrK24J*miBhLdk3D~>> zrgq^x(=~_vr3c`RrQ~) z_X6YyHv=FkF1g|pB=$z1HA{b&{^Ys`{+o5QmH-03WAlN|y)5OQG%QYJX@iNtedez)bCB{mysLccKV5;>PHl z*0V6=+erzm%oniS34TUaFWyG*_Zgu-X&cqS{6r98V@1=g5J}O!a7Cw}hN|nl$Z|#wXQ5l)#emW)hR} zfgIEN{qc%&Q0V*%;&1cl5m9scoM!EcDr5#5$B1(2St|dZHaR>t*%#0EP8uDrY9{nv zAW?ofJAgt7B=^cuA7ky0QSdm0VPwWIe4upB6g7I|zu?$@CId27BR`rx$E<=`(5Q_| z#ARSmJQ#>p#ILN9YQ}`Oc$uT`$Yha0L7w|M79wrv%ckBkjMn;nr7tFvKvy)BePDV< zK>4(}?rf}ZD!SmZ{u-1LDfaWXUhEJ~vs=+0Fa@wrE3Q{n6oJhV>}5D9gB{YM69!>F`T z7XE;DYj5Q*lHZ$C(uBX56#)Ir@)w)>#!{YE7F$*lZyUq-9)*{nQb(p-2$;K&015v> z4-@$V+(l*s{Pl+%CCj((1f<7ecHpUU!Nt$0vEf-0x-%YMq&CopU`}O5gdESqNY#>e zI02VWf4BAYcx3Rd)CP6oBm>N1t@rv^Wkj%?iq4=?wO-rwwpfou&NqcBf0Q5DIkunT ztGC5H3VG&Hg&AQ}^ZGE4_wnSF-(ukQ;6azIqoP;r^|kL}9YDN?L2X$AC9piWK)YFu zvjePKtVd(zomEzc=$=m|@)F@p2rWcXhr=%uIKU}Q-B)fX(WXYqnNjsYH=&b7ySR9O zJpm#@{g-%-Jr3|w`1)tHIOsJ3fRHY?4fMq zN*yX?zLe#FWez2`n68WG^8$2Qe^`B`OO18M`%4pS%4v_|HRGij!D2CVkyVQK7cZ4B z&$cS(sxncl1TSBDe@UT_VF1-nW5wEvm2U}>`~h3q^d|E1EbUz)UcL6>s zmJh`(gQqTz#q-@mC@fRZF<%Au#WfDpXTmpU=V)UC&~WGRmILo|2~Q(9y_3kr4wqW6 z+!>w{CHTr@Ywz5R-#3t)i+Z2{Gv2nQCYp3E`qK$qkXY5-Wg_$pp{}@+1z7VA^i9`xLL)fSkq5-LZ%ss#5>p z_CBQoe=IJR>iX%x`*>?c4Advsy>IKySH1;PGEc$FgJa%s`&t6Z#s-qQ#Ok@Gs_4nJ zaZZUa23Ex^5!>kl7=BEB;i30DGFa=<{v#8L>|YRM|Em^P*e(9-jVUGtofq?B^Dhmnhc8`sCw ziSG%V<_Zg+aT$jItta0d)1~6z2P_*4x5b+Hfiy zk_j~TlbswOKxV`C*)eZpHWiY7ZmhqxoGM#h$Wj0MVrim?tooIC5xAn(yt}SH72<&9 zUK{6>?c1^KaKa|YY7+0g4HM5Jnn{bg=6v+%5C$%ecKZDWD(#`aaFEn0EhPH+Pe`rJ z(@xz^JLPBF-=2+Wc`|8xp(xE-V?Rje%vZLD;-e>b5)BE@A4R-NX1{tejL>w!DY3TWX8UW-#c8ZP>n`0ZQNxMZQL{a>D9NSZ&5(~Tgn z{du$m>k~a&mk-Zo8tj9h$>)xmYv%xY)Pl9b*rVUMGMFoOOw~t)7*EJ7_dy&9RHXD@ z5qnU;cpOs)2McL$W9S)^sPa2NL{oqftX2tG_=)kv2i;GG@}do*T&25H>^;W=cLad$ z_N~^Py>|N5OVDNKbq&-?=*lUhW=%8-7I{H~*xmiMO8b94btJUdl$U_@JOI%Ij@QUr@+3!Xuja?9b)> zz%$&IfsQHs{o5%Uf5S;dJV!0~;)QbOC(mRQyKYJ~LgkzY@-ep~I@UezPP?`{fZJMLV-b0b$0V^9^S_?3-Ru-6M{h8r?QuoH2 zeCssv0IY}m0O9F3R@inrv>sMOeFAV!6~li zc^c|33Z`%Na#CGLU>%cDH1C!+v&?yTrqAp-q4aGuq>ynY2O$F^BfIagJ~6X7L2u~5 zEV#M=UoK+>mGE>{$GB0(1=N<>y*LD)Ug4MB*8jE~y$6DPnZbmt1z}z< zGLEmgQgLK4H7XBxToBv}c@I@n_g{AHS2!-g+be1{S=lKcXa5RTDn25Mjwd2Y%463% zwW%l?c4m#mgP;ol@+;tZlvpM z@HBtIDzq94H0bWoU6g1}qW8vVoRHTb&I?j`|1WCMcjQdYY`iVL_J{ayQ+_Eo-$$ZyK+wf+I6hKQjle&{xTN|t1Dlub8V|t)53X+tC%C31G~rrZeyH-G`Psy<~-#kuxBRWJ!6F5 zTcJqx>YDLBFKYZxr^-q7eh=#nxPYGp#f^jGmHjro8+%*R5;IRz^eG`5M7$2PHxI9p zmeCx*9=aAEn*u!Ax7B&4*S5fC2}?y0uxOf9T7C4GBMcIfz4knpoAyN_-fOYhj%}+Z zygT4GgZ`V5xDWyhW@?>mbs6@4zac)Kwg57C9rRJLpoHbBsDl%>gj%@O8y||A(sr?jOfa&q6#Rs z;L-m9f?J?-1XL%R%3I(frQ57Zpe-`L0lU#{6@F)Cf4(P7zWgi>rzRTpcJF4o`i~M{ z4Krl`kN!UO3P}$Mu@G3iGi(aGXr=R`cJ2(0|9UPyV`nj)z@;=G4Zut#tTmj6d3l!fDGj*Uc?CZ`LeeSA}p~N(BGZ}rqO5kR? zgf`2J4i2}q$?}b1P(tB9bR^s)_Uij{*p;d!^D_=k`IoifY77vYj@4V(=e-H@bs-(d zuRNEj{)GKI-eKEAXs6c0Uc%bjdln_`6$HDf&vGyVfJoz5IZV6oc%85LL;H#&yaY}J zR+&YQ<4WZkL?s*d~rr@#%a4m)f`lQq~JKiZBXL(fE zjL()CmY#=IspsZaNOwN=<$TPW1*&x9PKbRB=YSZuw^#Y%_F+DJiuBu307qNB(yYyX zVozUcq&~Z86!T1rSWOuVDGf9*uat(70;qFCHNq4?0sp~wI@FmvXbn1W=RJ4$aPl}= zAj+5t8Vp{y3Lc^e&deG1U8JyrZfNN{^@@QeDgSZsI}_08SOG=|2lUj0E3R`d(pBO1 zkxpNN(M|6&Hk9L^XW`**EvF3ZQ7}#rY$yc|%k{xb)Q>D__$27&K!P}2IOzWyqU~+S zP_3$jZVm`j0~4jjtB3KW(Xk0{i$H;1U`RGYBUyY%486RO%5n9_QkvobXT#2}y~)W6=B-5)zyS%9|O#AqI29 zOgf0A$-P;0JB`}^E)wqV;uQZ2GsFqdgPReA6|v?|=~^EG$Nj+Y+TRi7 zUjL8ds|2FDnE%WlMSB+aAmPD-cXJw8wVb&Ejd^K#OJ7fSr8BM67_?84{Wg+L|`YwgN^>%io+F+>-Brc;&%57RZsZUVg#Eb!-EQmJy>Gk1RPU-+3E=@dBm>MF1k;(&aVEa2@tK%1VSI|S69Ds;Q zOC^|6*`M0@Red_J{&o%HB#(Ay^W(7jM~SQZFmTWhrVCFCflf9m?(rqHR?ZNfO+ZNu z^+O3*0FCl-#U#7dnb(rH!@nP#dzFCu@d2rSu@vgp<15N@8Tpm<7PQyLC>biicj#fE zv$e9kCIOh)>-i@}`nxEwL(O6^Hp)Iww8GLj@&ZQANJ0$$m+HahKj-iMnDHFlp5?aB zLkU zZp1|WpO+*m-26CfHU^$lmvX))Gqd93l;Ms!p)qul*$T4Qj)u@UzYlX)7I)4 zG=+UCnf}i2#*Ovgq0jvY$4gj697%`(8I63egcVl9mYO-01^dIe%wF&Xj_|e|%fKDAk z94fE01LO*0Y;;I?%iNd7Ih8|^y)#gQR&~ml5kZMZv05PJ^w6#xHrxPF{eXb2i_#;_ ze(*7l>(`sC607>=njY0ZJv~cdnYjWe`Q_oWWaHa?N=nJ!S&Z}5@9bWprvKUVk!Ug$ zJHjoFK9N3DpI=yLK^AwYgEN>(YYOI18|s_Ax;P!|=m?@X3L|6x6mbOb{_?OZlLnhcR^6f|KTl&*gQ>fpZ#jgZr*3%RrY+<#n5)Z0yvS3V7LZ zD!x7%?kS`T)pnySpwdTzU-@Q8h4#D^wvY9YxQ=H9MQ=6@y@KV4?WCPcdmE!)%!YIO zl&s->f!{j`(Sf6R6w4{8QxD{af`JWjaylGW^W)kYls4Df8zx@DKAV4=uiNkc8MU{t z3x&;&wJUv12uy;4;qO!5Wq}R3g1xgdGk5HZ>;KDXrtn%K_A%oT7ZPfe_4hu2G{y-b z(FlcjOo5BapYkeDra)k=t8B_RYo^iQ@cHLhL7t#J7UkO=aDZ-Y4oo0L0xPpsyYLeE z*?#wjcV|3co358AaDN9pi@XCm;~>%K1KiETHz@G;Akb*SM4e9P3${1lBt(J>kd#Es|0 zSY*S>!Su9ayTEd{R%SP&l&=tDHu5v8VL?OZeaqYvBC>bNMH+?|f27=wfc2a>cL&1M z{hcZE5w+w%HWL-hfOGCOTZzYElJ-Am8Zl1(tGmyd1_il}#kkKvoee478zk3e*i7Y; z_&r|w)_TK*L;>R=SAQbp71~=VBb1u>Fy)~Lz*vRx6pXGH?cG399YFRdqo3gzczW>u zB2(4N(7hgPsw;!N3neAvOMSOnPXmzp7=9|&ayf2H#vnVpLteRIJHH3ka~P|^WLTQo z1h$CG|L^bgKjce*0^H`G72p_0O?Nig`E&gG_!pf&*&z4>i|1DA^DNJ;a~ zbw~Rb4IRvf4}mr#EDu^rMJzH22_B_y$##+dh->UrNk;hmr6bKjqtx#nEw zocmm7`F_FhUl?o{z)xg>daxR=oHTYJKK5XIGA#W_G{}~Nc3MA8M*zb%_q8Z-Onyu{ zy$g_BPyu86TSK<>Jy~1uZRvqO16KJWe~^B7jQ7YcnWk+jfVullykUb5O?Pv}Ja77#b|uR~8#>3OXJzz75a zrSC3=jH4<0e#1*G9yKe;$$_#tQ;lYDEbgfr03Eu458Z{k#WYg!J&RfrDz|w6TJ!_l zU>GV?9pq(y(SvGnrPF%oP`gwOJCLzSUS@r{D+7R$4B7u~DALyZZ$M;x zint7Lfr9eY7e0e?ZIlZI!^}CIWY=@{A#@Y6S1|*i&jw_Mdzf8$pR30ObKM^#-Tr<^*hqhkm#u9EghQ(baiX!O*!L|E__!pkHj?B4 zv!masi0uPCwp;Yau*-_Q%(;pw@Icg;LMr-ma0&JPrWPdb(*HNhA_;YtvD5|b;IW}J z2R|^(Cc1?rTX@R-=#6FLEe5`H?MhEBFnbLJ*(5t_wBe&mKp?t28vmLUKkd~}3SC}1 zaBWEsJZB1nqlG&)L9j#myi)1SJ_TwPec%w+-UY(+0VmY_((l|NPx`;@%si6PYJVZJ z_GhA>Jg5Bttd6KI#;F%w2^ZTm2=76$Yzwtuv#MF6IMiLCf{_fQY|E8TpcQ`fnt9cwmg_@vIv$v$8(V(W-HWvU6 zQvuV{g(egXa6LsfXdx{oyiS5PVJpfEj0_Nl>S$%LZI3 z)}VtG@MSZTEU1X3g0-9bZAvb~<`zaHM?gV>Q&6sW`K83ycbe2&R6yCjMT))cp;6{g z8UB~31p9B#M|}6cU32eQS*6XLKu*uucHd87eBee^VeWD8^Yfo!V#ST`4)yi?NR z9`YKM%E}w_^Vt8B^iI}Yi`C1^sG#PrGuKVzq*qlEYd#Kq0tupkgQ>i+{9R;|zxml^ z>^K~?4DQO_l|I6`x8z8DmYtqak*Y$9U2*dKjQnoYncJG)!#XrtXwbSgKJ|fOFs6P7 zf6FB}?Ky!mKQN7vYsIxlR$5_wt4c};+~|6x%;66Yx!O<0r@KLr`0UzyK`2Z?RtVF^ z@`EGPlVKiX9;H+$;F%pHuNJ?XbU+Ae7@)?IZS_d~N3Mt%?L?gXwr=fp53bPG_!6t* z56q6ChR;HLw9j!ij*h7nP3YN{5LoTdB&9@nARmL7D+=j$?yLAGR>H~lRgX+}X;f6y zTJt^beAmW1Gb>5>QU~HT3zTK5g@&L{IWKQd&^M&MGOTrc?Mhl^Tln+|_HO>#e!{Ka zt*AFd6oO9Yu%AxX}5K|#dX$mrekO`&B+UC_f>c8G6ng?YDq(IZLi zoP|B@`bsLb#m8*d783_bU4AX1`E&A@7ye_oeC6CWfhBBxU7(-&yqKufO$t`Kd^PIb zy=YNciDT=V{oNVQg?7l5+nPB316 z`5t$l(`fArfNZ9eF_>#eY+s2~od&l}D;lWJ*N72PdFDTtGs_!Rs}9evM*g4|G%+I9 z=7rrlh_uOQNpnEvAWz-e3+Zk3t*}DPQvKr>AG(fik5&WDmv{^6=4(l5F~T9jT?e6 z77eEG*;X;@%<)D7b)Q%t9_xseL~j!NbAvaKvstGeAO!Jk8;tR{p>lnOQrn27ouIO! zqjdB#wx8ZWSskTeOkzAo)>h?$yn7DQX~IjAJO>6A86k$EYDgn$Eib}CEr)-mlwfu~ z8uRLS;4#;e{?5eqU6}RCD#ARXA$6RwJh2QXbSr+=r;37!a6 zWS0$`aCxSyIu-Sv@cruk;acCp<<*_c9bq>xVDIiu^chVC+0^lC=(;X-S_HRPvZ&gL z0&jq-HO$zraqBxm8|Rh$Ww4Gah5@v|6vtJt*-|ypO7ACIpShi5{Omp%6pznmRWKEH zMS2i@0%{gkf^Mul2`NDP_kUVzWS6RLV~4^LQFn-(K*BaLK~7CO`3+aJTbp77M z(AE@IiiSm19W0kjD97En?bYJD(Uc2IzpEpks`fz zSH<=wDP26P^SQlKJ%yorbL(43DBx=h(Xkqzth#*bLd_jhu6V^+`-Ji`Tzblp;q z7v+(TK#)t~H>Rxk_O>^%N(Y1dCn= znd_e1nd(#}jJ`olH_NPV+Su9EYQdup@3>jNFlo=WVVic_+}^ZN4J?-yg~FcjY%}G= z`%)ZN;@O>^_GF1MTwh6a?^TPcXJ!A}&$jy7Q5Hkc2C_Kv-X$wt0=5wQgVf^IcztL% zU`Iwbf$9=+jwseLi1j`QL2U1UmFW|D$FIUihGeorZrxvrTO8iE2ZAEB8m|MNn<%t< zz`;T?x+Aw|KVqznh4SXAlcJMijV#W9%#Rq7t35rq+C}#^LkOxn;*WvvPBgHOg=xdeWE<434W|LM z7As+Mu}I&w@3||u+Q?P_T5*UQ7W(re(RYx zRW~k;?r#F zS&_CIoeVRsG@wP+_15CNml$783{L6jBAOaiO`of1vUi;Zi_l_WZpY#=&fH3}wh*@M zJ4H6VRUu9`4_mq^VXol%WMfZDie{E?w52c8Dn5J@X+yor$-O=|)$a4L(9&lSC)~Fg zVCzGtKC>Fz-gcQ?Mi7Kp?t$f{4`9CLvS@69z<$QI$GrOc>p>2OolTw zOl>SQ(1q*zkujw8ono{j(SOu49zRrEEKWTu?7`OYOYD1@dx$jRC4Y1%5Mc-%8CNE@_#&st>bda-dHme~2%dMC$0O7MQ~e%FjR$ z*@%t#Jy&`cRWG)#^}j4q#>A-Tt0)x>RA0Ob@UnOOx;p#?mfF{4SWqdK8c6) zDcifl{)nk@V1NG<9)fy?Ie?hS0y%)c^ht|PTbzW?@_1vBTNB!+r}-|6)VKQ|Q(uL& ztX5y6)rwO!tbrK_hXdUKuP~K>Up^hY)svCg-1Y0CEdPJ+9{B%V+Iy5Pm3ym&j|(>F Q!CclkeY3OWr`^N<1Dv(YUjP6A literal 0 HcmV?d00001 diff --git a/keyboards/ergodox/keymaps/italian/L1.PNG b/keyboards/ergodox/keymaps/italian/L1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..17c5ffc67bf071b11ecc847048a5693afa0ff650 GIT binary patch literal 130416 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 AK>z>% literal 0 HcmV?d00001 diff --git a/keyboards/ergodox/keymaps/italian/L2.PNG b/keyboards/ergodox/keymaps/italian/L2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..c0aa9e9d38ae64002875ab484ff58defc6fc5c2b GIT binary patch literal 126006 zcmd43cT`jB*Y6v915r_suF?bqHXTA2>0MBSP?X*yy%WR&h=6n{0g*1fOIJjC54}Y? zp@kYs2suyOd;i||z4wfJ$2fnTjN#bCP0X{_de)rZ`JJD+LbNm#$uHAhhCm?X%1VzO zLm=nUtWlO_Zg5_vTE zg&ldy`q^<=+j za6#sA&3YWn{3w*SJ@9a6A*jB$BGY2`m*>f`*W+i;%vI~wKMYXMpPV^Au6c`1*DCcW$xy^SpPO{;AcJSC-pFgeNUIa^sm#dC>=3g;GSjT{uZc{TIjjmF zu7&ohW%n?VGtg=^vSZGC57nsffoz`j6B~Y`iT_YJAXJuQMJc6{?S{H8WuSdv+jl2lCsE#Sh~7USNCagFw$;KEdV6n(?!<={QQ# zXYQmhh`P3^*(@$-d}v4(r5AH?#c-!K*VVR$IYaZMmb!e3J_U2NCk3Al*g0s)HqJJ4EfkkcB9V5jT zs;yFE53f+QrNA5b_6&5}R^m9wRaYyvMZ`g+}CAvaASN!nb=iBpluCUyWl9Hhx zXxV%5^IbyxH3z|zm}t4)_tyl)wpxRjgtuyZ=U*OJPV5YO$AZhn&CT zUy?;}Ey(pvgmB@i+!Mu1A2%Pma z{h$j;e5L&GH0hkBAwQRwJX6%pH>ikuqj^^FR9ZV@X2_*=viGC?p3qB7VFH&@HwD|% z_lu@my`@+E$p5~6A8;9c98<1uDC+Nj5pXzi71;Icn2VUW(cIL-Ag;!*9&KwF-QRy* z3Q9hm1g}@mBnRJ>l9oR0=K9@*=ozl@LA$SC65((EK4fY>nI883S)Zq^p-@B5uGd9P ztO?Rt%glpFh<4xz@C1=1SfJ+P=c@=ShL6jb&bDrmY3oH~H#!!s>Qs6nU==>L8siu| z&Cq!8)=Tz;$vX;!l<#NC%c2Fk`2@~B(zGh=3pc|~U^=eRjbGQC>lhd8N3kRbgq}mv zylVcQC?%7u43Fg@9O0ad&X}WG$V-`}O*H7GUx1LOJSQkN_dy`Ausxmk4zf1c!g$fO z`KH~`8)`@O)E*?XjYu#FNqES6yHGju9r=nX9=C2(l>2gD2psLl2ficc$%nri>pr`m zia1H2m(Z;)ToiIJ$X0FbG0HHWs;SHfEK_h8DeH}jiMctv8zPe<y#%9dZh65%Id0RthZcg2_cQuBYO?!ubJG&oN1u8>nAn&NpJ73qoX) zowNM3Gwg9f&#OACUPk;Su=vd^QVhkrEPa9^g`0hzZ1tP!?~g5QZ`78l-RMG}dwo8E z5Q1$G@JUXdYwawoFs}DbsOJr9Ot~P*o^N-8&h?51N!McCTL#c=TO~=}u2Z zR#w8E?{T&VtkJQ+>r%VKl07DItUJy-n(g~yZz}t*U%#9&nLp2XE7*|HU?{6!GW*rI zZm{gF4qaI`%2F0lKS*{mpu1iY<3Z> zpCw6)*>5^wFWe@8$@S!OfQMy~(@NHl6`h$C(+|6sZrWz_M$R&q+U&%A9+?k(dqqt$ zTsW{aW35U4N~Q)9%5Qpb5oW+Pc~J_o^)`dzn$={K)Y0j5N#1wl43?^O4im!;rM~hh zyJA&U=H;EmnHEY%kFviiGchcrGaDWgQ}k>oO7<;#<9Luzm57vBpO4k7ewMx7degpm zZv8oax0DeJ3yb#Hc$4e>5A!HAQXZ^I6V)p1$81%9TaT4mVBibY&O6_nKD;{%iRiQO zq~bMda^VYpM^4v4;k_5dH)2ffUQdIB8jM&RoBlkn;BcY8!B3oK6cIoQB$XK-U~|Pg z4Qh%lmmS?Wqon%tYzM4b?27s$`-4zYo9StCTK3UrfD$wRd>^vQX zbD|WujRY`hij1)!HkW2@R;;Bjut`b!;P`ibo`FQgyWhu*mZa-@$fkxu-2^%DuItc* zqg?@KS@+80gBm*{YSs~}tioGg5l>SyFJ_EU0<<3>vJ)T=?{%aqp&stzm$=Nuf_n=o`;bKNf z|81LmK}%Y36N>ryPgtny^7HT+4Xo9Y$5!ceW_u3EodnTdc|XgQtsaItY)!w%`@3Uf zY{vRiwHKOIQe%&hQsR3wmp!}-FtwjrI=z@&R<56vr1MY(*F0PM_UqBy2y>oKpWWl? zp_#glbt$*nqEpT63P(VC$(6HX);*?Qgu6Yf)0n&MXmFhuHER9A7_o3`N8fB|w`FKL z1L~b=7KGcL`6BO(%}~yw|ADzl2IX%1xOT;2wng@XHak}g^LJ3u43B=J)~ zK6(S?Ex&sD(Y6E1d5~cXb(Q`vA;b;)8HkNv_TRg_>e5B#NgqU)KV)6~E z2jWgc0>)py@7c19IMw`Wa8QuOhu~(Z!fYa7?4w@ex^iFA8&}HuGBl(`i!P{Qd$sZ4 zH;~Px)>}8k5WgWdQ}0?#E4+tP#)@sqJ~SNJ!X7L5h=K+%bhK? zO|azJ`bId8|#qEnG0-??zHXYecIj@WcgX#g5X5IMvl*%-z%opZ$&4qQ-GY zX)hg60c1E#ko}uNrhANfI8!yAW((jLrZkKmTyrZKbqWm`{sjU+qmZ?AqFozsrP{ zYBskX&kFBu+Oqx3kh0jkGoAHc{S;tgRUS+rQyE9U2m6gh$|zesd!1~U=3(^BE7aUE zlX%Q3cs@XB`dt?a_NaHOqc@Mu)w71>98NJy4-f?G0$z+SKQolNxPSZ zujnZrkO~21+C8bNs@40{ynWAn>$WM!>U}i((Be^2kdG1%S^wk|ni*6h+(fexZ+jt0 z^XYtb1N^P(ktk9{&}OjS=V_ldk8#>w?i0IVB`2p6LvPGxfCiMs?~9z#19zpP=JU!- zcf^Xbz+G0MMt7(D`j6F1OqqOr&#X)D89+0Ww!NDaZOn8V{R!P$K%jRqLVk0Pztl7I z9sJO?>3yb_jm`Cq=Iir&tO&hV++ma9$G!qJ@&ymoh>)Izmvq~)u%sNF43$(gyn^MxSBw@1#VgYxe;D-bUNc*|}t z9;iW#6!rc(8ZIrr(Y!@DAX-pDc=N%X#uB?%asLz~SWhT!_fQo6mK46bn|?qid%o|!pjS;lF^Id99bt5~~WTPK~lGY-eB*MX7=WosVn3~FKH&PTI z7&v9=@IHv?D4mSKKle}r!SW2n&YzE=r0Zg45PzbN3bNzZ`sS4}HN5Lo8(05eaB}gz zkRQ0!stYhbUHCr2)SAE#KJd?4ZhSzj(StkXg?j4fMLp`Bu)FJs85=wr+;N>V%!+D~ z!XhGi z`F%z0jf8X94BoF`$@AHdy4AU3&v8S4L%gi(aB#@PiP{(93+}_Fu8rHn0{-)Bh)xRE@je>nzwjbZ<5_ITOqev5$*3yg)MP()2 z#;uH@no;OvF_*4)mmNnkT8b2(j$yM}hNwr(?^Jyf9m$Y-9cUEoI8qv4J(W${_?+)7 zgoUv{{Hzalq55_kH=72T+m)x(bM+!0TlhwOidyZE)2;b33}l(D7#e3w1G@|L(EWVSMAKQiMj5;|*D` zxoo7E`4b=EL4Ddyamw!a@9(_Bc#DxUMg;9Wp_Z$OH*s|}kU&1vjlcKlsF`wGS|{rh z#}wO?2mCOKLWwc4*(FPyyh_;LEvGUgqDL`@x=`3MdP`ly+qkH1)_KQF2-AR9t2|27 zPG74EerI{?Hr)d%@X;Ipe3kzLf^~uokB*QrvN;dnLBRW=#>TU?aa<9DhD{)G{NlmT#;zcC4 ze4R1~-RH?^+w_s*7mTd?_1hf!yv|t61ch46z2gmJJFIk=VuMw|_tp+Iln+w`HS8Xs z;r)g^8;KlyE5j9N-EY40ZQH-50=XGGW&>Y6DudUpUoE-5jF2DQIw%^3F4V0E$xNy7~lxMwp??&+7 zDU=~fszi2x9pnax%r+^Pf%l|bmJ|Bxs`8)s(z)hc>09QJYCl~!=CAX^hUh}uWJAm| zz^AhLPWySp*@U`5=R_PPNBu)Rzw8G_|F)mb*Y88mkAL+UQ5jh3u9_C4wlBWIw55o! z2W6I(e|cfutP0HFuI?G1f9x+(GCbN_#UAdgvq-$I*ZQ~{!U(?n^Ox)5EPkf1Gc?zL zX+v`P*qy=qAkxaILrE*w9;*2S$Af~9r#N$Zp`2)u;^O}O;>VZ0$(gEDog?BqhXrbP zG@8nKtLs_Qjoxu{>%iQwwlGv{*omigR;fb=cOD#QpkV5WNzHS{1bCPy?+*5!GB*Y zr=p~C+)17r;~#?){C&X6!~gcrUIORy-(OZb4V=M$Ur`Wcrhk79V3GO1{v$F?Q2*I) zAftl=`mNj=zV&cf)Ia$d=@4YTSdV^gSes}>`v-D9co4-FhFW8XYzl+3DUqokicKO6 zufw{hS4p?y+IT%|VBoO>$$S8A=pVu2v49oyDRP&YFPM>3<%dvKWD&b^S^|7w5wQ7eon=#^3FO#T@L6ul{+`Z|yPxP1F##4lqoqUpD9! z8E}xQk<`zNJxDv8+&eNppCFgsoRSd}c1_8h4`S|Jp6f!Gfn4UT-5IKAt&t4r`pSBh zxtPR7siiGdRCedL34b0Vs7KV%-b#CvMdzA`1<1v`F12hIc30UI-$%4%b;IVzvQOAX z!WirtXR2?1fT<7VUg;V+?O^Y$Q)FTlzYo^kD;}JF#P8Z-qg!>lq^G6!BfZN=G!8fareIw@r}gjpD#|x9&(MA zwK7(V`yYRk40J(2_qhU^!C@#}Q>V>V2AS15kmij@Hz>7F7{hlUk#e3!wizdc1b0+kEN!lUxSs7uuxUii2P9)mw-a`N%0>0Fk&1H?7H)V z`xQLGEck~B;>6bh`^K5b+wnzh(J?Vt<+<{fZ30#Iy2x}|y2@3c_CVt)Nt6tV(2_Y* zyE83*She4tftJ2QINFU9+gTigU(XFaPZ3A5{Kud(o1r&Z$=@7=5H7?&TPWfyo^tE;P7{O<|+4A(l(sf#3-secLsqSu9f?NsK- z{L<=30`;RJlV}=;-WUyJ?dU)UsNz8){~w8+(GwN}cunCaA= z={!DPt6_1_z|eQ@o$_d}k7gT_e)W?s9yf%uK&m5V}PA!al zo$0eaxGWE?VK3MlT92_%dj@wCZe>g+a?VH==wY!%t z#+aSnK;hmg`2BUdUEd;u!w|_pGm>YwvotACgW>zyBl3=9&GiDyExu0FA(7*?c$i*Z zTtQbHzUP5X)_#>^4m8XpB7bAiV7KwA7teWTVCwW#r-FqYb@ev}U3ToH->`!yG5)t` zwuqD1;}0_{K5A&$1U6q+%8}lX7`DC!U2PWRMI7oKF%bvdDe5Ju_`OYZ&u-?Yn3!{SXfXa!t8hLy24R&Py2^mS@YybDGjoUpk7J@(w6G`pfSf3 zf31pvf!Pj2$NbV#=lI@gw{L4rc<&&4N=({MULiE!z2EbE1MJWbyCDo9P|9qZWoXXd z#!!m03k+PCISk+JzrBc^r1N=6FdZLb!DbUZ~k2CT>leriLZ!C;nxIWjZbUKnvCx*I2=Uy-~7u0684il zB16*^xD;1`2vPC}oj0KPfHKwPtzvl_*Ld8)wZMSWN^pO^He8WsC~m1HGa2}cG7|Wk zl2KBm=#JG{XM{u9*%-7KARf7QeGg3U8D|GquQU@H#)IX72C29`=Y zd7{1DR>vR1!I@h7YarYEFhZ?A+$+7XrlY)e+2>_rgI|Vvk}yv5XNe7p?XX->VLUey zGi4eI>eSo+wG&^$)S}MiQR?LEWG(4aXIyq~(D!_x^@Q44Zr;~yx%mk-oneVYZ_JM= z6DCAm#*@ycmYsf9aU6LC@=H-6f2!x%ypzx%MoIS%Z)pjlp#fBkP;=FeM>U=~EjKMJ z8w3OjsiMz9np0p?KC5vBgY|@E0qxYVlcu3xyV&}8d%tt3_x8tyezBe6j53)ItnMOx;(8viV*UB3SY zx7ps^9m|B18u33PQib-)uG>7`Sv+V-ay0!~Mf+J2P6tXJll9TNq&yer9p55jmc~c& z1~VgV#>=b6;M3oJtkr8Ms@$fkzVTI`1NBLgLURJc5n)~kZ!PBgBrp*2D8gvwRrl>@A* zefyRdTffsHCVS#BeBez48>jbPThyOe$Ul>HQ>(hnMLk_D?kwXz5Ntv2nyh*)6 z2Q>b$y-2fgSd}d+xhh(&ZY8N6uePmLl=~btb*O>GZ89+mB0H{0E+zWzRM0pt45h29 zp;N?A{-H`nf}X_*Et4T;#dx|%FJOgxEk`OQOmkmW!!B}f3D?v8b4S0y_j?$B6mdKV zd?bHM)ajUzfo_MhqkC1Sl$Rr8S>=N$I&-)R|FXNsM|2tzP6k>c9sNOz{-&i_Y!^4mB0EDN^HwdJ~L;R^JFO)g(^B_yKZW~{LpsRLbIrJVA_2psvN zcO)~K0))$Z)P<+6M!G~v9UdNL2{2*sLTYviviXC-N@Y#=ryo z?P=$|#BJ(F$n;v!sKmkGeYvT?tQXP|u%_o>bk>%cZKX+@rPC~IZ?kE#8ZCaYm^hfr zohSs?7+7Kf-vWwu;AATuB};(neU8PCZDC$XbK-ff-Mg#678O&lZqTu|`NBRZo>a+g z?Wd6)tie^#>E&cQ2gEfHvuQN#%fbtv;bcOm=JO+5|Fogfx>NQF^|5-G!9!BmrN^5@ zmlMz31HpAGZuh$Sk!}#IHH-_GnnV6yKQ_83w&w|0ev-VQNQ$-92y}yN@BY`=)K4Ha zyDWC`B}o%~T0(L+Op=AW6WUrv1awDu@gedc$3dB*AYGNbm_44 z7Rr!c>%O&90z+YuQo$FQ!A_2fl)8#uYa9?wfA}Ls^08L&1budPRaCB~g#PsF2a|BE zV)@y6TT*=sM@v<2zvpsLrm@m}i*37!wEdlm%1YumA0se(+Cq?L+(iu|BsLS@_`sx2 z_?g6YARC&mG6Ub*>s$T)J?Dl!9)+W1daH~GN;zcYOt`rJi}5Ql4b0h9_BP?#3abR6}2ciHYkW6!Y4Q1P98_6wtYV#%qx{>wEtSP zx5*8gSCr%B)3L&se&|=D`Iwk!8}S(hc?2bv_4wt>)wqe)8AoR)-;?bP(-R2`dODbF zH=uk#Du9eL$bXIZW$GxHNIAdpZIs{njO{m`?vct1&D~iw_zI1!jNZJo@H_3HvTC}< zYK~r2VZ!1D2)Fhj;$cNC`g4AS3Ny9i*GOt!`1*K-(0<-@l{XRKEs&7c|6Y^CNGYht z3bPJlERgK>mje5zO{wEsP*omh8)YM1YBgVnsr9FL@1v!w>-260qNYvtjGd|zIwy0> z`39Cqs?8l>7$88d*HcGc8Cj)`1ezw@6`8nX?3v~pcm8blI;Y3+EOqS4Wk;;NwID;M=64RIx~ z!vEa-lVHDBza)PdoD3gO%9tqi(di9r<&? zgty+lL;2_t&%pT+CKHbW(D;qZ)ie}jfhmwNz39+RsH~_v8HTax=j|aF7&1X&v0)x1 zMRIAX>+z#ESOO=Nu)l3j63@|w zW^Wmf(ycY$RWEm#T5ldnH_bnERH61CF*ADp@$ETg7tjM);6weQ`AImBVYHZ}GIXWt z9;q+8n1?+beo=jHu~`jk7M9eagN5sc?M!&K%Tu4LZ@ex>D98`{#c~Q#vQ&3L2c82( zpWF44dWszWDHz_EW+k`q0l7B#{?6bhxUb}a|K_E5hKSG^9xpI6XWBT#YL1;}{|Xrkg=X8oS)mO)q& zjxDM2`6~it@bLC6E;X_XNRO052>`@(G4}V{(C$^0`r%8h1VQthoW^iCeK$6~)0>>x zo75Te_w!b*{XiyQ09!Q=o_6V#vcu_5)g&Zv0jezAz)9ia9YJJ?X-}QkqQPL~eP{s7i--V?{<)ak$3E&~4=jBL8@bjq1I9!eV!3aj_C; zem_^ehLzISu6&^AUE|{eSI^tRObu2ROqf@bE9?MMgmDXV5HhzIq_Fn~t>MC7-@j$+ zEs`nym`ksSuhm!z{Yx>lo1%fI@)J^W^nu`VXSJ29b@oQW>94kcT^-fsQHZEfv8+2e zkE)fwGr8-i@jxhdQ9Pda-rVFw&BevR0la}pTy7njx_vJJ9DxYLx-2}}QTD|m89#dB{od);G(U^*BH0m)(kCVei zPtev}Omq#u&JdQ_uu065Dt6?u@f!vj57t zzFfCa*4xduj<8rq{Csz{Eb~^AIyOtW>~Lo(0rzY@0R7qj44!4j=kCcw-S?x~ljkFjbArAyk1H7#u)71;d^R zUOX-1?0n<)kvMTRgp%e7eV}_sLUOduG^S_2ItLA!-d$>MzwVW8&0$T=?JpWw9nAft zNb(dzIwgC*nOJr&KrG+f9v2wzEWbb;Gpaf3aNl)fsjPS9f!pdJc}{2~;MX`YE*S^G z_TzQGgc9-u27PNBkxNC&M&ao|b`Sh?*WF#196>@Wm}5wnSZBT^15vOo9OwaL;+G0j{7klo5fG@Y&ZFaMYBg&irBOcCiQaDKCcaZ24iUgi!JFqp# z5(l>k>w}`U650s>#mX(;TIuJAh};CI`hsiR%aqg}L5Uo-)k`X?WJQfz3g2C{DWyd| zFxWv=?-N`u>S`JAx=dRkoPUmPYlGb?r7I|h+0QVg5;Q-Zs2UM>wpsweWRHO}! zK4fTqR*I7PQK)Qn>2g75g|gd*VER_s z+*bbVt@3+mJC0T+FJ(vjwV?0isf$itZkZl#5F4V+TI%usnSyTACfp93V8bX$Y0}j_p0#liA zeotlYpnkwJMdan@aI}y7h)Kdd178 z`S78<4J^y~O{qC_3s_T$%T1OuEUhpVnTc zXM(8r6})m9b3Z4I+JwIE{uzjp)X`M{gQajWWd_PXFR#oFc*ho2E#nMbvjTiT0jQ@~ zc1P4mb*M2q95&FJ8+vY)W#I|C4z*4>g>H`RKx@I(r6F%hme|0vL*1 z^@x!U0A6&^=cB!!aTvc-qpevuMdGqS|;5anUy$7b8*j83pnRqZO-sXJZ;p!ef%{dV2Coh!8o z&MVhz_HSvrm3Ybm!U+(VTdR>zp29a9*i)<1HZri z0(8>$o}%RT0sQ{OO81THcr0}aVtTiwelFZ(^f5$+{}U+FX=Vg~fA8h9sFt<;ApnOP zS^5%=tKP~=>X_gGie>;y8jEou`f&KiQN1NjNrQ>o$Q0)=UM}pze(B9}fqq$wpluUfr2|m~@R_WKc(hGEE=n;A;QUl6 z_*NIemPfK?nITMJ$U^PUy|mdcIz3K2-(;g|FgH&_S*Jl*EY5@kJlgNIL8%)(q?8Iy zmZEm^7FoZx^@kMkbW^DUslz?%VOW&L&paJ_J9cD~oErWrOCIRaC!y7#hk8@P4ijD2 z%wf2jiVKT~dX(@3$q^wEr$Bv`(H>WZMxfUslL1NbDEdq(59 zyFPQt>kq2Y-K3lN&65zTw|wgsE4%xZ#oqWUrDd;q=34+>GHDu>m}u#(Zmkyjo^zi+ zH0YO{TTE|pC?{2X*Yc>oGdjsadPstbB8;KRZop%!FNnDLyf63R?zmyqiNIJDqLF(m z3*c|c+2KeQ5}AZ zpjA^}He}I}TMn4{5__Se-g?luK;2gLt z-LPQ*Hs%8q#}^+PNs^=nUnBqa?KURc&U|EJilp^`^GE_wtWx}I?CNz_O`){n&tO^- zgTH3U|AsT+Mh~9hSsb`y0htASEj~cTBKShCAkRnR8kctgBU*yOHIke7I+~6bX<|S3 zGO!4%FOsBcCYD0J^y_X_Lzb0K?r=uLN$Xy@bRyI|u~~Dw?_CuM?#;EyCE>-3O+yu& zt~}^EuJW{qdlni&P%W==EzvnrFH1?BRnLBl8rE9HoaIaMG4gDi5$flQ;XD zi#PU?^K&30gk5NjU=nGkbx^{%IAQ~uBV5#N;f4+|m*R^1Rv%MZ*<|)+3u7?gc(2k! zSpdk-=hW82NdNKR?w>MR`RJf=|LZNUPK(aU^{g~wG+$i})oLWO;`}P|aM5UW_AYho zuo)P8vPi!D^|>40x-Mxtp-Wul9|splhi&J*|JS8v0S!B5!UeMO%v+=c0XS>`w}b(i z(48bCvW_T#Wq1ChAVlICFIv-87pmqphSi);)CkE<*0|7<=&N+qyCI02&hmz@BLgB2 z2?#wMK;x-^Ncm(SN87fY1mpE88G4`Wfpl z#CBo~T(IV1z1|eIl#|7-1T$gXm$hs{{*t9NNnl`x(CurLH5Se&4u%p`&3-rkOm$JW zbi*?4Cc19G{kb~rfe91RT2qla9(DPDKz!VwFC%e5>e=Qi?yX9A!(mIaS^F%7gEAm( zYtH3`ieWn|o&*Jp(8`4cwG5^Lx=&yefh}0Cc_#6Nhe{k|9zAN*fer#BmQ?6S2Bn+> z3UGZ>yB;pTwk34JJ04aL#gfr#1xqWbLyfPSGxmQ>&9%l?g{>aua}QN!MaY%aL*KMx zFnqRMw^2K<|AUXNTx25JH~9N|4Cim3qZdQ}r~-U)R1l-rAlX(e=o_>x`UIE7MMw|h zws_XXzM?*21ZjR`&1}<#y=r-A_N635K~{Fm6>jCx4ZxAr!Rk=VSiKe27H3hFK5Od|_T3ga z-JQzwbT7V9g2TlBFf*a)T!?)3Y2ZJ;2L6x7qwp`N1O%4D_eh-$Bs#7tBFIw`p=ltB|5Q~sbo9;QCCajTaGHHsxVU|rsIlG z_ghnM5r~qnBdS)c_g5!R?T2vIxQW__p!WP5n`_y1BsJ*7K|x9v3AzVNKlMz!m8U&- z)W?Z|eYi$IlJd{!HI}lbO-cIKy{qIZ`ew)$n}T{Cs&&|-6Vg{cvpqt|{?z+9P&9^LSp5LP%;Uv` zFqJ;%G1fK{)sIud=US4u@o42Et-}JDf4R3S@t`hy_Uex`4I%%B=Ki95)OSKH=8#@9 zN8Nbw+X;P*`%z3Q6N%)lJR73cyPttRDSSFo`xOUH&D+r3b1HN;uJQTFEA(N`w+dINm48o{AqF`dud{TFQ$`aDf1^B zwJ{LgU~L6il>b0q{htZErQJ3})Hy;00sEsp+Tko034OMhg>MM8Lc1qOH03VZG!&~| zgpfqXN6`m&C&soy$%_gnw zswCQ5maD$4J2@tENqp4$P7$iB0mq2iD-;aL+L0Vyq&Q{U^6K>ki}mq6%Vtsp*0n*E z@>bc$&ZaA_r;=usA-b^|_UR1V6@?4-CwqTQ71FpEW%jx(@!6ibC?AgnN5Fpq3@ghB zI6gI8&<~^_%t&^XzBmB@w6<=p7r$zdmQM7>Sd>ja0Yd|ezN`1E$F&N;MIY!^J{VkV zk`I=YOilC~-pP~JQVDWh+4Up!PF7#a>t;z`1n9wH5HX}tLx@6yg{i=P(rv#e1A(39 zKl;iwpGDV70!~S5o{{5?WHPsC=PGJ=L1ZJX`;Ni*nB#J>DyvW5Vb(v3mohqZ%It0Y zwoZl7H{ea$8i(Ob&ir2e<6RTWUnJog+YYLTHmzO`X9g2uTseyYZ4oJ`dN1*t&jwR( zf(-_nmzk^tP+nJZruvu42Q2K}QmcnUJNeSOJs&mvH`CLlS16=+6?eY-u9YY{a74As zA-o?+8Ge)TC-yOKkG&(e)H!KY-PxXRNez!q#``;Xr~RSHz6ki>=uu-EdE7~?>1I~d z^8?qN@w}}`-7~~7bV<76f=6S*{oZ4O7woi*!)Wo3{M3A%IKF$VPyjx!dfNdv9h83i zXcOVtrFM3rDNcz8YBr1{y4C7u=L%bTKrH^sbTI1cTNb5f|2OXTlCt0Rt;R)L@2x&c zb`7QdLL>FJ4@cIVl2MteUQMn0&j`C#RZ0Lun(tRUF<1Rc9U9aUJ|RS7yQM`{PJYvI zOKY7WQ_>RfGyjv$O`tB%E++nO;M^>vY=w@sL*4#L%sBLC;J{V4{o@r!m$kl{`0aww zx6UiM*&X88?l>@GV6SYiO&yBV!qz*w@yWwfEx=5k-1+!v^p4bDtNyjz=n{Z8iJh$T z;oFlQ5?XBVsl!%RfIESsp|OmKpp#?@hP$l{|4~$$ufWKFDyTxc1cQZgf%@%H)hT9r zWrha1FOEBQs&;?$MsqDm07#2gRSo9BM&e@n-%com(U>i!7*kMubLefdKpRa!M=l_!D=*HHQJkDc{cCg^k*iRKiWz;IBU@ z?VG$%@_#zj0Bwzy%zIk!g-{ezNhEw;q5#_TdDFpmB(uesVrO@7>hoUu|1lvS=sEmZ z)(?X&LiEjRIt zGonpR_iR%8pZ18(0kA?+US7Tw)5)v;Ah3S^-Txn=Oj)FyntF^7>D*>z>X<_uCK);_ z|33T*c;ns5b@QHN;;3ecJSYfB9?O$e(-l%jVQa266BtxcfNE2%SDYY9@e;x~c%(R` zX`zD8aTx#_{-;eJ6&J^egu31*7^zpF?=XTaso604t)Je6G);4gvf{~p;joZjU_VDg zGU(%9+r99HyFo-!)4M@%D?Q!)OB%%$b!YPwmr4KyYxW_~TuI>@?LCb4rG!MKGv$HT zm0AA~Dc4fie0Aqqeq`rd(2^9?PE)>$oKm2){xSZmt`tmjynW5{m($@cO30EatYD%l zu~N=KZV z=t_sZE<}>G;KT$NqoL>UyVgV}b>f*hhIXAB-Dc4&eiVWAfOh=N8{fH3FIwEY*4t%m zg)`1h_W}Ig(@dN+gV;cw*G|B7=3tY=*om?h#f=dl1o$;VUYX*V*mi(8ew(SpJXOGXY8P5or+%l<(W%p;( zY(TG_f&}c7cy?ReB4f!iY1f>-HD>K%E|ViN(O!SjRD3|&w*@(@oii%1XADD** zb{Rw~jCQby*QyeGA0T|?tTP4AN**3j+_sh`oopF%*XD@1-)V9IC7R<%$q&3_%t_q85S`nQg=IMa>ojA|T%Z^qkg*#n zh|kVGk$3!dXf=@LC;s=NCBO$FN!8KN16Edfdyq+>3a!*b!sIgujjgrL5-3 z9tVxz!Y$|N&sXMCOr{(fNvjLEyyS{8jQ~Fd0u&Y^^x19I_0YVVHhS=IUD6||V_XyA z9%?AC2*sdltJM6C`3@J18lw~$Ptuc}J2-IgzqbW| zFN=_GvLuZR5MLBAeUgMgLIVG#^KVT5zQQYrrvR`eKDy-hYl^N0#fS|{3P7d*3+)HI z@z|)gNOz8Va4a)i2!n^`%~p({;~bJiIuh2!Rlp-Lz*(0u{jXoow#%G;xzpRVMc5}! zucf>F{w?dZI}-%nN3(ZwWG9=3gC*Yl&k}F4O$$wb=sR>>Xmv)z*~bRjteckNV2;tR z@%zfDr{y}%|5XVHzD~-3y27j_T-nYP*L>*>r$m?1x-nz zSZygtz?=V2(#q*_cz1p~9HMIrG3}@L&WK+(<#<)6)B&%T)fLa?fq#gr(@M%4n$4ISIQSmH? z5k>GD3do&)@aPrNg@WW*oU7el*R~(b)9YmfjWIU$`BWl4nPyMmc$-T-fh_=>)9?1- zCewRd(RYrzi`b(!PeE7!a`NZXkP7>s@5pgEE56yh%wF2EiUiVbnlBr;ZRgxNCI#%Z zm?`&8P4&S0k@V6|lZ>*rn7AtyArSC!iA;^D(rHJKsw^oYNk|ItWWZ1XcvZ-bL|>|0 zR1;k6HhGTg$)P$sFdtsVYHOMgx?>z*`~au|z*VcyX&L(JHlV*$bDx61|BMuXL6Ey7 ze7sl0{v(*Zg{>IXZhMdh3`l0rpC{wUsJlc75>v!F*YZ|C<8(Odkm$cnS*GX=1y6_Q zIw7IjST_y&0Tim65mLAD|01lbwV%-4rsg)jw?sjIr(h!4QuR9aA+idLA-99asn`t{ zUJ*s-=@rC~Ckb~h=M`15eiHX69HXG&Z(d^nUAq=z1X5zJOJH%7Z?0k_Lp3{mAl-@= zcDm}*n;JGS?FrhaejI9GcnfqIx=KctH$B$LGnI>h`Tq!vOV~AX{QFcO)%YG{hJU?x zDR|Njcw9o2-B{;jVf+6VN}c!zrM4aY>v!UO0%hB})R5id!`A=B*;~g&)wb=w*exn5 z0s<-}NJy82sPq7ef|4rIB{1X=HU=RrEe#?dodX8aJ#pYL+dmIC|ckg8X73y7uKbduOKeP5@%6hZzyrRTj4-+uw_VAb$ z#Rqq_xlS!A9gxK+Q8&<*i zCTNMqQX>5KO~k_me&3^E@XUd;-VR+)LqB8pm@HXH-W;ffgVc<$-@Rfhtip2g8k=f* z`wPmU=d2=#7;vl}E0GYoNiskCjK!7WYc~3y&G`SDMtKF3eA&3+Z1#%XEKMJ=GrHpD z@SB5M4f+eVJSyQv4?9zhRjE`xwhWcJ0kmZd_xey*1k+1Fu@3s=zg?R@w|IHayYpZ? z1)<@Vd|9EO=q?INVqoXyE?oA1z+&t;tHZY%X08OJrUrMaZm*7h4t!5i#tMc~lE|j5 zg%$9zvd^rQ^}3Ad$NT`>2i)9agPCBLYjyeho;Sth~5TAC>Y@mZha}$YLVT| zx@;pcG-?JH#8?aK#(OsMYM@2WX3z#z5R{NQ?yK3_Bl)CWOWFN+`5275eg4L2*zHdJ z-JeB%F}n*qjZ2i={BXF~Q zSR4C;Dqi3Egm`1w6sY;Etj#_VvOoPdQ76Mv9jSVaDC}y#Ii_`4Caaa-{qXVapc< zXDBG?krp<>9EeWWW^c1xA)f!pmR&UV=z!)f`T4XGX|R1bE`(LvY@N;`82P0iC% zI$3wY>S^SIRV1%zrrk5(IBeNt1oIVm`GDA35tJH_pedW>-lwJN$bcg+wWVs*z{DIW z?(+oHI_!#Szy>{nv`P-d#@OJN?I)VP1@9JHAmZwsn-;za7Ty9MKTn!gt^nedu?KV+ z=B#>tpY1zkk2w~0j!)~)QzT;kte3yK@4j26nk-33OjOXwSH73+p!;>DeP6{ZRJb9r zO|$1jU8H!&wC7=(hf7Dtqiz~xl&M6yjM3Oln}gkJ;n`vOmD~EOq$wUQt(-3`r-)&# zXC~!?3Kyi_!$9EU7I;bf`VgG2P%sdgw4NW)-+WjT%&Bd(R4T9|-*%C9t-42G5GTP8 zLi^c=N*sqLI#mC_5k7p-1D4pvtMP}It$3YHSJ5<%J&g#VW7|dLZ>(}I-`GblfTPpx z2<*B4!*7s9lYwQ`6|)aykic~L^JyUq;sa;h?&R4-$8rDc zA5fejhdJ1vX_mlG60ef)xcvKp_K<`NDo--a+uZsh%#F{3Q2{E8f1Q9~j$9c-!0g%6 zA326fdZA+7$7;eRJ6b|AJ4_<xwwO`tC5>{q;`#T}(5@d7xixZ?H1AuQof}rtKoB#@%EPgwFSxxQZPYjCt`j59+@gLL z(UZ;8%U?M|IyF~6K*08VU#g4rm9pk zPo*jOknd!&8vm|hCZ|`XylJ-Wh|^F+B6?ONz3LPQgMW$5-xwzN zK2dV+h4)$H63;QzAsS)2p%AKB*a5izUf{Axgk*#E1Ezfx{nrqJpxx=mt>^oTetqN~ zN@j9L$7tuhomte>+mZ{FDK}-?!gvXNCXT*&GROMmVqk0e(xC<<7&*CA)e z)^uD?jvs(h0uY~drga&Z-ESkLF}JzU_;^><2IwIu9XHpv>bF>eL08C{;#8J5tx#ZZ zuMX}W<)CQLga*8X|FF)Fc+&UDs~NjXj$Y(i?Pt_;g#s@PHz{i(vlX5kFtrIMxM4$FXiHbEA4v~&ioQT%$3m<=oP%LkP@GTsN6uneU$_f56At3+=eB zn$*)?^t|2NKIb4kO{#2?BW@WlKG(RPi3nXMsLt`oY9YxRD)H`Q*uL$|>5xe^T^G}zx)2hxEZ zv&`lSkA#^z2w_lc@|Ld`9)6b-wC?X+Cy`Ainm!(2^izM=6AHi!Jyw=#g5iZMNyhU8wAJUa?7PP0y138ea;jc$BSFLM=(b%Q@r*7L)&$k zNMYI4>ufrS9>cGA>h`~D&AGkuxcLHZ*{4bb>x3Sxz^RJ&5oPXO_Hh47D;YKc=IE5^ zetMT0E}kY+8nGO6>YROV2!bi*Of%hg?vK4UQhZt^%A`&dp7+sT|9*BK9sYUM#3HRDJEmio>1rU-FL{q%GsDu7-In3N3` zJM^Z;n?czR!96g!R1r+pD=SXaD`&c>#SR=4*Dmz zrP%OsylC3Df^!S4I8|H>?_qir@8qXc<({`x*YX{OW~!EvLG~OntGszvFBcpDD-VZd z?OXwkmjKwnvCcudYvXzyLZ3SZoSvKW9mcX+7caKYuid38uh>tX@p|b~mZ5#WPhUvkhcP3-lbEcMH_|dAv=pew&?t;agfz2x{s;D?)vgW=%l3oT53ql)|}WM0#neIU}?IV=k~Jz$x72)A1)lPqs@DqWa(C3ZU)c08VMqGVxY%x0JaMJ>Ip><1?i7&fg4*gt3TU1u*) zbK>KO60_jE^5+q<_`>qLt&G?=T~nK}|3i1*Ol18GePeB`8=)wF8~^tlrAbIrD<^$`Y(?wx9G0;OOOFNu6bxg(p_@a_6ZQNCzqDvsgYLe9-lketx9R ztDfxdb7k<4)b&TK!al$L=__)7eqp>fXEw)AT$yw|EMeF_ZOYKeu`zTaP;&*Y~CzngOt&^zSl{cDJiV({qaFx_QEikCUu=;!Qu$3v&N1u)mGM{9zN^z&8d zfy_bink6z%M=m?g3~grHCc;(kl~@3JySi~iou{lnBEHDWvG#yqw`C;hrZ{-ep|)NM z+vWcJZnL@VkVKhKrPyemUI4A*?j%xbg*-t&fn=9_(*#Z>!fP3MmV%fJP&6T!XE5|x zDvZ!32?k>mJT%EinD^=`4#9~x-tgV&y!fTIa0sGJIvQ}}Yn_?H^Ig=@;B33uwD>3j1O6iP{+UrG@D)m4SJ9V7 zE2g!l;p!u*U@HJ#m|B6L8!LH9GL*Qsug*;mXZM~}49nUmPIhJIz!C&`MJ+ln^Sk{R zs}G-vmKH$M$_4djC3NxoqMhc1GA>h`TiWiLz0}5ygLRJ=cP4wUL7Rw;&Sj5ML|Thm zd2?6R8ie&@Vy#niKYqSLg_6a?d&HwcUSbIKH8p%4Nv!QT!xt}%=NvIfssPC5hphXH zuN{rBOrW(2$rf`A9;>hQm)1K8Q`3WaiH%5aaOLe4#HWg$>{OU+i^CaQxx~TY553OI z9i{1_QDGX+U#~+O$eaZq7g_`Da=tf=%zHOtnqSo-zH0x2pjAcqfh8@Bmo_pNiVzY4 zsZJRW;u?_5_42PC(?#^a(#opI6QVZj%}q)p*e)`h1fM=uh(7Oz zsZ>AMC*|12pap0Z`X)q4c@;M87(yr?cn_el{CC5@sMBH$)kTfCA3oV~(!dWVD24Vu zX-Vg_;Vm2wY$fHsrI}EE4=rmHNPn^Cld*>;gZ^V{U{ z?#+C3*DaVbnkkiB@?VlV1*>Aj_^A`u0HT-RQMTD~p-P@nmBsDss=;H#h(I+I#A?5u z9a#Du{$GT(pAlCnqkv6f1cp@t88iWoo*AezT0kn_Vc~0!FP=)iJ?KM zD<+8&OG)%k?GGk{x4!3ubqoFr^g;m@DcbQUKYhF^B`J#bcY|yTn_4odf0)gu);QXF z|Gj-ZIX2J7Gpc31X{&*K^DIwWG?GT#-h$@{oxtIHz8^PKW%7hYN%;ruQIpoAo7jO) z)z`)`4f$*VlJZCWSly0kF-xr~g>VLEIA%%ux9CwxO{_fs$WtAYuHY~E6z3xY=%}p`K>jyvC*_VMq&L~Esz>Zei)q@JmbUujLSn3ao zoT$58UAF$SmHk+lkBJB3#+1A9QgL;nxEfaObR2_o^`8}I^oU@ zT?mUFoZ6O-s{qaiPk_idpDj!mQgB@T4&M>FL3iTfo8#o-kuT6DL*v-4?B^P%dl}}tugwdSdYSay7K0ETeXtB(z=vK8{a)${ zQSECE#}*u7AB8_7{FZJ65N(v5mmh?RTSuK0dHgl_YjfUAsBK%2X0>1kK;UZ%Sll8= zqtKrp?d^B7NXh5ATObY61U9fxCUCKX0on!bAt=kjTZ-?4I6i1xsstpc?1t$_npUEb>!{)lpuVyHaJxf?IP~_?L!`Q}E z)&yi(+`cN#pRcUIyZuY2p(CKcs9W|B(B=Fb;yblSVZ@$+AXUxjU}DTRvlqEN8lDRr z`D=mOzKLL*7ZyR^;SsEE&q`CB+_YiYH~rGONR6ByvQGowFWC)h&yRZ}L~LXb=^Wsm zC|7U=F0U=r@?;ybE z!k(-anX_*R*i0Yn%_Mbl4mSChp(-FHK%lukc^Ee9a#%iQCH@&(7$#bb0CCp_W z6URdrm%`^Ky@XMs{ep8wtw0*D7EUxbv3K$retl1 z>qV)xE-pkPsXaM6c{8LonYW|5m{4k<^qv#2@K&=6H#K!0DD9l-E7nA;l&8^)LwV4G zr`jcajix~khYfE7Yk{?}+iB*j%FClX zsNp)q2(I*AnOHK3XzG6SN9su^W2xw8=ws{{&F81#SYpBM|C6^z#H|8vStoe{pVsr? z`f>kSQ2*2e+)U4ipac(XL*%6e(DNgddg$a!6sCcHk!qLs%Zl=7s$$qY2?)IFTyTzL z4_9{T#_dptx)o9xnF|4}x%tl3ssIO7urEVUFs|Wxp51&BuveZQpnW)8oUS2Yg)tA&G+lSjl0w^MR6I z6(ZzrUHCNKp{YTdOM4vH&3f+L<+p3rSfob zGy88SIRL_^NjHZld8}9DMm7ghvoH7-~qkr&|jT2`+vm>H1~KY1B@TqvHd!bgw>gs0R; zs)KWKDwedDTb#x1&m>hSP-D?qrGUlb+vbbaw7b~+q29rQPa~rEH5FmKw<;GcwL&?Y zlVFGz+c^{Iu=#aIOA%_3r_Kem8Hknzk*DB0GJLsCi6$vgV{VV}M>}UkgF=FDajudh z=nh+C;#JIy_cqeo^NjC5klvhg;pQ502FcsOCK>-dCQm2}DBUvQ^?eE=GG1;1#@n9} zc6!I7B%hgt2hU&a=!oyhoi>CUsTWWq^@`$2c^p5NiRvvfNpB0KH&m_$dV73vb$Va% zXp55Pmainm5ueOPAK5?N+m9dzgM*ukI{!f4clK}pt^lZ~0yP~BbzvS3Z~{0+zKO{r zBg8M??#XWyVasytj4>UU5o>Z?aP$@Du-aWy#ZUp4Ts!PmY%I^K$( zI|~&+2*3%Tz<;mbtC7o2sj$i%^@-W-?ZHE%P(>7$xlMFSinaCpnzqcr2r-t5LO#%D}&KApFi!(gcn`&ogWp~+|DNEl!9NL2Qtq~^(E z`Q1?p8418B`+8^}lq@VVEtQt>su#V83OaWXG5V2{|1IG>aOaoz z-k8d;R)pXTbg0n=JF=S4=XnO4L=R!`~pkr+kPY#qiM zSd>ECA1Qsu4DopIdn6@(aWa`M&<%(=O__!_=R02Tv%HX1F!)=#0-_#~;WDA)+Me zop~kWR*5V1Qinm3_nl~|+}sJNhjNXi_tO@3DvKo@!DjS$en8t9-G1F*NJ0`2)*>Cd zt>0InRb(WhUGx^$C!ICKVwJK(#nLpatgODizjr$kH@pEOm{D*G@*OI|?{tFx6TGBL zz^g*<7ppFsu9y94sq8X3ECZq|IIYRW-`Mn!GR}N?!VzXa$q54Q&k$W3LxnS3KdDE` zt{!_F>}^PuZg-LHxnzWGB@`VZC(kMbB zq?iC0F^8oe_vNaaDa1OVCwqSe-%dPKFhLF#Yo?dH-{_|g+IAm(BlH&7>d6O zjgmio>Q3pH!zdx}-zds9@-y(n9l-bJrmk@qAfgi4 zTCJ5l)amx>{M}bwP#oklJ1I{1s?fz^{DK2MLLkzAX+3iRrYOj zP66i@u_Q${_PIvh?9lf>t?9pBl7f@wjH=wqL=~g%>iG{SI^in7_Cv4a1=rOpEen06 zZkUd7tx6wy7A(;v8DHd>>rDieLt589rR53AuSf{bzMeU%N=x>kn~=j}7e#c160jp! zqu}xH``H887~ieG>D!9QHm(h}?2&LQb)4zv0$_$8a98r;v*1pJGHy7LMuXFARYJIp z=$7IJ=W)?}4}~_)PTwVaEsQS`Tu_RNZ;3RIqe@8qoZ2V4K_xXBm!K5yNGQ!K*Vc1h z^q!w$37cUf57Z}=Y0Ax%Au?GCiiegR>AFUVVfR6}P9>{nO`E;S`<7d^`4O8E?? zcMzesw9tlQGZ6J1AcF=v^L@Xam{V!Y*CSbtYg0+)%E9!fR)t@p5@NUcut7zCoM!HpI2u*OzUyUFHF1I~i8D9TwAZ60+LJ z4&)De7CfaSEjFjYQ*EKJXqT?!@lOpG0;$sG#Cxnwn5T1f6A%vHh$? zgZ7tZ$(ZTxP##2Z2RRZdP58kQSbG}}vA*AMr2hU*7U*{#jB5XYKs`zcG)kBIb7Z@Dsi9>iXXpb)i4AzhiT`mtpK zV;Ato?JA4r4ABvjNt7Tt%C2oaPHI2$tOtyiu#GcZK$I7()N2RWs{*j*L!-E~R`%>c zd;!R42p$b=zlWMjU+S|KJ8B-YEBIk~6e?Fves_Jiu<+XO0IYcO^df3Phk3!;+jTAe z>c-xsi*rbxM|RnW|HSwahxTln%_BUbqk-xpB)AacNZcJ+edm|Gq#lJVi!R%RNR{!W zXmXvP`k=)6uMPi&uZ)HhP4DU)^#txWy*$q5>UyLMUC_lSe!9;ZvNqr)B3kJif*P0I zM?UC{qt!H(hyr)TN~xvijfYL;z7F$bBkOhLN=aKm zX7ZQz12JDgG4dqjg#BVcQknE`UvH_j0oB|+Huz`Hg+j|t?M=WmjYG9s=<2dTLQwgI zHSekth??j(btUz!7jDpu5B$D>k~XopX4#YHVMxvq=DN51bSihamW+wyR&`sSQ_R*R zJCo?u)2CSc*5_XFH&~c2MSrg1$7CSUVF;Ko=aHTz#qW4%&ss0(TlAVN>E$C-Wbkzh zC>Utn2kSyFXyPuf2T1HA?c{s2*aOHhHZB;NbZB z-b{X`%R9clL*E>PCYK>;R${*4v*RPY|Ie$@bb6hCPrF;q^VxesGVsf&eiKjm%f^ox zbBr#miAHctY>mCC(cR&lgpB>UmEj}cSPtZl6bl=M!m$=PA?M>g@>@h68B+>*yHikD zi{(2q;@g;NIk`VaUU()UT=E4((n9ptfC1%)Ygj175{6LM5yV9%>_ zQBcgtS3}=!E{NVx1~h_!k_yzAq9668L~prX7qaZX&?vbmTxey{g+{;KmW2G{V8(nQ zsU!ZvD~k8aFqC<%0}bMxFF(CIQjHWfI)HmQerJg^dY?D z_d;urvc>OMM(MmiQq0utr)vFdGwg2UTQebA;L_y7sj~i+`*_)CrJylTj4dv zrPZgvI!`aI;IFA{1ZwB>O*CS{Vz^TPzQ@1s@rxZkRYA*(7uL6iN_K42OY#t?vVCRy z-)5EJ3YFNhJ>_BLpFV!JN67l~ty?zD-@y_UZ)1?H=}TVW^_NiKz}_kPd=F&IGI!2O z+Li-r{ernaS4c>z^h3B8=N=kI_x+qEZ<36`V72ckL!hRf zd-d6T>yQUaPr{9(H;N_R)@2#ijv@kP9>Qu6qBqYwSv{SDQ{i7jf=Myg$03w6Yo(T} z15& zaU}%>zleRCCb9;|c9ADgBFE@fw;m}aB^o5_{6YXM5TnSdj(Bo{UnCy*dA8@b$IOS+ zdWLF(Kj8bYHqn^DJvg=J6TLQ-Jatfs6hpJ?ednvAWw#OFIs|4~o>+U`pi5N|e*B9R zcEt#}l=q$R+k9Ok7?%+!xvPQy$buiJF&ZbL+bY(TxY?&(?k`x`Ah6YfbEU?bP$+IO zB$xEGcr>`DhU%?y$T(NPY_TRXc>VI=hy42WK@hyww>ly6DEH1a9q_rxqXXR6!~+Tn zR+5AlbiAJV(7OL|3I7Sq{i@_sBPgcG)>^SY>IEX!yN!--P*+6>9$5&hqk)n#(MC^B zM}&B{mMG3P80Wp>HGfs)$Ye(d_2x?1=$q*1&FRxCjUHp&*0rB?^Ys{3aZG$hL=*nB za34uJG2(?au96{0N(w{*d6d;1K-9|LrhNv{)a_bb3_t|CNZ5dS<8@&a8^yU&yb0rY zVQ026&w>u~%CJg@R1qAV5lAi~z~xILiXNbN!bT4?{hn)@``*TfvwECn$ldeWF)1)G ztCH8ghbzB|NUiT58!MxI%SdxmC0P)SH%xYWxG5Rdg?Cl`?F=s9l94DbW3CQ z_ln-0O&VRCamL8mixL)L9OiODCwSUxu5IjPCu0(ec;VRzGC5&fC#YGSG}TeNz@r>O zXSEr6xail;Yo(3Fv+Exl_heX4wR>jE`BCrs7sijAy@++0 zqr($w>%$E834Y;^0W_gQ)&WMv z3hMZ{Iq@UfS@4JZm-e)-OMM#Amn*-Ok^~JNJk`lY`A*iRN;3JIX(bPwyMx0O?{U=b^Knb6tevfgx(qe3G8`ARt`=%d%I7u)^DEhzjs+u!Tf8 z4jo-(58=P9cijM+j?MhCWafpJx-7Sf4AUj84n6O5`MMtZRm!o1d3?Zdbe<6Fp9_c1 zM#q@EJwKNkwI#_?dt5aYY^o<-Z|W=_TBJKU9hG7QA*>V(j&K~s>}EbXQ~mkfWiklw zN3nLt!R~oI2-z{*+6AXel8X z>GicoZHn29!n3Ed9kU$?{U1Brk?bG(w?g|Tuk;o*fT?i~yV7mWYRU_f21|vja$Yc6LjmPh>Yg7P0PFKv`V$V!Mga)_-Dxfhg};m{u%9F}{#4b>@Xv6Vz8tr+ zL|HD6R9ACwwe(av_bcfbfG}hsY8@%a@!M%-$qGFNMe$Wm-Mm)x&_WU9Bq@>IH*^R7 z(diOUNT;s?L_{}vCyVmhz|$Ws^=v6rH4|6y^JZUPhf(o4kLgv5s=0Iu+-djmVr4(M zN@%!y_kNNa4nMdqd&rc}EM{{vLB65tG+#BB^X+Tfel#TSB&LB5qzS-jic~x0t){@} zx#Vzo5lby#KIfJKXy=XFH1NlTx&d2=#<#C(A|o%oe0c+*q}CCS!m6J?;3RkRrXM0j z5cr*<#6!>UI644P7#-)p$Hf)Fb6_C06DZPl3aYB`cRdM!oz#DxoxO|p6-+32UT(UVrZiN$CqM?1uyg0}!nSv@{^~nrp&7dRjZFLAP!K zi_8rx((37ik<_Y^>*6A&-{r(*Om@8xV%USRVqP1&Ld^rmy3kG2AJox3`*&2I@3bf6 z9+9>%d6+P=SND0+{8-fQH&0lD5>LHQSuU6h9kT4pGdT4orNzT8i$7NzADuGuLiGy5 z@2Bwp{&d$`T~uL7t;wFdNkvsiusECrvK+0u>@p$t3XH7XgQ+%J23@r$8^LGrKF-#g z;3EBeol235nQbJ;V$tvxrFhZ!*PG5LIjSJ7{Eg%dVf9Dop0~|X$y;${%%^0(+%Zur zdkUdoPTn{gnWTjqG?7C-i>jb+pqXkv8%(n#LOf|R%h%JM&*TiPjv2PP&0NbOp0=D) z9o<^|)noDBt~M^9ia!-i=1LjeRJrJ)l`A(;(4F{IRl8=W(gHY%>q| zW`TWg>qox6k#APaF$(Qh@E6#P>8ITD@1ODaOUXP8eY zFu)bdA1j)e0It|H+sD8`65jQ+*JC<(ppFUm1euydDR**l{ z&r3*-?a?c^v$7J}ukJ%#en5trUgG;YZWP+r0&5_w3dNSa@}>>jn7&5{lZeeXn$gP6 zfSBN}H6*XLj_u{0;Cu6j%8|KBrxc*D7-Q67;Nuy9gPS&hC-U# z-Hu-Lh75SIxuCAi#f~va%bQvQ`yM`k8iAeWB=gmP=Ie@9Cg%gDT_gr?tIS`{)fV~R z%5hoDIL~&I;_H>)erNu#M(M|6&lva~z3vhR=_a@-#GEHXjq5VwlE0|+M~hdU&9`b( zq!r?%s~)-m?L#nJGXL95Jb|$D1}av6+;|sXZ@S)p{hFM-H!Z&`q9Q;P6x%Mqqi*c( zl;oPuUp64uA_M)s`8FT=L@M1cE>9Nv zF{EWOo9~q+sjC@EFGyfuLh{%-d=0*s-xBBL*7q|`SFkh(tBTJ?1qM|7t8QbW#!3K& z&dY%j;KZHWjYjaF$&H4Y?lXMFVD|mu-3uwFf5HVqNRJHI2tKXGWuOBayIVpYS?VnD zB|ZDKM1l5~1W z&)RoHAQf7G$I3fX>q3xHjX>2p9W5(RNxfIJ-<&*qUF4&wxc zuISX+Y7=Ua7tbK}2V5WRMS_@wp2@65S2R&=CCA3*!t7*!7%}B2kozn3v8t89H^sht2d8@fVr(iWd+xs4V&ox>Kf6xE% zJSYz*&k>V&(UbQ#3E0;W5Wg7mhI4OYrbS^>OB+vD(=hg_YnNfwr5W97X5DNGw=HNUSM%KZ@p|7?HGK6_kyuHhE)p6~E`YNLjpi461iEYeH z5I9=7bGtg&$}(98YXzi{1JyA_59|_=S<`JD`oh(WyOZo+f=u9(z$r*F4S?ee*g762 zJv7TdSxwU=!z##i$(IexS(0tDJIUrX9Yy%EZ-P~t-Ii( zooAVy@H+`R$GSPDhdVR~eJ3QB8)?{~yXS#qTHiWar*}L8@dw(pIPH+%3kC3_qQG9Y zB5w=k(7clmCWuyT-z<3n!lj}d(-0nItoxp$bH(Un^*rthQ*Xw4Bo`d(@nTA^f~wIxDG?Dv`}R_C@cZ@RiIXZ=kq zy8LZJ%|~;V`cPqCe8G<gWPr2x+d5pQ1Fs zd2=-C@@niC(7B0v{Ce_*Xa8%)mGz7cf4OGp<=zsq=;lOHX2E?V(DwfP zwYvU6kmU1`Oiej8gDQNk-ylLlUzgXcvujP{K9fBQDd_cJHEnCo3xU7MH6ZmTqt5AVchdw9X#Y*n^++Ib@_pBZbY)bEix zfwVEJQtHx;Ye^~_4F6@qJd>m1wfv9u(~X)y!^ZwS0g3=7zwjW#gm$KF>T#lfw%O3#eV0D)edm z2hQ1ouIhWMp`g#-+_I^3$Sn&p?E@DNmu>lvYWYZaq#{pW+&@#-DamvVN&1^z0BpfI z^)k6?g(%Ytj;i>@BdFA2TXXpL0!;T|W$Ej4kQ!6xwy{b$;TY(VT zPHM{S$hoWkADmul54Hm$F^$u`nQ_di7{`Sb&}{~Oz8hs+bG#Q4?}I9*o<^KiA6ue} zM}&_S1Fj3+TyyE5hP+Ig@c+q(@NqT0V`hV>hJlBw6Y#*KE@I#(AXF~$EO@iUj+d)t z-0;qj+J3tKl60Y4^jE_tEFs&rQt>;(SISB<->mCXNz|)fIY+)09u?GsJSo0WNc>Tu z^KKvBLiJ)5$ZLW}X?^coYHSBc+2fqddk0kr+TKBWAudvv^38!Af#gS(Lck0{6<|gT ztB~z?;XBbPlgi2|iRv1CA%r4i8lhj>Ci2S|inZ#>kxVRR*E4!X`xOi&RD0c@FU|IC zNo)ay6PzB}x2?MW>b3eePKtwT0AJ+}hCU-V#-D;T5q2n!ftc=ZLvJP^bCLL={|JSD zbk7#*F%$kHMilyfysbBPigj0}WaBYscba0}w&Vq|MXxKZtV+NKY{+%(G7PzKWtAfo zUv~;dG-c0K-ax85mUXL5$@IMC1JnD8@!x(-M(9>(Q*%Zq^7cacle808?0g7UyyLYz z^o{tZk|xepiRA{Do?~Q}{63aVFX2#ESD*ThFP+2f+v5|GF=xq3AG(CW-aLK2CCA1< z)MiM0jXeiR61+Dor>|VVx=R?#YQIW>WffErI0M`5*V>$zyB%>zy%-O39e%9C7m^8& z^}xn}qfy#PU2|EwJ&`X|FBS<|f+t8}`7Z4~@5-mwJRv#?%c_}i&tNFcrek@ZIFDXG zQF5ju-?z|uann$j``p~+Keg0#u@*VJNp!WS=)60Az()4yIkhrL?C7UU>B%`~nEsU> zH5lgQwRFG4s5M#fjXWe}Ayt*H-@om$w(k@Q^g3QgkmVtS^)cCLws8I)=P~&K%UnO* z4&^!2Y5_L85IgLAPXMAx8(KF=s=y0Bmf5+bp#v1J zCH{UTP9XVt3#zLkxNG7H-q}THKggA;BIZIILKmcYJKs{4(-euUgwl<>h13soxnKnH zeAb*!CP^jI#C$H!l1tyBQ!VNwuFDwRP6>Grwu9Z|lM2xze&XVqlku%@qKonY#{E3| zVvv+^W+7y=b)R6~X`D&A|85BH+`cE}StLQtqcIiYnRp;Us>adg>S;GhRcieb&_lAi z7kw>0NTMqjy!XxW+YRGp*S?IqQJU^3u|pyka*8W`dCFK9Y3+v;);~4eJABumW+=w* z&7Uf1slRr+|8@qEJwK9n$V1GYX9c6SEu-G-hsHdU?77_<+dklTuGakV*o23_x3s%y)iDBW?y!N5@9?x8K*Fvj1o2nw(01-TZiO2X<-*v_gQ*@-LiOm1c3#DU_Gg{4E{wfMBdxvbSeVLGV)pKdWC!{; zvFh*7I|xM4Y8nf@l5ba;7c)*Xr9Ym)w1ghpBaF}6AmCIxK43d6y9=(qedntf-j2^> zwuOws0O(xTLZqnWfuTO|JJpvW>D-KzX0DI`MZF0rAT|E`A@AcFt@Tha_p^L3#%EVy zAeX%*#f};xq1AB3DSvqJMmHrk2InVN+Fzbtl+(^wLt21ee#P1~nhZUh#5I1nvBy-$ zH|l73tL&1Jhk)`w0;8k~AADZ7>qaLQCC4IJjHmh`qB7h$ZgCk#x(|5kE}F8;Je#(_ zJ^o_c$e>;kxO0#fO9w`-?L6thL`U3F@$QRt80$6>`^-BDHVi@*A5PLsassjE`gb-( zzY-E3R{P^)0v32$oEag0zu)*csLXa{hX6H1uYU*6U5SUF8kt{ga8=DG(@VMQly>De zqL)>mtel?ymOkUb(YcWLr@fK$Q;5fVn52CMU|I zcb3^Pr$BWQdZHl?mOTox#fP=E?m@Ov%k_c08U4_BPfdLN05ccL{V^c=8C^$v`DtsP zwNMws5A;|cJ2G=qXik_^^KoHs&38)b0OA|zg7`*C%wnLgW;)^}`1oC8k4gecf2_hA zCP(y=y(OID<{Rg(q&+hE@l@!72@6Utiv6#>6Rh>N;Etrd<|b>_7px-IY$GNnN+@Yq z3$`RUl2! zWNoMxZm5_I$;qK+xV+X88Gfj;{RV0M%=v*# z137-(*GIh_Paj3W2#qq3f&Zm}i3>e4PCa>Ynp?lMeJ0^eMH;{twgE^wkSIFyB`y+; zHZzEPc{OSJrMP!ThP&WRaHw3eR&$&@4&s#jkA$M`19y|wJEEHP+CSY<65Wc)Zh1q+ z`hi9o;tjJ~)6|83MS4TB5df3n02gqCPB^H8ZQWG-DYw$E#k|v&C6eQx?VdTTI?PU~ z(D#5x`bdgg#0zjU$}{{sdyw$PE8N4yZUrM>wiU&kwaB6N0GEhj?TT|1=YFLKd&Gu$ z5_{xq8R%4(=&YOBpO$uK{%9pUZ$kmNP9B1}7W*;VX;&<;KIR;sP!{g?Ypm^vcNlBE z$?`4O@!S@73SnNHI1P=Y{iHZTowt~XxHga-A1GnX0fwAN-GC4Rku#+hBp{(bg%O)y zPPT)1Ysy7m58|B~3$eRgWcOgIrUDHE>}(&InuZEpJolcpd^M!P>XvDQYtnb1TZnF1 zbhoyxc;9PsCXM=Eq$Ro1G);`@ZznQ!6x+{mbokJyr<|9#-7*g3g}}W>Xm{(5e>cye z>MJHR@Xh@uh=9=naXTVXGDPV2lUo0~psBdSX=>`)AWa=prCR8RL1zQffVSear6a^| zxwdltlKr0Kb@aJrvBPM%gjqi@fKk>LPe>Yyb&G64gPEE|xYAtDEAMUr+aavi$I6N# z?DHfJqQrmUtAbVN{~yxc0xIgZeHXQm66sJ%y1QEu#2};_BqSt-1l`~A?(rs(KUbIU>r1_S)FV3*o)k; zgHO{*u0m}2fqlx>A>cX_(?D&1gRpVZMeeI9njF`oH4t`$2{xuWc)X@fhnE#4C|ELc zXrLRqL|wb_$FRxfV{5SdX$f%6 zLD(WPauykdB#xT+Rx{Fm=N}7m5X6C6Pao4Eq4D3W zBc%vIAyBP+*7*QHkYj5>rkbXohg*`)w{WmPUHA)_ zQreF_gQiJa#_C0;5xjYR<%vL;Ib3;jtJLcZz&RA%=1B9PtBAtdxt$c~*W|aVsn{UE zsa_n zSv-dNIS=VfUh1_sY1$7`EC&v!s=otH`R_sn8)OI>p4lr|)K;+gex*FlIpb@U9}=3| zf%GAxv(39a0lZ|k@LICew4Mb74swOrW~eK4hAXLP&;qxMbX50fq)Py=@mAWW8cw|; zzZnf3&d=JiO3K5sh3L@F=Nx9eOQ|00lHWu zFa=UWUVYGtXUqOxZ^MAZ`9f4kjsNSL-+m_#5DXJhQvZj9Ajvfqq?*SS^vwg`t{5=( zdkOF^kebcpsFbcd?es_TrIO*umH8w5ChhFM_nN$J-%Y#+7ycY?z#yqk!a3ZdJ}Pzg4+_?% zU%J-6iwih;JLWbsVA-BjAOv6ofDkkhlk0YuZ4m7(IS}|1waRj6419OA?=)GM-Q+&r z-Oop-lsnvTGn=}f^#cmjzi%j5!s zJ)9g)N=q%~Aj}*GpeNG*B_4K6vd8Ombphu)=-Ha9znuFu_}Iv+a3EH(1h7cp z_|e+3y#Df*SF3+R(iC49WpN!KfRvNozupbbdvGj(^lVN2^gpTk3d^U+cxexiDP7T4 z%X|NE2*Pf@l#VdbLdlEgU-HLn=D!#~zQ{dy*lINiz)j^JIAW?1YgfXRj}Sl-1620o zAfNg*GGr%6W-;|S&~A3@BYkCnJK(n(jVB=G1b?eu0I*A!Df2+k-5;@~Fc4(k2s>;% zz0fCl%u^5WgY%1xH`8~@J#*)=x(6PbnMyDHu`5hbzB$s3$^o%q0pS>NE`x<~PH%*U zOP&;)5zPw)2s@5}a1{29GN|y1a)8?h4yN|Ahv|?J7v`Jn83#d8!1M9noHg`eLIGLS zAW9~KzzmrK0GI~A8vsr=3pf=zPLuDI04l4k1(5?K>&hQMfD%a%0*uI~YNMZmnoT<+;R?7}AbrB0T3H|m)RKT9(RY0cu~BeDb(sZ5O`3Dp&VWz$slv+@ z3S?=>%UFJ;ka_)^4_X%X_QtZ-$;#(i+w!3CWEWbX*{M0cpWW{pkrNpSd}ruA_WX!@ zN*iD5#9K9hCjUETq)1uj2+;4?HMIVscw0mNWngvl9bgt9_t<0hkffZ@tw4xxsoN^Ata`9lV~lS)CH(_51Xg=c(nG37L*uc#x2!TVT(vEf^=88$qO<*{L<8}I$HtA)X_`g024@k~?EL)s$1?MXJ7Y)rnAMy6(pJ%=ZU^nZ zbBVF#y?~z}Yp;49Cr1mgOIi1t)k~K8TNM=p9}HyH!~OqbkcS-XWkuEirq6FHlgMZ} zVS*Pg@R=T|%zGkD$PHHlUh}$5m=@_}=zB zLi9uU2|{^V2{?mVi_;WuoF#*jFhfjf5CQsHn6R>1`7m&5wj;_xsvRrtbw3@8Kk`hNT0yF8b~H{fkey!HhqnFDj$A@k0w2heA;nr$v<3{$u3ue z(F&V%+OYi$lD4*4U5GVWlMw;`I@I?S9z9fz9w~b4p$BAxkDB>FF`%3g5^nCVzs{bw z>xzl*XW|ZW!221iknGPFuaRb3fW8r!5oWxLC1+fARb_qhEY73J^VX-T-7#(OAWE`b zd1FjnBgK>^$DPohT*E*X$p#eanelO~WmdnewghM?$gwhic#N#f&)dNH^0lJGZ5mE0 z9xbg`yd}g-p!ej}JUG|3iKEN~qh@a9h65i;@+1n_M_|MWP`*P6+TK4O;%Qh8N0eLo z#4>)#-gmKkmjI+~l~v6c{tQU;hFV;Y4sQ1q^g1Ad_)W?ADU%4mu^i5?`NifWQTH z$pO`>|AfeBxAbey(6ICxUnUJf@;31)EWm9Fem(r}pSPYK8p)+}6=x{y6lEw_jvU8} z$BAimO|ddmFEg~IBor4tEtphuTgW>r-Tj_evTru|?dQz(tfK||b>%3-4ucHTb=1^2 zvK28HP7%#sXcF7{z31k}{15f@OW*J3V<2(P*0C7(+rud5x&EJ59KN=VHoy@m`uHo` z&v%0qudGI1ssW_25#3>D+U7lo57}X8OAvP4egzh&oy@1gFVleWQJ@|QA=GNg4&wcg*OMvgkPXMcRAv5tFXPdd)1JCQAZ+^@iyRsv1fHmzc7 z4tQxm+z(V(4!?fWo0;y%+6Rs+bih^H)5k>_g#XU(%rYP+gZ~)I>JSMI4qj>cco)f+SUYNe&W>?Pg{D5VAWe(&pW`*8(UJB6>#d}! zC(_USrN>KdA| z5)Hda0b)?VA!Gki6N|wwEIoL8*Nb8PdOgtxFz9;0XoVf=wd{7XHDQCRka(2u`cOF9~fCi2wI_&-}9l|^9cL5Hkp4x2w=TcYEAOy&@?al5|!mo9q+l#;QHm7v@KyKtfl z(jxAUEf?sPB$kj>$^XkP>7PJBDCD0d@ShYxKzr>2p8x;1A^rbY{*YO*aKIE_carNU zW3Tw%DX~|lmygbz6}z>xcU&AlUJY2zN3ZNu>fcj5FvX6p`_K#2U~%QSjm4|AuV2`d z`+3e>7yMV|sG1)lKk93FBrUADMi|D|7`)mH1N1^sbHe2>v zWV39wm)RkBgi~QLJ+Ko=l6XY8EBXbcw#VNg8DgSciV!9r%chwL=M)8M66D&*PcF2~ zLpZ&WSHfpE6G|}xNCD-Pm*j%1QM-ZPhkSHiY(+m#T9lo2k{p{>lwdBkx;nhseKh^4 zJb{djjYFhoXQ=CBJ_4P*m^c5aJcK`mFI2~zbvLC@l$-f%Q})@`PC;q`1q|sEu(Y_4 z+Vm*0WwO#Hc>mT(1@WoR#&K;pYdd?3!!na7WlK z!yhf7K2n_c_f`HTN{mjx_sywq<=*!w0wF3P`7cxxYdj@p(6f0(CT^zQM<^;>IhlRv zadjR1S^W7N>a}6~IWM-=C?Cp7-F`~;hir&^FWTxp3N~50PA`#3%WKK9ra~X;zMSzhs;_&*g7TKlf6mpy z3U5BckKW8@B0Iv=bag$-b#m+}Q~jBBM4dT|2%7_(V9v2Ks%gE;L4pMv()#O!M*Jn**!4!1=yA}{;{yhTQFCLlC zh80=db;lZuX|yC|+0-K62{8)|WRaxcJ}pl({}Jrl^N~7^Y}G8~k%b4o`1KFSYa@XY z!>}Js>6)8}brCLbLxeCJ3K*sGtZE0ZBr4#c{u|=}Mg`w#Ufn;-^Wqscy^1~Thw8@L ziU05?Beb|0p_tDeX8yv4D`;CK`ikJgd3o?n2Y$(%gaHxj=E@Pw1a3whb!m9NDd9h7 zI}l66Pvh*d;B6&ZQ{$@acBPfA2d3nts%(AxGM+RqNS1#Y~U#0^4rP8$y|iC)+-M zG_NJaOHId<>o+(bwC7bTtg5HaP*NT;M(*(Cx%H2f9kqtFh_3U)#^v0Gx-FhBACkzi zc!fhigoVn#c@(#9;T~w$nk_22lWFTFRMBp7KaOEY3eCtS9B#P%6aeA>+(I}^^KHEq zt=yAdSLEtWA8KFIqj0SGw$vJIzW^EzMdE|ac^FZ9G*Da zjrmgSMs4zcV9-K+*c&_g9zD5_qG7m?Je2z2-jm7yTxD-FUMm%@{P=LVkXeL}`4^?+ zC-KGgIX~>=yH=zJ;w4V{3G8F=6ha<;D@485gwzoJeLanSf&GE{NBN4?jVjPNHFue=2Rr44AhVDdyZlT6VkWZU&Qf0ja>>!}4a%<|qu$dzoWqNI(2Yb6EjjLLeO}P;q3w zxS4dv7i7wD-@S3U%X}yJu_o^w3~J5+?;YzWPd+{23ehu4Tcd=9ku2L4lJxa_Ri&QW z#w(<^=_8d(>(G6w$gda)CBF|QjM7ag#BWvVV3!x}H3PD8j;f9bSw!FQ@zIq>M|?I# zN8FZjW{&5eYqCBMkE^AKvd|dAj^)*_%iQ$=rcKA#xRv&{(eKJ{cqVr<8{htt9?AHr zslV(jtMq&Gdo)xsutg><0!I>!%J-k&1VthAdfyK|W-UQMT$GGICXYBf$xeg7Dej>S zw6XWRB#W`y#01Y!ab(c@aidX93WG1BG41((-{8;RcyIrI_>$t&og2eOM4UG?W$#EF zAAG1G88pS{9bimxA?tD2&5)s4%HgVy{?BJM>mzeAvnVx;VxN*T(l=4zM{qF0Aa^aBGB!{vLFo#+FZJVCyTL-g0^2~|Y}aiLyT59`$WXRI9&0K|?v!z7w8vQz4Q(OKvf8gi%DBnM{Bv%lj7&Fv8DwaW zvuC)Lu9+N-S)~qo$X)p~CN!ojb9$WG!n(kB3V!GQh;Ws!UOMdUpTCBr0LpemB}4ZB zxlP~8>DD#Zb-V>Fsg#i-kE-Hg;$ClP1km$MFlDSYg99HbrNd`eNH-oV zhE~z2IyUHWROZ9S#^RHRAXlqllcP+Ln@$~vgZ4R=8g_qNN7snohx5Cs$2>S1B{LeXyzlHbz^Gi}bPoHautFh}Z?&5-{V{S*maAS^F>RuM{$&<}N{apa zQ@61qgA8!a*DlmAn>-&p5*~5b{N1htIa`gd^uq~@*H?%$bc>0J!>>uw;0rhqx}XoG zgh9Xky}Pgiq$sH{d_lN;0`lo-z!RCDGN`ngA~UFb7B0NSSPON!_NXPCEWOI#b(+r8 zTS|-X zQGGg190!P=@r_r@;={Fw?usmCU!1U@Oj9v)d2-&aOE^LxE=k0hZmpEdWXi_VN+Pxu z?s-{Uy<8xnbr1j}luU2=gzW-Q&RsQYuvWL+&~+%{)x8vAymflO zM(nos!{K|jA6L1c$pX*QES(Y+H}XH5On%2Dw9#`(Wh0~B=M1>IYPjf+8P_oa2aM!?7LYktUnR2?R%;bVQ%RbQ)|3k^ z?YH)mg5Yh_8bj0P?QTc#X;>`WYTC_RNvOcyv=l^G)-dGIkyS=WoY6waexz6kUE4I2 zw>D6=KU}9gJj$HVRrTzbE>9uGx0Y?`uJ4f@$FFhKS8eTCP=G@X^`^@v ziOQMmL>zQw>9%6`fBC<;$5ry*2fSvDlb&j)ZUEJJ#w|B)e>g?68MT;!yzg0rIJ^q_ za(!MlQLy`XcYe@a6^&{uV5(2rx`CAUdt;ooLio}DToKX=GTZxnu*HmP9Cr=fPQ)jt zqkK)d28feeKOyS(=YaY1da~Dm$3gqeRACSo!)RLUlV%^3q^5ZZhmE4>JGHg2deL&Z9_jR_d0dv)(qYI_nnSUtHaHI#4jz5`Yu-RAET*SjkPum8zG-;EB&5 ziDkIx;meEi=Yxim%G2liBbUsN1;SP*r>Qc*GSJ49nQRjBUG_R(n<4+8y+b{G@7-%R z2LT%Y6hh|H)5Ye*gvd9I2(flc{uyEeZCv(u$N=#!___SHP98A z`Y8gZC3drN#t^A2-mBYYw^0xkJuUh&M;P`Z;*k+$c$u9Znj+=fiL^ly#B%~ICOm2l zQ)=<$OR96MPF@MHZ{cHf|B#6&9(3q*+|qFPg#CnZ|FY>*u_BF3yD+mB<dNa6Q?SL&D${HO-RE6W6dnn39$)E|y2V^Mr^Q#>uTMoh*-KpX8I;~VplqGw zF;%S)%gMibH?KX-hma~ZoILC)Om;62^L+pFr)p>LQ3AH2yP#)%&+FadtIm3an|sto zP3-FtuEmM!gGc=Ij{UFbw&Imj*2`-fu09+Z+bB43MjX{1@`OuVpK9HZQTe_^MMzpV zEY1~I9AP2eUb+{kpL|R(_4)fQkj~H82(m?nEjO(`TQZ^KXM+BFanvsJEZm*5h#I2} zFZqjBw#o@8HCZ@zXLp!18ihin*dEE2CaZl~0r_Tukm6CU*^E^E{K?tQuFQcoH4Opm ztH>4}jGnu-y|&sYu-CMQBXf!iV<4P0#{h+3h_0!}O>Nm(P}sFVAeyk8Db=NN=WU(# zo|#$5S(-5QddKykc&X401SihdC{V|JPlW!;FfC2Q4@c-D;o^8i;{aH# zzFx&&biImVP@lz=ex}fvRc+A%3^K!Oug!kg4GU#%zaA;AEC|VFoMUqy;h&Q;_OFGV zP(ELaX`D;gQM@~Y9TZ<>>X}SfaJCqudSo+kKroqVTD+rJrwvJU5uozTGG)ZzuD0`W zo|~}mzl}=?`@s{IE*n z8L7v?#E-3I?BaA5JD>QmR<5pppqFnlb-c+xb~q+6lj`~!EfPOgJ+M()R@{DnGj-6h z{kj>lcxsz?$X10(C1vyiY`STT-xc}?@dcm}gR$nbMCVy&ip2&$sxJz?_ylG+pPd~^ z1|~M?v@q+dUEEh!DG^SlAE4Yl>skwl+MY*lkHRk{Fk}2E4S3b)v2XWl4CHI`Eq!fR+2t?urJNJ^8mpcdd9dy=0 zemHlx6HlAecsKp*_3WFAoS{YR=q2&Ogje zkn62`2r0&OuNtd*o%Tbsmmxwo*knR^We*Bs*AY`lcHP9URKCaUO1!hDJuD{k4GR6Z z0hHEmh&}S@mtVOc)4P?^?l^0w2jhAcS@XKvyKOeku<|E%!n{q zzH;y+R9Y*8j|J{@PY9xZj|5NCa}&{EnlhTz7%H?*X7BNhea;!Pb31`QPE$eb{krbj zsr&UIal$38Xfn0?G3!^c^86d7xqMFZE>qZB9O&UQ6`ogodF--Fa{_aw5wG3X1nb!$h+Vjxks!X9EO8BirliG39X1?2 zZWNhEETs`Ebx7h|d-2Mx-*nGQ^EgrY?zf7C-*_gtKZmy;Y_V{t_e;+-%INCPK@qb# zXUu3vkqHTheiyZ$s!RpfbR$=?Clw|mo?I8>I_)l9rEuB%BVufg8VsS;m6?yjsrrv5 zbId(=!TGW@9ZY-=vp@aC)&C$oO2mXr;^u&$yp_BaRJ&>MQ)4$^g&usJc7S){xqdMz zg3(@!P8H8;Tvpl=5QFd42=lZl4D=a2Ej1mi$aM}BG2qL~5-FJcKp^;dZlYlpF3990 zc%KY2JV;wQiAi6m;>YaQZ-u2Sg(2i>(@?Nk#v2Jc?88T}1zBMY>lE8{==S+v)uR(k z`WuXE5D#p``z{7@_|^IR zv#|!#rx4jYizUDl^fRUMt1muTEBoMP>=)JNWL{aaImdIBAU>C}{3kf`{LX4(`bg zRveLW`e4fA#}3zcJ>laKZxW+}Oim`2l^ z>nkT*41tlpc>_+bq0poNP~J^X1`M<7){IgiXN1j!2;D244`exY83x zdc_`Xi{aCKnmoH#Or5Io`%?$|MiG-okDF!ChE5}gWsId}F6c8AoYIxggAz!@OhVaI za7zgZMW~b@?6=4WfngC(&F!WHp;9I*7Ue^lt^S$;auYM#IvS4E zsOg;A4NhTJEm(QpH1zBR-ZCFg3K7@+!Q%u9)^!lAx%g~Ms>ehauB;U<$HkqyLW5$9 zNzSu`?yyf!OAlhyb7msz-4O*REqA{c1wIWkBS=g@HnN~qT)p&U-kQ`lmakDAr?$_+ zwteu?$ZfT%ceSb?Ps-vOj<+^$%ig5Mtx|_c?$V1ZM7>x$W@HmoVGsXt>*k*O>=DVh zf2V0*(S?*rmC%=?Ge7B&9dRM(Z<^qWb~;&x#DsxV1S~ny-6hC=8}XsmE)7o$Zuft@&U(P0ukA2-&{4 z=SLaNqIL~(6GFZ>koXSi&*+0 zMx%sYkv?b{zrTFZK;ZZ-YV53V0u(|r6^(pL~BQg84KwQ&Iw7qL1643@~G4`=A z3zkmK53)Je--4x5mePuY#Dksj({LsCxXwCfoHoqcnJW{4yFUM_af%JXt(@X;$% z$@_D4x8AG&>CN>>-2pExd%xCvIFH16_&A|nY!tNI^h^WMUtQg|?&k`|wQ7b+Mme6V z{&Gk%v>?$T#!0gsK5XiFPBgCGu7;s_YAdm^hw|})kRsSLo+4T5+ays^{9N>!Y=vBL=Um1cZ$;>5Tc@H*OuaB{Us)npOxmDbBXQI9m9`#1p@1`u{Wda~Z-7<=*6vsP6<>KW-XA82^Se{^!8LZY zwE@Qu6;ok`8gq?Ot;ddoWSloywF?POzK~lIO%Ko!R~vdr#@S@8UZD5B(lant>PgCB zZ}uDoRXqC)KCnm|NKQ%2)NvLvZQc73a^|znjIr%)n-p|+wG~^UOnc8ys>JKj!ucyy za8@3WIfr{qTqyNXCT1oU?w$9zvIf-Q`1vi(O1(ff8^(ArBIDnKUe;rI+7@%J7vwe( zx73`SH-61|z-s5;Fy&c1>`BZzil$~1Xfl8p4`<5p4A$@0br|33FivQlj)mzQTOAb= z)0Os-Lpqg>{YCtPopVLd$Ulb|y<8+5e?W~9_WP=80~al1x{L0zQ7vD?I;6TP7$@%c z$;G19BJ7F_vP9dij-hzVcskbtl=2yMX>~a^3a7bxiko$zbeB6f$%h@lH8Y;46UtGq7;S)yvs_ME)cF-{4^$SzJ`u#`0h<@j;oz_}Jx#p6DDShM~+obRicU)S-fYd!U4%VoEXGnhtIp5I2b3F;_oEJ~r?~l- zdhA85{bh7~!@}%I_)QNT+E7)n2F@p%A?%}pP18gJiOwXI@iY3Z26eFh-bw6A{Jyc= zI1qe%uQNp|rLVhep(pkj;YM&!#JM$4yO&d=_UgEsEJz$|@Ayyx82uIsg`1QUj{3*Z zDnO7ObL)GaD6S;2G1w%HH_at?6oZ>2!MJmNbf^zqUHyefpOBb|ovAe~BxD@np_O>~ zz=o{o!#7kDwJB80LIQ1luvZu46mm49A`uk#A7Q`l9bYWoCmWJ@K=Cf<%=REg)LSuB zdWA@m_hGDs%e%Fjo|BjhoHUcPdz8sywo{@f$HQv-skYp1$FXks9=Ek(;)LlqZT?iNiwFHyr8+MWeCMp|LUx2OxxXr-X2YnU+yF6nK4FyPRRDWeSi;RB z8#vPnA?N!LUGKH(Vn5S5hYj5+UeDe3YIDugdUHiBW4u@l8-`|R9+}LkV=2^!i1%ZQ zc3C^`PQ9;87d!&Z6r#p4bX-ON0G&QEXP|0Rq!1* z27#eab$w{eEM7iAdYwno*;2?2AJ}5y@DUC)xx9kRiQaPJZw&p@KZw#62;QH>^t#Bb zWOU_O1mj?#9*H8_kNap;y`>3t^q2R-a5ZcvaPr40b`{q^v$p$s(xcxyzRBvB3$Q&$pNqUU&0;gd>0Pwt+>sDLYzj>!@?Zwxx`@YzxJD;DSY!+^K?S6*Qf(M7MV1j^-CO2 zjjO_rs_OTHGVXo(URA9aB-j#%fo;hT76tp0#iogH0@I#7pg!DP?4&qqcy8P~Y`->P zB=Zm!&x(~{)R)pwqsfuYp89eRz68fKz%=J$Y=*14rV0Q(oUR>9GVp~4;~9PkvZ#_ ziXg^S16kCrk28&>hQ7y>g0fl=eI z`JpoGqZ@4VE?H=MQ1jp|BEQ=#Bk~d_WxoP4s*=TRx?NOSllfH&Avx5lBEMMm?0jf&fz(Gu6Z*nYi0n6kDC;r*fp z)bXW|*I30h;urm!WQHOPS;yax!x&<#*?ha$X1p$~r+Bq>FyNh- zK89UAqq%+4HjPFha#A^qMdq?a`yun#pe=F5P>d7GC_rcm;=5ANgv(e5?+98F3ubQS;ty=qFx&Z2m(YVTM0_1#aMiegZuSK|tIBcZTP z$^8@9y(dg|CY0dF zV?cEBdgEbayVcq&->$}a=f?hxHIukeB`t%mkK_fHZ~Jt;v0aXW3g*yWrlU5m12fqQ zzxbwYSh2cyJvc;pvtkza#^9o*CCK`lCCAr*)mp zzF`m7ebRgd+~Nu06!#hPqTyS!S-vKy2-q>PVFNl5OMO_893`ckzMXzb>amp+|8t%VPT zo29WO4dc?Dr!&YOpUvMO8Z!)AJG$!}kajpfn)LtaJTjnJ+7O9fzd@KQ5sVa4%Pk`vsu*mK;*qB8hx}r?1a$pDq(cGsfAlE3Q)`yt)dXoNtjPuFiv)bZ?y-HvZ zm10+j!;o(3W3R<2b0C_!ZODt9t5k2_TvEDA5Yg`ma-pT(l)T~K`v$$a(0Ye=$B-t{ z`Z(j0g{R9;^42{e>b~ZVlW!!dI+ZOGr<2O^a$z&?Lx1aYZfVMLCV!^n_zb2b*^B z41YRZMVbZ*=DNeuGl`rm#vulg4=m?Zs<~|vaKU1kJene=*5`NRGY^C9YMEJC2bf(V zGn*W*PPccq#3GZc?tGvBNVSw|%Xd9xv7MMpNi4mx79|;PR2t@=Bll4Y4fmmB4t{#I z^N&us8A-IgWl({df~*`1;#(l`KJ(pLyhEBxf#Dmb7LYTj3K!RCiyBZ|BR&U(*pYzz zaVlrTf)7pX9BPQ=pJR^;6o()RS#JsNow8%iMUX7NcCHC4> zJ6X>;Z6!NtxTbb2f5G7-s7JmJ?9R#ZSb5MS8AJL96~)f0?2*fj=f^& z6P29{2mN3Y)*%LWaEU~bfc&qqfGrKTDm`xft1Welk!0Hc`=Dn>M%xI9TPfn{&W&ZP zq$xXA03?~qV8FVZ<7PLON5B;>^f9K^kNuuamWGX<=ZPvQ zsb6gctQ%^0L$TJAq7ZMKgwcj`?b6~KZTJa?8eOt&BwIO8`GHIT^_;r^>pK0R41Re86I4~uKkg`$&A;T1JHX}nKV72qy`%vboq>6@mSls zm`gT_UI7kQD>WQtCaqSP%B`%-EK1Fi-FZ+zx3tA5JRIU7t{2f<(=))5=*AFp9!yRIwWOiLtPAne=lf@`qQvf#y z?XCf;1+Uoqy{heq3hxc^3E-M3U2@6!{?M3I-)Zvaw+w<0LC>cvVai|+SK4RU_gT!378IN-uFEGv2B$n zt#V0aEqspFr(e|6k%C*!W7syCv5h`k2Qw3n{`yrjwa&2h4LHZv@t&n&4HvUz=5rL0 zZ?Y5;1)TB-*L)Cop`$>(ZazRH8Au}RxMMtflLoJYPgyu|CE=XW+N2G3Gcc5Lno0=u zT1yYFoX92YR3socGh)WdO`+}gwV&XDIT1##4ae0S!cyXqUBssI(?ND|J&@r`nqTfb zs7IPF9jO>1Z-?4>IMhi|Ii8gw7r(MACmH$mS^yX;eE8z0iOOCGY1_E) z2}u;1)=tev?|yi1by>u@qB!;$D%H|~Ge`A=9?Ui^aHgrMt$#U!MCv>BFiq|@W zv8A~FfWVUeJ53t1R`se7ZaG&oS|+l^$a2Z5W|K~jg`k|lrUccejlxx=z)%38PTt%2 zlM&@PiXnn(u$}GDp4i-6!{FQV3XR>MWPN*Ysd?{D*$j9$woim*&s0lXJO}l!4c(uf zy7#<&Vn3usKwO<|h{7Q)BW*EC9$(;f+09_`n}goXJ%s^dyc zrqHB=Usi2xOe;UACyi6kDifTr^jM9F7V@=tJgDJSkFco;U%izmQpFBA!r=;>c;5Ep zPQ4FTFlTpS*b`q)+95eKDy7YNjx#c+&ZHZoN@|fR`pEB3uOi&(l5uIj^Xb0q^B$HL z8nxbzs)HY=4srMqs{t_#YCA7|j*aK81>a%j`+&iR6f2&|E=^BquN1^I(5R#^kc}K6 zIgZCAO8gT7OGb7jBsXf7Vp70|dxhbgKbJNC5+>fHPh?K#<#}(1` zV2?@TfyVrb>ha?3@zuEP<_hzV3(IQz#dugCi$ z21roFl6eUssIS%2A#aV-vz`wPwU-?;vnZFTvHjWFe7XRrytuphcha`} zrIPF^0kH2%{b5)DHNT+-iOw<;EjN3${?c_UBpX#!apUcNbNh=n`U4FRF%hymT?(My zqmf~SX)_*be8?c*s!Nxku;ZR_xZtJj5!ghSAdzIxlgnM!zU+S{@5`-Xe)Nr9qVm`-?~3Zrl`s^LwlGdy8ullu39_??XdwSzbqOJ9(E^k%Bx4{ z*U_?`%wxaSUrLRFO@*MpU#y?CaAlHa*pl|0%dRaj=UP539^nk*R~U>lQh)JQ*653~ z(0aaBc?C9oV1_4!#|G8KJ6QtXmw1k{g8pa&eImvV7gR5NRe!bx5KMpg%@{~;`12fP zJq5P=szo|DVD;bW4O`kpY85(xnDmz{u5M;!G>Yeu6l&qhFWcx8wG9&e(DKGs?%Z9)ADa{~C%>**1%NGnT1;GvP@a`bGyg^c5K{ z;4N7vFEn_8Dy;bE*gyEB0+nPP?cuX~%Z7oFH>i>amnfJ!T#vY20xJd3+bNe`R~L?o zNdX(!Xw`C^Bh4Uj$WpqN{t<4ti{A6R2t00SK~SN(?0}K*Ylv6~)p?yMz1Qc{GC7t~ zPs=w^y#*bLoxY~U|Im(vjy=@!f6^6q2 z?)(H>puXoU(Z20-|6x)2NNa>(i@PcTUfq0IO)5qAMI3uRZOV%7F@)25^X8Mr6AaR} z+Ftg0-ik*o0@LzjctgHofuQ08_*nI`G=;s-8&TR-Ul;t}t-4I`p)M{W2ML4IcSl*U(egP8>PamxMjJXh;JDc~0hC@~^2K)f$C&fg)orlGAt$V) z<(;~fN%rwwss2Tmn2N-gM{PibNGX(J2P-$36$Ue1z3J8r{S@&URLr8&c4?0yKw2-OjnF{VDbYyD+i%e?VgjqFbFj!q$sE_awAIU z%!4Rb1CcCbzDo>0!n|L}bF*VCAvcIhnGj{NQ!bzQMNcOFGu<>|!agBklc_OLYxSvoWgwVzN_TK_we&waUSJ%1 znc-lYpFOevC9E)*#jX~j7hh%4y-S0ERmsfvx~%PXrE#|*l8~o?d)$UE&nfms{!ow5 zQ&0`y<}6(LWkvO2m#6LJoVX1W-SC=$Vm&}1>=C(qp0RQn^mBqfBlcFr~Pb#>-<@l9gjbIMKpDTTp0a2BCd^n8_I^qm)--K|e|A^@Zd zE-&fdV!fJ%U8y}xlQZ;lQLS*Gia4{UD5-D#o9WtQBHMM4bJ%*_wenJA<)sYslR(1*qG~LZj|+% zg1AyMZ~rnm-{;!}>POeyI_8@i|eZjSi?(w$12*&^U)$3{n8Wl6{()SiM!Y-~6EYlRDW1fA?xHPw0W$}qWbs0wnjOobaXfWmd=P|uU$rCw z9%P)~*#^lUad(%Z=TzX-_tmX+(OY%64Ro^m3H-&0_sxa_(+b7aX-h7C(G6hhg#ae@Pg~^o|K(oN^9}q{9Ut|_9KpDxbjHoW4@joKaC2?6t3s}Nk;G9cg3i_otQ7jV}49vuC@(|?oh|{1ztevH?Wk&%uVPLefVjVyr>J+ zfba}SoAk#b|B%F(7oW(p{;2ko07iki!a)3cp05xh+|=jMZ;D&W6UodAZKYLd{S&Q=l?nro7-Mhri9|AIbAcV(n(6%l#VYGRJp0MkLDAIXrwvL-^Hx2)Y#3e#;2Efzd~CKK#c$<+Y`{n1pa=aO_RZ7wqgd%YtQ*B z6F{nPT3T;m^2Gtfg!jI-c`$>tyJAX#7{MXdG~oK628$F~w%chRyTa-bJLAtzZ;Cd2 zmT(0k2plaH{})kT85ZUDb!~tkIY>%}3P_3600II-sH7kvB@L3}kkSo9i%8dqf)dgl zk|Q;QNar9WE#2=KfB)xtKX~!kGw0rC?X}lhdv(O1af^#N+5(r+K4^SW`r19mVt2NUsrG`RYLYO0{*{z~m$3V8zbM{oma8aCO z45uD!bYiWt1>y@^1?7`#>~({?oIf0@ryZ;RYmK?+CKxUFouxdbkA@#ve4IfYwLYr& zl~zB=Xpf0qTP)v~M|^Lre=d_rZ1S5um1Z+VcE5RjE+yfFI|0L(IUC`A zohAzDj5OXmUT!0wypZAwVV8vXP6eT5w(9$l)>Ny)^Va>1nPZ55%5sPt6$cdsP6_2@ zbT3Kf2l7S1JCyvlnVC!vuFWVqcopA)cf~S?kYCHSa_}B=^LQ{h;?s28Ne05^adxdz zs!_dhb>>6Rgh3ZysyWdUSwnTOcw!V7O!aJ4ao7Wo0eSm7=rrmC$9)OXN&O8p7J^J8 zrd-gC5snw&k^r!{+`Qz4S>X*dE8-(VP?Y|=TOdu_dO4~@;ThAd1v+;Iv&J7}%NDK} z9U15=?lS6U0YRtNmL%|;Xo5AU5D~XDof}byQ%gmYh5l|pQXDGHl(P3;&ZVsnSs(&+ z<9@JnX?jNist}j$WsX>szIk^t=(^MYz*g(j0&|@ zzl&_KcbsK?%3CwtA_BZGExuijo^3z0*8-WQsxN;TK1j?rZ}n8gyPn`zBIu^A z)oOOHxlcYaGG8#l`AUm9*K0Xbf~3BR*|P~l&pwfvnLBXOVxa))pE$(DMlesf!|o{k zX+Rio5~rtE4vD6s#C{PlTo?!A;Su27kTGnF=n4Xo1G{Q=#1tcgs2jzEv$o-OpHngc zi*LJeJ+trc_%V3rR8)OxhbUogbLzvpZz}5{t8;9(m#>A`Bgw*>R%zPiZ^$vy$9oL; z!grqYyu9%ZSi7iZKGH8ldN_Y!eHlFct`^bk64hwPxvt$#ZC_d%}z&TA*Z~G@#j)Pw`Ftx zf#V)R**ji;mi0+;mgIL?vpUZ%sMltMIExetZLRLbN)4$zg`XVxss;WB{C@jfW%0IG zOD(N_8m#Oo6^o`o#oX*S%UVBeZ>X|GbSDS57F7N|geqp_IjYp1%ocoWV0_!({Rk|@ z(fM_0_Q$VS`f(o;Uj*vk%K8Nh(rr9Vs5#*xwlvmQIj28|u*y&Q3RyKREkQ)J?+ag3 zcg{ew90LmLC1Jss^ddZ_j#=hAk?kuMj;L~Jc0sst?JV4CuW^ShpA#tne0`&GZ{c8b%4m!O`9+awhwVw z8c!_HO{t#sMf3lG?gUfX`(@U}Md+zNY8aA3;c)Z*KJURCqQ19zLNrM;FlNhX-6i=8 zB*m5cbD@&0yBE z-yAK_Z06S3*yHtye(J*_HTBm^Psp>GZ+@=@ULLOFo9@f7<^;hyKQTZ57#%mnBZ$&@X@cViDk)0Y{nhbs;Aw_+OkVRT^xvPDCtY_78@G z%{{um2e>f=o1>c-&Cv#vjg1{$0K|Oth7S_E8NyY9q5y>25d0m~A5^o$^%Xd;;O6h( zKbm}R?y^&io^Q5h4m@s{s)eW0A`?OXxI-)%ib}V-F-D0j33if%rs=U>lfA7P z`nGveY)Mwv`IY96OOrOJ*L*3`kwqq_j-P6+^UiBtMOF(@&deILv=id8vP-~P^Zp7Q%r)KYI6 zMnYE1sq@^j4O8u=7t*Z0H8H-Hc5CnP_xZN&zeSTX+XqB!!LNSN`8+MDO6Xfdznq{P zeOKiW+r8=TLZluy1B`RPY2fCflV{hg)5r5-(&V$JD2MAN!bO-4Po7S=aVUG-szc6`t5#g!1u(2q0>?4f9s; z4{+iH!!+j?aE#2!*aE&EQ)?{@d)3jzUBG`$(6NJ`rz?V~gQ-R66lbA%`o~bZI_bmv zi6(6Zv0S&Fqn+TJBbHADMB`chA+#%=&UUb^WC#wRDMX40(Yo{|7N8;qR9p_weOGkB)bsZdhA;Ic1iUG)_)S>tnS%DK##CY!yrr?%AR$a$$|^b^)*~LOK-_>A!?qJcGqXlJ%sK zPLXZ<@~{0|2zUL7beY|H-<#QlQxC5<1Y!fco7r7L zs9Wch;Xm2laS;*iQhf}UW0!juu7!L-RYXMbc6Z19RRpukPM}u&0HA{hN#cn z*8hH|ZNKS2aIcd!M4l*Imh11Wwa3~wS;F6GMml+Ham`Tb%Na5%_@w^T`b~RHa}GE> ziu6=1XqF|_1SWSz{r*$iI9Sq5|`ajKe`M@5y3i=RRBu5mRGMXunvG-^*9d(#}y zw+mc@_JI4HI5z(?+)C|9kstAu!wRxu|0vRtr!1B9zMq{vEE$)95c>bM;gHv9Udh=%3XVOyxJls-~W1k9GE3#u?Ws`Q^)gp_Dv-9)V+|xfxJV__cm-;Q|dZ~`W7$N zV7lNcoP3*x&)AGOj0$qD;exYgyofo(Dbi8mF~Vh+3yii^$ugU7$`Q-_2EX$Tk;r!) z&#K6XmW&vwdV@}-r>ze+fYsRQboXT(&IV#6%@ivo`rMxm%9>)?40O2l)G0wWOEh=q zy!V6TBM;vnRt?}8zg@FhkdSwg#j|Gg1-N%@=+mfX6LBPF5xFK3jzCLLnEXzayI)32 zM*F^!$bIf8#z=xzy-M3V&Znhb@OhgL&HdcrTv;RQ46=ev$-Ne1#C%=qR!dNSZIet? z#MHryTeS;u?Lw)_*mQG@9xHhG|C!S1@umcYQP!V4^eD<2P*W2V^@oL7N)(RwxY-l; zRvdx6+dA@Dp|jK1O(J9qmEAYsapDeSKy`pcb)=-FmChWJ5DU?!zeuKfQ_=uGAep0{ zsA}8^oeu5z!>3<1#_X3GUXJt`{-HS%zoe6~pu8Z33|zuu;uXu!<=k^4)>}G8KRrvj zPk_IxogQ>e_9{UKAVN1rqokJPJ6SZ7qn2OT>3kxL;kR1d?oVXowO0ZjJ-o)U%5w_2;cK|rBe z18)R{^zh2rMfg#=6Z;{RcDxiJ=~>aUMJb_Ap&vg7?1<-|Q8@iV^RrJBk-e|z`rT+_ zbuZe%`o2KK5nZ|g+gF{VX=`q^FRc1Cm@41oKla#Z?NbvEmt2byskDhvsZ(& ze>GveB_}NYpG6-fn|*nmr_GNV8<+D#e)#pF7G*pgO``1VJ*yPj6>be-yx1d~00(u&Y*>r-~b$aty@v;3S{ly45 z-|*W({gg7qSFu%-PSqx-vJGhQ8nYK)&E?t`X!`;kc`%423cUB7zK%kd^GMg?a^T%6 zBbG)5D_@L&DbUNDG!Mq5rqC4!4KNpFs;@B#ntNy2yO2ulnf)EP9um+m`@&V_r&7Ia zm#JFAaVw}6KJ*;~mv*8aSqFtD?jbQUqI{~~P*H}~S*d=}4DK^fDek$UuJoY3T;t6# z&I^-+%iWNazh^V|1GciFWmPEUev<;@GMIejyF*}Ha#~SjG#v1eh9=8MSCJ#)*!>8; zHwP@Q(&Q!G@#B?JYIwM;=8IXMe<`iwDW(&{5IO3aB+@^V-y%fTQ+WdUmz$CK&a3q} z$_Zy9UZc`hiK$kzeJ-TdtK0#)P(-dKo?DDC@<20282gUvgfa^cIt0NV-paFWIXb~8 z%$AW6jph*(C}<4t2PH?_^@?*TlF0N(aJ3@;L`gPn~ zOl34!tk@})kYJF6jhVn6GHP&h+1|Wi23Cs+46Nqpbq$@{KpFjE=;SZfol0u)x`M|u zRTh41xTR3cUBT{UsEvZz+;)VS zZ=QDCUa?RoO2Ev)`TMx=NXPd4kZ1py-MyVqwtp|E*iD!4WU5&-q3sMO{z9-r1h-=B{;KEDo;D5 zAJwulhxARQR0r(kiPf4iht-pFU!ts=3uprZeAUHO3WerUC@2I;2#pGxK~%SFe6jmW zTU-619mp*qH$a~hEr1;>Me*10*nM$v06pKD=*86(puGf8lN1(cf6!dArEiPuq~0q> zcyW27*TGV|>xjnOTUDeZHMcpfX(B#v_(`;;3y%j;;SXcT5y#AkZ~Bpe6a{aF{MXLr z(+3h&n?bRCA$C%l`5?`Md()bRvFWH@`7mWxociKW_iz~3;5j7GmyUph55Fg_j|{-U z&JRa9y%B(Ft^ePe!TxXJD1cnS4BU!<(RhvY3 zNugFaJ1cg*J>m=5l~J2%5o6kvg;+~@-o1rj(YKkr`enQibz;q+3Og$1`&@Whh3I(2 zGtGN3!tGaBmd3U&zE)pHh<*qa^ULB)d>U8VeV> zDX<~U_BV*Z6>@V4J2+T-a1{mgMeOES*rQ%@$3a;QkHWg+jk+zs+oa%i%6`!;Lj1Jad6 zXMYFY-nk3>nk4_bQvw<#XKRgq<(R+{8y=mQ^1$>!3%18_B6s|b``N25>GgqFUHLkm z@RxGV41ODx0M(#bS~kYaV{C^54a|ehm9hvr9Upv%7L+;vU{E+vWjD%i0BP7Qu5ZvS zfaAlE^R6L>v50VwJGzXYS6IMT>20q9s6`@vsdlp^QnLnUjWZBxVa`NVo|WmqgxlrN z|0U=eT+pa@EZvj%mbtS{{+0RIh{#(#3c}NB>yFivRiBt8!PB7R;NzdL2Bt)XYxc_+ zqorV-l^Ykbcf*-~5)L#3qGvuF9x z9gPd8e5QN$+Yq8#BlSB@eqF~RCerfbtUQFXV*fs$$eLJ#1#w^tyOe?xQFv|4uLbL0 zBk_v735eWz3?*q8LSujyyrIc5;Ohi^jSUkO&>{=nm8zTcwWxK|*xQ_zbm$#3kaW|# zigo|_dHmaXO>zxTH9E!qpc)k-2~&Y!%-`||ZvEb!+ONkz4${}6!kf9AVeF5EXxZqo z5^JM=k6ZYJU#(-c4N6}p0!Q$Y2F%y6@>U<>*#ckLDU9S&=>=SBT%K#+bzhs?21kW& zr>poL>c1S-XX3I=kUcZ@r*AC8C`XAmx7n?QeUVBDhNu$#hev)$wky;|U4k2?i)V)K z$%b{;t?{L%st(sdUUSD+csNB}Nb=c3ad*v|3i(-0Rgquyqyq+qDO~J8CU~%v7H^iQ z98&tsp2l2EPupG2;7R|c)nH_#16y3+D+qGtIO^A~xT;UoxAL|P;WcDeq?gMKmr+)H6fM=0eo1)NOZ_9`j4Hav$P`&$_RmTOC zHdVR9NOz(_ywx#?wPEgFhkjb@+7kyO>pgk|xLvu1$f^CC=G7Is?J?6Oc8?ri!o*;H z@$y8uKlqU$xQ?#nLVeZ9TH{SJgRV(3^6|F}D(NGW@|M#I>tD@1kmme_HOm)#+4Q?} zbvI&eQ_20N{=Y*KE(>FDQZd?TeB=72l9vZf%!Jf~acK^txJ3q^*6;)>Xoi8pCM*w; zr|YQ%Et*s@>D#U-MxlwxG@^5xm1pIzTD(Q{`XRJEODB(x;Bp3NbIA$5kngNi^$BFv z?;5_jq2ogd=TH$40-H_nEgIB28YOa&?y${*hjJsEPU_xxTF7oysRY*v(DknOCD3uo zt}ul5SRZ%4(Afr6pDsaD5YA4Gd4bU{<^kFH|@_^0hqRYW=ypK%jI*K^%!#W&Z-oA zFVpv)uuiP`v(hw_yU%{PbBr+TDx+=9`-iT%6tke@hu=c-cS}LJ)MOT-ESkS9#0rti zZ2NCqr&-Q^Weg`n0z>d$+y(GMHvm9|T6l@cJkvAxtI>KLei=y zw*v75v5^dOmKG-^pnp~}7$SB*>-JE|R^%4GHCf+c4d$}>ui0Y%hb7L)T8ZE~$fSe& z-bw0om9Dyw#otrZut&e#Djz6VAYDuwEn2g=l2lO=bsNx38eyG98##42Y9s>(~s9lE7X@>&-D5 zhZD97c8Cu_H~`|<3RWI0C{$7Cd)ay%6@*QrHP&0q_Lx6j2C#LGk;?Im^}bNE@SXFM zz0zw-oupqft{V1^1FF#U1?C39J$ z+uT4=(HcqmS|PW%N85_mn=Fg=`BV|WS38fsIk%+n|3MvH0qWR?*M}(|Q);u#Z7Ts=II&P1@Q;M69j@q;0zk7_W{<|l_0QPN@(mBI-bC97MP9KkjZmG>w> z9||+h{sH?eg}I{ReQK%z zF!5Fk8J$LsZktmttd(9028Q<>uQO8N=Jp-q`KS}18!I~c14t*1=nmNy!+`9*Et+%| zI-WD1NE!jb<)}xKig@f?NApgs_sGO7(&>yzoH2_J={F2$jcuy?FT0Juwr+RvY?*r*1#*i-wWhS+A02DTNJf~DDDa-tJmm$12~js6Hlne{$X) zG$-54znuMDBqWG^67(D4ZLuYjzY26G9T;&59Nfj_bAhBXh6KqR0CLz2gt}#j z;K97_agg-@Q}zR;GD823E2*>ym^n{bB#Kkqu_3lp5R*#y`pj!q>1B&m;bG&&rFG(1 z^3jj>qNNNgBxE6`kr)rjVQg#d%uUJ*9r4JTdtRB6=zHZ<=3HiY} zMO_tfu$JZ!&{#}bC-g})@Ud2VN7*2n4eCZQ&-FWLZ{3mR(P=v0p62#$o7XeVv}>k% z0@MGthAoE-1wjyqZ=4uwFG;TX97TEXmm<3A^nBXQ>u=YN z8Hr%f9@u=I?N?-E9sQ)eSiMHtZEK`2#;AB+);BSkSfAuO>PkEV{fl@bK<(J%{_oqu z)Z$ziNJkwH0{uGsl1+(TOu~GolVC(fWgVPMNAnE(kM?fIime zg?l<{oGr{qtL@(@{2&!mDVh8z=~99(P2?lXWyR@rHF3mt-`D5yBTCRm-+&Q-LxA8| zo~(2ZQs-Q@H&kBDEINk^+1UcLgI3{HH6H;a-HUodMuexhoNcpi{<%We$;-D;FY(Vo zim+!{23Xu9}0% z@3Kimw4Sm@^y-)BY=WJVMiqst>Q$X;rH(Q-dx(>$*^!2j^~^P|sWwJODm-qIrLz1q zCkO-hPf@TNDAAw$I#W=YR}2R4EI7no4NT#o z_@wp-IArbF4UgxYn%0M&74_s9)w}7?-MuCZGzpCxqP+KtxhbflKiHXW0f%R~nSr)C zGv?W-7dhIPE`1HxTw~wY`-)kO>dR{mm4`)N@Cv9)RGm$^O>Ve(?f?1$uf~yhkmJYy zkfE3}@f?stv$Uvd zqMAbBEXKyqt6$ff?)!&Tl0Ps|_?m~dilJ7v^v6NyEMy!qiK;nO_ba4ic9VvlCdNBw)`@1H?WOG(=8fYfkkBZUV&ni^jvkrjjR--3+ zB8rFRcO>gP8xRUhMv@BXhdl!&kzEwO#c*%ch6`K)&1>PFa)sFs7;m7j9$rC(tsRg0Q0qtZp0YQhBx{T3c_G1{I3xUE`Sy}Fa=?1-% zx=4br;2@GDF|m{Ala{aeFECN3rL4XOUr!}c8(T<+w;F>pfq3Ii#q1-VSd&FHbT4pQ zQs(dsaj+|g01SW+(3qPi*~!L%N6#MpC=w5Jn1pP9qyOU{f8!Bl^546s_ZU_4q=K5~ zJN3e-e zYhx{;f$;C13bV{GJ)OOu)dXV3RN*L$Y|Gf|r({IIB!+Bf4zjXw$%0cRxOWxo1Sr9T zy@K6E`zO~(c^!OiZ>Of;=UW#~N}=@D3!g8>_r_z&N)vM`ou%#ktoluV$8r015b==f z2;_lV#FfQHGJbDXY@7le@2yv*{ej^&du{~zgq zxbLh}8JZ{R-URQiHmjo&Ayp71x4T(I7?~eQiAOKFXAQoLdfziw zw_bO(vp%Z7Tr2pel^RDMJya>`xvBP;&iKIiB_KwLw*{U9xd22?6KYV;B_QsPp_K`f&;&-+MCLN^tKC%=P8Z3+y213h zx5`+bSF(>8L)O*o2|Z$O*8_cV8HB2HEy>#6_r>6OEbusawT z@Y&!P9tFh$oi0>&u~GfH4qZ71oYwoCE#W;E#8NzRGBt zhg@p}Q^8hF1s(dm!>vg);AMN67hXl(!j~cP>n)`!O=AzIZkJ{=284C1c0078<%Irpqbr_M67Z&TtbuK>c zO7kR}0ieo^Gh}T;U1j?tmnKhM85!sjb8jB%Ji}&1%odD8AzTkV=I$wmhhF@t0q6P{jQb5?qZHWHpb z?fo=+YK%>vv5S05l}W)8K8y|OA4l75_fB~(fs`Oy%xzD%nQ5Bd+P%}9mDQ7T4H8nC z00y2tOWXxM`BSid@clY@1^y!0#LhI*~W;H(to~-)bkto}-YO;T(wN z{_2huK!T@8Zk~K}%@!%S|AtB$GryIh1{#)Ef2a8Lg1%j$VMe{%#=}r7WW7L;ss3mw;uAWj!zRw zBbNB`|L`fcvla`v^Rc=mG8+&UhYu5e2&+)0QOZ**x?M^Doc5IlQ!(t4&JA^$-Yum) zUh{ZcpKrmr>2J8lG{t#jM!vMs zb2)Y41*_jOegn5>c~=)Wrsl`4^Z7Z1<6%*$BEe4mtrlugw}{R*?hxmL;h+6uzjmp# z&NWs(4)o9J+wb0yBM78D^!Fc-MO@VA@uW+`m<9Q{!)H7eDwIc69A@Xj~YJ2W!Wd9xUrrjA_3= zJF}P@1wZ`lvFu!XM#t_`twyn^ua)f}a3(Q7^+}zzpfjTIK^MN&-McwbKRswpEoM2F zDpk{7T=w|q?+!;lp&{Fzf-olFGG|UqHp2@pLzv`o8MG+EoVnKSXQ|PML9V4((+C30 zgBGQ5l^kbSGaV5KV`IJT@WN5|Z8_G!f`D9&D$>)Rl!lyQg6oJ>3K7mXLIJ!A+gE9e z_J0@ZSABmfv`;GFP;u`2r_G@y=m;2BCXd6$@^I1T_m-pkTvHh9yY#9`!isPaS1fMT zxXHR&x}MMo=?8uTtLp0nBqft(fjiysk6|}E-lo&HpK7Kf1COs;Uo%fR`U2j^G58GK zD-mh@H?&|?4KHY~Jd1YL&03ZA=bgo1;8{e7!vv1! zb8m9vkY36b1m?6?Az>!Y>wlRwv&{ltHl3_RVEx4bqn1>3dHdU#^wFt4EA>5)d4 z{F$eB3?gZDs_e(R9fQt*dX;Ci(0I}3E(pP$W~QtHVY0Z8scP`|Oj5HCXBkk6gU?w*AX2e9pq#YyHU-KR3(u&*!atT6Io-(;g7vAcq_ z>}lNUmGY84$^SbZ(mx^CI{UJ;Y0B%c1_b8F-Y}k^W^8P{hns-}F@WXNaQR7hbYTb7_i%d9TcicL|GL|;W`XT?q z5pZlwWFanq8?M@~W|3wq@wE%zH>uU)#Z8GBs)(wiGU- zKJn=2g-zzh-Pq&NDSFx&wfAQO9BcRuarfTZDs&fkJ?$+B8`YsBrVv39uLJwFuPslK zV|S9cXU{st){hTn#nfY?rQ1`&7J|5V&9szAWS+${GB;c@QpTtzFI;t}jp>jLx}is4 zJ}@6*cLU9VQHnvxwk8f-w@nhPJw13HME#kK4{R5@DR1H8t?A ztsX(n2`Gsn^2sPxR5EMcjHDH+c3}0@#-+Holg#`Oc%e$-hyDvta-PO@R2!~U%Vys*V^UreKh4KTQc))>&NArDL1f z_&*)Q70~unhe!~)$+kot}FzTK29WBBP(yOJ8;aTlA_#qAi zK0Oc~3Lkyvr$w-+I;{z@YkVXb6za6}iL4KUau z`#;KHWWYVZjEh~i#P3SSJzXlEPG%ZcOCZ{NlB8_=wFiCELCJmPRpdNXM-Zz7G>-`1 z<_!km^URSa@;h<9GE|hdH)6Ks<9DV8KiW4FB4fei^6$tN=Tk_2|1|-0=%rY*e2I-Z z#fMCeJ!btfixj?L&63@=t*553*a}9+dDh^;-QdhOQJS59*7K~xn)(U(2-6}N@&}JU z#>!Y#n@Xkm@6-a1$f@}9Z6B|{i$`28(5#rPsqurQn+I-Yn=Pf`J$Zh!P4RLp7^Pr> z^tk<-tuyK3{n|IZidoF0VMguzCkNiZ1G2I6*!j_YIFparQi2hruVR^oPG)!?qJu`)At0Ih``QOH~-dU*-rlE-w>5%X`l5m zzJDP}eZO>#EYWAfU!p&T;dGB|xVRBqZx$~ill49-_-164*=dPrz|L6AN@5&ZBCCcdnAY6p@c8_8LqVo(FkDZ;i7a1|b^GjnO61hkz zA`7vK!fvylaD9#Q>&}*~I+}*yLIkSlm~~z$v08Y)DUJqa5m*z6v!E%1iRWE~-)*Ho zN{zSI<+K0=;YxR7nQlplmXelQ_rtRzzX!TELK?mKtiGED6%0l6a31oPXE~`E((1h` z1)G-|L7e3zlPlNEEmG8M;;@E`~J zh;Cr+=UbfUab<+Z9!i)*f}IW^8P^+JPSoRU!u=;$HkI%b?D=$kV}Edd7mkR5uYiU= zHk0*v4qPjYb zbV?TnL<_O2-j$I2%C(UcT<^YeD74#^r_#?nouHOv+0(ZoX#RI%D-3&|XBf_1WL%G_ zlSLUmt@W4V!q+?z0Gz>~8=)g`={^u>sA;EJS&>`_yC#S)MdbCy%YuwdfM{59)^~F9 zr^j4V!L+85r^&D1U}0UwWR858ZE?>vv(|7KlE|BIO1<56HSPbT+9UdS*qK1zfu{**Z^) zHYAFyLJbO`Lg&d!C!y`h~?89{V|-9n_|#SMEXc-qFwmpQh|PnP4_y_gmswu*!uv9@qZ8miDWdbTo> z^S`{M#35&wygg@zbyi%WpL*CE!H;rj-!5NIPl-Le%}MFwg-a3E(YySUJh(J{=#~ch z*UHf`fPKG%Bzwh)CaG}jgKU$_3bi}5@w7BTpc|(A>AP5 zseICHLvqX^4zxQJlhpg^r!((aM?%9cxFjl^tcizTZlttR_Zd{F#58_J+F7uSJi9R% zXm*RI7O3v3weUXC(Hp96(oTFR)-&zzDbbUnRsHa!(6~yCp6IzSY2GY(L5uA@wPu#o z$m<}M(|GBbP2LLfS(kz&h3WeqUm5-n(M`m%D|~@-q9uMZyC+M0RS#%+TkG_siQY0A z#52`+JF^A{6hxKILiWUuEhJ|{6!@9k#!TIMSLlf#KdkXcWk70D}3Ro5^O@8OdvvM z9m?JruiGG%)a|O}hnXTCTVC7RMFkN+->h~Ol3QVAjt1lpZoK44OxR{^55gyZ+!E0Y zw%=4;X%BJPnn?}B!@td($q&8sc8Yzaz^q}vD-R>%`5Zt!)j~(W+#8-U7y28>T}o3X zJAPPaZHPHF?tkVx(PSiLR(hrKhGf|Tol4>o&r~S=iLRyXQgW-o{7}<>TYfO$SIPI} zGq4QCOh!PIE@7*oyoW{uD#P7?mqSO^VyM8UC|Z*SZhUC1odGX2j&zwe#1O_RQkM-cC-pmgLOVokiH*3@S^l zr^=Pmh5NtT<&dQFqQ-St&jYtO@U8JWN(4<Rir=AKw4w>m+q{V8;sS9sm}IF*#WPq7SKoyr_!tH*Q6KS%`j~np>*HG1thVZ{G&SQ zCZ_#?A&Q1YAvXG(X}5zwT40)o8!_#9nnXQFrI?)Y{)xzLM@I<-R7m{nw?i%xCsNC6xNVH0R2Uy@15_!q@Fan(N!yJ+BW+2vo&ZSyDX+mpavG z{nzIL{D$*2MTbIPobzkRfLK3TlSn3JL)$luI^MSTQRIFE3)n9G^5>`y8tLi*#YhT< zdwKG1HFmta^gKQ1(41)OTxgQ$L|9=yRwyRp!Jwelk+|^BJjk=11j4&IchS^)HEv)v z#X^<;6BfeF`{($*-k8PL7PWRVLxu{essC8 z{c)S*(c!1Gtv}cLGjJYXV|h3tU3=&!ul{qs_v-0T?!~%4oY2|Cy>-nz>M_UlQ0mm_ zWKKu2L(MUtih9Sv1rWw@b;dZJ8)_H9OG?>SGm5QE_1dlx92|=%sJzljjv>P9H48oE zn?jfpyPcuqj)Q8qGn>!u4&ie>pO-$txwdCyOu%A~QuCqaD_@i0{Z~vYH6o^*O^ZBd%2WZ zzyE%fN~vjpz>*DGHy6^0rBxopau`^f8-3?NN*Fo{8QODUI5DvO84 zx*7GQ;3E*$Q0Q^>(r0&X%>4d4=d+82x}5_=d)f5X7RE;9;nwEmnb1}NmSa=DHTp?} zbjtrfLyCkZwUShDo=mk6AK0UdCs}5FcO!Pw!W@vX9JkOuKjvCy+=)ZJb}( z-T3Z%ZeRLAJmfTZ(y?C3so;Y+8F0P61|plljFTCVb2$NvR^I@$v=R{99BsZy`D7^QnEb6leWfteFu){a$JD zD)MJ^O3lm2A5n9HF2&UDCL&Aeh~Ax<^V<9+kg(N@TQ_z1v9}t-^hr?PeM<2Cf2km0 zu&nj?6-vR?HN1lVLfkkngH=zc>}{gDyPr~!lJ8%-ja!N=!6Kwx^9Evb(z04lUe_c} zRBqhW>V+mLYxAa2PBeM{j*sUls{IU8NLVB)UL1$op6&9-_+x+%cO2Exjq#-xv4$ z;al%8wttoeOMqU1HQv;=INQZXMs}xGLo1D+r+iT6I&OOZ|EnS;+lNb0gm3M|HIa4!0 z!kR0I1p0~IR94!vph)r>MT*NGc8~FFZNJTUB61%pI@X^byskFC^tGBf>z$72T?O<> z+2+&Kh(ms!o;1oX3Ql85bjBJt?Y+mj1`VvQ`*B@~(@+V%Sjc0;A_WV@I`i<|upbXK zDN)<4C(O1gBTVijAc`>Nzl1*;))Ok8%bLTPZs0K=cZl}cbDz8IvY#dzeQDft;LBw zNqo@_qTwC~-h1&VtkkVF=zjIwPfXfq9&I$+m^<2~5OurF5|vmYI6F{N`p9dE z7YssE$?enuA;)+toxIKC^?}xl94ld54S%foBDp*Nnn zmH0!I0u_3N;AtFBXLLDF+hnzq6UR`eiI)SiC-{g(Cn)K|?<%ysgvU4iFN$~Q=SE)P zGpL0<(EAm`6Zj&r@Rs$j(-~mHE478%=_OOK zxW<$MW`kb1!yfW^9EjJy6I@X)+YHb(F5Q8@^huH`yk@yR6ekUJ(;rtOr%ita-_a!n z^0$QbZk@Nf_${)5#4#SS0Iz#F&(9sScw)oEgTphCq&VW|xg=+qgy@ffoVG&AQ0mU~ z<@Ok?^!y`hOm`Rqxh`unv7=sbB9wkrrhOT9b%+K2^RsF^Pj|{QD9cKu{2n9Pe@1bi zDeBQp#9KC}G?<{rYW5o91wwXe5uB4#=`(yVLd{2{G?a*| z=;Sf>b{5p$QFaOah#&S(!M8Glx6T?ir@&KtU?)Sh^e)igOSO^(k(pqKDN#Fah;%vX zb!kQ1a~yS1K&-~d!vfojdn{B2M7k1#jM6MaI|b@yL~s-XI*P(<5b_1elAHxL zI%s@jZwk8PjL+y@Y$=UALJ~%fjWj!f5TRSsw}USn+HH$pmQGD_l!esBiw}{Hs%>6p z&JyGih{P$!2?t#OzX{_Ay0#X>B-!u{R`vViD=wIk>Ea1n1fo7Jn?fW+6&xJ(;od?v z6xJfcQjnJ>K_$ZN`205sHn_^?^k5u2k!zx|XZ$4;Mc*NEA|-r>iYO!D2AUQlfK0B5 zLuCtG?a+9Wr2j$*k*{YTI9bUc5!@B6y%>pH*Z`8k=JAc)Ay7r7Ec-}X_7^qe3G zs`X8QlnNvyc3-|&NARkkmcSBnA8vLOkzIO+r{}tXk^^sG#`j<2*2k8F7J)D_FZtcI z5q{HV3qWb-xkZ9wqSDAoRGz=s%~Sa8e}tgw9=Ev-J;YUiW|J z@8Djoj3tmqq(4)+uv3wt2-Q$;F*JLoQsML;s`?kh0#nxvP5PP3H8-Dt-N8)Abv`8^ zT=Vi!jXAB4UFOew4V%4!Kw`IKAp*Qpc1@4FKAYEeDPCV!9M60J%!c_RM zG(x43^&xC~zqN`53C@&#*S{3!hEJ@C2}s~b#XBcS7^N)mZr=x!Z%3*woud=tMQ1jM z1R8iU@h6=759HlIZzqRy6{@vZ@8MoF~VktAt8?M;m%T~1QidpRdGQu@UAlW(DKe)@O5^f&Ic8S|dfXd)=6FSzI@PBzyAC+|s8m}7| zMyuSScKw5A`gT*neL2p3K1Q)DUHc)73a}JUf$2@Qz|Gn=N9}gCZ&d(f^qN;0yB&Br zyY%b6d={VAo`$DFGn+|W_ib8pvx+%we;bjjInR7q+AaUs%T&YPpdz)26}ZzYBEuK$=G^=ooMDO$_jJ#|y;PD*oJO zDQq*bvlO2o%Az{~WLsVDwT zF*54!FCKS$FK+k~;*TvY+)Uaz8PB~XL!W9pP=QX*46Lkhz+) zVnqDi`;yPeo1`>L?%nB*EnaCyA2xj5d$BUzU^vt^k9C5BLZzPh*SwGr!3&Z; zozs+}Mq=7dF8$Dp5rHY<-9+0KiJ9*+RB4mEZn;nHf)_~p#a=&9gIby^1iy=qscWIrVHSQ$z%UX>cHUJ6F#Z!aAi?;-*6x z2*C)2MPH%mPXXHWA=->7#{(8oS>e&v>TuHd%tP;mOUPd$$%V3c^yd*>$+q0A=MH!q zSOuxgY!_ewpZ0eH6wy?6RK>*5(0=Dx_DS8@SZH9N0lX!x<0#^g=`!QDU?}zvK@+s- zzXd?74MMlV@NCW(rqhpc10y^b7Ja#lZaz>X;d9#2{y`#>J((6GhLON{Jxu&SQ@9QP zA3d)(A=}@5I`VLyT5=4_>J!{mArH{WjyBSB-Ou7R_PiV(vLaP81 zfi?7KO<-WZ6dntML4F82H`w)n94+jys-=F%Gl8K2c&GPo>kl+~udR<0v8yc_na4M_ z6QO0=wkZRfSzhkuuTFj`#eMW7%u%GJF9?tsyt(;`RNB|#-7-7mqk!!I06uGsR2rDt zlX}5OtkwQ|qeY+=u4gFEy|62!E4b;tmL(1xl(Js5+BYx$fxU-6aBg2RG8J%6dXM*v!kRqzenIA<=T!N zdttiaG;~S95l$@1YaU)NO|wFwBj96~&hDn>b2QJ)^_2*oQ!h!o7KxKJ$0|-@QvuAm zEWo>%d%8d9=xL49Ft>*u9g-C)1E)OgMXsugAY>Hi#(vh#26u-9pG8tnh;YtmH~BXn z?$+oH?6Q_*O13!4AhWkD_s=r7f-!Vnv#Qj^$J#hKwjT@DlHF^E#0Z7ZLwpOm!uQO| z%fR$QoeYC-%N5qMO~oX;uMztbpEtm?P&_O)s~yq-O1N$E5vZJ{W73q zAUl4|Kg#Qh41?W^#bAS>ypLaq$6sc2jv2eY|EO6d@XdnAl=)(NAjjyL!9C-%$Vxo( z=sSYz=jXde6jwD10jDyNfONXW5X?4xLku`*U-2i4$?z8PZMM%hu9b_uH_1?mX}}Ko z&bmnh;1`Fsn$C1&XPs!X_|oK$@s&qLzn00NIu~sxUVk!SH~Y#0goll^uX|Dl7oz*3 zLTHdgBo)`AFXKqmh!>bumELXpPW#z*tr6r}FT$kp#$bg{ZK~W@r#a%I{O4z9DzDfE z3o8RvJPS)UDQhCDw3<2GE9S<%Bd%1Lx~K-2K*-@841?0s>>%`4vb#+;Z2zp4wkd{! zG?u+QpU@gR68xr3AZe|7z{YJoN2y?qV2!&oyZ}zsm|D~zK;afI6eSfN z+F?%bqq)g$8;0UtB)9otl9*sDs}F~5-(ro!!#FwJ@$Cc|h)kqys@H1sD`-kACA$Id z`axH=)yXXuv1O(NnimJBv3Y*YsIB&)MaRSFHv+dz1$O=tQA1t{e9h5&wXuLypi;L_ zCC7!8zJCc()%2V0+lZSg~9UtWd|1#b8+TVWcc0g!o&WE2HNURia=38l=^*&fR<1#Va zKH|AN=y46~2Mw$i;0Vm-ksLT4>{kFk-tL~NI{3B!(`y&tGu89XxEWC7-3ciQ9KnFZ z-lfppfb~82UN9px(LQ9uj&}U3XbC`6kGv>hlCHY@oz4AhLr_eM`%SDA60kY<7ooWX z%Zm{KcV+pZxS-skBrm{u$)i|%yY*vP^HIFe`dHoXW2^n!vG}763ppW%!E8xQK_D><*B=0n$mlYhgoy%Ro`?Rzr5r^k13 zG@{Z*TQ8z2L(f9i5M1P+1iN7SYa`vszjwa4fHN?mkJ_i7BO_xd6Bf64^+$M`=ehKwFGSGaH^jliL;XqhYN72#R5%svTy<@k^7dPE=wQ^S-NV9FRNV8C*2LW zXj>^zsPS8pMo1aZK1~W0o_^Hz@}9B}9#-b-zQf(P*G3*Jp>=?Z};03JaLe zAl`8d<8>bSBKrpKe5kn!`5*x-O+_sMfxrl>loR*eNPqxHGzwD+yP6DB3j;K;>V;36 zv7O3nC9#S0^>MV6`=R8EwNoGfjvmOK*j5X@jQ$1n%e|Y%r5gLV0O6#=z2KmD_$pTu zvBKjnem~LP(yA&bGfCt|NW!5tfO?WlxQJX&v?#X%<*niS{5Fzdm0 z6~lQ*coO}d7tmI23H683`_XtTzx7hfmX>a$I$&=d3pa_RA(mth{JATl)rw|H$njfT zxRz@YHBKbfd=Mdf@^fSZ6H32`jKbGDeNpk!)41#zt7&|rv2VD-E6B_ z`?@YFYP>w>k8wjXu4_aPfv1lZoRrR9aWl!R>wfNecY)uz<6DT)J&MGIHS`a-Qm~8YY=up zbO@%;d5cVS@X5lp&xT5UkZ11%cMNih@9MPi#{X(`EQ_hqDj>MF?y@vNr~UG8 z(N2?Cg58v(fdd)=K`54%CdN2Cq9Ec4gK7-)Bxl7lc=7q@sa!*aTZ6mby^ z3p-m=vT2I?`pFz9_GAU5?9sls<9DqASrIt>W&Eu}WnrZp72t^O2>#zK7QhV6(Y;iE@i2nU%D~$8)wByI+27f%2e> zyOnhKGEIUmbQ6lNsV^t(Vr?^t>WREdYuB| z{jy<+GGO@Jd0UUlWwNigmt5D~V5-i|>?dRO^(LQ*xSJp2nE9`lvigVlu9oH#tnI&^ z$H!PHR{K3N&9NhkqxnVl`}Q+HGz7LHF>@Y#GzH^3h_zs|;ZMF8A?BeQ3(9{|oNbf- zhKVZ=!~0&l6(p?-Ce!*~#w5#*xhGs?cm38kHUZa6Wos8&pXm&*RBc})bbgRn+2$$g zu{D8JJz;DAbm8mYXDiv zCMOUxH@QrTI-kY5=qltxn~P=}{ntjPc^Fx{ZOpGv)L(Rt;Cl}^9br_koQNQfA#pMv_@x^|(a z`l8Mx3$=#1*^NA_K}DB(e}~QH?;77W8}6){-r`8Sd#s2_VsXipc{{}7Cfc%otBK>H z!{oroKok;c(*$;?O&m0Ft$`C~j;8^*v)hXyp3(m6!RuevTPho=TY z%UwX4bo8Ctb1t>Tm8bCjB9m{jr6>0y3@-SAIlwOQ$wA-ywmOp@}`;=O9W-<8k@ z`yKGJBSsg>{6rm082k)+?-g_z0zd%b2xURK7%yd07=4$TTE5<>LoI~=Gp!KvrWXUk z(B`=6XeLe&NrAdf8YRWX2=So}jLDN7FHg3tex50^eks)xY@?;dEPPu;k{h=5s-W)P zp?sc0CYJi{XZiAffU%{?DcYd0!czswfG7dE2x+=cAHv^9kGun95{HrEEK!^-!?P35 ztIO1#2N%>X1ays#3ND6@V-ya~cXL1$^8eLdbHBo}r9UBoX^LBRfjYGq7|f}V9{|sE zqRRzgSTA}!_@6D8ZVySo$9DZVSr0E;Q2-S%r={_ISgc##=s7?gVqGUR_NkO>{p-_` zT%)B%um=q@iIQC2@SXjzokgE;;H$iiic>EEMY?yMFF#nk&CfW0LB;7C-^{@LW_L%t zh3+nLTjTfxVHXH5OlkU6GiSQjwz~&I&9utD^WBoy}x=S_(l2&PtWYV_T3K0O|5 z3kZBU*Qy*P>-(n%f}ymfRnZ@JL8#O4&2TaXS8o|&*FG4QF8ux)r%nUOuWsjcjEZx> zBwcq&X>z^>o;PmYUE0jlxMdy!{Z?vqg&OpWpu7_7{B+0Cg$;?0p+)pa2**p^cGDkLnh$H5d4?_s-{5UsL(VC#>zZU_yW@O9+JoXQzyq`ou?W+xHUe_PgvYV-AI)C|bhK0U`+_)g&C zf%$Hq0r2IyqAr|+J=9W_xn8gfK)yy$k;cnHg=j?L-FO2;t-YbNR>)M6ged3*nn{`) z2vIwA1My3-w#=peg2^9J4Cwfa9|U!ADM>-pC#>yUU}d*T$a=}|u<_}St1MM7%@{X? zFYu)zAazf5^|mt{_V)CbUGE;?1(vzLlTaK%!g7he#<}Taa_D7Plazx#aLmRBz`&$l z^C|FsWO!Mh!uL|u!+H%kf`;<-nk5tm_!hsDuPLD1J2OC2bFDxKE`KX|J+R||H{z-c z#R6nF3u^F;SNAqaKziClRg<&&YEE26Uq(sE<5w5L&Ehkf8A@MJu$;&OlH}PbJCR%8oUi%o=T@ zH~1xl>%^s;6zxAH|CS;z|N1%%X}+nYoA zO$;HIOrc>-l*W1VmGHHtw@g%2>_|1_lz>F+q8^Y<=2cbOVrQ9foEZM#ae*=(T?RX` zFVDq&XlGcO+Wna%nDl)?OvvH;n~MdPh%bday%%S}Ov^u+;F)2TX}7|`6m^$%Q-}cJ z7o<`J+jSKP|GCc?!QH{oD=3GU5=T-h(`mOO!(g#(xSKOLp6ja6&4;ac96{;6Fy5#m3x4A?FL zXY*)Ge%+=r^6H?Wtob6BLt>Sd-3q6ugDW7=8HLpY(3T1h)mvLYz6u!@7M6Yv4r7z} zL_sc!`-D4u?)?P|C7z7QOA>DD3HNh%zgxj!tEo|zb9s^8}@z%)I zB|G&X!>C26gT(eKeN)Zg!#;;Gxh+4dXzX8}6cacikHe9Ym64Uy*i7Kp6IOj=0dXIA zy?#&8o3+>oF`*&B3ruESkIZ@1pbLI)hFdsLL<%D`7isU4=N=_$*lExAtNsl?YxNI! z*GHyz~8cdDOUVqM;9`!LWdz4 z_-ITIdKoJZ2)RF7( zD%Y|(YB0 z&A}4_v|;1JWm=llbav84M z>PwZZ1Q+b#3#_$5sdMPs!Ko&FvF96hE<=pbQ_&pTDa3=<0Jg@-1(BAYUI^DNU zNAdw&jI>K2{y`Ccku(hS3Yvcf`x?tz`h?j<*)xZtkaHuF&&Fh$w9yblyBhkzU)yyb zr`bV}uO|^h1+}%F^uO1CTXvvf<2R5siUuV}@%i?lWNB%#efy5bx(RlGLhN&@4FdgdlDR35KO#&r z30;>2T--)O|Lcmg=a{qcF^zDf#B&1M!YOn?yk2?YUaw{dp2Z8nqmytoFli4bv)zP%1v zfp7B@9AGo-Tv0vO`^O+`nH6sXdZYFhX;y5~ydDa(3gKz52c*5u+GDkhPa1uDP-M~q z-T(m>DyU7jx>nn6W=R{UK)|IfiUsN}TO@ltxYo6w)g4Yny6obI4wqjl zRpmI~cJc5_7fwR11y(SPQAeM$gJ(EAoz%oAr+d##kP-3xkK$H5d=ZFK_3X|<#ue35 zDDrZUk`cyo7wK+3a=`EZ>C5dojx&qRs2tH{vDe+SaDdI`F#96v5OTZXSBQo$!qc&# zle^h&Y>a2pey6wGbL~_l>?TH`*BMe;tm8n zbe((Y4HkQClW;s3Of{f zI?{hnemb4kUB1aju02p4+1~5j-ezg-({hsBzymiNg1dx#y@;;jcgR@MO3$L@(a899 z)A9*%DG#FH4Kse0jw71Je~#2Rv8E$AyW*tG^vjR+kTW7l;DnE(GVNGJ7xkr2sRWyv ziUBWld_r3WbojYkL4t@ut@G$Dc!k7R;Fm1Ne6x%Lk0J}f*>x?e`G-lYk5v6SC#fq*z|6;kd4zX5&RMDm^4U;F3)s#!8ULPu)J<} zd+Ta^RXCW7bTG8#z@;>_4$1y~6WLG5P(Hr?<3}@orU{)SQ)@Lw;xZZ6k;F*ZRkeepL+YNBgT5cI@cjS=_c|&B>?h z=$_6gsc*P|!ymka!P3N8SIEe12@U_DsQ{`h^GNHS1Jh>v4=aA_#@hLyubV;0_>pX| zCyT}IhDYG+b;`v}p*a6=GU(v^n2d)+sZqK3+5XnqX0Yaq&M7wcT0oGW(fq1??8fc2 zyz+OLbjxg580wRvh;}m6Zyl6xbE;yIwXFvU@L9cl_lgAS>CiR{PsV25c&GRGUj9+iIch7Jwcq-p zep7vG*M_(MdfkiztZg@Nw$E&FrkMC8MCak}kESK>3-_C@+UT|hsTW8wFgp?`MbdX- zgok1|{E>m`WL(cky(FSF;-9oLh?ltKWWC}5G*y}0S}y2AVkULsd=$8}0RPx1CN z=~5rB?jI(=n+Y9e%MXD`^?7J-TS2Fpn|Alek}ZsG-a?x`Wk-L!X@u~x7uG#odI)yW zy9S+AF$4ZZvD2Ej(NrMn54&P&AuWF6MI$S zM4})YOtdyNL!$6uhb=1S-@*kB?avZ+{RREqb*J;muQ0A4#II;8lAkLxw7W4Tv$R-> zNtVD(2iM^&ykqmbhJrC07BhKA;jPvy0YVK7OF)>?x|=e0_yW@pU=6@~7mjBOJ=wCH z-Of@7tZlK}$#VX&VpDeL@}p}~PKy4#f70^j_v5D>dLgc)l>FH)?|Ge7ydJXuk=1w^ za$57?fqj$J_m5-m{ZiAn*4sy}XXB z)=w;9q8K(0si!USymy1v_M+|}6VVBgpu4`d+i+ntC>?!OXKep1eyOj_`W`IxjdgD) zUB^}RMSeP*ubMLLnvq$(=DP<&-r4wT3rC&`o-kyf9O$#dG75f$ntriu5NR|tDT3CISzwY`|ZA59LBtsJGFLz9ln$O=;oZ# z5Y*AaMnO#TBog-w?2{ds?0?kh>SwDUg1*}3gOjz)=-H3|%1^sbzJnQf(#Neu7S(qP z75A*bPH63Uipf<-%Sd;7=N;-2DdOu=;@(~5cb}P;=W9 zVjm^!()>5a6V*csF{_8aOV{?ygP%ZuY8CrDpeZ67B0u3QPw&Ufe0-u7&I#FBiB^($ zWKUYC`bstFlGwyxc`PY)zD)%6V(9)z%>bzJwqGn<$dQ`n;hu!2kRipsYtMjPTd({{ z$WGPGlm$uk?>1ltkQ&`_vuh>h`Hk;woyosvKG@|iC{Ujedex?QjA@?^C`$p z_pit-IT3F)_uwUdb2L{s65>InxNKeHN0_G1F9Zlh?~ycZqwK|s&I?VVX}HJcl0%>U z5(c+H>0}FZP$0_As!}kN&QbDq2v26a#M{n;bU{CO0AB$Nd5Gaco1I3tiK5-Ve?+gt zg?1K=Za39ORz4a)t^#WUr&wuLLO3)w%WO2!ENnr7T35Lb7QHa)GB&}zR0R$XGr=Bp zC;pjto_e})3Uj#=*iDbeOf;EPI4-$Zn5(bM`OX5cTP;`#bX~1HDe^x8Z=WGQ_4p=} z8;S2I33YHWdUoiAGOj8mc+sHg$@i9A#!Ms_Os@W?r^(`e_Zprji#uWud+ik4cvI&4ZP-D$>1TPCjnz<* z&}pJ7(Z7ufrKgtG^j<)pxk7fsVM2Z*11Cy(a^{()y!j9HZ zvOEaCp!nrnDTI*zgZCxYiIupH1g-w8FKcCyVRt3TT|lU_s!dDLx_>*cDFlXyh2U5F zSXBNn+NCS9D^K5lR#$Bv6=|4P73ax}_WRl%b3nHw-*-FFyO8fNl=}vEF}lWsx9SF4Z_s6N72@&5Kw8Jo7$!kN%sfEq$tW1A+*&-dYCks!$GVRJO zx2%pju%V(%wiq+(-P7m{XUpNq9J25zsy~!5=A3!HHF;b8ud=pUy=jAO(c#+fv$1vj zuA!Hst$9aVFs=z*gxo@fSi;_^Q()I-Pf@Mt?kkFz(7omW+Muuh>u$rR=DVnaf)O(P zhyP5$STcTcAk5{VA{ie!Yo; zIhnF2)q&lfJFs&$?JcH^Vwt|c`yNQK&&9Do!v#bazmZ4c(u#K=A3(-)LS6^6!lOnX z5I?y)Le9A7b+JuG-G7>lj2O}&IJv0Q#}BdnJx)n}soq%N&w{1?EMk}Du*X~i=!oDe z8mzZzSErTE`Di0K*-HMUx4*t8x8n@P-68f;_j2Z3;4LJb3g}CiZ=Ft2bA^AEL zt~5*)L?rknk8&e#=e#0^`rjL86>we z3n?e?e)u_i35CvbTsn`#pe#8+Q@OI|3qjML*6RIaNHvCF;et!I*nyb~xw&2>wkfWMtGkpuPBsjSEy5K<$bv@&}&)aU6puOqg zI4?W1N4pCEC*j&w^IoEJkDQ;5a8`~%Og->ZK#4=FB$_6L_?vv&)&6AJ;oG^R-M z{YuMQkP1ktao};4tFn2Sd*LLoC zTD7VIPB}CnQqaLl(;5gh50-JWu;uk0hD4$GgF#*uc>diofpmjnai7B}mL`b($%D!w z&%TTlFBil^W-%y-=ll7X?a04jZz)rux~}~Y6s+arH2yBN(9zr<)gaWK-^_TG^um8_ zl&M9J`d*_6;a6of4Di?O zJ@-(@Ptq+PzpXRKxG)dC`d!GSELFO#8aoHuLAB2fd!eV@8ZEEY2S=;U{)6z2Nyrw$M-@OCZ%>n_t z?mJHf97YoJ7NiGOo*Ga~eJb%+=<>{(z|_oA)0#j|5y+0BhfLiOLd}gTjU42)5cjwN zx{1iUh`(WmBFlbC$j*rv6LYiqi*;A+(pnXihHj#6wYcnDEUzH2l?rd^)`6Jc)DR2K zIJs#WXgGqk9(v_Dcg+_MaOT(rTNDsPP^d(8Sw1y+&|pL$n6NaR&fG7_zXNKFJb{nY zcHvo<0`TD(m76&R?m}t8e({x$QmJKc$h{o%K025?$~>D^nVKc_%RN=vbRnG$bho7n z;e%i26fJMu|5DHk=N;kzEz7ro&ki=&%A-XSF3bCR%+~@ znzRHlm}TEOzjEcRcLb%`eiyVba3CtKEZFXK6!ungnekJ0xn+%vY{fe4fvYu3oh+VX z15E1UY{L7POYt)h99)n#Nqso~eVHr8`=B_o^0 zr2)sped24zJ0=EqmHv${7dQX9R2bNHSd4jE+}_9EkEe3`K|`Nuzlsy(bmam_7jZfnN`6X&N&ET-*r z^tn7*2;G!^61u+!a!0NnoN9TT$J2I`buuz%#vj-2%-VAY(77=`X9k6SG=)#ky}DlK zLkj_^gc4t}%?Rs@jKdKf45iK3N4qW`AFO9fdXy*O3K5&J+*~b>5yF?q@xWy$Dr7Wi z=%+5;qnTr17-K6QL889)#yV~}%mvl8O8X(E6Ggqnv2e9(Y7TGAbkG2`2K`3bbdI1Z z$GYsn&k_MDM=Hh6X6&ZiFE^#_%$~PFsJFB=$d7^Xl~SE0VvqQeVNu-NwH=`A<1vkV zTunm!DqUuK)jKk+{Oq|ZwPs~0z850&!x@L{zBF66RU~bn@@;v$eJxOK&zsGKCwg7x zBEemCPrlcd;RI%u8^OLeA@6AW1a)f!F4{<^j|s?x($F%=!)QMes1uLi#;#yo)ERg? zE*l1QT;>O4o(x6wUA5*p<{Ov3v*T>y7GY@qf-X2@%``~YZ(^5e1-M_tHVxkdb z@*kM-IT{O%l;v|fn(zdMmgN!Wum6?%30j-X&prZ`t`gv1?VMGE08L`eM1ed55)S`C zATl!YE#^oiQWQ1|tQuYo-EY9S83txe5e;k#9%D*psYyJdSdBsrql*4Zg3>G*Tp};u zT~hi^4x|c%;j&{_J#l{HA~#pA*8p{4lDB->J#X!Uf-#6f3C#iR2bS#Jci&>?REIMP zPY9)BA3cWj0n#upGdr=mFidYYPoO<^%^(<>YOZDpk|>u{#T|tGPT}j*vM)br=`st6 zs+#nV6VREMEwCpu0{hO!Pv+V=0YXoxy=vDe7=M{PJs&B(7LNtaPXd$2Dl6wJ-kk7` zBxZ%XeGR;QMg60?7$}pz{`^0dvPTQ11hp%9O|eB!7Y?N<#jST> z`ek`EGng1fYO4a$t@LZSpj)$AtX8$^Q{@&fb?Ut+)#m|$GmGfvS^h+WOZr5$ceX$7 zw{L%X3iJnChTm+YXUOSP+gX!rxt%7qBS9?dQR!I5{>CKVDQc!TC^*{xV7R;gM^}Ol zfD;zw^m!Leq_@60$n3sx8oJRR%Ms!<6SO8$1G;drVx-JoYI6s-d;pQ03bhGb6q_45 zDmMG8X9v_HA0KIf!K=AP#e0h8u|yok(!{=7F{h7mpV^9}9d3xmI64!q7vEPs;dfZM9xD$ekI)~97 zxZjS+C*O?wfd^%vG_EZUJ2I52dHspBTY!iJQ;S=p_sgjptjtYTL8qD5n>5*HicuM^ zxd%ap3x10`1!p6TJA3F8q=};My2+N@3%1F|wBR$vv*-D_ZE9%oineW(bfDXv(*x1{ zYjbmKxra!4bXS*Ff2CwB`Z(acz9mNU-@*#xDvV*kfw_}OL7C;PFOlP1M&l!90JM=B zIu}lg+JDi``*6(iR@dDeRm$P^y^6<;LD3c>x+%$=yAg9IZ|gK$dw<=F3*cJE5jO_%?FqS~2nEt$LWUCy_F#{_n0xroKJ4^f6^F_UWS|RoUfEfyHSvCypVi`|7GP9vZj*b#hU$xu=vk{^#rT7z z3_JC zK7h#&b;mnBU;jCQ-@E~_50!x1F4X%-`kt=n0j32-MjPzx54|KlQx+YGo2jwuY#&!C zn`(4(8O85T7VDtjDg=IdBXO`RNw@W=q`4p4jH$nuiLL*Yl32wFcc0*rtVteqI zIp|DHzP{8m-#yeN*4zJRsHyz7Zsni><2B;zz+cD}B@pzlXMluUHw=J(rLzis4KJ2- zRxkCrhTjr?z2RbY)+iFf{#T4NLr?J(c|6;8Jo_qwzbXKEJy+KLu2X+H0>x1}CL$4X z@*NtoS`lhzS7cOS>XI-RO1V2fcj8qQ(C$=y6o$+0xS?;p)ru<@0d$S3PLKha``#lG z-v^P!@2|T3N~@3r2WgqJ9kDZ83z*t{eHz}FSb>}I&l_U6%S7z?QP_DmDoIUtc+|?o zTg~`6qIAn=RSc?I^&8-2BHA@LCpjbqW&xqL$D*~iZ>;>@n6L)r2k@e_Q;>maDYBO} zf2W{QWX3E)TarxKKuY7#pvJ){#~$D^IvbcC383Z8^D;=`@bxp>Hiqw{RCl^QyG{MV zCm->Ma;Mm7_m6jA@?<)JX`P3u(-sB3KDMap?ykfZ>}Hc-VJ4t@x^?AfKD0JL+B_tH zj0*V+S*r5%3o%(=T!5kNFOdfrgM%;ArFdV0DTthg{Fz$8cf^rnIFvKqO-hlE3NbF2 z3UqDSC3?obnC}{&8B&#yZPDk!J+l;oTqJ9BjN`xFl5j5>Yb~mw#3lIt`BJK6Md8;5@#bqxot% z>vpMOxm*ZB8Ppb-N*hq}|3J(;PRz>8>bt}15zU0QDZSgG4p+NX&HI@{6Kqk=u?Z|@ zKv4&6QnsiIv0SvVb-zQJPA2uhMMT8nY06cRN^~{LC7r{XQ+VcbiFT)dVutiTG2_x7 zFuS}KJlsT6kfAvg_a2-OiQL388H8L@#mmyKs((0I8<$kHnaGbl)6JJuF& zqA;czH3JRtI}`Y}a~gexiSlBX`_ajqc_Eo107s06zzCbJ4V)_cx-n(+@=VLOvZmgU zyaRu!kqVCx8MiEvo*Dl!3vhO#W*$+~Pz3V5ckL)YSs(zG^m~MczI-~`m?rDHD^T;K zPg>~UubhZ^koZoezj?AQ#e{*tQ!s~+UHoh~@L#*?wdjL^pdT$}GD6EY-@%=W6K3>))9!0=IAkk-B9>4MF;bVisnfqUE z&<|rlA4+PvItgLnIx+vx!o3`=6yFwYuq%4Qs9d+48pIKt=@M1>qVmV+N!T6Z=Na)tUa|& zsl025pZf^%^$SkPL;lG<>LWo}m=U#nha;)clDk$M55k`C9{7qiK&$7(o^>b5=+>BF zT>E6|9}fZ+Q4qm|0k&(IUYhxKxS^nDwbwmD8?mANpnK8KJc+7Y4#;jb?zIHVRmg+4 z8p+Pj$KI6lKd%`>jn%o{gRgmtbjjigB;*VUbGLS^(4Yj@55vcg9hlV0Olwd8Lkn^V zwb-NAz_Cxq>38makL?x>gA-Yz(Z@8mLwM#3F$y6T3ZTI(4`S zP^3j(lNz_m9T1FQos7TX83Q2pIRR3Z=u$h4Y|x@P$$j!6@^X=y{t_K|1+Z)*b+Z+J zPYLZ@*^<*0W21&n?~rVXV15DQU|CQ5@vj<9UjmD8{h*QH1l?%#7EGXE>-Pu9LP>(q zINA_fnzRsP7kwa&&fMAY2Gm^lCJ`2)eSp6icM;yK1s*Hmeju0ISfaXmP1;9SNF`YG zS>XQGZ6T?b)ClW~pMLn|-R>YuJ%aM0ANo(9B_}hQHY5}NS?FsAY@AmJ*0Cu9OfoS( zVf3v4Z*}CQR|%sOjYI-Uw57h_Kv^po)Cinc)k)XmJ$N*7+=d<;*Igjl=?h)|8>@w))e4UAxI=qio6%94OA80k?H^N76Qa z^=DbrP25uIyY(u!HmlED0F<0Q>OmNE_JL4G%?v{62|vBVBZQ)jjlwh=6x2ej6Y05n zGrE&r3L%6$uWQV*6Tq&ZR0Ku0B^exe8Zvv5DiK1)ODH@vs<3d(lJRiI@6TBZy^Fp~ zD1R8cKUe^6@73)D7q^G~8D81~4#ILT3Qa%cR=|BPgDarv>*Udvy!r`=XJVx1U-*9n zj`@EzDFQSm@Yz@KGf5=zKH%2|?Toe@LK}jofXdm&NYr_4q6xetm(A>{qWPIhnS|L4 z{XWKznq?)9Htl4&G#kJCd)i>qf?^Y5APJQOZl1i6WA<+PfxnR?vZNSA@E-<8%=7v1 zkd3E}df4FjL#f3f_2JFc(wE87b(hS4iXnm${d3&Cz2Vzi1iZY)r3Gu{W_K{=@h1RT zr)jtl*}}`5-kh#tLGA?`Q#Bs5iiSVlHW66GB!bVpk`fbG2x<387dL_kc!6LaA(Tlb zU+GGGqE|AQ`va9IQNiV;xo7ljD<2#M_4o=gLqywO2(Lzg|Go8L3H8qL>RU0WuIlK$ z7jPBU7W-cwe!Zww5)zqs-T2W`g~0+w#!}y@jk>8zKQVCaV<`?6Y=tHu$4W~cWYkN74E{{(v85arivo zBM%IWCM;}3(9>s^w$3#dDFaa*`6!Q>>d|TV)JCyO9es1lz1LzEwu;~&_CE#~73ExJ zP{N&_wzsp-SI~n?h@&SQDl>L=$i0xXvDva-n1Bi+Y)2sz-Pxzl?nw?-M+VPIddS$E zJvPRl2ITk^u6!?utdqGS@q`+-U(XVRdJ3QuOlFQMo_i8qMn}gqrM^Gz70t|apb1rYCZ#W`3dRqL!}eS&MgkK3h4G55Jl{+OHc} z;MLlYH!=!%VVat;l`}%BIiVgm_Vx{Dv+LolnzaqzbvFNRf+ZQ{7J5#%u+z$8?cd|kNZxJj9G5r% zr*kYSduo6wKlJs^X`CO_GFzt2eMX0EOgC3<3|b;PNbt0nzN+7}B)DKsnFt$3i0t`j zM}taeGY(pCSLRv26T!MP1JNPO(}nlWHT385wQqmZl`=&!`~}bU^^n-dfH=Hn_2o(5 zuO1VHfID+^&dyZ%VKp2wfmp0@;Q3I%!`gwY)U| z+wknP@IIzV2LNYlrMA;r4{(xaf7<4L6O7Ba83^0wAZ`q8d0l-*RlOH5^4g+)m1%k7 zzt{aIu@xY6vNzLKlo%Z9Q6!-G4#8Jm_alX08-Xl+!ok-Ygj zX(2B`jd)6>RN3r#s(Gqm)7yL+|=+Uwu~~)#_jc zJ4V!C<=~$VR&bpefDHm<+!LiX4rG}1_9S%#HQeYpFzUweUz&>83*8Okpf;hWM=^e( zIaD=<>I=8J!S0$pV3rNFDgp(sHaIXMfs_q0$kbNfqd^h!8S{UrddsjXyDnN-MWm#= z1*E$hL`oV|y1TpCgo1RV(w$0ohjfETw{&;+w>CcSIp6ui=HiFmd);fzHRc>+j!D7K z{ig=bKKtj}0lY_B@w+)ULpBwwS;E;}PM*Ty;81)daO#f05`d{VUFRx%k253NKy3^9 zXHZaeV081C_`0C;SVzTx`$%;t1lC3KifuB{3M!K zjBteC{~k*u4ki3>%XI|ci-te(yOXJD4pESUE@(KqGTtUk${f~fquT~{@VvXJ8h}wA)0vt4RuSDV^=nLO}?A#O8 z!r4a?VN|4m1ToIfa{El1Q-U9pnKa*Bms=LnL zEYnB}$T#)!*R;E=f#}G%3^6w%rRn%WtO|wKl2(k>ZM+*;N5Oy`WdRr$gxe)PSq}0_ zi|IdzXdN^!U^&(~=9DM`(y-|}LO$9tEi)lu4x$ye_;jKc?%<%a16B3GVg~4(8+sQ_ z46se@b3YqX=$3eN*#W2R7j6`-@ zn-SbgG?HLfF#!sld`J!O9(Zba1JbI(sNkEG7Te-2l}#6e3pM*U974COUh|MsmWRcQ zW>bp4Xa}3U=#4g)y)L&L&gJUxzhYD0c~_#P+jKBK=K%^`$lUzfPb^R0UWipue;8r6 zI*Nv7xdhDr`h+;%293Wt%-AGmm{U51YUnD!Yo5|!V0ln&+dVy146e4yVqFk9OIIwnY}{44+7iFwOU9K$2pDyA8Ktp4N!R7 zhL}Cy9nuQSLAnDmJ%dQWAlsCA+!wGqD(4i6ERkf*%Q%eZmQuqpUkfimcc^}3G-ddDn=(~<>S3!S82h_%RX)^JlZKVNcDs4qw&aG!EiQfId9B;hz)0?L67H~`> zm^QM6%eRlr!~a6B5!!TxjhBDO zg8L^PiVz2mU#Jei)^zuL6NT8y{y_CZ?o`R0qO5cXP7d8S69oTknm_{oY^Vbz_Kewt zoYGnD7B{3scdULO&h0U4ara5%?6eURegr#DYF?kLt7rB882ptKeGV~PZo=afR^({DL zq0S!&<;$$#tvMuIn~Yu{Z>C{Hu11b$)xIuo@7(t19V;gFNx?0coGe~$1}L?wYg@_= zDRAYjFnY-KsX*ps@DBCMkRPRHN1@&k4UDoM(>gOz zA7<9aP@wZK(FqR%fUsaQ1&*e9M23nkb`ZfD3fEeikGjmk#0+wbOn-X1;DKPrALs=a zmtpEEFExPi|Lm7k9(>{6ixQw@!crC&ATqqZ5-}!XqZ`kC1f@2#=Bc^kaSa5-) z4*z#3X`)C|9XH#tRBJ`d}#qk7FkI?F8}~-b4^D zq$Vo)@Hx;1LTsM0KpaG)r${gWa_`@+kQViuTD!X|58$;`k#58* z4yf&IYO9!ZTLZ=kIOFW!o0 z{d@s(;12ov%H{=x9u^iJ7gN$UM-LPrq1n*<#oX6FAEclxSUA!@r2xgJAPn;2kEcU| zz=W6Fa60+-1h2i;3cyVyN@9O3u6EyTD1w455G|RsM1+jPsET1Hv`bqfP7=@5fHn7f z_bdLuu{_z&f8f^#`KsB33X_?lG?k(l@*N;j-%~L{L3$p9Z`k^V#bme7viN5RKL6e~ zqX9KVC(*xDkGcCFs55{|gNa=J?7t}m$dgc!&MT^j9eL=+?q>D~2sV*FO~xpHBk}m; zaQ{8|FY#|c&@?VX1)-^~(_w3cN*!_mtT5?~F*b+vDvDuDqdz`8bl57ysG}1kZ^-pu z#5_Q19~Y&=RLtD&L$v^>RBJc%>din(%_~ZiFvqSl=l26@=KzH%)5ii63XoT)Q5U1b zqv?Ce|0myAiNv3+H!c7`3yEFJHs|x*wKyVLan1Y3rwvZk&rHA+Y|li7rePy){{a&g zXaEbRL7?}*w9W)1Qa5%J7%QX2oB+DJShxTZMen4DCI%9NbkRZ5f*PkQ#0Cw1Cg5`S zvj@eeQ0I5XdYYr}5SNl0&(md4AKYM>l#~Je7NP_3n1f*70x>x@Av?|nU;@zCyL?0c zPt7$>SxVNH5*L$tgdLK++3TekRm=N0jtF?+2|>Xl4EtTICVA+Btw))vKJuZsKmu0N z7Nw}|lMq+Xe}WY$=JHoDG-SNNV6N7vP$$o*Z~@$TiR40xua*DLCXRQ^yjBfvYeztn ziDg6$#}Bm_VEWTug}cQ2uj4P8)evOq=%^>&7dG<-5PExJK%$np5I&wEsnY?HeF$EI zt<~cG-cKrimkK3GFHPO){OYFT@en$C2{alp_AaNYhuKPXHM2AB1$tg@$4NV9>Wx{8h>23 z)(|~%skV@X2(Zs*txKm~FZX6|4$>(vFK!~EO~?e0M|<>+q2Ts|VuIuY9ili?3|CN5 z(oBb6u@SgTbC70mR^EM}h!i?5!@UvI*1`M+Xs#Z^{C#{``XP(;^(g_Xq0ddX7kIeV zc%EpI2>MCC(go?7`Pki@RS$ZwaKvF}DYh-v^FsO^gS_CWzL>fF3;f7mLTeG}J^0Oj z$(I?7Cn|3vM3I3PE92q9Eu$)S5tG5wVXw-ZuuG=G3~q(a?GYFX=w_o4f8V)nj9TV_ zwyxN3G=%OSiunrKaSC1_(2t;laXbu#ExjeVvSl0NO1kp(1nt+!;G_VLXmr%cr{LUf zPUyFGfnlv5&s1VI6A00$aT(%mBh@1@A#RWl!AXvfYOm6NHAjLc9vI=D3%gWFcbY{2CL58`pLZ@p3Tue=M;05Avb=nAU?TYy*# z6-viud*8Ae0wb62o9Z%lB7#?|4E(|@3SoHODiRkW|J$c1|Msb1yC^HVs(zEv^5*!B z5j&8n=4Z|)yF2cQ)~gh$e3crx`2-Wjh$wg6DF#NKX))u6h?4W)J}z{ZC!0!1pt`1x zjjG||RktuG0737Ch>+c1893Mll5qJWNAR=uSd@#KI*GSU-EDY?3&=#*~>`G9h zokB#z?1}`HlI6(Y4|VaNAJadUy1#uSKa02?4;SGX8O%YP~Z`e`OgG8lKcUdkyOTO zmaH*SBM{IP3Mx=vn~b2!oTkJt z@rQWl_Pp1yVD#H0Gmly!>H&BC|3!wa(Gnk{0ld2{P{F{XZ8l47%1+Ekc@4VPJrim)V2auw?ZW)17xnQB)jQf4v89E{DLN0zI&$go`hu z<+6j{L3N!5XF?ZUMry#wRiSfx90f5=3563>o2e>;bHjB%1%WCEkRP~#tJYmyyss)& z$exEJ2!Cg>Ceq!rt8gm542oqUcZw<<&gcNG$h{E%Uob30h%mc8ueIy~lAD<$2G=6! z^?Um7`W<68rlw4xi3ARj^Ap%46YgetTgCLRj}&zo1Yy`{J)qOx*9U#L*p@??D zn~Ou<0kE%J<^l4E9t!e2Uli^I;VuS4)&Fy9x#w8O%6-0@UGqF8*B(&&4RQ=ofEh*O z&CUV*JlTI^D+CJG|4KRw(ohYum2J*a`_Q+|tycR)U~>H7=#Ru`qr2m5jcLzcGG6V~ zw#>w=2)@1>>Bo)nZ?JP_>ecnt#_ZnW{Sj)zAhtjw&=v-|13QfMMmfQ@*IzSTyAAng z7!w{uphx$O#$Fkan)4u(&{?DMj%d;Nz*z}Kryu64Abbe4P`2>; z@lKzyH(IW5J)?eU(8cpm-BiZNW-`#(VGSHgGDGnT=ox88=QG|FyPWKSb1qNX6n}chS9uXbSe~9i04~g5G)Z+r(S?rjrC+L2Gp3l({ zKM358HrCK$$Nl>vJCu&I)-|(5q|_R})ijN|AqP#Sp`A))9?)z3ymm-4Dr`In)a))S z>8( zGY{~sstwrT#jw2 zTrk%a(5B8OrD*7G4Y^vaeRJa_|RF-TbH{g0|2; z_Te@-z`u;LxVhk{!gCAb1W?QgpYLvRf>4AB zgcl06s%BmiI|QgVnG{{!8!xgiz9TXe#&YGdowlea@oC(eq80X!&K*Ds)nOS-;%0|| zOEF0F+L8gM5?9x=?CQ2+cyG!ZuvjOU+3r+x3LRO`l%x ztY@Jva9ht-DO_E3qWD4u%{z)a=s}zvjBfL1lbRWOEhoR3Wp5w$?hrf&O|OOTb!kGx zMCqzEFwKL-Frl6;PW<|FWy)$!o9Bsiz~cjyNsyI$wvm47zOpE>k4Vtc`rQ9aV^_ z7Sx`Rtd9O(pdz!Q(z?8{IB_aFpYn!{ZFTJDhd*OZ z3N`DC1G>#O`~0-3I@z9A$1_TNb0#nG7Y^W1cH^>md2=6HY=72mq{Anq#^!gvy%qQZ zd7C$+o$Y-G7j|IB6xL11@|QP(-8I$C?c-MfmU>hj*XK@ksL07PWBkNP!3V~Zq-Ex& z+j0)`DaDCm-4a5_lZ`=4W(5TVC$t!!Jd3N#&GoJ|8C>Tq1VSoR<_A@au~ViaLK6S! zQxvnKsO;=)>Gl_>J*Y@Hc#(jyoRA2| zBWqz&h{{X#d>h-zJo#b5O%M_0fZwW_^T)#{t$H^R$pd4fUG^qPW_!$;z5ryx)xL3h zjA^bv#fr1tr;RIBw6YoDeIznZ4ekQOwjOpXG~mnMWRPuaDvfUJ2XR>ZPX9>!%#PBj zy;!?N9)(zl{JY$+lu;7A`7~SUyJ3ZK$iepmAFWq=RL)%UfMQAh3RlCUeZQXP*9LGPJ}B3 zIXRsOOT=pm3egi>2ZxAWdcVMTwxd334Ri-^OU*quWnq#c3kp)C_6EH%_8hT$XOp_4 zC1=|c<4Sx7VQi-TYVEr|jyQ_x_Wp=ShDL~eF<0BVj!s`bmMZ=5T;Iw&vsBV+XDZi* z5R0qLSJXE%vxcB0X&Dm>CBcS|w_lP=UMY*=#3o}(8g|WyiEXMz;Io%F7pRo{iB`vD z*7^2n9d)axaJJW{-HUi<`Tp((%ystI;5XTAH5rUAa!Pup3A-~4n^Zm3;>wtXY_FDW z9J-#vr-=}#!}5&N{6qOY3B`-(*_FM$q83-KFd`Hbl;|(tTeip|C_{1kEAiQ#oXF78 z(Z5?UT%&=HHb3pK_aVdJ;!e4ll^&h4GoKCbv6pgMt4COD(4%QCKbil;UYap>;oAq3+*}waqhaq zW`A)jC!aPbsB+^f;myoFyZ3%-7sP6@6h%%5E;!#Yps0^Q1^7D;=f7(jb%uym5BS~Y*sq+Q{ zR@kbGT(+suIz+?uhrZt^LD#mvsN+wv zp}ySpdh2(w^-nsFO!(l7oV9zx@jHEUY@+3{iyYYfwY{0@ai)_-NB84>O$uX8i)~`! zzpp?9YWOb@G1aSv6)MPnJ0kV^(eiLvfpAT_20!i$Yel8^l{g7$$|y)dtvCtA74o%- zC24`DHMQ9=FQU6bFgiqzsK3`*HTwR~$_%Ko8 zide$E5I6NjJm~s!q1F8J3c-=RVnw&AuD!ZL2S%JMy3NUEEzK_zWSlyd&Zk?1@;uk8WovQP}4dr9!Q z?&TjS-@f#>aa{NSjTFo{UeFJO~IuLRyoFhkT z4WlIj!PWN$v0i;-+yXzr-$vCm^1c#lg1pU!NURj=6&RazFjp0ZKO6roTleRoB1e1c z6CyQ{`*2R8^w!oWXF`k|>)9X-&C`w>4Dol3%&aq56!H+Ui`pWApKZS~@K?{(>YY`K zw0h@A$jQmM74^e{k1WA&bW32Lt&L2nZB6795Dg6dL8q)R8Hx#Of}GV?C>LocgZ>1% z@AL~4)Q*mn^!%C*5hUNifGP!2dL}TdI)?p$mp(c=+T~%P6-GC@@{|~Z0E5ANcGP&4 zu${7Nz3$BjIsHvKhtHwNPtBTQ`|pS_NzGEdQtwAjNjArRR@k2fbd&gK**SSEG`e5k zKljvb@ThuCMHw0w82F{eJZmxqwv*Jy$A{K+54D%qMV76id~LNC)4@m1_UFgC@+0m2 zr?5qP{4N$7DJ@%fmdNwoX`Wmn+}lD)JR`NzA9=9*zkh`lW{erlt(rf-Us5W{_bz7A zt*1HLp5!jBhbuJSGXKf9k9mRZS@u|-9D%92o2!gty{d&Sn%lh7*APqsNM zt6HM-UHUs+?}YX2s!yuN_H`2yxbk~i{c_WsWiMiL<-FEX5wXK0wU7?_zcD6J0urds zZ7T+c%>J^g`*gz|mS}2ov8CmcRqL9odg-7Io;%vKON>og26-Dio47@=9L((;` zo3qiu%x~7SM&sL@Y>w-)M@Q$)<|jSs7K!(D;RM{VmMyy9lUKT5gVAfekoC&TvEr3u zi60!wH{@VKVw{=My7Rr7Md{n)=RZw6_EWSkpIQy+e?TD|4U8oE?uCzEudb1m z>sn?#RyU(D3b}|B_MVh8pKTfa^mJHCXTkkyL-@WooR5yplgj6Qi#k|Ajci0Ia_*Gm zZN^jokDkQ@oMwNyIzKuU*u0xdw@jS$((#CTa)GT{h>JIWKK39$35QA?TYIrsp$WqX z8w5t__Q^1}SZQU0WB4WDiZ6vNuk2{fuQ>(*zBvq$ES+tk};)cT3CT_*g5#0`}j zTS^Dhcr5E7ddok8N)FepIduXqi`DXrwND$@{fl|SQT-213?;yG`nJ)nOvc;gH8iFM zK7zaVFCU_XjC#=OT-HLsoE7=z2m8-9%djT)bAtOsc&uT zh{X+kMO;l~?vvT}6umrlZ|>P_lIOc%<%bL?D9h!ZE6C!acMVv{%1_Asi29ATl8-N6 z3L0u2z6KzZMA-tXk>bRXheo@MkNF?f>s_`PgcH4+jJDVW$M+Wp7Ae8q+^27N4X|zf zNZ^IB_^2}$y$ridV5075u8TJO2Wq((AUEqBRXB_O><5Rh8XU6zx&CZ**5^UfWp9oQ zCe>%5)*>JR0qgxyUHM)-jWx@*rJp(SOpUN;0}c#~#yd5&+I~J2CA0^B8^L2@qr1ZK2v(l-MjZh1`Fr+j+a?F0e7=zIi9e{%49}!SsrqY5RCvM@@0<3)*H@!%bukcfqDdjqlSCoem(ebn?P|q* zwbV_z7A)iyb^xw4a@Y6!iT_2f&O_2u!|t$X-o=6O#TDUAYT4U4W5?+-_0P%4jvL3> z(%&JJ3>;%y>>FiU;da(xydqI8oK_x@9tU1q_;*3K<-4jW<1Kb0D z@awsm>Qx@!iG;o1R-`mqBhvJIZ8OV+B8yv6&v!x(p1u)|{4Tq-N5t!;yQLEue9~~d zh?j!TR-@}y^DijnkMnZ!%&A~>Em|xFqK=`Js2^+;e&4mFM(br+>$)DGxTpgJGDuFCl;>f;|pFk<|!oNCSIlrfr`#x=*?uyHtK?zlup`_(HpW}zFE`O!sF0b2W zluhw>dghqYWp3h|00DH>Fwb@x(&XK)c;bRtJHmq#XZ`FRQ1)gToQzb`sMDez zlFm>Ed3LVeeIx4WV-w8#>5=Bqc#)Rvv)KG+z-hQpXZ}NXNCrDDanx|azVT)NgW15; zm7{5nh+jaLGTlojk7ZMgIk?{$R!#R=6nNSrwZc`AR`i5iRM_!FM*LL!E=wB(g?pRn zox_Z^EiRi=y~gT(G&aa=^UTemOzSwv>{snH7?h8hc^)0oY~@A`XxQc#lZ;f&hEU01&uJd~Ba`r0c^&ss7S z3*}>NK0I&7Df7g6niV+p0Ur z{Cj?m<~d{O>%GwnCQ&xVFPLQKn<@TlE~ql>f`vPhLSr_d_V%rBvY>0VSV^7+gPioA zVcvb=&rhE&PYyWGOHEu%98P4s?>%kAat_N`I}un8*JnE_`Fc#uj+0iZl@C$bi2pNN zs(;7Fc+zXddqZdTEcp~ZjW>9};Bh|SMc4JKQP?DJhD$8uuHo#Qyq)!L)~#>{ z2>>6d13qT>H!pFz|)1s@(8CG-umEh14SvnVMIhBycY>ciJcR(gcO-Niknf)1Ponl<`I`e=9%~x+JPbM2z`4YHBt@2Mj81s0rm!)PLd`0ec}5cM)67{2(?j02h@4>jkt0KYN#nWLQYVfBs#3Ph zLZi4Y-0H&Az15csbd>bn;eoLW4gCzYK;O|s=bb7&5R8wfwUiHATM@BrqIZG>Xo+6F z86rc1X0gVY-3`#}{wdz#iBX!+q@=Ze*h@AdCf!=QQ5sUyRw`_XjBgF+fvZI98~J)- zgLj-ww!8*#Nei(I30-oD1ge9j_yP8mG+0(MjpCA8`a(^dR(-F!pBj3Rlk@at|9D?* z75gD?n1`s~Vj>8gPsR3E#huaqt*x`)NkuSbxFiysVFW`~xJr>aeV%+uj6Csd|9F9_ z@&5&!F4Ht^65)h9G;dc0jCL1G+=YdzcD}_&+v3SkIt(tU2^z8MeMGIFI!vH)ppqHt z-LBdpiokC-g(b$MG#|jLXNkHC;6x%k>9KV*wi*8a!7nS12$EO|$;iHmZ`PBNS_Xm) z(mIGj-96mxwf%opieA&x%XF8ckP6LRqOgbI_YV!ltWZb9)m!B>ARoYnop)TS8=)-= z>3!ZH6^3KH=5xdo8*V8>i-e}fo-jxsrDXa zEEGlxSk~)N>@VXtQuVZ)$ zZtRd-+iB=!A=lybq|7w9mb|u+ofvsH-{2HG-*92}i+3TeN2@l)$6Mqu^(_;EZ&UQi zCpjx4F1-(jHXGm5MUi=550ZNRW||^2JVWaWw|XJqDpsu5%iFs2WRAXY{E)4vK|R6Y z`qX^1-rG^6xpv9!i9>gJIjS@WT~+VGIs29C1Zmt_cpb8d_&mij>s`MiUd&PKOxUu_ z=NI?(a0m2rpKL6i3u5uos~yD1T3Q_lcWzJhv)9!nJ{W#>F7V`~Ri2inL`W@xfjjS) z8a)YVYdIUn;kopkYu}q4?QBU%b6KCW8Np0Zvz#m%zsUlq9%F*zaqM$N8F&qWIp59YVTNU!9W^9I3#Fybpk0 zg-elEqmz_E|Ex_aIhF^gxEyyFM)of2#%{+~f6ld>_-*W;Nyx?Mx;sS%Ip2+C&y!!9 zmGYB&Z^b|%;Js6A4U&iun|go$fbAczt%UOOa-;#kNM4xsZ6TGnf=nL9XpN?!i)>9{ z74C1@tA_Yb5L-k??}038Y7TN2&V7o--Buf{1-m1>kF@zhTxp^{>hrLyH!)_XxTHyf z5cTGZyOqerGo6uUFSs}_6Z^$hQ&i%Jr;H>qpVkMBJ8cVA!35*_7eh(hCBNicoXCq5 z=3dRd|KKb)!0YjGzu`crA+r_6d8aqI&e3@cFGP)oCWGRS$9(%q_=9jgmQtmQ_~-r< z<>HU(<>eJsqodVk>&70bM~;eiis`$;QR;dlnDZ*$-rilx?6MZ zX-1~6zr+O5C0DTM`K@}E8Wu6@bH9@2A?$MQ6$7oWlsHVvhUsF0>lFVB@>;9k3v-os zO3!}S;>x$>0))Jd!Y6&}dDk)9kc;CR^>lS>i%c*Rg12ZLAZ!>IL3}nzGM+CbKUDUt zy(_C;cz`L5ysg(g+0F$^CA`d|F(`H>;{FCwM&XqxnDEb4`s2fV@X!A9Z5%+t^25S0;s% z5rVN2X4PV?Xum+zos|?mmp_H9mQ99+XF>u_zuycZy+v7^blkv?OjMsRFD#4Rn;}&F zS;}znBXwlNW#^`SzTQ0d{qUybYMgP41yzK#3js>*-wiAx26JMJ{DXeM23K=9w7>UP zib#{j2+Ll%5+ey;X%RFXe(C8dY(f>Pn=iksQI zkn?00xb&|t@`{c~O8qa$j=k%hx9A#N_M?yqzgDs{@Z~o|tX^4z%eT)gj%o7oBiPoTJYap@6pf*iLjLy?^_SNiGSB`P`2( z`*DVJ@lP&sz*s?vDY@k@izWhvrM+%xSOMol#c?J4BrpPWGEV*YzvLn>3=0$#$S=Ax z!7D+hHCj=NoOxTy;qZdRrHhNZ8-GCjsczkHMg7MD4ROz;YbiCg`1ycf<59va=W3hz zTtZu6W*sX55192$!$Rq#>S(6LY*%jhl&%1af?scrj*eK16ZIQM6hhd6`@F^pfiO3}{{3&fC97_IX9@ z1RTVO)>P5!LMS&nM&enqtV0dKC9lCnMcMm#fI)j!)KB#FYmV280^j-lBluQh^^I`& zknKxaX_T-U?SDVHNV(;jE_-2swbr$2#OrhK>q1TzH{>Eqd%w$b_^GX2a@>L&`_~as z8cR_$puJd%Y6Ll5hrxdo*56V8#o&5=NQKV&@K!T~t6H4B-%QlW=`1Ybk9}6PxB_?^ zMH*{5?!QhS5D-vsbcKcEJW(n!A%E$Qhad+#g7qvEu)*M3HVcKSV&$)?v?vu30JIltrTsq-_EE~<$b6?$CW;uZ2y+LZ-al2q_4F2(BXMA6 zFU;)ii20wz-0d5dbaBU@sx=WE)P-Z+rBB!Ul)g+kEmRtZMv#l)YS<|%e)egZ{ftrt za4T%YxFg4UaL;&QHy@K$We<2!`<1{y+QL=CH0kX@%G(-Q4UK%43M>-8}rSY^CyVx z($zd_i#Leu@1Yc055Z%y|M-oK;PrN2%9G8edN@;B@!fk}zYN}9P>$`S-t2;t*imbL zv9w;K*|8(Uj4Ypx&ge;g*LI+V7fy9+HW%#2LcD#7p?Xi$tC8S{?$7rS`PXEHsn;pSFsH!K22$){M}ftVUA57pWY5?=dd;41T=*$^HH$o{Pt z`f59hdDa54*gQoojEr*Js!28QEX9fHroBd_0za;BgqiQBZD5=RXR59usQOWxQQZ-z z7={F$rMVYNKdaA=wl7(l(Y_^Le6|u1b>TMv8}?TO2a9VHtnYTyMg6K*urC(yq|~i< z6YPIVkqEfx=Bz;#u)@DS;aq_Y`At{+qZW(A5zsLJInHfY*b@8h#)hd@li;SC=u@mT zIL5z86OM&a#WW`ANm)KE-p9SBn8h3CS~n}G+Nz4T!H@^R!QnpJS~lE!|=P1=_(I0P|8(-*)A` zvjcZ^icpo6hoq!nVI2mZ{aNB*P?B#5j+13iOlz*O(d@eh-*8HqT-V(+quz4k>~ntS}T2mc$At>+AYuFlNneb}Iy#aG2&Txe;LklC#ClX0Vmj?bY0s^la&&Ff#*X@usshT`x)i zJz{5sgvz}|4VtH=)k1#@s!wI|CoDxh-RF%6G2wah=|<{nS2)Mwpwh^wdg($|0Zt&p zz{Q--%zUqbFu14Y5lo;Avr@F4-!pe%$L55BmhKmwUxL&4o!15LiDMb?-!y;Ds=Ef6 zC%`Pb$F!MkM!g-UZem=vawC@b`0GR@mYcVA4r?JD9jA0Gad|AI8Hv@5;<^gI(snX% zp2FTcmVLefWf!ycr(AaQ3C*ta0b)N@s`3Ty)oc^E3WltIwyQ#z4l?C>qSWQXe z(RUDCe<&)twVGV#f2Vi;`YdUb=C|HSo4Q1V+sUxeD}>0;WjFTXDo>?3DZA69h&~pDNMm2@D|B!>ZABO-nMG= znAEf*Olk{OG=Ire#Eidw$n{;}gxe;x&qmPy>>~mmC`J+@n4dI0#UZwjz-3p40HNQE zYLj5*gSF!JU|ohwqxGy-JIsiAVtEh>^I}uu)7vjarN0&HJkDIFt0?Ac-7CqNu9_uSUx@D{Zfe- z1MJ55bN<4Bf{4SgAogpoZh5eV_J&=Xe7ASLuo{OVPoMFMP1qe+{`rvsExk`-(rVGmSPSKc{7&>G^fme$IX|@6$6@GyzeRYl-ct+Y{ zcuL=NV_(*rLQATt9>)j?5A!Wmm!CY5EMrHE#`BfG2Elh{McLp=U~yW{d_3`vAQmpx z-+)6k36-qMM+t@Cxt@ZuOk!QB<)pmSTs*^Cf83;^%k2a1ZRI;jbRor>R2epW799A4 zmXnPk3o>eU`VXK;@KLX;t1CO(vwQoDRq(*g8VZ@_8G(c(41Z@LXGiWp&XWm=-Q=Zs z@S;jd427hl)1Db72^FK}i+Upld~lPZdWs)VUJ9Ird5iUZXU@A~=-I>PatiX~G?j0@ zpewZRCB$_0{6Sfh7ru33(V(+HJ6BVx^S7>oI6AOu@7N#7!#3P%R^t3X_^;hSyelZ) z_p8uZqUpr zco~ohxQv$a&^W$$?!F%Lg8YFaD|gN&E+AWtTaiF?g} z2WG*wXZ20S_U^P}{pZjqyXQr-0S#IGWH*1w=EbT9McTFwpvC^J#gdYjL;^j4JZ4jK zkVi2wonC|dryApUcrLDKspdFQs9kWSOFo&cte1`xs$J!hzJryZX1>LLdiZ3YvVR#9 znvq{mCqhdXSf%!nOcGdCjG(46v|O>Be}jbBp~f7szB)y$_ofUvke17Kft*zk($lA0 zz^REk$#{4dYel)5HSXY`->1FgEK!56V>l~IiG<~5GL-xi4&F|9I;wW0cvD?%GX}B} z{*dSXeseC7)$qlnJJ|XT_>V85hc+`ai_?sc|Kw9dh6p^Td?&~j>VGHgg7=Wz*F~j0 z8)SE7wJf%x1exOK*xD@I_4D|1r9zDJy4?MQYJMOrEbLppasj9r+Od%k=6F49_^fuP z;cQJ+DjhUi3Rnc#OY+=BgqN?QNVM~6dZ%!3T6pl!ed!D~$09pgXn#S>HAUX0A(JvA zx9| zTP3;z{$y*O4X4)U^k7lfTcc47%9(5PyN=l?5t00ATHWE*-Jybbr!mSYXO`2YPtK3pLsUdko4bvZ6hGE?jlM$u{RD` zPL_Pl;_Y_&W=1&LRGPj~U{L2U!x{qfyf%%8&I9K;g+v;wm+-#iAn9pbOBf+Fz`qFm zydb0K$?4N(XZ4l?m%=Jm4>8_N%gSqKNc~WoBuU4Oy?s|!L`MJf={KK1szvmQ`$xK+ zHImhGc6KfZQSON!{KA4Wzih{0yQM}6X5~%JRslMAi4$_XmFMh;mBPu(+s(n;%_Y-| z;YkdXL2)T#!>EYzw6wGi+o$GUDKIe4I5nw-@vwPp=G5l1CAdUq!G)2KK#6~Yx_NWV zY}j4Tzzw&O5oKR4%zlzP0DoII!mF2rV1Qulb5Rssb6bc8;*v9gJ5SH6GJh?4EYqT` zE)TIU{S!!@LyO*!Z$P%Ov(ac7Hx$$8USWc^G<-GmLkZSr99+3|oX%T0vlg^JvRr6rg<;O+9}S%k)fCn5Zu*X^9FE%n$ro3%R9e975%? zq+)!gK@f@a@`}IK_IVBBpWWKF!qJ)&M*u?5qbo{B1Htv0JmfNl!-fzA_xb2eghbWS zmvh5NVX_Tottf6CA323_9ODjbuAV64Pbf%XJ*_k>PHK9qiuTEWm>5gTf;~gzQyQjH ztVlpgAh<*_nw7_(TlQAR{Rq}QQ-KulAcX@A(>22FOJ?QEpN3vbrf>j1(KPKzjK8lr z<&CoF^$!-B5-&ddd{4QxkW;a{&?KoayyAsFM>n;VSA2AaNh0!M#f|{W&d7y74ci?qmy{*;Dz;U)a z<}0_>TtSaU4i5J4#i6czxV{ntGcWh3(!Ep1-yQcN}O2pW{?{r%S{d8eC zv-OP1++3RY#L75$!t5XkS^EiSSIQO!Y*Yo*-X0cV9~?KGl@*_HT}g34hsiXBS$P5{ zX8!uAFNKR6IgXhr@Hn=g^VFm-&Lw87G!p zaW0;8zkrQ_Ru(!#u-8U(A_-J&f4yL;L_vrKk}_Tfp;xB_ z{*|B%;c9%UW-a@_o#;$OyDc}N6%=v&$63Dhri5r|?Y=JZ} z)cJX&aUqFs6E2g6krpN0G=skZP^@YpXlH!QldThCL#pFPp!Xh?J5P^&%I1Fj?HTv9 z%r(t#-wBICZDPK}ieDPlX3@48Q{^iBbVT2=-BMV|t4p)qAgxR{564ezc24?mi7eT# zPh$q+c|UN=TUYQYssU*b)3{(k+|=lb`20ZC@YAhq!&Jm1m}Q38!XO}j zJrU#iPUm)zdFjxgogkh;QSkz~K6-eZ>MdIZV%o5BBFfX zZ>PWPXeU5Lqt?03!!t!8xBG=Z0-uDmO$#SM154d|_Z52ZsTAxh=WhC|OPH&<^s~#+ zvN&?R4v>e~pnQkDgk=8p8{w*kCAG>n*d;*}3?>}(CrSQR<1fb%Cemh>9D`Wm7`aI@ z6YR9shwYVu9+tYe6DDU7CebG4Zk2owhJ)$&aOCE#t`dD!eStc1=w#Z2N-R?IoNJKO zr;r;-=;OB91R|D#HbT-~YbzN5$usM{9jq(+2j9z?S186R8iZmg-T0zOGrp} zNec)95>f)vHFTFW(jg$-C5?0o(%lUrAPv$DXKnC#-{+ja;mjBD!~AB?UVGi^zONeG zXQ@w!{yH$y{dH(td<4A@qxk!G1cC7Q_-{`hfYk|*@)VCJ2Nes&-DwmOhjxvQ0&nY0$E;6z zD3;wi!^!Zanhdsih~SqOdf$3^KhUpOKe@TwphMmQy-bDQBrhTYtQZOZIWh4V+wx4@ zjam9{xng&I;_VlI!)aEX z3tnu=m_8l<;r-l;>ve_wqvK`CwVgPtVr^Fh4US+wa;3 zwjgEUOke@%NXJlKB*wSH?+<6@QY6U*2<>266Qmj*Qbf8jsUNsA32(IBf0!6^qKk)h z2xP!P>>>f3aew24a6&Vfb*m7$RdjE_?_|ypD0sKgUF};U!$9o8Uj;{R_=2FyY zQ$sKq5m=FLXj|?$iRtUo(QZ;|zLx6AVt0<@KP44&L;`owX}=wkzmvhWyR>%xlV)&t zb%612g9P|OiVAlJu@oVRg#~|CaAH)4^NGDPjwl$OvW!Qvf6G_I6AD^spb+!Wb4!Ft zjnSS=n-@hJK<$*^^{FP0?UtUyhSOlPXJo9y2Q>h0{0xy~*$-Jn#~^@u&ZvFWsV8j% zhZ-{ zRDz4dTwMGN>t8IqlSPT?3eR*parTdH!V(&@7rR~Mj7^w=HwNuDO9pDo>~653ILDO@ zEX^t&yA66kqO?1Fd3iE%I4;}vE=P9#s#`7grKTR}h2t6D&2&hB<9@BycZUwKz{+qS zaooxf$XCWMl6jju>wpkc-?W+xfS$ZLZm&fesytrcyqw)e;(5s&?-R+ZV1 za1g4N>_wgCvs(S{rNH;AkW+MFX1iD;ITJ$;*uA3@F3M}Upid7t0}44aMZDD|0b&oE z4zDE2SA4cv>WqlPz*2-B4U0KpuO(|t<{hYZHnsO1YY%zOyeF<>ceuu7OhjzpTE)Ly z0|Y8vZ9%bYRn(yOs8TORpl!^Ud|W6Ztk*TH4_CAjiXf2%Cq8CAT_&bw`1UO-JPLyK z)TSBlpOK+8zT0IBy=wx7O764T_u`&e{b=FcDWO4f==6r#5HVy4ID($_zhppE-868j zFfH!WvyVj=EYWAla~Z4OV~a6HBOo$WA}YshT1cqyCqrSQZSJ=XBD&7 zYExgCf4eU5JXu`sdWS&I1Hl2&ioK9DIUOB24lS&`U8?G(rv5}f5&oMH`iIM}XC>W5 z-I-_~pTYl^uKd6qaMg_p5uZQFlr8tE+aAjF#CQVId6PcQ`w6N^_JH8c-avvisdj6- zD8vTY0->&r)vUa{P10Y1t(oGKau^nUo^f7eHM44WEFFkapqE-cXqe$Fiq3Je^sa9S_ZI?zm!KXoQ{1)Q>D>!0^Y>gWpnzA&E;3)zWs(5DGUIx)pSrUQe$95 z!X?e0D5&UBZaIl%q^PLic5(1~Jz4w8-Q!1zr)e&=TtS@;}A zq)qg!DcKSyibk&ke7;^+nH-r&%E*jqJhf#*at^x?%%s zUDQZ6yKzTRQW>94mc9I=a>v&jV}*2k*$WTH)74jwF%6TYC3RI}OF6_UO)UV_Y;z3^ z6`MA0fIaT&;{H<-_3Xs&`)a?G;)%cX;elU&cKM;LThfsEG!=P^zQ>1|(C>hmXI!F| zWh179zInqPF`|&i)lrh_VsJ3d0Bl6?M9c@;-wlSzQ?vGrx;$Nj08@t2aZi;f=24KGU0E;neqwb=kET?^!Lie;Bxky9)E@yaG_Z;mOPO;X(pV^t?ABKkx=4 zrg%A&1*v`4hv|3tVk1!oBwSmpLE)WyX^MQ(^6S^LymvX3qqR5g+Zt!?*RG#;uykGh zG>}|CZn`RNbK3cpU<&5hK-)T93K3bemW{na}3&1JuPuR4Zaj=U|^iXEYs8| zafquTd) zp&}G+ju%H^P}@`tPG{K|8qa2~YpSY9r-NRb66on=|NPmQ*1M_)D(s%#I95sq^E$rc zocF3VCKZlOj;|dPINBWo+;3K-W0#Hkne#OEh&7jX9@qB+?~V1=DSU&480dCyU6pq2 z{3T7s4DA<;jJx%GSBfN`wHhz8SAD@8&^dS4(9NRA@_8H;bNluOS7T7>JdzipaCwYM zn7gz~uZkMVp}FU9sz1eoEU`Na96iwmSo)75vNCjbljpXM$yl7K)j1_+l9Mf-5bhg9 za#F@l4#iPQ>XglVbmsf0R;+NSChk|G+dVzk4Wrvw>*e*mNTIYrJ`woy4ICu$s`B%v zQlJ1XbF{xr%uNXDJQb=GS}oGFJ9t9vo`kH)+^O>FN7l!-z%o1aZ}gg#ikww}4>_de z|Nbx{oRLuoZV>tLMAsd(4zR1}ju+ z=!U)PpHfgz=p_>OJl5R`w|QhfQ$9xM-9fTxUbPJ*CBLdV77P;uT&)uu{%8B&|Qt=edz`b4!gtL^EloX{i<{9n7W;f#LiGC)*dwer}u zQuuefXv0a`NZWDq!*OQJ&~Vh{4Hr!7fN%;u?!;#RU#vr+G*qp0{9JB2qb%NV(s+G6 zS0!#zgchg+mP=G0{7Xt<1r)&Mowj#Y~lEK+7G zMyAz@Em4a$XSrNb^Gl9DC7ngQmK`_*>UR|y-x&L>BAno2Dwx$t4fR1fVa*%fa*JZP zDj-6`3!5LLA{TD@XqH9y>(%}C&a@Im;N`WK6t6VhjckRZF@YFFCjhG+?S?enOtYIV zLsDp7Xfp1`zJ=Fw-{A6?eKjD^W~I@+x!=eC>KH*hm75^&!Q?D-KEUjCM(6~tRTzf3 z5CdOBbxz}v1YCk(N837AmB|>N?T7`aPwf<(sknA~zbX63X!|vuIB384tz`YTUKJs5 zvXhE-lb)gig@n66tBYH>wWUHkCDLSJ8-vpzxaekq@qMZ)Mef=FzsuJ)LIig5|&FZZxOx4^fsPp*jRV8bF*ig11N~JJ$HvI3tWN_ z@I;&Wv>k4&Fda1GS>h8UXrk#Xp1UkxX|wj?5twy;WWq6fu#Lbm`A8(D^}E|ex5L6s zDuuh;VVPe#919uK?+$?J0%M=)z>em5g)GrUgc8>r3jasvb?~I2)X)M?{LhgQ5foy9 ztw`8w2R}O!&E&N&W&CoVygEu${5Ra1TU$jCUjg8WnYe+hM5zQjl*7E{07g>p-pPHT zKUKC#Au@CX5hsD~JGbL_-29A*iVAD^dsGUvVUTDlLeiI+s=XKz>~ueR`}XZRXa*s> z{qfEm-5xxh-k;t$g;EV}c#Dzt)0eAz`}^p?P*~%9))Wc4H$4OWo+;LxHi%Bh5r$i; zLqMg@V~*?qx)yl&25y4;x-dT^Hzj-y$5;FN{awJ0v^;aRAk}crnc^(_PxR8F=FifT z6Yz`=l4NwyfnXUtmA*mlW1uB6P22Xa9s*-!+4kt(QrY2zBe(AP7G#}K>7$*0Cl5y9 z=M(Nt8zli!XRQZzzna~-Z$k^_U4{H2YB1e4=%6 z<-l#tCef{VAp-n_xM7%mp@-Y?WVRcJczwK^qiGpzW}|DBI~G-5?3DviZ#!@L&ix@y z1q{>seV1qGxOyq3wvGuO=`O=0hS%Hj^PV{fv-y(Q-=qV}1njSx%wqR+zI;Oe8 zKe>-6Ad20oEL1h1auc87YitVm=iyKhTjKOo88Hmtbv}7$>oM(YI7-t%lE`BxWiw~c zmu!A=N#Tz&r(Ack!(d&7wL`gP_GY0*8Z-{+HT=L+Yp)7Jt+nO_hTaZ&x;SnvY? z;C1}(c}7hTf9h80qeX#)pEg*Tpxghcj|n`7l;)7 zC_8l|T4&Yyy$V&B-N`%(H$p6+$aYMk&j>Q(I*jU)CMN=UeokC^U3 z7uGXtprsA44^74W{&7VLxz(P{;7JYq({1q|kICl8vt{EmHKjUX?@vd_iB?$MA*zz~ zlGR~*Dnkr0I6fo&hrucsz?aE9JnB|SsD}>d%F!aGa#G?Efy-n@n2Z3<9J4adNUmAp z{^OHpzzMWt940ufzKgm&Q!!#1!~A7j&EIE3MZ%W?_>+R4i%FpI1UZXKNWXXVnNwRs zqLDfZ4T%PbY(!$B?zC@0L`0ge2-Hf}R{Re%8gV~uP{a>u=+`E2v~>Y|Fg(TMT+&M& zPP*Z|e{NJ_lKnvq0lN{Y;XqP!t3;@jc)I}dWYNw_R+ugYYC;;MC_o|N!M_uP?!On3F=+2&7p`yb=LnhdpS@W?1=j3a`v2&i!1Gne)DY6qlS%xVjm9{=@? z{SX6@TZN zFD^h40>9`HwK!q`#fFu47czw@sgaNnk5U?FW9`-lE%VXx&h(}^PC zX2vD>6ZjI{!4H;LIHSO>+hMm}UuW{Vf$Te)pDgR%M>nya?MShNC+$*ud-h9SHxgF@B@LtL)K04hZePY`6yUjj@NV*E%TGvd_ zMvo^J`q9wj$$-(gRFtNiR1aTg1l3_PTa%;>zKz=KtIosS3phmEC8Pv{N+w#AC8uX! zWW~I#Bqv?ljVNaN4Eb(oPE!Zly-?+cAbiaFx&;o86IK99CkNV}k8J??x{~ts--{9u zs91ibT)F(`4^T)jy+l4ioaIb*-C}mTX09!-)_HDhY1w&nfrH?|RnY8p+oRZ&tU)E- zHUS!AaxzPeqrZNkXKrv_H^7!)mF>pv~RKR4p++ zy1G28{p{OE@AHM?%XIYL0f|^i(0br^hj^Ua>Jz|afll0XsD)!R0cJiCYKzQ_iu9DN zX!g_Z5AMDk~9zeW|Fx5R-CjlAxT7>&@8uR|{_a{YN#lUDh{a`;>y|^B#<-HvI+Vp;MgtjS9@eMWVX7K)E-U1B!zqu zR=nCD4J9h2c+9})44c)?%oYqYZ6=B)By`ewV>YRv2Gq3lc5#s3@uNwKS170ALpr`j)KD8x-+QvLKzg^P^f-PG{Te z1Usdj!jG4M2#9#(9bqZqPd3J|EG#U5Y=EZ)u=s1I~7ObkE6&!kx@a#Q>{A8t{tQbj(nl&k1f~hLncF$yvmZ{@Hv6i_^ zvRS`^l#KM4%P43;ZDus{9OsC4#$`U>@rl~F_yK|E%p21eK}%pCh_;2@bt*Wm**N>| zp!@A(@=>MO?Xb5wP`32qVSb?s@Cx#tn2ycYnOsk(ml)I@myZ^Ms#=M7Kn0}Ta~VtF z#Af4fIw({{N_UjOUZ~}ddEk>(VqRz$z#U6Z={qOj>uCjphlhvsID01t73w|oC80;5 z+gT^kYq>Prl`W^;>8~Q5Y8G^E{}6m~!?%1KoWeD9iURc=v@oppueePhS&W<|r)5I3i(swLHxZZ!{zv8ObRL_$tXNe-e(y z)(@cZXv>KK(mQ8SAi|=A;=OiFC9}GtLv~3`JCSaqKREaWw`UxHvV8H(Lw}HT?{6*@ zNZM*#*%T8Mdj~jHO;l!qQoymI<6`RZk=Gh%-Zl#7gwBeER1oz=p@(dWo7@V?O7?~+ z8BWU)P?(ABkWNxmSq&xIJ+IJl2Zh1$U~zJ}y4qT*y8^W`ed?7aIpb9aP0VA*HoObK$Om!hD8O2eG z+B5%m3r+OuRKUoK8@O|iMI@XE9ouAww#2UhjqipL1-F^hnj9w%V6j9gr(LIeV6TIW z1yZGNvveR3rX8!y?`0d1UGyZo;X$Qi9goNjAadILF4r~JwT%^@0|r-b09I*aXzczM zw^m8;+RV$*(YX@>Ibh26uWlI-q?Mw$yY)){=-0<;W@)e`n7TAAr}z{RG4{gERS%5I z`@k=*@6;kiROh{CdBg3Z{IDznLvgg=QSjwdyDvW*g&FxfZH7E$b-Y++H#`G$ag2XX9&g7PvUKRGaMo5+)hl{SBR z1(m-&qeU`{{tPvCyqi60mS4U&hsoZpa1GAK_3m${t92UagTf|Y^qBrk8|ePHp!x>n z>gn9dHF6&{e@%p>&Bmtcla4_b+U24rfkUZV<=g9^LuFnXN^hmokuv#aFrgjwEQ#T% zG-D6_84efGt`2K_u7g!j zic-!3z*%o-AZW!FR>X%-V5-qz6HTiEa*h%LfnUp-fP)p*0VPQ5wtO-$^U0MR?uK|lHz2JTooDVIH zqMB7b0d&V+=;Cp6T#(#^LxO#!)#;eBqwL;*=4R3=x@$}}@@|$5qe}^r?m?Ya@J7W% zIag#96y`#H;>d^y9gT+j8F*y08)#JolB$WOOgk^uOl;Ytpx~4MDH8kJC5dK19WA65 ze5sLp&;XAe!;KxHvo5F6)(J;|`DB zW=hF_K2zlo23qG$H8rRi#XwsugHZ+-x?XI{tBn>x&K7{(;DH>CJsR*#qSavBK|!-W z{dGIKGn-__F!nk#AS-cCtrAlp4FiJ`Q2PWv)nqO75($=&e(963I~ALzDP2ju&b;$9 zX92iZI{W0((I1Nief`kz6O3xADPMsDNQBwBE3!=?OA2cpZLYOi&6=!=nvz|qKdEOV zB2FhQ?IoQuS(V||S7w&ggqm{~TV~m>r`$mx%M#p?e^?Hu!YqMnTaA-bj$Cfwohom$ zn#a^}o{1cFDU^kU1==Q&+CG%ym3t&^G@vJDEsEd16W?*uuf<@#_h$0jIo-ohqxUFL zWi>_{90rd=-~s79=$l6q-gT}uX}^hA-X-b=!X}`~$J#aYG}rJ#fC7j##$6FrLfR?P zdA)y|-TK5K%9qYS*LEqIPK6C4=XpqCd2pL(EE${es2qsYtlJt0h)4kdbHwQOI?uih zz~1daSTJ~5YyEFm#VHR84c_0&1E|WV*10!aR+>~m_-j2MKP3}QC%}&L*0&h|HrxGA zu=ZaJVHZCZE$)KdNh*c$MQBpI&}cmX+{TdL${glhv>@?@A>pRD;zy_W@#23&yfqJ} z3UNpXJ27+q&N>-Tn^^-z-3b2sg=%MqG}2`7ly-!s40<{0>1CdtvDAbzN-Q2F-bVkP|mm+?5PUcotGa5hc@QV`O&cD08rEe zJGc=E>FE~`?SU7@Ln6L#1@yi}dvkU65ym4qtW}VpGdGyl!WE+J$vORoU@u;%voAfN zSb%aD6MS%Em(3=PwgER7Dxd$pH2sg+El(%3`#7<@quq3*J!Jcq8XNX{d*ki~j6AfI zzXfm$+d=@vjjsZ0Hjdt5&wuAQWR}iRWKy=1oo=!mv z^sGN`=WThsJ9%w=vx6vN!hmz8va@RHmb{pC#d+DaEzGSKu22jGX$?SogI2gH1CY& z!2F*8#|%K;9`U4=KYyg8q`Hq1gZwYA+8}{`u8mIbFci~DWp=VN2RBE_+Ee!2Eu(=r8`+X$Vs@dXkciVnHv(PmEO-L1=+0jMgWS;ScM8|a`0p}fAnwm#bTpj?=^2$Pkx6)QFMFh<}RfN9g-?cFd?lNq&j_ zebExSy5Q@B9Ey!;>+4xn40;I)yil zuXa%{-xyqpfaweGtljd=;Mx_6jBNCVzD_6ct;0H?vmYw#K)znQdiB$dNe$4XxM4gv zvV9g)U+Dcq38P(h@<_qC7Nh)wtUaSDClv$yns8-w@YNGN0F@Djh%P_=8z(!L{4!s; zsQls$&gh;BCe3pTpf{_-;OFOm&PCIiRl^V9))!F0TmZ4j|Cka*qr3VVAu{Pm$ZOCm z<0N>SIn_?Vp)}&KRi7M&hWm^LP&F*X419?{-!9bj=)^n;R3!nDZch1}zOOpaJwhU4 zP6A0!i3uxo%D5_h;oDeuiBeTP$FxY7H=I$N`Vw%V^gLE0B_ne!P%O&fX36h0?} zppn}L<@w!Z$a|KgogdF+JO=~zfqSw?Q4=)tg7e^6bED}%@}`p@kcapRq=glw{a-@( zKDnPD{yXE^c{`q+kNxekIHbn0Z|CY>2mPDU@m5cGK*?WWoXFCct?7uO8^Pw>&SvEw zFZ;I7^e!E@g$p!iBtV!Hy^RaBC~K8>=$xppLSjN>4DtlPjI56~cK2U3)S}~KyZ0bZ z$aG2K7tNQt@zxDV|Lgdp|L1f=kKlbJ&k6P?2={tU(W;SK+UyLHWA8+B>O~YZd>{~T zbK1MbCL!SIh~UJC<7iD_T`q*biS87);9@LIK!1v!2|J#KlYs{(nyw58pON3*oaLlE zuU0A<&EK6Z!t+U=$a|-PKkD%cYP=+DLL~vE0I=U(g`SR%)1m|&q<8y&7{Fzg>8FCj zhajIMn3w^=oB@z)3@9vz#r5?U)YjI^RZ96QZ(v0b4H@=zB5Hp{6!4H{Y9d7&)4!jJ zzk%Yt|K$OJP)eUia21hK*;>2=fr=KOXR`<;eBqBm5&`(XWq%TnFVyFU%y-ZB+VP!S zBp?u?+xqdE{Z@b_xQ=c2KOIJW3NVw_$tDA}THo9n9+9~NZ4(#|pBG%pG^Pk@L3;r3 z7<1(yZ41yY0O}os@wec6l3N3X0t_GTv)3Mo99RaOL;MV+0<(A0?)RBZ27_r2D6D{D z14?F%*xOxZe9H%tr_cDI#7}5>$beLqO`~+3VwC8UrQg94Ndxv+=;s^ib@Al;}?9zLNymIiTr4W)GN!$^c!(K=|bGqm5~+ zwLvm&$5YFQ_Sf?-FQ=&9#-(pkitB~q3M6JwK>%jw`o9a|_3P_}`2Q}ug>0GSB>4=D z- zbAG@oU1KH#N!Q39+%>12d6wVYmIFBTfxZCDvKqhJgI^rKB)H@TnuDLMBO)v;upI=T zzViEs$kNg7ak!|7m&Rc?{5fQnk0UF?kY$#a(si`?o z>}b_|FZR#XWSQByJNNePtQjS(?vC=%39Q)VcDJmA6yN?Ui#10lEVX|%NGXOKFO)AE*J>um{=f{sR$<6{}u_g?5m2f%#qh66=K$liAJS~Q^-_`3+E3Ca@#%LT%?5$Mb6y5BqJ$Es)qM@;vXlU+u=&zbH6wfFMx1tu zMgW}Gx+~?YDRp#O1w&ITa24FOf9W6nLsXWp>MzD$UtQ&%%ug`Cc`DR|f&1MD3DvBn z?3ak>C;3R4{?tKN>Ttl*{sbbS54%*NR&j8UDT$m`^51=Mz~WHo2*sngGxv*cfSrs} zW9022YiSt}syZDLZvrX`i(#Nnh)~*@eIOf2C=p%MHHVT!8(alacvn=8<-hBC{jbn} z{uCi;(Znx>9u;|{czrN%6blTM_+j(Y(1HLyg4f&!1FZ%p*xd&p=$N&+!SY{Hf=L)5 zcOp$Un7ew8AW2$)6x(geKhPH6&-sJq6`GD*YxgWPR7TCLb{;`?G2_<=2YDhvndtJf zvR0;RE5H)9M_;Br4WUo{$L2z6psvo&U+2Qm(?j|1JkAxR?d77}9I}KYi^EycaVsLA z9FtLl&aX=29SA*?n@IjQ6W0{o0xfxW0#3B(_miK9xPQxR|Gsa#e|mPdUK~cuPy3l5 zstCuo@n-P}tQUQVL3Q8lo~eYKT=@00z0Bu-09pt1eFCHq?{-t}&(_>5(DHU46Y<*e zVUV6sm*{`8-JU(G^qTsdyJcOTeGdUh7f;DMs-g9k&uhCy)1kkiR|EmgzYZK)M(|2k z_&2ZJ{TFoR&Hv9EwD0!Z?NxwMh5YXjyxmlQ8G8J$n*4je^~1Y`y!$vXqTau|?tgC& vn7wxgb^Uw0DD2Z6p#J|q{&q3mF5f)t`!bhk$@Q@59(YNL$%+;UYkU14wdQZ* literal 0 HcmV?d00001 diff --git a/keyboards/ergodox/keymaps/italian/keymap.c b/keyboards/ergodox/keymaps/italian/keymap.c new file mode 100644 index 0000000000..e4c7a569cb --- /dev/null +++ b/keyboards/ergodox/keymaps/italian/keymap.c @@ -0,0 +1,223 @@ +#include "ergodox.h" +#include "debug.h" +#include "action_layer.h" +#include "version.h" + +#define BASE 0 // default layer +#define SYMB 1 // symbols +#define MDIA 2 // media keys + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + EPRM, + VRSN, + RGB_SLD +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | \ | 1 | 2 | 3 | 4 | 5 | ESC | | T2 | 6 | 7 | 8 | 9 | 0 | ' | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T | TT1 | | TT1 | Y | U | I | O | P | è | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | Caps | A | S | D | F | G |------| |------| H | J | K | L | ò | à | + * |--------+------+------+------+------+------| Alt | | Alt |------+------+------+------+------+--------| + * | LShift | Z | X | C | V | B | | | | N | M | , | . | ù |-/RShift| + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + break; + case 1: + if (record->event.pressed) { // For resetting EEPROM + eeconfig_init(); + } + break; + } + return MACRO_NONE; +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + // dynamically generate these. + case EPRM: + if (record->event.pressed) { + eeconfig_init(); + } + return false; + break; + case VRSN: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + return false; + break; + case RGB_SLD: + if (record->event.pressed) { + #ifdef RGBLIGHT_ENABLE + rgblight_mode(1); + #endif + } + return false; + break; + } + return true; +} + +// 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/keyboards/ergodox/keymaps/italian/readme.md b/keyboards/ergodox/keymaps/italian/readme.md new file mode 100644 index 0000000000..979ce0f5b8 --- /dev/null +++ b/keyboards/ergodox/keymaps/italian/readme.md @@ -0,0 +1,15 @@ +# ErgoDox EZ Default Configuration + +## Changelog + +* Dec 2016: + * Added LED keys + * Refreshed layout graphic, comes from http://configure.ergodox-ez.com now. +* Sep 22, 2016: + * Created a new key in layer 1 (bottom-corner key) that resets the EEPROM. +* Feb 2, 2016 (V1.1): + * Made the right-hand quote key double as Cmd/Win on hold. So you get ' when you tap it, " when you tap it with Shift, and Cmd or Win when you hold it. You can then use it as a modifier, or just press and hold it for a moment (and then let go) to send a single Cmd or Win keystroke (handy for opening the Start menu on Windows). + +This is what we ship with out of the factory. :) The image says it all: + +![Default](default_firmware_v1.2-2.png) From 512eb5e1d5edd39e3e46f8201b57d8fd17084408 Mon Sep 17 00:00:00 2001 From: mattdibi Date: Tue, 28 Mar 2017 10:10:24 +0200 Subject: [PATCH 152/181] Updated readme --- keyboards/ergodox/keymaps/italian/readme.md | 79 ++++++++++++++++++--- 1 file changed, 68 insertions(+), 11 deletions(-) diff --git a/keyboards/ergodox/keymaps/italian/readme.md b/keyboards/ergodox/keymaps/italian/readme.md index 979ce0f5b8..f9d012135a 100644 --- a/keyboards/ergodox/keymaps/italian/readme.md +++ b/keyboards/ergodox/keymaps/italian/readme.md @@ -1,15 +1,72 @@ -# ErgoDox EZ Default Configuration +# ErgoDox Italian layout -## Changelog +## Layer 0 +```sh + + ,--------------------------------------------------. ,--------------------------------------------------. + | \ | 1 | 2 | 3 | 4 | 5 | ESC | | T2 | 6 | 7 | 8 | 9 | 0 | ' | + |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + | Tab | Q | W | E | R | T | TT1 | | TT1 | Y | U | I | O | P | è | + |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + | Caps | A | S | D | F | G |------| |------| H | J | K | L | ò | à | + |--------+------+------+------+------+------| Alt | | Alt |------+------+------+------+------+--------| + | LShift | Z | X | C | V | B | | | | N | M | , | . | ù |-/RShift| + `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + | Date: Tue, 28 Mar 2017 10:13:29 +0200 Subject: [PATCH 153/181] Fixed italian kymap readme --- keyboards/ergodox/keymaps/italian/readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboards/ergodox/keymaps/italian/readme.md b/keyboards/ergodox/keymaps/italian/readme.md index f9d012135a..75dd3c29d7 100644 --- a/keyboards/ergodox/keymaps/italian/readme.md +++ b/keyboards/ergodox/keymaps/italian/readme.md @@ -1,7 +1,7 @@ # ErgoDox Italian layout ## Layer 0 -```sh +``` ,--------------------------------------------------. ,--------------------------------------------------. | \ | 1 | 2 | 3 | 4 | 5 | ESC | | T2 | 6 | 7 | 8 | 9 | 0 | ' | @@ -24,7 +24,7 @@ ``` ## Layer 1 -```sh +``` ,--------------------------------------------------. ,--------------------------------------------------. |Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | @@ -47,7 +47,7 @@ ``` ## Layer 1 -```sh +``` ,--------------------------------------------------. ,--------------------------------------------------. | | | | | | | | | | | | | | | | From 221b27c508b3870de725e720222a6281770b5f98 Mon Sep 17 00:00:00 2001 From: mattdibi Date: Tue, 28 Mar 2017 10:15:18 +0200 Subject: [PATCH 154/181] Fixed layout title in ergodox ez italian keymap --- keyboards/ergodox/keymaps/italian/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/ergodox/keymaps/italian/readme.md b/keyboards/ergodox/keymaps/italian/readme.md index 75dd3c29d7..215c24a5af 100644 --- a/keyboards/ergodox/keymaps/italian/readme.md +++ b/keyboards/ergodox/keymaps/italian/readme.md @@ -46,7 +46,7 @@ `--------------------' `--------------------' ``` -## Layer 1 +## Layer 2 ``` ,--------------------------------------------------. ,--------------------------------------------------. From 2104900030c4a0d0a5d71c9900804dec229a375d Mon Sep 17 00:00:00 2001 From: mattdibi Date: Tue, 28 Mar 2017 10:19:25 +0200 Subject: [PATCH 155/181] Removed images from ergodox ez italian layout --- keyboards/ergodox/keymaps/italian/L0.PNG | Bin 152470 -> 0 bytes keyboards/ergodox/keymaps/italian/L1.PNG | Bin 130416 -> 0 bytes keyboards/ergodox/keymaps/italian/L2.PNG | Bin 126006 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 keyboards/ergodox/keymaps/italian/L0.PNG delete mode 100644 keyboards/ergodox/keymaps/italian/L1.PNG delete mode 100644 keyboards/ergodox/keymaps/italian/L2.PNG diff --git a/keyboards/ergodox/keymaps/italian/L0.PNG b/keyboards/ergodox/keymaps/italian/L0.PNG deleted file mode 100644 index 491a4f3883148a4b6ea730c545a1dd4d69c823e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152470 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 Q!CclkeY3OWr`^N<1Dv(YUjP6A diff --git a/keyboards/ergodox/keymaps/italian/L1.PNG b/keyboards/ergodox/keymaps/italian/L1.PNG deleted file mode 100644 index 17c5ffc67bf071b11ecc847048a5693afa0ff650..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130416 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 AK>z>% diff --git a/keyboards/ergodox/keymaps/italian/L2.PNG b/keyboards/ergodox/keymaps/italian/L2.PNG deleted file mode 100644 index c0aa9e9d38ae64002875ab484ff58defc6fc5c2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126006 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 From 71857ebc3f410b918481f4a6bbed93f1cb2eec65 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Tue, 28 Mar 2017 09:17:09 -0400 Subject: [PATCH 156/181] Move Atreus50 to hardwired directory and update README --- keyboards/atreus50/readme.md | 25 ------------------- keyboards/{ => handwired}/atreus50/Makefile | 0 keyboards/{ => handwired}/atreus50/atreus50.c | 0 keyboards/{ => handwired}/atreus50/atreus50.h | 0 keyboards/{ => handwired}/atreus50/config.h | 0 .../atreus50/keymaps/default/Makefile | 0 .../atreus50/keymaps/default/keymap.c | 0 keyboards/handwired/atreus50/readme.md | 16 ++++++++++++ keyboards/{ => handwired}/atreus50/rules.mk | 0 9 files changed, 16 insertions(+), 25 deletions(-) delete mode 100644 keyboards/atreus50/readme.md rename keyboards/{ => handwired}/atreus50/Makefile (100%) rename keyboards/{ => handwired}/atreus50/atreus50.c (100%) rename keyboards/{ => handwired}/atreus50/atreus50.h (100%) rename keyboards/{ => handwired}/atreus50/config.h (100%) rename keyboards/{ => handwired}/atreus50/keymaps/default/Makefile (100%) rename keyboards/{ => handwired}/atreus50/keymaps/default/keymap.c (100%) create mode 100644 keyboards/handwired/atreus50/readme.md rename keyboards/{ => handwired}/atreus50/rules.mk (100%) diff --git a/keyboards/atreus50/readme.md b/keyboards/atreus50/readme.md deleted file mode 100644 index f0be255a09..0000000000 --- a/keyboards/atreus50/readme.md +++ /dev/null @@ -1,25 +0,0 @@ -Preonic keyboard firmware -====================== -DIY/Assembled compact ortholinear 50% keyboard by [Ortholinear Keyboards](http://ortholinearkeyboards.com). - -## Quantum MK Firmware - -For the full Quantum feature list, see [the parent readme.md](/readme.md). - -## Building - -Download or clone the whole firmware and navigate to the keyboards/preonic folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use `make dfu` to program your PCB once you hit the reset button. - -Depending on which keymap you would like to use, you will have to compile slightly differently. - -### Default -To build with the default keymap, simply run `make`. - -### Other Keymaps -Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap, create a file in the keymaps folder 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 **__\.c__** and are stored in the `keymaps` folder. diff --git a/keyboards/atreus50/Makefile b/keyboards/handwired/atreus50/Makefile similarity index 100% rename from keyboards/atreus50/Makefile rename to keyboards/handwired/atreus50/Makefile diff --git a/keyboards/atreus50/atreus50.c b/keyboards/handwired/atreus50/atreus50.c similarity index 100% rename from keyboards/atreus50/atreus50.c rename to keyboards/handwired/atreus50/atreus50.c diff --git a/keyboards/atreus50/atreus50.h b/keyboards/handwired/atreus50/atreus50.h similarity index 100% rename from keyboards/atreus50/atreus50.h rename to keyboards/handwired/atreus50/atreus50.h diff --git a/keyboards/atreus50/config.h b/keyboards/handwired/atreus50/config.h similarity index 100% rename from keyboards/atreus50/config.h rename to keyboards/handwired/atreus50/config.h diff --git a/keyboards/atreus50/keymaps/default/Makefile b/keyboards/handwired/atreus50/keymaps/default/Makefile similarity index 100% rename from keyboards/atreus50/keymaps/default/Makefile rename to keyboards/handwired/atreus50/keymaps/default/Makefile diff --git a/keyboards/atreus50/keymaps/default/keymap.c b/keyboards/handwired/atreus50/keymaps/default/keymap.c similarity index 100% rename from keyboards/atreus50/keymaps/default/keymap.c rename to keyboards/handwired/atreus50/keymaps/default/keymap.c diff --git a/keyboards/handwired/atreus50/readme.md b/keyboards/handwired/atreus50/readme.md new file mode 100644 index 0000000000..0c24f67db2 --- /dev/null +++ b/keyboards/handwired/atreus50/readme.md @@ -0,0 +1,16 @@ +Handwired Atreus50 +================== + +This firmware is for a Handwired Atreus50 using an Arduino Pro Micro. + +## Pinout + +The following pins are used: +- Columns 1-13: D4, D7, E6, B4, B5, B6, B2, B3, B1, F7, F6, F5, F4 +- Rows 1-4: D3, D2, D1, D0 + +## Compiling and loading the firmware + +To build the firmware, run `make`. + +To flash the firemware onto the microcontroller, run `make avrdude`, and press the reset button. diff --git a/keyboards/atreus50/rules.mk b/keyboards/handwired/atreus50/rules.mk similarity index 100% rename from keyboards/atreus50/rules.mk rename to keyboards/handwired/atreus50/rules.mk From d5ee0194abf5cc9df4086a89ad78cf188352028a Mon Sep 17 00:00:00 2001 From: Ole Anders Date: Tue, 28 Mar 2017 15:43:04 +0200 Subject: [PATCH 157/181] fixed #1139 issues A fix described by jackhumbert has been sorted out now. --- .../satan/keymaps/admiralStrokers/Makefile | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/keyboards/satan/keymaps/admiralStrokers/Makefile b/keyboards/satan/keymaps/admiralStrokers/Makefile index 18d2280d69..7aba5d809c 100644 --- a/keyboards/satan/keymaps/admiralStrokers/Makefile +++ b/keyboards/satan/keymaps/admiralStrokers/Makefile @@ -2,25 +2,25 @@ # change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -SLEEP_LED_ENABLE = no # Enables your LED to breathe while your computer is sleeping. -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 -UNICODEMAP_ENABLE = no # This allows sending unicode symbols using X() in your keymap. -UNICODE_ENABLE = no # Unicode -UCIS_ENABLE = no # Keep in mind that not all will work (See WinCompose for details on Windows). -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Enables your LED to breathe while your computer is sleeping. +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODEMAP_ENABLE = no # This allows sending unicode symbols using X() in your keymap. +UNICODE_ENABLE =no # Unicode +UCIS_ENABLE = no # Keep in mind that not all will work (See WinCompose for details on Windows). +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -VARIABLE_TRACE = no # Use this to debug changes to variable values -API_SYSEX_ENABLE = no # This enables using the Quantum SYSEX API to send strings +VARIABLE_TRACE = no # Use this to debug changes to variable values +API_SYSEX_ENABLE = no # This enables using the Quantum SYSEX API to send strings ifndef QUANTUM_DIR include ../../../../Makefile endif From 48dfc77718bf115c6d65257b07e8d87304c23d8f Mon Sep 17 00:00:00 2001 From: Ole Anders Date: Tue, 28 Mar 2017 15:58:46 +0200 Subject: [PATCH 158/181] removed a carriage return --- .../satan/keymaps/admiralStrokers/Makefile | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/keyboards/satan/keymaps/admiralStrokers/Makefile b/keyboards/satan/keymaps/admiralStrokers/Makefile index 7aba5d809c..bb4072861c 100644 --- a/keyboards/satan/keymaps/admiralStrokers/Makefile +++ b/keyboards/satan/keymaps/admiralStrokers/Makefile @@ -2,25 +2,24 @@ # change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -SLEEP_LED_ENABLE = no # Enables your LED to breathe while your computer is sleeping. -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = no # Audio output on port C6 -UNICODEMAP_ENABLE = no # This allows sending unicode symbols using X() in your keymap. -UNICODE_ENABLE =no # Unicode -UCIS_ENABLE = no # Keep in mind that not all will work (See WinCompose for details on Windows). -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -VARIABLE_TRACE = no # Use this to debug changes to variable values -API_SYSEX_ENABLE = no # This enables using the Quantum SYSEX API to send strings +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Enables your LED to breathe while your computer is sleeping. +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODEMAP_ENABLE = no # This allows sending unicode symbols using X() in your keymap. +UNICODE_ENABLE =no # Unicode +UCIS_ENABLE = no # Keep in mind that not all will work (See WinCompose for details on Windows). +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no# Breathing sleep LED during USB suspend +VARIABLE_TRACE = no # Use this to debug changes to variable values +API_SYSEX_ENABLE = no # This enables using the Quantum SYSEX API to send strings ifndef QUANTUM_DIR include ../../../../Makefile endif From c72ca58528671eb582a1a7360407fd9347c9735b Mon Sep 17 00:00:00 2001 From: Ole Anders Date: Tue, 28 Mar 2017 16:50:44 +0200 Subject: [PATCH 159/181] Moved key_timer out of function. --- keyboards/satan/keymaps/admiralStrokers/keymap.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/keyboards/satan/keymaps/admiralStrokers/keymap.c b/keyboards/satan/keymaps/admiralStrokers/keymap.c index 97a0f225da..4bd49aaade 100644 --- a/keyboards/satan/keymaps/admiralStrokers/keymap.c +++ b/keyboards/satan/keymaps/admiralStrokers/keymap.c @@ -1,13 +1,14 @@ #include "satan.h" +static uint16_t key_timer; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // general keydefs #define norm 0 // Default layer #define elev 1 // Layer directional keys #define supr 2 // F-keys and mediakeys -#define spac 3 +#define spac 3 // #define FNO1 4 // #define FNO2 5 // -#define FNO3 6 // +#define FNO3 6 // #define MAC0 M(0) // #define MAC1 M(1) // #define MAC2 M(2) // @@ -143,7 +144,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function - static uint16_t key_timer; + bool checkTime(){ return (timer_elapsed(key_timer) < 150) ? true : false; } From 37b7539af3a4e302a44ed9292ed5012a9ab34e5c Mon Sep 17 00:00:00 2001 From: Ole Anders Date: Tue, 28 Mar 2017 16:52:56 +0200 Subject: [PATCH 160/181] slight cleanup as per recommendation --- keyboards/satan/keymaps/admiralStrokers/keymap.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/keyboards/satan/keymaps/admiralStrokers/keymap.c b/keyboards/satan/keymaps/admiralStrokers/keymap.c index 4bd49aaade..72a4c3dc9a 100644 --- a/keyboards/satan/keymaps/admiralStrokers/keymap.c +++ b/keyboards/satan/keymaps/admiralStrokers/keymap.c @@ -1,6 +1,6 @@ #include "satan.h" static uint16_t key_timer; -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // general keydefs #define norm 0 // Default layer #define elev 1 // Layer directional keys @@ -114,6 +114,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #define DEAD KC_NO #define SCAN KC_TRNS // Scandinavian keys, the Row 5 key 5 is actually Row 1 key 15 on the PCB +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [ norm ] = KEYMAP( // Normal scandinavian mapping (danish has QUOT and SCLN wapped) GRAV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, MINS, EQUL, BSPC, DELE,\ DUTB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, LBRC, RBRC, DEAD,\ From 1b821eca663fb6cbe13ea1753f220bce5a7636a6 Mon Sep 17 00:00:00 2001 From: Ole Anders Date: Tue, 28 Mar 2017 16:55:25 +0200 Subject: [PATCH 161/181] removed varable trace option from makefile --- keyboards/satan/keymaps/admiralStrokers/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/keyboards/satan/keymaps/admiralStrokers/Makefile b/keyboards/satan/keymaps/admiralStrokers/Makefile index bb4072861c..61dfedeb84 100644 --- a/keyboards/satan/keymaps/admiralStrokers/Makefile +++ b/keyboards/satan/keymaps/admiralStrokers/Makefile @@ -18,7 +18,6 @@ UCIS_ENABLE = no # Keep in mind that not all will work (See WinCompose for detai BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. SLEEP_LED_ENABLE = no# Breathing sleep LED during USB suspend -VARIABLE_TRACE = no # Use this to debug changes to variable values API_SYSEX_ENABLE = no # This enables using the Quantum SYSEX API to send strings ifndef QUANTUM_DIR include ../../../../Makefile From 256abc64d5daee6d7526d33455f6f28cc782dee1 Mon Sep 17 00:00:00 2001 From: Ole Anders Date: Tue, 28 Mar 2017 17:08:01 +0200 Subject: [PATCH 162/181] fixed function to not accept any arguments. As per Pramod's comment on stack overflow: In C int foo() and int foo(void) are different functions. int foo() accepts an arbitrary number of arguments, while int foo(void) accepts 0 arguments. In C++ they mean the same thing. I suggest that you use void consistently when you mean no arguments. --- keyboards/satan/keymaps/admiralStrokers/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/satan/keymaps/admiralStrokers/keymap.c b/keyboards/satan/keymaps/admiralStrokers/keymap.c index 72a4c3dc9a..7a8459eb56 100644 --- a/keyboards/satan/keymaps/admiralStrokers/keymap.c +++ b/keyboards/satan/keymaps/admiralStrokers/keymap.c @@ -146,7 +146,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function - bool checkTime(){ + bool checkTime(void){ return (timer_elapsed(key_timer) < 150) ? true : false; } From f504082f7f4f2fe078cb1863b43d7ef0dc0c5c53 Mon Sep 17 00:00:00 2001 From: Ole Anders Date: Tue, 28 Mar 2017 17:17:08 +0200 Subject: [PATCH 163/181] declaring checktime before the function it is used in. --- keyboards/satan/keymaps/admiralStrokers/keymap.c | 1 + 1 file changed, 1 insertion(+) diff --git a/keyboards/satan/keymaps/admiralStrokers/keymap.c b/keyboards/satan/keymaps/admiralStrokers/keymap.c index 7a8459eb56..b5fd2ec601 100644 --- a/keyboards/satan/keymaps/admiralStrokers/keymap.c +++ b/keyboards/satan/keymaps/admiralStrokers/keymap.c @@ -1,5 +1,6 @@ #include "satan.h" static uint16_t key_timer; +bool checkTime(void); // general keydefs #define norm 0 // Default layer From 411cd4fae27693324ca51eb5bf07ecebbc074c01 Mon Sep 17 00:00:00 2001 From: Ole Anders Date: Tue, 28 Mar 2017 17:30:15 +0200 Subject: [PATCH 164/181] moved checktime out of function --- keyboards/satan/keymaps/admiralStrokers/keymap.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/keyboards/satan/keymaps/admiralStrokers/keymap.c b/keyboards/satan/keymaps/admiralStrokers/keymap.c index b5fd2ec601..422a801ba5 100644 --- a/keyboards/satan/keymaps/admiralStrokers/keymap.c +++ b/keyboards/satan/keymaps/admiralStrokers/keymap.c @@ -1,6 +1,8 @@ #include "satan.h" static uint16_t key_timer; -bool checkTime(void); +bool checkTime(void){ + return (timer_elapsed(key_timer) < 150) ? true : false; + } // general keydefs #define norm 0 // Default layer @@ -147,11 +149,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function - bool checkTime(void){ - return (timer_elapsed(key_timer) < 150) ? true : false; - } - - switch(id) { case 0: //MAC0 - Hold for lshift and { on tap if (record->event.pressed) { From 85cac3952965b37317d42bf7b3e5cf3a9e4ebdae Mon Sep 17 00:00:00 2001 From: Ole Anders Date: Tue, 28 Mar 2017 18:41:04 +0200 Subject: [PATCH 165/181] fixed capitalization issue (checkTime => checktime) --- keyboards/satan/keymaps/admiralStrokers/keymap.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/keyboards/satan/keymaps/admiralStrokers/keymap.c b/keyboards/satan/keymaps/admiralStrokers/keymap.c index 422a801ba5..7b83ed7b0e 100644 --- a/keyboards/satan/keymaps/admiralStrokers/keymap.c +++ b/keyboards/satan/keymaps/admiralStrokers/keymap.c @@ -1,6 +1,8 @@ #include "satan.h" + static uint16_t key_timer; -bool checkTime(void){ + +bool checktime(void){ return (timer_elapsed(key_timer) < 150) ? true : false; } @@ -147,7 +149,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX), }; -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { // MACRODOWN only works in this function +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {3 // MACRODOWN only works in this function switch(id) { case 0: //MAC0 - Hold for lshift and { on tap From 6de7e5d8dce42b56a0424da98408f3cf8f27cfa1 Mon Sep 17 00:00:00 2001 From: Ole Anders Date: Tue, 28 Mar 2017 18:45:26 +0200 Subject: [PATCH 166/181] typo removed {3 ... --- keyboards/satan/keymaps/admiralStrokers/keymap.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/keyboards/satan/keymaps/admiralStrokers/keymap.c b/keyboards/satan/keymaps/admiralStrokers/keymap.c index 7b83ed7b0e..b6dc29c673 100644 --- a/keyboards/satan/keymaps/admiralStrokers/keymap.c +++ b/keyboards/satan/keymaps/admiralStrokers/keymap.c @@ -4,7 +4,7 @@ static uint16_t key_timer; bool checktime(void){ return (timer_elapsed(key_timer) < 150) ? true : false; - } + }; // general keydefs #define norm 0 // Default layer @@ -149,8 +149,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX), }; -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {3 // MACRODOWN only works in this function - +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: //MAC0 - Hold for lshift and { on tap if (record->event.pressed) { From 23839b8c6d2f955e4da89b0981948c721346c528 Mon Sep 17 00:00:00 2001 From: skullydazed Date: Tue, 28 Mar 2017 15:20:36 -0700 Subject: [PATCH 167/181] Clarify the quantum license (#1042) * Clarify the license for files we have signoff on * Update against the currently signed off files * Remove unused and not clearly licensed headers * Replace an #endif I accidentally removed while resolving merge conflicts --- doc/COPYING.GPLv2 | 339 --------- doc/COPYING.GPLv3 | 674 ------------------ license_GPLv2.md | 264 +++++++ license_GPLv3.md | 656 +++++++++++++++++ license_Modified_BSD.md | 32 + quantum/analog.c | 16 + quantum/analog.h | 16 + quantum/api.c | 18 +- quantum/api.h | 18 +- quantum/api/api_sysex.c | 15 + quantum/api/api_sysex.h | 18 +- quantum/audio/audio.c | 15 + quantum/audio/audio.h | 17 +- quantum/audio/audio_pwm.c | 15 + quantum/audio/luts.c | 16 + quantum/audio/luts.h | 18 +- quantum/audio/musical_notes.h | 18 +- quantum/audio/song_list.h | 15 + quantum/audio/voices.c | 15 + quantum/audio/voices.h | 17 +- quantum/audio/wave.h | 18 +- quantum/config_common.h | 16 + quantum/dynamic_macro.h | 16 + quantum/keycode_config.c | 18 +- quantum/keycode_config.h | 16 + quantum/keymap.h | 2 +- quantum/keymap_common.c | 2 +- quantum/keymap_extras/keymap_bepo.h | 15 + .../keymap_canadian_multilingual.h | 15 + quantum/keymap_extras/keymap_colemak.h | 15 + quantum/keymap_extras/keymap_dvorak.h | 15 + quantum/keymap_extras/keymap_dvp.h | 16 + quantum/keymap_extras/keymap_fr_ch.h | 15 + quantum/keymap_extras/keymap_french.h | 15 + quantum/keymap_extras/keymap_french_osx.h | 17 +- quantum/keymap_extras/keymap_german.h | 16 + quantum/keymap_extras/keymap_german_ch.h | 15 + quantum/keymap_extras/keymap_german_osx.h | 15 + quantum/keymap_extras/keymap_jp.h | 17 +- quantum/keymap_extras/keymap_neo2.h | 15 + quantum/keymap_extras/keymap_nordic.h | 15 + quantum/keymap_extras/keymap_norwegian.h | 15 + quantum/keymap_extras/keymap_plover.h | 15 + quantum/keymap_extras/keymap_russian.h | 77 -- quantum/keymap_extras/keymap_spanish.h | 15 + quantum/keymap_extras/keymap_uk.h | 15 + .../keymap_extras/keymap_unicode_cyrillic.h | 163 ----- quantum/light_ws2812.c | 13 +- quantum/light_ws2812.h | 14 +- quantum/matrix.c | 3 +- quantum/pincontrol.h | 15 + quantum/process_keycode/process_chording.c | 18 +- quantum/process_keycode/process_chording.h | 18 +- quantum/process_keycode/process_combo.c | 16 + quantum/process_keycode/process_combo.h | 16 + quantum/process_keycode/process_leader.c | 18 +- quantum/process_keycode/process_leader.h | 18 +- quantum/process_keycode/process_midi.c | 15 + quantum/process_keycode/process_midi.h | 18 +- quantum/process_keycode/process_music.c | 15 + quantum/process_keycode/process_music.h | 18 +- quantum/process_keycode/process_printer.c | 18 +- quantum/process_keycode/process_printer.h | 18 +- quantum/process_keycode/process_printer_bb.c | 18 +- quantum/process_keycode/process_tap_dance.c | 15 + quantum/process_keycode/process_tap_dance.h | 15 + quantum/process_keycode/process_ucis.c | 18 +- quantum/process_keycode/process_ucis.h | 16 + quantum/process_keycode/process_unicode.c | 15 + quantum/process_keycode/process_unicode.h | 15 + .../process_keycode/process_unicode_common.c | 18 +- .../process_keycode/process_unicode_common.h | 18 +- quantum/process_keycode/process_unicodemap.c | 18 +- quantum/process_keycode/process_unicodemap.h | 18 +- quantum/quantum.c | 16 + quantum/quantum.h | 15 + quantum/quantum_keycodes.h | 15 + quantum/rgblight.c | 15 + quantum/rgblight.h | 15 + quantum/serial_link/LICENSE | 2 - quantum/template/Makefile | 17 +- quantum/template/config.h | 2 +- quantum/template/keymaps/default/Makefile | 20 +- quantum/template/keymaps/default/config.h | 18 +- quantum/template/keymaps/default/keymap.c | 17 +- quantum/template/template.c | 15 + quantum/template/template.h | 15 + quantum/variable_trace.c | 16 + quantum/variable_trace.h | 16 + 89 files changed, 2172 insertions(+), 1293 deletions(-) delete mode 100644 doc/COPYING.GPLv2 delete mode 100644 doc/COPYING.GPLv3 create mode 100644 license_GPLv2.md create mode 100644 license_GPLv3.md create mode 100644 license_Modified_BSD.md delete mode 100644 quantum/keymap_extras/keymap_russian.h delete mode 100644 quantum/keymap_extras/keymap_unicode_cyrillic.h diff --git a/doc/COPYING.GPLv2 b/doc/COPYING.GPLv2 deleted file mode 100644 index d159169d10..0000000000 --- a/doc/COPYING.GPLv2 +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/doc/COPYING.GPLv3 b/doc/COPYING.GPLv3 deleted file mode 100644 index 94a9ed024d..0000000000 --- a/doc/COPYING.GPLv3 +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/license_GPLv2.md b/license_GPLv2.md new file mode 100644 index 0000000000..b017086e9c --- /dev/null +++ b/license_GPLv2.md @@ -0,0 +1,264 @@ +The GNU General Public License, Version 2, June 1991 (GPLv2) +============================================================ + +> Copyright (C) 1989, 1991 Free Software Foundation, Inc. +> 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + + +Preamble +-------- + +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public License is intended to +guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to most +of the Free Software Foundation's software and to any other program whose +authors commit to using it. (Some other Free Software Foundation software is +covered by the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for this service if you wish), +that you receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs; and that you know you can +do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny +you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a +fee, you must give the recipients all the rights that you have. You must make +sure that they, too, receive or can get the source code. And you must show them +these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer +you this license which gives you legal permission to copy, distribute and/or +modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients to +know that what they have is not the original, so that any problems introduced by +others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish +to avoid the danger that redistributors of a free program will individually +obtain patent licenses, in effect making the program proprietary. To prevent +this, we have made it clear that any patent must be licensed for everyone's free +use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + + +Terms And Conditions For Copying, Distribution And Modification +--------------------------------------------------------------- + +**0.** This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms of +this General Public License. The "Program", below, refers to any such program or +work, and a "work based on the Program" means either the Program or any +derivative work under copyright law: that is to say, a work containing the +Program or a portion of it, either verbatim or with modifications and/or +translated into another language. (Hereinafter, translation is included without +limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by +this License; they are outside its scope. The act of running the Program is not +restricted, and the output from the Program is covered only if its contents +constitute a work based on the Program (independent of having been made by +running the Program). Whether that is true depends on what the Program does. + +**1.** You may copy and distribute verbatim copies of the Program's source code +as you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this License +and to the absence of any warranty; and give any other recipients of the Program +a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at +your option offer warranty protection in exchange for a fee. + +**2.** You may modify your copy or copies of the Program or any portion of it, +thus forming a work based on the Program, and copy and distribute such +modifications or work under the terms of Section 1 above, provided that you also +meet all of these conditions: + +* **a)** You must cause the modified files to carry prominent notices stating + that you changed the files and the date of any change. + +* **b)** You must cause any work that you distribute or publish, that in whole + or in part contains or is derived from the Program or any part thereof, to + be licensed as a whole at no charge to all third parties under the terms of + this License. + +* **c)** If the modified program normally reads commands interactively when + run, you must cause it, when started running for such interactive use in the + most ordinary way, to print or display an announcement including an + appropriate copyright notice and a notice that there is no warranty (or + else, saying that you provide a warranty) and that users may redistribute + the program under these conditions, and telling the user how to view a copy + of this License. (Exception: if the Program itself is interactive but does + not normally print such an announcement, your work based on the Program is + not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be reasonably +considered independent and separate works in themselves, then this License, and +its terms, do not apply to those sections when you distribute them as separate +works. But when you distribute the same sections as part of a whole which is a +work based on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the entire whole, +and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise the +right to control the distribution of derivative or collective works based on the +Program. + +In addition, mere aggregation of another work not based on the Program with the +Program (or with a work based on the Program) on a volume of a storage or +distribution medium does not bring the other work under the scope of this +License. + +**3.** You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 and 2 +above provided that you also do one of the following: + +* **a)** Accompany it with the complete corresponding machine-readable source + code, which must be distributed under the terms of Sections 1 and 2 above on + a medium customarily used for software interchange; or, + +* **b)** Accompany it with a written offer, valid for at least three years, to + give any third party, for a charge no more than your cost of physically + performing source distribution, a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of Sections 1 + and 2 above on a medium customarily used for software interchange; or, + +* **c)** Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed only for + noncommercial distribution and only if you received the program in object + code or executable form with such an offer, in accord with Subsection b + above.) + +The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all the +source code for all modules it contains, plus any associated interface +definition files, plus the scripts used to control compilation and installation +of the executable. However, as a special exception, the source code distributed +need not include anything that is normally distributed (in either source or +binary form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component itself +accompanies the executable. + +If distribution of executable or object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the source code +from the same place counts as distribution of the source code, even though third +parties are not compelled to copy the source along with the object code. + +**4.** You may not copy, modify, sublicense, or distribute the Program except as +expressly provided under this License. Any attempt otherwise to copy, modify, +sublicense or distribute the Program is void, and will automatically terminate +your rights under this License. However, parties who have received copies, or +rights, from you under this License will not have their licenses terminated so +long as such parties remain in full compliance. + +**5.** You are not required to accept this License, since you have not signed +it. However, nothing else grants you permission to modify or distribute the +Program or its derivative works. These actions are prohibited by law if you do +not accept this License. Therefore, by modifying or distributing the Program (or +any work based on the Program), you indicate your acceptance of this License to +do so, and all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +**6.** Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the original +licensor to copy, distribute or modify the Program subject to these terms and +conditions. You may not impose any further restrictions on the recipients' +exercise of the rights granted herein. You are not responsible for enforcing +compliance by third parties to this License. + +**7.** If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), conditions +are imposed on you (whether by court order, agreement or otherwise) that +contradict the conditions of this License, they do not excuse you from the +conditions of this License. If you cannot distribute so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not distribute the Program at all. +For example, if a patent license would not permit royalty-free redistribution of +the Program by all those who receive copies directly or indirectly through you, +then the only way you could satisfy both it and this License would be to refrain +entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and the +section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or +other property right claims or to contest validity of any such claims; this +section has the sole purpose of protecting the integrity of the free software +distribution system, which is implemented by public license practices. Many +people have made generous contributions to the wide range of software +distributed through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee cannot impose that +choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +**8.** If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original copyright +holder who places the Program under this License may add an explicit +geographical distribution limitation excluding those countries, so that +distribution is permitted only in or among countries not thus excluded. In such +case, this License incorporates the limitation as if written in the body of this +License. + +**9.** The Free Software Foundation may publish revised and/or new versions of +the General Public License from time to time. Such new versions will be similar +in spirit to the present version, but may differ in detail to address new +problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies +a version number of this License which applies to it and "any later version", +you have the option of following the terms and conditions either of that version +or of any later version published by the Free Software Foundation. If the +Program does not specify a version number of this License, you may choose any +version ever published by the Free Software Foundation. + +**10.** If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software Foundation, +write to the Free Software Foundation; we sometimes make exceptions for this. +Our decision will be guided by the two goals of preserving the free status of +all derivatives of our free software and of promoting the sharing and reuse of +software generally. + + +No Warranty +----------- + +**11.** BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM +"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +**12.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR +INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA +BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER +OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. diff --git a/license_GPLv3.md b/license_GPLv3.md new file mode 100644 index 0000000000..2061be2b73 --- /dev/null +++ b/license_GPLv3.md @@ -0,0 +1,656 @@ +The GNU General Public License, Version 3, 29 June 2007 (GPLv3) +=============================================================== + +> Copyright © 2007 +> Free Software Foundation, Inc. +> <> + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + + +Preamble +-------- + +The GNU General Public License is a free, copyleft license for software and +other kinds of works. + +The licenses for most software and other practical works are designed to take +away your freedom to share and change the works. By contrast, the GNU General +Public License is intended to guarantee your freedom to share and change all +versions of a program--to make sure it remains free software for all its users. +We, the Free Software Foundation, use the GNU General Public License for most of +our software; it applies also to any other work released this way by its +authors. You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for them if you wish), that you +receive source code or can get it if you want it, that you can change the +software or use pieces of it in new free programs, and that you know you can do +these things. + +To protect your rights, we need to prevent others from denying you these rights +or asking you to surrender the rights. Therefore, you have certain +responsibilities if you distribute copies of the software, or if you modify it: +responsibilities to respect the freedom of others. + +For example, if you distribute copies of such a program, whether gratis or for a +fee, you must pass on to the recipients the same freedoms that you received. You +must make sure that they, too, receive or can get the source code. And you must +show them these terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: (1) assert +copyright on the software, and (2) offer you this License giving you legal +permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains that there +is no warranty for this free software. For both users' and authors' sake, the +GPL requires that modified versions be marked as changed, so that their problems +will not be attributed erroneously to authors of previous versions. + +Some devices are designed to deny users access to install or run modified +versions of the software inside them, although the manufacturer can do so. This +is fundamentally incompatible with the aim of protecting users' freedom to +change the software. The systematic pattern of such abuse occurs in the area of +products for individuals to use, which is precisely where it is most +unacceptable. Therefore, we have designed this version of the GPL to prohibit +the practice for those products. If such problems arise substantially in other +domains, we stand ready to extend this provision to those domains in future +versions of the GPL, as needed to protect the freedom of users. + +Finally, every program is threatened constantly by software patents. States +should not allow patents to restrict development and use of software on +general-purpose computers, but in those that do, we wish to avoid the special +danger that patents applied to a free program could make it effectively +proprietary. To prevent this, the GPL assures that patents cannot be used to +render the program non-free. + +The precise terms and conditions for copying, distribution and modification +follow. + + +TERMS AND CONDITIONS +-------------------- + + +### 0. Definitions. + +"This License refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds of works, +such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this License. Each +licensee is addressed as "you". "Licensees" and "recipients" may be individuals +or organizations. + +To "modify" a work means to copy from or adapt all or part of the work in a +fashion requiring copyright permission, other than the making of an exact copy. +The resulting work is called a "modified version" of the earlier work or a work +"based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based on the +Program. + +To "propagate" a work means to do anything with it that, without permission, +would make you directly or secondarily liable for infringement under applicable +copyright law, except executing it on a computer or modifying a private copy. +Propagation includes copying, distribution (with or without modification), +making available to the public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other parties to +make or receive copies. Mere interaction with a user through a computer network, +with no transfer of a copy, is not conveying. + +An interactive user interface displays "Appropriate Legal Notices" to the extent +that it includes a convenient and prominently visible feature that (1) displays +an appropriate copyright notice, and (2) tells the user that there is no +warranty for the work (except to the extent that warranties are provided), that +licensees may convey the work under this License, and how to view a copy of this +License. If the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + +### 1. Source Code. + +The "source code" for a work means the preferred form of the work for making +modifications to it. "Object code" means any non-source form of a work. + +A "Standard Interface" means an interface that either is an official standard +defined by a recognized standards body, or, in the case of interfaces specified +for a particular programming language, one that is widely used among developers +working in that language. + +The "System Libraries" of an executable work include anything, other than the +work as a whole, that (a) is included in the normal form of packaging a Major +Component, but which is not part of that Major Component, and (b) serves only to +enable use of the work with that Major Component, or to implement a Standard +Interface for which an implementation is available to the public in source code +form. A "Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system (if any) on +which the executable work runs, or a compiler used to produce the work, or an +object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all the source +code needed to generate, install, and (for an executable work) run the object +code and to modify the work, including scripts to control those activities. +However, it does not include the work's System Libraries, or general-purpose +tools or generally available free programs which are used unmodified in +performing those activities but which are not part of the work. For example, +Corresponding Source includes interface definition files associated with source +files for the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, such as by +intimate data communication or control flow between those subprograms and other +parts of the work. + +The Corresponding Source need not include anything that users can regenerate +automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. + + +### 2. Basic Permissions. + +All rights granted under this License are granted for the term of copyright on +the Program, and are irrevocable provided the stated conditions are met. This +License explicitly affirms your unlimited permission to run the unmodified +Program. The output from running a covered work is covered by this License only +if the output, given its content, constitutes a covered work. This License +acknowledges your rights of fair use or other equivalent, as provided by +copyright law. + +You may make, run and propagate covered works that you do not convey, without +conditions so long as your license otherwise remains in force. You may convey +covered works to others for the sole purpose of having them make modifications +exclusively for you, or provide you with facilities for running those works, +provided that you comply with the terms of this License in conveying all +material for which you do not control copyright. Those thus making or running +the covered works for you must do so exclusively on your behalf, under your +direction and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the conditions +stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + + +### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological measure under +any applicable law fulfilling obligations under article 11 of the WIPO copyright +treaty adopted on 20 December 1996, or similar laws prohibiting or restricting +circumvention of such measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention is +effected by exercising rights under this License with respect to the covered +work, and you disclaim any intention to limit operation or modification of the +work as a means of enforcing, against the work's users, your or third parties' +legal rights to forbid circumvention of technological measures. + + +### 4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you receive it, +in any medium, provided that you conspicuously and appropriately publish on each +copy an appropriate copyright notice; keep intact all notices stating that this +License and any non-permissive terms added in accord with section 7 apply to the +code; keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may +offer support or warranty protection for a fee. + + +### 5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to produce it +from the Program, in the form of source code under the terms of section 4, +provided that you also meet all of these conditions: + +* **a)** The work must carry prominent notices stating that you modified it, + and giving a relevant date. + +* **b)** The work must carry prominent notices stating that it is released + under this License and any conditions added under section 7. This + requirement modifies the requirement in section 4 to "keep intact all + notices". + +* **c)** You must license the entire work, as a whole, under this License to + anyone who comes into possession of a copy. This License will therefore + apply, along with any applicable section 7 additional terms, to the whole of + the work, and all its parts, regardless of how they are packaged. This + License gives no permission to license the work in any other way, but it + does not invalidate such permission if you have separately received it. + +* **d)** If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your work need not + make them do so. + +A compilation of a covered work with other separate and independent works, +which are not by their nature extensions of the covered work, and which are +not combined with it such as to form a larger program, in or on a volume of +a storage or distribution medium, is called an "aggregate" if the +compilation and its resulting copyright are not used to limit the access or +legal rights of the compilation's users beyond what the individual works +permit. Inclusion of a covered work in an aggregate does not cause this +License to apply to the other parts of the aggregate. + + +### 6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of sections 4 +and 5, provided that you also convey the machine-readable Corresponding Source +under the terms of this License, in one of these ways: + +* **a)** Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the Corresponding + Source fixed on a durable physical medium customarily used for software + interchange. + +* **b)** Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a written offer, + valid for at least three years and valid for as long as you offer spare + parts or customer support for that product model, to give anyone who + possesses the object code either (1) a copy of the Corresponding Source for + all the software in the product that is covered by this License, on a + durable physical medium customarily used for software interchange, for a + price no more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the Corresponding Source from a + network server at no charge. + +* **c)** Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This alternative is + allowed only occasionally and noncommercially, and only if you received the + object code with such an offer, in accord with subsection 6b. + +* **d)** Convey the object code by offering access from a designated place + (gratis or for a charge), and offer equivalent access to the Corresponding + Source in the same way through the same place at no further charge. You need + not require recipients to copy the Corresponding Source along with the + object code. If the place to copy the object code is a network server, the + Corresponding Source may be on a different server (operated by you or a + third party) that supports equivalent copying facilities, provided you + maintain clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the Corresponding + Source, you remain obligated to ensure that it is available for as long as + needed to satisfy these requirements. + +* **e)** Convey the object code using peer-to-peer transmission, provided you + inform other peers where the object code and Corresponding Source of the + work are being offered to the general public at no charge under subsection + 6d. + +A separable portion of the object code, whose source code is excluded from +the Corresponding Source as a System Library, need not be included in +conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, or +household purposes, or (2) anything designed or sold for incorporation into +a dwelling. In determining whether a product is a consumer product, doubtful +cases shall be resolved in favor of coverage. For a particular product +received by a particular user, "normally used" refers to a typical or common +use of that class of product, regardless of the status of the particular +user or of the way in which the particular user actually uses, or expects or +is expected to use, the product. A product is a consumer product regardless +of whether the product has substantial commercial, industrial or non- +consumer uses, unless such uses represent the only significant mode of use +of the product. + +"Installation Information" for a User Product means any methods, procedures, +authorization keys, or other information required to install and execute +modified versions of a covered work in that User Product from a modified +version of its Corresponding Source. The information must suffice to ensure +that the continued functioning of the modified object code is in no case +prevented or interfered with solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as part of +a transaction in which the right of possession and use of the User Product +is transferred to the recipient in perpetuity or for a fixed term +(regardless of how the transaction is characterized), the Corresponding +Source conveyed under this section must be accompanied by the Installation +Information. But this requirement does not apply if neither you nor any +third party retains the ability to install modified object code on the User +Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates for +a work that has been modified or installed by the recipient, or for the User +Product in which it has been modified or installed. Access to a network may +be denied when the modification itself materially and adversely affects the +operation of the network or violates the rules and protocols for +communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in +accord with this section must be in a format that is publicly documented +(and with an implementation available to the public in source code form), +and must require no special password or key for unpacking, reading or +copying. + + +### 7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this License by +making exceptions from one or more of its conditions. Additional permissions +that are applicable to the entire Program shall be treated as though they were +included in this License, to the extent that they are valid under applicable +law. If additional permissions apply only to part of the Program, that part may +be used separately under those permissions, but the entire Program remains +governed by this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any +additional permissions from that copy, or from any part of it. (Additional +permissions may be written to require their own removal in certain cases when +you modify the work.) You may place additional permissions on material, added by +you to a covered work, for which you have or can give appropriate copyright +permission. + +Notwithstanding any other provision of this License, for material you add to a +covered work, you may (if authorized by the copyright holders of that material) +supplement the terms of this License with terms: + +* **a)** Disclaiming warranty or limiting liability differently from the terms + of sections 15 and 16 of this License; or + +* **b)** Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal Notices + displayed by works containing it; or + +* **c)** Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in reasonable + ways as different from the original version; or + +* **d)** Limiting the use for publicity purposes of names of licensors or + authors of the material; or + +* **e)** Declining to grant rights under trademark law for use of some trade + names, trademarks, or service marks; or + +* **f)** Requiring indemnification of licensors and authors of that material + by anyone who conveys the material (or modified versions of it) with + contractual assumptions of liability to the recipient, for any liability + that these contractual assumptions directly impose on those licensors and + authors. + +All other non-permissive additional terms are considered "further restrictions" +within the meaning of section 10. If the Program as you received it, or any part +of it, contains a notice stating that it is governed by this License along with +a term that is a further restriction, you may remove that term. If a license +document contains a further restriction but permits relicensing or conveying +under this License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does not survive +such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, +in the relevant source files, a statement of the additional terms that apply to +those files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a +separately written license, or stated as exceptions; the above requirements +apply either way. + + +### 8. Termination. + +You may not propagate or modify a covered work except as expressly provided +under this License. Any attempt otherwise to propagate or modify it is void, and +will automatically terminate your rights under this License (including any +patent licenses granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a +particular copyright holder is reinstated (a) provisionally, unless and until +the copyright holder explicitly and finally terminates your license, and (b) +permanently, if the copyright holder fails to notify you of the violation by +some reasonable means prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated +permanently if the copyright holder notifies you of the violation by some +reasonable means, this is the first time you have received notice of violation +of this License (for any work) from that copyright holder, and you cure the +violation prior to 30 days after your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of +parties who have received copies or rights from you under this License. If your +rights have been terminated and not permanently reinstated, you do not qualify +to receive new licenses for the same material under section 10. + + +### 9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run a copy of +the Program. Ancillary propagation of a covered work occurring solely as a +consequence of using peer-to-peer transmission to receive a copy likewise does +not require acceptance. However, nothing other than this License grants you +permission to propagate or modify any covered work. These actions infringe +copyright if you do not accept this License. Therefore, by modifying or +propagating a covered work, you indicate your acceptance of this License to do +so. + + +### 10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically receives a +license from the original licensors, to run, modify and propagate that work, +subject to this License. You are not responsible for enforcing compliance by +third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered work results +from an entity transaction, each party to that transaction who receives a copy +of the work also receives whatever licenses to the work the party's predecessor +in interest had or could give under the previous paragraph, plus a right to +possession of the Corresponding Source of the work from the predecessor in +interest, if the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights +granted or affirmed under this License. For example, you may not impose a +license fee, royalty, or other charge for exercise of rights granted under this +License, and you may not initiate litigation (including a cross-claim or +counterclaim in a lawsuit) alleging that any patent claim is infringed by +making, using, selling, offering for sale, or importing the Program or any +portion of it. + + +### 11. Patents. + +A "contributor" is a copyright holder who authorizes use under this License of +the Program or a work on which the Program is based. The work thus licensed is +called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned or +controlled by the contributor, whether already acquired or hereafter acquired, +that would be infringed by some manner, permitted by this License, of making, +using, or selling its contributor version, but do not include claims that would +be infringed only as a consequence of further modification of the contributor +version. For purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent +license under the contributor's essential patent claims, to make, use, sell, +offer for sale, import and otherwise run, modify and propagate the contents of +its contributor version. + +In the following three paragraphs, a "patent license" is any express agreement +or commitment, however denominated, not to enforce a patent (such as an express +permission to practice a patent or covenant not to sue for patent infringement). +To "grant" such a patent license to a party means to make such an agreement or +commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the +Corresponding Source of the work is not available for anyone to copy, free of +charge and under the terms of this License, through a publicly available network +server or other readily accessible means, then you must either (1) cause the +Corresponding Source to be so available, or (2) arrange to deprive yourself of +the benefit of the patent license for this particular work, or (3) arrange, in a +manner consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have actual +knowledge that, but for the patent license, your conveying the covered work in a +country, or your recipient's use of the covered work in a country, would +infringe one or more identifiable patents in that country that you have reason +to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you +convey, or propagate by procuring conveyance of, a covered work, and grant a +patent license to some of the parties receiving the covered work authorizing +them to use, propagate, modify or convey a specific copy of the covered work, +then the patent license you grant is automatically extended to all recipients of +the covered work and works based on it. + +A patent license is "discriminatory" if it does not include within the scope of +its coverage, prohibits the exercise of, or is conditioned on the non- exercise +of one or more of the rights that are specifically granted under this License. +You may not convey a covered work if you are a party to an arrangement with a +third party that is in the business of distributing software, under which you +make payment to the third party based on the extent of your activity of +conveying the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by you (or +copies made from those copies), or (b) primarily for and in connection with +specific products or compilations that contain the covered work, unless you +entered into that arrangement, or that patent license was granted, prior to 28 +March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied +license or other defenses to infringement that may otherwise be available to you +under applicable patent law. + + +### 12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not excuse +you from the conditions of this License. If you cannot convey a covered work so +as to satisfy simultaneously your obligations under this License and any other +pertinent obligations, then as a consequence you may not convey it at all. For +example, if you agree to terms that obligate you to collect a royalty for +further conveying from those to whom you convey the Program, the only way you +could satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + + +### 13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have permission to link +or combine any covered work with a work licensed under version 3 of the GNU +Affero General Public License into a single combined work, and to convey the +resulting work. The terms of this License will continue to apply to the part +which is the covered work, but the special requirements of the GNU Affero +General Public License, section 13, concerning interaction through a network +will apply to the combination as such. + + +### 14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of the GNU +General Public License from time to time. Such new versions will be similar in +spirit to the present version, but may differ in detail to address new problems +or concerns. + +Each version is given a distinguishing version number. If the Program specifies +that a certain numbered version of the GNU General Public License "or any later +version" applies to it, you have the option of following the terms and +conditions either of that numbered version or of any later version published by +the Free Software Foundation. If the Program does not specify a version number +of the GNU General Public License, you may choose any version ever published by +the Free Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the +GNU General Public License can be used, that proxy's public statement of +acceptance of a version permanently authorizes you to choose that version for +the Program. + +Later license versions may give you additional or different permissions. +However, no additional obligations are imposed on any author or copyright holder +as a result of your choosing to follow a later version. + + +### 15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER +PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER +EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE +QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + +### 16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY +COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS +PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, +INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE +THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED +INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE +PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY +HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +### 17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided above cannot +be given local legal effect according to their terms, reviewing courts shall +apply local law that most closely approximates an absolute waiver of all civil +liability in connection with the Program, unless a warranty or assumption of +liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + + +How to Apply These Terms to Your New Programs +--------------------------------------------- + +If you develop a new program, and you want it to be of the greatest possible use +to the public, the best way to achieve this is to make it free software which +everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach +them to the start of each source file to most effectively state the exclusion of +warranty; and each file should have at least the "copyright" line and a pointer +to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + You should have received a copy of the GNU General Public License along with + this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short notice like +this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. + This is free software, and you are welcome to redistribute it under certain + conditions; type 'show c' for details. + +The hypothetical commands 'show w' and 'show c' should show the appropriate +parts of the General Public License. Of course, your program's commands might be +different; for a GUI interface, you would use an "about box". + +You should also get your employer (if you work as a programmer) or school, if +any, to sign a "copyright disclaimer" for the program, if necessary. For more +information on this, and how to apply and follow the GNU GPL, see +<>. + +The GNU General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may consider +it more useful to permit linking proprietary applications with the library. If +this is what you want to do, use the GNU Lesser General Public License instead +of this License. But first, please read +<>. diff --git a/license_Modified_BSD.md b/license_Modified_BSD.md new file mode 100644 index 0000000000..3d5f00f2cd --- /dev/null +++ b/license_Modified_BSD.md @@ -0,0 +1,32 @@ +This software is licensed with a Modified BSD License. + +All of this is supposed to be Free Software, Open Source, DFSG-free, +GPL-compatible, and OK to use in both free and proprietary applications. +Additions and corrections to this file are welcome. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holders nor the names of + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/quantum/analog.c b/quantum/analog.c index 49b84ee0e8..1ec38df75d 100644 --- a/quantum/analog.c +++ b/quantum/analog.c @@ -1,3 +1,19 @@ +/* Copyright 2015 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + // Simple analog to digitial conversion #include diff --git a/quantum/analog.h b/quantum/analog.h index 9b95a93bef..8d93de7dc2 100644 --- a/quantum/analog.h +++ b/quantum/analog.h @@ -1,3 +1,19 @@ +/* Copyright 2015 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef _analog_h_included__ #define _analog_h_included__ diff --git a/quantum/api.c b/quantum/api.c index 6a7c0a4332..52dfe23e17 100644 --- a/quantum/api.c +++ b/quantum/api.c @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "api.h" #include "quantum.h" @@ -176,4 +192,4 @@ void process_api(uint16_t length, uint8_t * data) { // #endif } -} \ No newline at end of file +} diff --git a/quantum/api.h b/quantum/api.h index 00dcdb8954..efc0ddca12 100644 --- a/quantum/api.h +++ b/quantum/api.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef _API_H_ #define _API_H_ @@ -56,4 +72,4 @@ bool process_api_keyboard(uint8_t length, uint8_t * data); __attribute__ ((weak)) bool process_api_user(uint8_t length, uint8_t * data); -#endif \ No newline at end of file +#endif diff --git a/quantum/api/api_sysex.c b/quantum/api/api_sysex.c index 868f854b92..6a2ee90124 100644 --- a/quantum/api/api_sysex.c +++ b/quantum/api/api_sysex.c @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert, Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "api_sysex.h" #include "sysex_tools.h" #include "print.h" diff --git a/quantum/api/api_sysex.h b/quantum/api/api_sysex.h index b947b60e54..a23f00f572 100644 --- a/quantum/api/api_sysex.h +++ b/quantum/api/api_sysex.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef _API_SYSEX_H_ #define _API_SYSEX_H_ @@ -7,4 +23,4 @@ void send_bytes_sysex(uint8_t message_type, uint8_t data_type, uint8_t * bytes, #define SEND_BYTES(mt, dt, b, l) send_bytes_sysex(mt, dt, b, l) -#endif \ No newline at end of file +#endif diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c index e1e81fd2b8..597073611a 100644 --- a/quantum/audio/audio.c +++ b/quantum/audio/audio.c @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include //#include diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h index 47f326ea0a..27fdc2ab63 100644 --- a/quantum/audio/audio.h +++ b/quantum/audio/audio.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef AUDIO_H #define AUDIO_H @@ -88,4 +103,4 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat, float n_rest) bool is_playing_notes(void); -#endif \ No newline at end of file +#endif diff --git a/quantum/audio/audio_pwm.c b/quantum/audio/audio_pwm.c index f820eec1be..ded86edeea 100644 --- a/quantum/audio/audio_pwm.c +++ b/quantum/audio/audio_pwm.c @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include //#include diff --git a/quantum/audio/luts.c b/quantum/audio/luts.c index 9f3de9a05c..57f2d5924c 100644 --- a/quantum/audio/luts.c +++ b/quantum/audio/luts.c @@ -1,3 +1,19 @@ +/* Copyright 2016 IBNobody + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include #include #include diff --git a/quantum/audio/luts.h b/quantum/audio/luts.h index 7df3078a7f..155e34e88d 100644 --- a/quantum/audio/luts.h +++ b/quantum/audio/luts.h @@ -1,3 +1,19 @@ +/* Copyright 2016 IBNobody + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include #include #include @@ -12,4 +28,4 @@ extern const float vibrato_lut[VIBRATO_LUT_LENGTH]; extern const uint16_t frequency_lut[FREQUENCY_LUT_LENGTH]; -#endif /* LUTS_H */ \ No newline at end of file +#endif /* LUTS_H */ diff --git a/quantum/audio/musical_notes.h b/quantum/audio/musical_notes.h index b08d16a6fa..a3aaa2f199 100644 --- a/quantum/audio/musical_notes.h +++ b/quantum/audio/musical_notes.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef MUSICAL_NOTES_H #define MUSICAL_NOTES_H @@ -214,4 +230,4 @@ #define NOTE_BF8 NOTE_AS8 -#endif \ No newline at end of file +#endif diff --git a/quantum/audio/song_list.h b/quantum/audio/song_list.h index 400915db91..3bf20333dd 100644 --- a/quantum/audio/song_list.h +++ b/quantum/audio/song_list.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "musical_notes.h" #ifndef SONG_LIST_H diff --git a/quantum/audio/voices.c b/quantum/audio/voices.c index c2edb75f01..54ebd423b1 100644 --- a/quantum/audio/voices.c +++ b/quantum/audio/voices.c @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "voices.h" #include "audio.h" #include "stdlib.h" diff --git a/quantum/audio/voices.h b/quantum/audio/voices.h index 52f7e006d6..9403a6b5e7 100644 --- a/quantum/audio/voices.h +++ b/quantum/audio/voices.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include @@ -32,4 +47,4 @@ void set_voice(voice_type v); void voice_iterate(void); void voice_deiterate(void); -#endif \ No newline at end of file +#endif diff --git a/quantum/audio/wave.h b/quantum/audio/wave.h index 6ebc348519..f15615dd1b 100644 --- a/quantum/audio/wave.h +++ b/quantum/audio/wave.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include #include #include @@ -262,4 +278,4 @@ const uint8_t sinewave[] PROGMEM= //2048 values 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/quantum/config_common.h b/quantum/config_common.h index 28f68b9c70..c88e02d918 100644 --- a/quantum/config_common.h +++ b/quantum/config_common.h @@ -1,3 +1,19 @@ +/* Copyright 2015-2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef CONFIG_DEFINITIONS_H #define CONFIG_DEFINITIONS_H diff --git a/quantum/dynamic_macro.h b/quantum/dynamic_macro.h index e6dbc5b9c1..64093f293e 100644 --- a/quantum/dynamic_macro.h +++ b/quantum/dynamic_macro.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + /* Author: Wojciech Siewierski < wojciech dot siewierski at onet dot pl > */ #ifndef DYNAMIC_MACROS_H #define DYNAMIC_MACROS_H diff --git a/quantum/keycode_config.c b/quantum/keycode_config.c index 6d90781a17..4f7bc525ec 100644 --- a/quantum/keycode_config.c +++ b/quantum/keycode_config.c @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "keycode_config.h" extern keymap_config_t keymap_config; @@ -71,4 +87,4 @@ uint16_t keycode_config(uint16_t keycode) { default: return keycode; } -} \ No newline at end of file +} diff --git a/quantum/keycode_config.h b/quantum/keycode_config.h index c15b0d32f8..293fefecfb 100644 --- a/quantum/keycode_config.h +++ b/quantum/keycode_config.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "eeconfig.h" #include "keycode.h" diff --git a/quantum/keymap.h b/quantum/keymap.h index c000d2da8e..5d64be19c8 100644 --- a/quantum/keymap.h +++ b/quantum/keymap.h @@ -1,5 +1,5 @@ /* -Copyright 2012,2013 Jun Wako +Copyright 2012-2016 Jun Wako This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 002eabd85e..6cf4f031ff 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -1,5 +1,5 @@ /* -Copyright 2012,2013 Jun Wako +Copyright 2012-2017 Jun Wako This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/quantum/keymap_extras/keymap_bepo.h b/quantum/keymap_extras/keymap_bepo.h index e5ef39552a..013559e96d 100644 --- a/quantum/keymap_extras/keymap_bepo.h +++ b/quantum/keymap_extras/keymap_bepo.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Didier Loiseau + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ /* Keymap macros for the French BÉPO layout - http://bepo.fr */ #ifndef KEYMAP_BEPO_H #define KEYMAP_BEPO_H diff --git a/quantum/keymap_extras/keymap_canadian_multilingual.h b/quantum/keymap_extras/keymap_canadian_multilingual.h index 0bc20c7b9c..1d45bee32e 100644 --- a/quantum/keymap_extras/keymap_canadian_multilingual.h +++ b/quantum/keymap_extras/keymap_canadian_multilingual.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Didier Loiseau + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_CANADIAN_MULTILINGUAG_H #define KEYMAP_CANADIAN_MULTILINGUAG_H diff --git a/quantum/keymap_extras/keymap_colemak.h b/quantum/keymap_extras/keymap_colemak.h index b8d6157484..2d3f9c06a5 100644 --- a/quantum/keymap_extras/keymap_colemak.h +++ b/quantum/keymap_extras/keymap_colemak.h @@ -1,3 +1,18 @@ +/* Copyright 2015-2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_COLEMAK_H #define KEYMAP_COLEMAK_H diff --git a/quantum/keymap_extras/keymap_dvorak.h b/quantum/keymap_extras/keymap_dvorak.h index a0feed850d..b1d5604baf 100644 --- a/quantum/keymap_extras/keymap_dvorak.h +++ b/quantum/keymap_extras/keymap_dvorak.h @@ -1,3 +1,18 @@ +/* Copyright 2015-2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_DVORAK_H #define KEYMAP_DVORAK_H diff --git a/quantum/keymap_extras/keymap_dvp.h b/quantum/keymap_extras/keymap_dvp.h index 83f49a52b5..50e2d1f461 100644 --- a/quantum/keymap_extras/keymap_dvp.h +++ b/quantum/keymap_extras/keymap_dvp.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Artyom Mironov + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef KEYMAP_DVP_H #define KEYMAP_DVP_H diff --git a/quantum/keymap_extras/keymap_fr_ch.h b/quantum/keymap_extras/keymap_fr_ch.h index 87d4bb24cf..c0ca832a6f 100644 --- a/quantum/keymap_extras/keymap_fr_ch.h +++ b/quantum/keymap_extras/keymap_fr_ch.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Vincent Pochet + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_FR_CH #define KEYMAP_FR_CH diff --git a/quantum/keymap_extras/keymap_french.h b/quantum/keymap_extras/keymap_french.h index 401bbdf644..3308dc5f77 100644 --- a/quantum/keymap_extras/keymap_french.h +++ b/quantum/keymap_extras/keymap_french.h @@ -1,3 +1,18 @@ +/* Copyright 2015-2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_FRENCH_H #define KEYMAP_FRENCH_H diff --git a/quantum/keymap_extras/keymap_french_osx.h b/quantum/keymap_extras/keymap_french_osx.h index 004d73ee23..ecade3fe98 100644 --- a/quantum/keymap_extras/keymap_french_osx.h +++ b/quantum/keymap_extras/keymap_french_osx.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Sébastien Pérochon + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_FRENCH_OSX_H #define KEYMAP_FRENCH_OSX_H @@ -74,4 +89,4 @@ #define FR_PIPE LSFT(LALT(KC_L)) #define FR_BSLS LSFT(LALT(FR_COLN)) -#endif \ No newline at end of file +#endif diff --git a/quantum/keymap_extras/keymap_german.h b/quantum/keymap_extras/keymap_german.h index 7e2e0ed44e..e007c26ef5 100644 --- a/quantum/keymap_extras/keymap_german.h +++ b/quantum/keymap_extras/keymap_german.h @@ -1,3 +1,19 @@ +/* Copyright 2015-2016 Matthias Schmidtt + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef KEYMAP_GERMAN #define KEYMAP_GERMAN diff --git a/quantum/keymap_extras/keymap_german_ch.h b/quantum/keymap_extras/keymap_german_ch.h index b66d582a44..8332e00af3 100644 --- a/quantum/keymap_extras/keymap_german_ch.h +++ b/quantum/keymap_extras/keymap_german_ch.h @@ -1,3 +1,18 @@ +/* Copyright 2016 heartsekai + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_SWISS_GERMAN #define KEYMAP_SWISS_GERMAN diff --git a/quantum/keymap_extras/keymap_german_osx.h b/quantum/keymap_extras/keymap_german_osx.h index f63f066183..798bb75798 100644 --- a/quantum/keymap_extras/keymap_german_osx.h +++ b/quantum/keymap_extras/keymap_german_osx.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Stephen Bösebeck + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_GERMAN_OSX #define KEYMAP_GERMAN_OSX diff --git a/quantum/keymap_extras/keymap_jp.h b/quantum/keymap_extras/keymap_jp.h index e81b5952e0..fb74bce8d4 100644 --- a/quantum/keymap_extras/keymap_jp.h +++ b/quantum/keymap_extras/keymap_jp.h @@ -1,4 +1,19 @@ -/* JP106-layout (Japanese Standard) +/* Copyright 2016 h-youhei + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * JP106-layout (Japanese Standard) * * For more information, see * http://www2d.biglobe.ne.jp/~msyk/keyboard/layout/usbkeycode.html diff --git a/quantum/keymap_extras/keymap_neo2.h b/quantum/keymap_extras/keymap_neo2.h index 80439af347..174f4a6eec 100644 --- a/quantum/keymap_extras/keymap_neo2.h +++ b/quantum/keymap_extras/keymap_neo2.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Matthias Schmitt + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_NEO2 #define KEYMAP_NEO2 diff --git a/quantum/keymap_extras/keymap_nordic.h b/quantum/keymap_extras/keymap_nordic.h index 9b0ef35ca9..6b34db5588 100644 --- a/quantum/keymap_extras/keymap_nordic.h +++ b/quantum/keymap_extras/keymap_nordic.h @@ -1,3 +1,18 @@ +/* Copyright 2015-2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_NORDIC_H #define KEYMAP_NORDIC_H diff --git a/quantum/keymap_extras/keymap_norwegian.h b/quantum/keymap_extras/keymap_norwegian.h index 5c4e8c4955..b7128973aa 100644 --- a/quantum/keymap_extras/keymap_norwegian.h +++ b/quantum/keymap_extras/keymap_norwegian.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_NORWEGIAN_H #define KEYMAP_NORWEGIAN_H diff --git a/quantum/keymap_extras/keymap_plover.h b/quantum/keymap_extras/keymap_plover.h index 9b88f7d84d..de6d8c53f3 100644 --- a/quantum/keymap_extras/keymap_plover.h +++ b/quantum/keymap_extras/keymap_plover.h @@ -1,3 +1,18 @@ +/* Copyright 2016 James Kay + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_PLOVER_H #define KEYMAP_PLOVER_H diff --git a/quantum/keymap_extras/keymap_russian.h b/quantum/keymap_extras/keymap_russian.h deleted file mode 100644 index 237e9abde3..0000000000 --- a/quantum/keymap_extras/keymap_russian.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef KEYMAP_RUSSIAN_H -#define KEYMAP_RUSSIAN_H - -#include "keymap.h" - -// Normal Chracters // reg SHIFT -#define RU_A KC_F // а and А -#define RU_BE KC_COMM // б and Б -#define RU_VE KC_D // в and В -#define RU_GHE KC_U // г and Г -#define RU_DE KC_L // д and Д -#define RU_IE KC_T // е and Е -#define RU_IO KC_GRV // ё and Ё -#define RU_ZHE KC_SCLN // ж and Ж -#define RU_ZE KC_P // з and З -#define RU_I KC_B // и and И -#define RU_SRT_I KC_Q // й and Й -#define RU_KA KC_R // к and К -#define RU_EL KC_K // л and Л -#define RU_EM KC_V // м and М -#define RU_EN KC_Y // н and Н -#define RU_O KC_J // о and О -#define RU_PE KC_G // п and П -#define RU_ER KC_H // р and Р -#define RU_ES KC_C // с and С -#define RU_TE KC_N // т and Т -#define RU_U KC_E // у and У -#define RU_EF KC_A // ф and Ф -#define RU_HA KC_LBRC // х and Х -#define RU_TSE KC_W // ц and Ц -#define RU_CHE KC_X // ч and Ч -#define RU_SHA KC_I // ш and Ш -#define RU_SHCHA KC_O // щ and Щ -#define RU_HSIGN KC_RBRC // ъ and Ъ -#define RU_YERU KC_S // ы and Ы -#define RU_SSIGN KC_M // ь and Ь -#define RU_E KC_QUOT // э and Э -#define RU_YU KC_DOT // ю and Ю -#define RU_YA KC_Z // я and Я - -#define RU_1 KC_1 // 1 and ! -#define RU_2 KC_2 // 2 and " -#define RU_3 KC_3 // 3 and № -#define RU_4 KC_4 // 4 and ; -#define RU_5 KC_5 // 5 and % -#define RU_6 KC_6 // 6 and : -#define RU_7 KC_7 // 7 and ? -#define RU_8 KC_8 // 8 and * -#define RU_9 KC_9 // 9 and ( -#define RU_0 KC_0 // 0 and ) - -#define RU_MINS KC_MINS // - and _ -#define RU_EQL KC_EQL // = and + -#define RU_BSLS KC_BSLS // \ and / -#define RU_DOT KC_SLSH // . and , - -// Shifted Chracters -#define RU_EXLM LSFT(RU_1) // ! -#define RU_DQUT LSFT(RU_2) // " -#define RU_NMRO LSFT(RU_3) // № -#define RU_SCLN LSFT(RU_4) // ; -#define RU_PERC LSFT(RU_5) // % -#define RU_COLN LSFT(RU_6) // : -#define RU_QUES LSFT(RU_7) // ? -#define RU_ASTR LSFT(RU_8) // * -#define RU_LPRN LSFT(RU_9) // ( -#define RU_RPRN LSFT(RU_0) // ) - -#define RU_UNDR LSFT(RU_MINS) // _ -#define RU_PLUS LSFT(RU_EQL) // + -#define RU_SLSH LSFT(RU_BSLS) // / -#define RU_COMM LSFT(RU_DOT) // , - -// Alt Gr-ed characters -#define RU_RUBL RALT(RU_8) // ₽ - -#endif diff --git a/quantum/keymap_extras/keymap_spanish.h b/quantum/keymap_extras/keymap_spanish.h index 4ba568af23..3a5787e9c4 100644 --- a/quantum/keymap_extras/keymap_spanish.h +++ b/quantum/keymap_extras/keymap_spanish.h @@ -1,3 +1,18 @@ +/* Copyright 2015-2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_SPANISH_H #define KEYMAP_SPANISH_H diff --git a/quantum/keymap_extras/keymap_uk.h b/quantum/keymap_extras/keymap_uk.h index 00c87afc3e..9d02efe04a 100644 --- a/quantum/keymap_extras/keymap_uk.h +++ b/quantum/keymap_extras/keymap_uk.h @@ -1,3 +1,18 @@ +/* Copyright 2015-2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef KEYMAP_UK_H #define KEYMAP_UK_H diff --git a/quantum/keymap_extras/keymap_unicode_cyrillic.h b/quantum/keymap_extras/keymap_unicode_cyrillic.h deleted file mode 100644 index a40626d911..0000000000 --- a/quantum/keymap_extras/keymap_unicode_cyrillic.h +++ /dev/null @@ -1,163 +0,0 @@ -#ifndef KEYMAP_CYRILLIC_H -#define KEYMAP_CYRILLIC_H - -#include "keymap.h" - -/* - * This is based off of - * https://en.wikipedia.org/wiki/Cyrillic_script - * - * Unicode is iffy, a software implementation is preferred - */ - -// Capital Char russian/ukrainian/bulgarian -#define CY_A UC(0x0410) // А rus ukr bul -#define CY_BE UC(0x0411) // Б rus ukr bul -#define CY_VE UC(0x0412) // В rus ukr bul -#define CY_GHE UC(0x0413) // Г rus ukr bul -#define CY_GHEUP UC(0x0490) // Ґ ukr -#define CY_DE UC(0x0414) // Д rus ukr bul -#define CY_DJE UC(0x0402) // Ђ -#define CY_GJE UC(0x0403) // Ѓ -#define CY_IE UC(0x0415) // Е rus ukr bul -#define CY_IO UC(0x0401) // Ё rus -#define CY_UIE UC(0x0404) // Є ukr -#define CY_ZHE UC(0x0416) // Ж rus ukr bul -#define CY_ZE UC(0x0417) // З rus ukr bul -#define CY_DZE UC(0x0405) // Ѕ -#define CY_I UC(0x0418) // И rus ukr bul -#define CY_B_U_I UC(0x0406) // І ukr -#define CY_YI UC(0x0407) // Ї ukr -#define CY_SRT_I UC(0x0419) // Й rus ukr bul -#define CY_JE UC(0x0408) // Ј -#define CY_KA UC(0x041a) // К rus ukr bul -#define CY_EL UC(0x041b) // Л rus ukr bul -#define CY_LJE UC(0x0409) // Љ -#define CY_EM UC(0x041c) // М rus ukr bul -#define CY_EN UC(0x041d) // Н rus ukr bul -#define CY_NJE UC(0x040a) // Њ -#define CY_O UC(0x041e) // О rus ukr bul -#define CY_PE UC(0x041f) // П rus ukr bul -#define CY_ER UC(0x0420) // Р rus ukr bul -#define CY_ES UC(0x0421) // С rus ukr bul -#define CY_TE UC(0x0422) // Т rus ukr bul -#define CY_TSHE UC(0x040b) // Ћ -#define CY_KJE UC(0x040c) // Ќ -#define CY_U UC(0x0423) // У rus ukr bul -#define CY_SRT_U UC(0x040e) // Ў -#define CY_EF UC(0x0424) // Ф rus ukr bul -#define CY_HA UC(0x0425) // Х rus bul -#define CY_TSE UC(0x0426) // Ц rus ukr bul -#define CY_CHE UC(0x0427) // Ч rus ukr bul -#define CY_DZHE UC(0x040f) // Џ -#define CY_SHA UC(0x0428) // Ш rus ukr bul -#define CY_SHCHA UC(0x0429) // Щ rus ukr bul -#define CY_HSIGN UC(0x042a) // Ъ rus bul -#define CY_YERU UC(0x042b) // Ы rus -#define CY_SSIGN UC(0x042c) // Ь rus ukr bul -#define CY_E UC(0x042d) // Э rus -#define CY_YU UC(0x042e) // Ю rus ukr bul -#define CY_YA UC(0x042f) // Я rus ukr bul -// Important Cyrillic non-Slavic letters -#define CY_PALOCHKA UC(0x04c0) // Ӏ -#define CY_SCHWA UC(0x04d8) // Ә -#define CY_GHE_S UC(0x0492) // Ғ -#define CY_ZE_D UC(0x0498) // Ҙ -#define CY_ES_D UC(0x04aa) // Ҫ -#define CY_BR_KA UC(0x04a0) // Ҡ -#define CY_ZHE_D UC(0x0496) // Җ -#define CY_KA_D UC(0x049a) // Қ -#define CY_EN_D UC(0x04a2) // Ң -#define CY_ENGHE UC(0x04a4) // Ҥ -#define CY_BRD_O UC(0x04e8) // Ө -#define CY_STR_U UC(0x04ae) // Ү -#define CY_S_U_S UC(0x04b0) // Ұ -#define CY_SHHA UC(0x04ba) // Һ -#define CY_HA_D UC(0x04b2) // Ҳ - - -// Small -#define CY_a UC(0x0430) // a rus ukr bul -#define CY_be UC(0x0431) // б rus ukr bul -#define CY_ve UC(0x0432) // в rus ukr bul -#define CY_ghe UC(0x0433) // г rus ukr bul -#define CY_gheup UC(0x0491) // ґ ukr -#define CY_de UC(0x0434) // д rus ukr bul -#define CY_dje UC(0x0452) // ђ -#define CY_gje UC(0x0453) // ѓ -#define CY_ie UC(0x0435) // е rus ukr bul -#define CY_io UC(0x0451) // ё rus -#define CY_uie UC(0x0454) // є ukr -#define CY_zhe UC(0x0436) // ж rus ukr bul -#define CY_ze UC(0x0437) // з rus ukr bul -#define CY_dze UC(0x0455) // ѕ -#define CY_i UC(0x0438) // и rus ukr bul -#define CY_b_u_i UC(0x0456) // і ukr -#define CY_yi UC(0x0457) // ї ukr -#define CY_srt_i UC(0x0439) // й rus ukr bul -#define CY_je UC(0x0458) // ј -#define CY_ka UC(0x043a) // к rus ukr bul -#define CY_el UC(0x043b) // л rus ukr bul -#define CY_lje UC(0x0459) // љ -#define CY_em UC(0x043c) // м rus ukr bul -#define CY_en UC(0x043d) // н rus ukr bul -#define CY_nje UC(0x045a) // њ -#define CY_o UC(0x043e) // о rus ukr bul -#define CY_pe UC(0x043f) // п rus ukr bul -#define CY_er UC(0x0440) // р rus ukr bul -#define CY_es UC(0x0441) // с rus ukr bul -#define CY_te UC(0x0442) // т rus ukr bul -#define CY_tshe UC(0x045b) // ћ -#define CY_kje UC(0x045c) // ќ -#define CY_u UC(0x0443) // у rus ukr bul -#define CY_srt_u UC(0x045e) // ў -#define CY_ef UC(0x0444) // ф rus ukr bul -#define CY_ha UC(0x0445) // х rus ukr bul -#define CY_tse UC(0x0446) // ц rus ukr bul -#define CY_che UC(0x0447) // ч rus ukr bul -#define CY_dzhe UC(0x045f) // џ -#define CY_sha UC(0x0448) // ш rus ukr bul -#define CY_shcha UC(0x0449) // щ rus ukr bul -#define CY_hsign UC(0x044a) // ъ rus bul -#define CY_yeru UC(0x044b) // ы rus -#define CY_ssign UC(0x044c) // ь rus ukr bul -#define CY_e UC(0x044d) // э rus -#define CY_yu UC(0x044e) // ю rus ukr bul -#define CY_ya UC(0x044f) // я rus ukr bul -// Important Cyrillic non-Slavic letters -#define CY_palochka UC(0x04cf) // ӏ -#define CY_schwa UC(0x04d9) // ә -#define CY_ghe_s UC(0x0493) // ғ -#define CY_ze_d UC(0x0499) // ҙ -#define CY_es_d UC(0x04ab) // ҫ -#define CY_br_ka UC(0x04a1) // ҡ -#define CY_zhe_d UC(0x0497) // җ -#define CY_ka_d UC(0x049b) // қ -#define CY_en_d UC(0x04a3) // ң -#define CY_enghe UC(0x04a5) // ҥ -#define CY_brd_o UC(0x04e9) // ө -#define CY_str_u UC(0x04af) // ү -#define CY_s_u_s UC(0x04b1) // ұ -#define CY_shha UC(0x04bb) // һ -#define CY_ha_d UC(0x04b3) // ҳ - - -// Extra -#define CY_slr_ve UC(0x1c80) // ᲀ CYRILLIC SMALL LETTER ROUNDED VE -#define CY_ll_de UC(0x1c81) // ᲁ CYRILLIC SMALL LETTER LONG-LEGGED DE -#define CY_ZEMLYA UC(0xa640) // Ꙁ CYRILLIC CAPITAL LETTER ZEMLYA -#define CY_zemlya UC(0xa641) // ꙁ CYRILLIC SMALL LETTER ZEMLYA -#define CY_RV_DZE UC(0xa644) // Ꙅ CYRILLIC CAPITAL LETTER REVERSED DZE -#define CY_rv_DZE UC(0xa645) // ꙅ CYRILLIC SMALL LETTER REVERSED DZE -#define CY_slw_es UC(0x1c83) // ᲃ CYRILLIC SMALL LETTER WIDE ES -#define CY_st_te UC(0x1c84) // ᲄ CYRILLIC SMALL LETTER TALL TE -#define CY_3l_te UC(0x1c85) // ᲅ CYRILLIC SMALL LETTER THREE-LEGGED TE -#define CY_thsign UC(0x1c86) // ᲆ CYRILLIC SMALL LETTER TALL HARD SIGN -#define CY_YERUBY UC(0xa650) // Ꙑ CYRILLIC CAPITAL LETTER YERU WITH BACK YER -#define CY_yeruby UC(0xa651) // ꙑ CYRILLIC SMALL LETTER YERU WITH BACK YER -#define CY_RUBL UC(0x20bd) // ₽ -#define CY_NMRO UC(0x2116) // № - -// The letters Zje and Sje are made for other letters and accent marks - -#endif diff --git a/quantum/light_ws2812.c b/quantum/light_ws2812.c index 55bdd9cd81..2506e3d8ec 100755 --- a/quantum/light_ws2812.c +++ b/quantum/light_ws2812.c @@ -7,7 +7,18 @@ * Jan 18th, 2014 v2.0b Initial Version * Nov 29th, 2015 v2.3 Added SK6812RGBW support * -* License: GNU GPL v2 (see License.txt) +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . */ #include "light_ws2812.h" diff --git a/quantum/light_ws2812.h b/quantum/light_ws2812.h index 2f78c20fc1..60924a0fb6 100755 --- a/quantum/light_ws2812.h +++ b/quantum/light_ws2812.h @@ -6,8 +6,18 @@ * * Please do not change this file! All configuration is handled in "ws2812_config.h" * - * License: GNU GPL v2 (see License.txt) - + + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ #ifndef LIGHT_WS2812_H_ diff --git a/quantum/matrix.c b/quantum/matrix.c index ac523482ad..5337e2626b 100644 --- a/quantum/matrix.c +++ b/quantum/matrix.c @@ -1,6 +1,5 @@ /* -Copyright 2012 Jun Wako -Copyright 2014 Jack Humbert +Copyright 2012-2017 Jun Wako, Jack Humbert This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/quantum/pincontrol.h b/quantum/pincontrol.h index 36ce29ef22..d77977ebe2 100644 --- a/quantum/pincontrol.h +++ b/quantum/pincontrol.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Wez Furlong + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #pragma once // Some helpers for controlling gpio pins #include diff --git a/quantum/process_keycode/process_chording.c b/quantum/process_keycode/process_chording.c index d7814629f3..6c6ebe300a 100644 --- a/quantum/process_keycode/process_chording.c +++ b/quantum/process_keycode/process_chording.c @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "process_chording.h" bool keys_chord(uint8_t keys[]) { @@ -57,4 +73,4 @@ bool process_chording(uint16_t keycode, keyrecord_t *record) { } } return true; -} \ No newline at end of file +} diff --git a/quantum/process_keycode/process_chording.h b/quantum/process_keycode/process_chording.h index 49c97db3bc..8c0f4862a8 100644 --- a/quantum/process_keycode/process_chording.h +++ b/quantum/process_keycode/process_chording.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef PROCESS_CHORDING_H #define PROCESS_CHORDING_H @@ -13,4 +29,4 @@ uint8_t chord_key_down = 0; bool process_chording(uint16_t keycode, keyrecord_t *record); -#endif \ No newline at end of file +#endif diff --git a/quantum/process_keycode/process_combo.c b/quantum/process_keycode/process_combo.c index e2189ad98b..58d45add22 100644 --- a/quantum/process_keycode/process_combo.c +++ b/quantum/process_keycode/process_combo.c @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "process_combo.h" #include "print.h" diff --git a/quantum/process_keycode/process_combo.h b/quantum/process_keycode/process_combo.h index 847f2b7376..a5dbd788a4 100644 --- a/quantum/process_keycode/process_combo.h +++ b/quantum/process_keycode/process_combo.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef PROCESS_COMBO_H #define PROCESS_COMBO_H diff --git a/quantum/process_keycode/process_leader.c b/quantum/process_keycode/process_leader.c index e53d221e75..473906d657 100644 --- a/quantum/process_keycode/process_leader.c +++ b/quantum/process_keycode/process_leader.c @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "process_leader.h" __attribute__ ((weak)) @@ -35,4 +51,4 @@ bool process_leader(uint16_t keycode, keyrecord_t *record) { } } return true; -} \ No newline at end of file +} diff --git a/quantum/process_keycode/process_leader.h b/quantum/process_keycode/process_leader.h index c83db8abbd..da7a3d2ef7 100644 --- a/quantum/process_keycode/process_leader.h +++ b/quantum/process_keycode/process_leader.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef PROCESS_LEADER_H #define PROCESS_LEADER_H @@ -20,4 +36,4 @@ void leader_end(void); #define LEADER_EXTERNS() extern bool leading; extern uint16_t leader_time; extern uint16_t leader_sequence[5]; extern uint8_t leader_sequence_size #define LEADER_DICTIONARY() if (leading && timer_elapsed(leader_time) > LEADER_TIMEOUT) -#endif \ No newline at end of file +#endif diff --git a/quantum/process_keycode/process_midi.c b/quantum/process_keycode/process_midi.c index 700c6ce8e6..9184feaae8 100644 --- a/quantum/process_keycode/process_midi.c +++ b/quantum/process_keycode/process_midi.c @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "process_midi.h" #ifdef MIDI_ENABLE diff --git a/quantum/process_keycode/process_midi.h b/quantum/process_keycode/process_midi.h index 58b7650c67..ccac8981a6 100644 --- a/quantum/process_keycode/process_midi.h +++ b/quantum/process_keycode/process_midi.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef PROCESS_MIDI_H #define PROCESS_MIDI_H @@ -37,4 +53,4 @@ uint8_t midi_compute_note(uint16_t keycode); #endif // MIDI_ENABLE -#endif \ No newline at end of file +#endif diff --git a/quantum/process_keycode/process_music.c b/quantum/process_keycode/process_music.c index f89a04ee31..217dca2807 100644 --- a/quantum/process_keycode/process_music.c +++ b/quantum/process_keycode/process_music.c @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "process_music.h" #ifdef AUDIO_ENABLE diff --git a/quantum/process_keycode/process_music.h b/quantum/process_keycode/process_music.h index a36514a44f..8dfbf041f4 100644 --- a/quantum/process_keycode/process_music.h +++ b/quantum/process_keycode/process_music.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef PROCESS_MUSIC_H #define PROCESS_MUSIC_H @@ -28,4 +44,4 @@ void matrix_scan_music(void); #endif // defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC)) -#endif \ No newline at end of file +#endif diff --git a/quantum/process_keycode/process_printer.c b/quantum/process_keycode/process_printer.c index 2e11dd366c..807f7a0b91 100644 --- a/quantum/process_keycode/process_printer.c +++ b/quantum/process_keycode/process_printer.c @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "process_printer.h" #include "action_util.h" @@ -251,4 +267,4 @@ bool process_printer(uint16_t keycode, keyrecord_t *record) { } return true; -} \ No newline at end of file +} diff --git a/quantum/process_keycode/process_printer.h b/quantum/process_keycode/process_printer.h index fdd36d75a8..aa494ac8a7 100644 --- a/quantum/process_keycode/process_printer.h +++ b/quantum/process_keycode/process_printer.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef PROCESS_PRINTER_H #define PROCESS_PRINTER_H @@ -5,4 +21,4 @@ #include "protocol/serial.h" -#endif \ No newline at end of file +#endif diff --git a/quantum/process_keycode/process_printer_bb.c b/quantum/process_keycode/process_printer_bb.c index 1924d03774..55d3b552b2 100644 --- a/quantum/process_keycode/process_printer_bb.c +++ b/quantum/process_keycode/process_printer_bb.c @@ -1,3 +1,19 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "process_printer.h" #include "action_util.h" @@ -257,4 +273,4 @@ bool process_printer(uint16_t keycode, keyrecord_t *record) { } return true; -} \ No newline at end of file +} diff --git a/quantum/process_keycode/process_tap_dance.c b/quantum/process_keycode/process_tap_dance.c index 403dca5380..68c8425bb4 100644 --- a/quantum/process_keycode/process_tap_dance.c +++ b/quantum/process_keycode/process_tap_dance.c @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "quantum.h" #include "action_tapping.h" diff --git a/quantum/process_keycode/process_tap_dance.h b/quantum/process_keycode/process_tap_dance.h index 726752ecc7..330809f83a 100644 --- a/quantum/process_keycode/process_tap_dance.h +++ b/quantum/process_keycode/process_tap_dance.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef PROCESS_TAP_DANCE_H #define PROCESS_TAP_DANCE_H diff --git a/quantum/process_keycode/process_ucis.c b/quantum/process_keycode/process_ucis.c index 4ad2533b08..86c0937f5e 100644 --- a/quantum/process_keycode/process_ucis.c +++ b/quantum/process_keycode/process_ucis.c @@ -1,3 +1,19 @@ +/* Copyright 2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "process_ucis.h" qk_ucis_state_t qk_ucis_state; @@ -130,4 +146,4 @@ bool process_ucis (uint16_t keycode, keyrecord_t *record) { return false; } return true; -} \ No newline at end of file +} diff --git a/quantum/process_keycode/process_ucis.h b/quantum/process_keycode/process_ucis.h index 4332f57b35..3f736a709f 100644 --- a/quantum/process_keycode/process_ucis.h +++ b/quantum/process_keycode/process_ucis.h @@ -1,3 +1,19 @@ +/* Copyright 2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef PROCESS_UCIS_H #define PROCESS_UCIS_H diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c index ccae6fdcad..26571ea034 100644 --- a/quantum/process_keycode/process_unicode.c +++ b/quantum/process_keycode/process_unicode.c @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "process_unicode.h" #include "action_util.h" diff --git a/quantum/process_keycode/process_unicode.h b/quantum/process_keycode/process_unicode.h index 4c21f11eb9..c525b74f03 100644 --- a/quantum/process_keycode/process_unicode.h +++ b/quantum/process_keycode/process_unicode.h @@ -1,3 +1,18 @@ +/* Copyright 2016 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef PROCESS_UNICODE_H #define PROCESS_UNICODE_H diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c index 31bc3b7ab3..6012b4f07e 100644 --- a/quantum/process_keycode/process_unicode_common.c +++ b/quantum/process_keycode/process_unicode_common.c @@ -1,3 +1,19 @@ +/* Copyright 2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "process_unicode_common.h" uint8_t mods; @@ -82,4 +98,4 @@ void register_hex(uint16_t hex) { register_code(hex_to_keycode(digit)); unregister_code(hex_to_keycode(digit)); } -} \ No newline at end of file +} diff --git a/quantum/process_keycode/process_unicode_common.h b/quantum/process_keycode/process_unicode_common.h index 864693cdd0..f5be1da5cb 100644 --- a/quantum/process_keycode/process_unicode_common.h +++ b/quantum/process_keycode/process_unicode_common.h @@ -1,3 +1,19 @@ +/* Copyright 2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef PROCESS_UNICODE_COMMON_H #define PROCESS_UNICODE_COMMON_H @@ -129,4 +145,4 @@ void register_hex(uint16_t hex); #define UC_TILD UC(0x007E) #define UC_DEL UC(0x007F) -#endif \ No newline at end of file +#endif diff --git a/quantum/process_keycode/process_unicodemap.c b/quantum/process_keycode/process_unicodemap.c index 68a593a186..0227fbdd7b 100644 --- a/quantum/process_keycode/process_unicodemap.c +++ b/quantum/process_keycode/process_unicodemap.c @@ -1,3 +1,19 @@ +/* Copyright 2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "process_unicodemap.h" #include "process_unicode_common.h" @@ -53,4 +69,4 @@ bool process_unicode_map(uint16_t keycode, keyrecord_t *record) { } } return true; -} \ No newline at end of file +} diff --git a/quantum/process_keycode/process_unicodemap.h b/quantum/process_keycode/process_unicodemap.h index 64a7a01090..929c88c0b6 100644 --- a/quantum/process_keycode/process_unicodemap.h +++ b/quantum/process_keycode/process_unicodemap.h @@ -1,3 +1,19 @@ +/* Copyright 2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef PROCESS_UNICODEMAP_H #define PROCESS_UNICODEMAP_H @@ -6,4 +22,4 @@ void unicode_map_input_error(void); bool process_unicode_map(uint16_t keycode, keyrecord_t *record); -#endif \ No newline at end of file +#endif diff --git a/quantum/quantum.c b/quantum/quantum.c index 5a9e771a90..62d9ef9232 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -1,3 +1,19 @@ +/* Copyright 2016-2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "quantum.h" #ifdef PROTOCOL_LUFA #include "outputselect.h" diff --git a/quantum/quantum.h b/quantum/quantum.h index 1f1bb0afd2..2bf18d095e 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -1,3 +1,18 @@ +/* Copyright 2016-2017 Erez Zukerman, Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef QUANTUM_H #define QUANTUM_H diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 1e3df9fa69..7354ae0da1 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -1,3 +1,18 @@ +/* Copyright 2016-2017 Jack Humbert + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef QUANTUM_KEYCODES_H #define QUANTUM_KEYCODES_H diff --git a/quantum/rgblight.c b/quantum/rgblight.c index dd1b91c63c..eff70aae1d 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -1,3 +1,18 @@ +/* Copyright 2016-2017 Yang Liu + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include diff --git a/quantum/rgblight.h b/quantum/rgblight.h index 2b3e791bf8..92130192ce 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -1,3 +1,18 @@ +/* Copyright 2017 Yang Liu + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef RGBLIGHT_H #define RGBLIGHT_H diff --git a/quantum/serial_link/LICENSE b/quantum/serial_link/LICENSE index d7cc3198cb..d13cc4b26a 100644 --- a/quantum/serial_link/LICENSE +++ b/quantum/serial_link/LICENSE @@ -1,7 +1,5 @@ The MIT License (MIT) -Copyright (c) 2016 Fred Sundvik - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights diff --git a/quantum/template/Makefile b/quantum/template/Makefile index 4e2a6f00fd..840dc9a286 100644 --- a/quantum/template/Makefile +++ b/quantum/template/Makefile @@ -1,3 +1,18 @@ +# Copyright 2013 Jun Wako +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + ifndef MAKEFILE_INCLUDED include ../../Makefile -endif \ No newline at end of file +endif diff --git a/quantum/template/config.h b/quantum/template/config.h index 7393097e1e..dbca45765d 100644 --- a/quantum/template/config.h +++ b/quantum/template/config.h @@ -1,5 +1,5 @@ /* -Copyright 2012 Jun Wako +Copyright 2017 REPLACE_WITH_YOUR_NAME This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/quantum/template/keymaps/default/Makefile b/quantum/template/keymaps/default/Makefile index 29f11bbc77..b8879076bd 100644 --- a/quantum/template/keymaps/default/Makefile +++ b/quantum/template/keymaps/default/Makefile @@ -1,4 +1,20 @@ -# Build Options +# Copyright 2013 Jun Wako +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# QMK Build Options # change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # @@ -18,4 +34,4 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR include ../../../../Makefile -endif \ No newline at end of file +endif diff --git a/quantum/template/keymaps/default/config.h b/quantum/template/keymaps/default/config.h index df06a26206..f52a97bbc8 100644 --- a/quantum/template/keymaps/default/config.h +++ b/quantum/template/keymaps/default/config.h @@ -1,3 +1,19 @@ +/* Copyright 2017 REPLACE_WITH_YOUR_NAME + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef CONFIG_USER_H #define CONFIG_USER_H @@ -5,4 +21,4 @@ // place overrides here -#endif \ No newline at end of file +#endif diff --git a/quantum/template/keymaps/default/keymap.c b/quantum/template/keymaps/default/keymap.c index e28a4723e9..a123cd7bab 100644 --- a/quantum/template/keymaps/default/keymap.c +++ b/quantum/template/keymaps/default/keymap.c @@ -1,3 +1,18 @@ +/* Copyright 2017 REPLACE_WITH_YOUR_NAME + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "%KEYBOARD%.h" const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -41,4 +56,4 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { void led_set_user(uint8_t usb_led) { -} \ No newline at end of file +} diff --git a/quantum/template/template.c b/quantum/template/template.c index 5ef349583c..97f788654b 100644 --- a/quantum/template/template.c +++ b/quantum/template/template.c @@ -1,3 +1,18 @@ +/* Copyright 2017 REPLACE_WITH_YOUR_NAME + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "%KEYBOARD%.h" void matrix_init_kb(void) { diff --git a/quantum/template/template.h b/quantum/template/template.h index cd78a54e3e..e912188bad 100644 --- a/quantum/template/template.h +++ b/quantum/template/template.h @@ -1,3 +1,18 @@ +/* Copyright 2017 REPLACE_WITH_YOUR_NAME + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef %KEYBOARD_UPPERCASE%_H #define %KEYBOARD_UPPERCASE%_H diff --git a/quantum/variable_trace.c b/quantum/variable_trace.c index de580244c3..713747cfc2 100644 --- a/quantum/variable_trace.c +++ b/quantum/variable_trace.c @@ -1,3 +1,19 @@ +/* Copyright 2016 Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include "variable_trace.h" #include #include diff --git a/quantum/variable_trace.h b/quantum/variable_trace.h index 46bd827861..dacc13858d 100644 --- a/quantum/variable_trace.h +++ b/quantum/variable_trace.h @@ -1,3 +1,19 @@ +/* Copyright 2016 Fred Sundvik + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef VARIABLE_TRACE_H #define VARIABLE_TRACE_H From d6e51d20084921481acacde7546ff08d790b898d Mon Sep 17 00:00:00 2001 From: Rovanion Luckey Date: Wed, 29 Mar 2017 09:34:20 +0200 Subject: [PATCH 168/181] Added link to the teensy linux page. --- keyboards/ergodox/readme.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/keyboards/ergodox/readme.md b/keyboards/ergodox/readme.md index d7eed8f435..23e5b862da 100644 --- a/keyboards/ergodox/readme.md +++ b/keyboards/ergodox/readme.md @@ -69,8 +69,11 @@ files. Check them out with: The Ez uses the [Teensy Loader](https://www.pjrc.com/teensy/loader.html). -Linux users need to modify udev rules as described on the Teensy Linux page (which page?). -Some distributions provide a binary, maybe called `teensy-loader-cli`. +Linux users need to modify udev rules as described on the [Teensy +Linux page]. Some distributions provide a binary, maybe called +`teensy-loader-cli`. + +[Teensy Linux page]: https://www.pjrc.com/teensy/loader_linux.html To flash the firmware: From 4d2be0281c230fc8d7764e4071d1447c59af2cf7 Mon Sep 17 00:00:00 2001 From: Osamu Aoki Date: Mon, 13 Mar 2017 17:11:05 +0000 Subject: [PATCH 169/181] Typo fix --- quantum/template/template.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantum/template/template.h b/quantum/template/template.h index cd78a54e3e..49e6b60e74 100644 --- a/quantum/template/template.h +++ b/quantum/template/template.h @@ -5,7 +5,7 @@ // This a shortcut to help you visually see your layout. // The following is an example using the Planck MIT layout -// The first section contains all of the arguements +// The first section contains all of the arguments // The second converts the arguments into a two-dimensional array #define KEYMAP( \ k00, k01, k02, \ From c782b269b6544f63a13b80e9b28f460fded63f67 Mon Sep 17 00:00:00 2001 From: Osamu Aoki Date: Sun, 12 Mar 2017 02:41:47 +0900 Subject: [PATCH 170/181] Update to match QMK keymap --- doc/keymap.md | 232 +++++++++++++++++++++++++++++++------------------- 1 file changed, 143 insertions(+), 89 deletions(-) diff --git a/doc/keymap.md b/doc/keymap.md index 6f2a663fc8..c127db2b28 100644 --- a/doc/keymap.md +++ b/doc/keymap.md @@ -1,15 +1,30 @@ Keymap framework - how to define your keymap ============================================ -***NOTE: This is not final version, may be inconsistent with source code and changed occasionally for a while.*** +***NOTE: This is updated for QMK but this is still work in progress. This may still be inconsistent with the source code.*** + +QMK is based on TMK. Understanding the essential changes made should help you understand variable names etc. + +## TMK vs. QMK + +| Firmware |TMK |QMK | +|-------------------------------------------------|-----------------------|-------------------------| +| Maintainer |hasu |Jack Humbert et al. | +| Build path customization | `TMK_DIR = ...` | `include .../Makefile` | +| `keymaps` data | 3D array of `uint8_t` holding **keycode** | 3D array of `uint16_t` holding **action code** | +| `fn_actions` data | 1D array of `uint16_t` holding **action code** | 3D array of `uint16_t` holding **action code** | + +Since QMK is based on TMK and uses major portion of TMK code as is, understanding the essential changes made should help you understand the code. ## 0. Keymap and layers -**Keymap** is comprised of multiple layers of key layout, you can define **32 layers** at most. -**Layer** is an array of **keycodes** to define **actions** for each physical keys. -respective layers can be validated simultaneously. Layers are indexed with 0 to 31 and higher layer has precedence. +In QMK, **`const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS]`** holds multiple **layers** of keymap information in **16 bit** data holding the **action code**. You can define **32 layers** at most. - Keymap: 32 Layers Layer: Keycode matrix +For trivial key definitions, the higher 8 bits of the **action code** are all 0 and the lower 8 bits holds the USB HID usage code generated by the key as **keycode**. + +Respective layers can be validated simultaneously. Layers are indexed with 0 to 31 and higher layer has precedence. + + Keymap: 32 Layers Layer: action code matrix ----------------- --------------------- - stack of layers array_of_keycode[row][column] + stack of layers array_of_action_code[row][column] ____________ precedence _______________________ / / | high / ESC / F1 / F2 / F3 .... 31 /___________// | /-----/-----/-----/----- @@ -22,11 +37,15 @@ respective layers can be validated simultaneously. Layers are indexed with 0 to 0 /___________/ V low 0 `-------------------------- +Sometimes, the action code stored in keymap may be referred as keycode in some documents due to the TMK history. -### 0.1 Keymap status -Keymap has its state in two parameters: -**`default_layer`** indicates a base keymap layer(0-31) which is always valid and to be referred, **`keymap_stat`** is 16bit variable which has current on/off status of layers on its each bit. +### 0.1 Keymap layer status +Keymap layer has its state in two 32 bit parameters: +* **`default_layer_state`** indicates a base keymap layer(0-31) which is always valid and to be referred. +* **`layer_state`** () has current on/off status of the layer on its each bit. + +Keymap has its state in two parameter**`default_layer`** indicates a base keymap layer(0-31) which is always valid and to be referred, **`keymap_stat`** is 16bit variable which has current on/off status of layers on its each bit. Keymap layer '0' is usually `default_layer` and which is the only valid layer and other layers is initially off after boot up firmware, though, you can configured them in `config.h`. To change `default_layer` will be useful when you switch key layout completely, say you want Colmak instead of Qwerty. @@ -67,97 +86,132 @@ On the other hand, you shall change `layer_state` to overlay base layer with som ### 0.2 Layer Precedence and Transparency Note that ***higher layer has higher priority on stack of layers***, namely firmware falls down from top layer to bottom to look up keycode. Once it spots keycode other than **`KC_TRNS`**(transparent) on a layer it stops searching and lower layers aren't referred. -You can place `KC_TRNS` on overlay layer changes just part of layout to fall back on lower or base layer. -Key with `KC_TRANS` doesn't has its own keycode and refers to lower valid layers for keycode, instead. +You can place `KC_TRANS` on overlay layer changes just part of layout to fall back on lower or base layer. +Key with `KC_TRANS` (`KC_TRNS` and `_______` are the alias) doesn't has its own keycode and refers to lower valid layers for keycode, instead. See example below. ### 0.3 Keymap Example -Keymap is **`keymaps[]`** C array in fact and you can define layers in it with **`KEYMAP()`** C macro and keycodes. To use complex actions you need to define `Fn` keycode in **`fn_actions[]`** array. +Keymap in this QMK is **`static const uint16_t PROGMEM keymaps[]`** C array in fact and you can define layers in it with **`KEYMAP()`** C macro and keycodes. To use complex actions you need to define `Fn` keycode in **`fn_actions[]`** array. It holds the 16 bit quantum keycode (action code). + +> Please note that keymap in the TMK, which QMK was forked from, is **`static const uint8_t PROGMEM keymaps[]`** C array which holds the 8 bit keycode (~USB HID usage code). This is a keymap example for [HHKB](http://en.wikipedia.org/wiki/Happy_Hacking_Keyboard) keyboard. -This example has three layers, 'Qwerty' as base layer, 'Cursor' and 'Mousekey'. +This example has three layers, 'QWERTY' as base layer, 'FN' and 'MOUSE'. + In this example, - `Fn0` is a **momentary layer switching** key, you can use keys on Cursor layer while holding the key. - - `Fn1` is a momentary layer switching key with tapping feature, you can get semicolon **';'** with taping the key and switch layers while holding the key. The word **'tap'** or **'tapping'** mean to press and release a key quickly. - - `Fn2` is a **toggle layer switch** key, you can stay switched layer after releasing the key unlike momentary switching. + `MO(layer)` is a **momentary layer switching** key. You can find other keymap definitions in file `keymap.c` located on project directories. +``` +/* + * dbroqua HHKB Layout + */ +#include "hhkb.h" - static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: Qwerty - * ,-----------------------------------------------------------. - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| - * |-----------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs| - * |-----------------------------------------------------------| - * |Contro| A| S| D| F| G| H| J| K| L|Fn1| '|Enter | - * |-----------------------------------------------------------| - * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn0| - * `-----------------------------------------------------------' - * |Gui|Alt |Space |Alt |Fn2| - * `-------------------------------------------' - */ - KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ - LCTL,A, S, D, F, G, H, J, K, L, FN1, QUOT,ENT, \ - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,FN0, \ - LGUI,LALT, SPC, RALT,FN2), - /* 1: Cursor(HHKB mode) - * ,-----------------------------------------------------------. - * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs| - * |-----------------------------------------------------------| - * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | - * |-----------------------------------------------------------| - * |Shift | | | | | | +| -|End|PgD|Dow|Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt |Space |Alt |Gui| - * `--------------------------------------------' - */ - KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, TRNS,BSPC, \ - LCTL,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ - LSFT,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN,RSFT,TRNS, \ - LGUI,LALT, SPC, RALT,RGUI), - /* 2: Mousekey - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab | | | | | |MwL|MwD|MwU|MwR| | | |Backs| - * |-----------------------------------------------------------| - * |Contro| | | | | |McL|McD|McU|McR| | |Return | - * |-----------------------------------------------------------| - * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt |Mb1 |Alt | | - * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel - */ - KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - TAB, TRNS,TRNS,TRNS,TRNS,TRNS,WH_L,WH_D,WH_U,WH_R,TRNS,TRNS,TRNS,BSPC, \ - LCTL,TRNS,ACL0,ACL1,ACL2,TRNS,MS_L,MS_D,MS_U,MS_R,TRNS,QUOT,ENT, \ - LSFT,TRNS,TRNS,TRNS,TRNS,BTN3,BTN2,BTN1,BTN4,BTN5,SLSH,RSFT,TRNS, \ - LGUI,LALT, BTN1, RALT,TRNS), - }; +#define BASE 0 +#define FN 1 +#define MOUSE 2 - static const uint16_t PROGMEM fn_actions[] = { - ACTION_LAYER_MOMENTARY(1), // FN0 - ACTION_LAYER_TAP_KEY(2, KC_SCLN), // FN1 - ACTION_LAYER_TOGGLE(2), // FN2 - }; +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* BASE Level: Default Layer + * ,-----------------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + * |-----------------------------------------------------------------------------------------+ + * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Bksp | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl | A | S | D | F | G | H | J | K | L | ; | ' | Enter | + * |-----------------------------------------------------------------------------------------+ + * | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | fn | + * +-----------------------------------------------------------------------------------------+ + * | Gui | Alt | Space | AltGr |Mouse| + * `----------------------------------------------------------------´ + */ + [BASE] = KEYMAP( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_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_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(FN), \ + KC_LGUI, KC_LALT, /* */ KC_SPC, KC_RALT, MO(MOUSE) + ), + /* FN Layer + * ,-----------------------------------------------------------------------------------------. + * | Pwr | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F0 | F11 | F12 | Ins | Del| + * |-----------------------------------------------------------------------------------------+ + * | Caps | | | | | | | |PrtSc| Slck| Paus| Up | | | + * |-----------------------------------------------------------------------------------------+ + * | | Vol-| Vol+| Mute| | | * | / | Home| PgUp| Left |Right| | + * |-----------------------------------------------------------------------------------------+ + * | | Prev| Play| Next| | | + | - | End |PgDwn| Down| | | + * +-----------------------------------------------------------------------------------------+ + * | | | | Stop | | + * `----------------------------------------------------------------´ + */ + [FN] = KEYMAP( + KC_PWR, 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_INS, KC_DEL, \ + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, \ + KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_MSTP, KC_TRNS + ), + /* MOUSE Layer + * ,-----------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | WUp | | | | | | | | Btn1| Up | Btn2| | + * |-----------------------------------------------------------------------------------------+ + * | | WLt | WDn | WRt | | | | | | | Left |Right| | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | | | Btn3| Down| | | + * +-----------------------------------------------------------------------------------------+ + * | | | | | | + * `----------------------------------------------------------------´ + */ + [MOUSE] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_WH_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_TRNS, \ + KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_R, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN3, KC_MS_D, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; +``` ## 1. Keycode -See [`common/keycode.h`](../common/keycode.h) or keycode table below for the detail. Keycode is internal **8bit code** to indicate action performed on key in keymap. Keycode has `KC_` prefixed symbol respectively. Most of keycodes like `KC_A` have simple action registers key to host on press and unregister on release, while some of other keycodes has some special actions like `Fn` keys, Media control keys, System control keys and Mousekeys. +See [`tmk_core/common/keycode.h`](../tmk_core/common/keycode.h) or keycode table below for the detail. Keycode is internal **8bit code** to indicate action performed on key in keymap. Keycodes are based on [HID Usage Keyboard/Keypad Page(0x07)](http://www.usb.org/developers/hidpage/Hut1_12v2.pdf) plus special codes in the `0xA5-DF` range. - ***In `KEYMAP()` macro you should omit prefix part `KC_` of keycode to keep keymap compact.*** For example, just use `A` instead you place `KC_A` in `KEYMAP()`. Some keycodes has 4-letter **short name** in addition to descriptive name, you'll prefer short one in `KEYMAP()`. +Keycode has `KC_` prefixed symbol respectively. Most of keycodes like `KC_A` have simple action registers key to host on press and unregister on release, while some of other keycodes has some special actions like `Fn` keys, Media control keys, System control keys and Mousekeys. + +keymaps[] + +In `KEYMAP()` macro, TMK recommends you to keep prefix part `KC_` of keycode to keep keymap compact. For example, just use `A` instead you place `KC_A` in `KEYMAP()`. But this doesn't apply for QMK. + +The `KEYMAP()` macro defines correspondence between the physical key location to the electrical key connection. + +Some keycodes has 7-letter **short name** such as `KC_COMM` in addition to descriptive name `KC_COMMA`, you'll prefer short one in `KEYMAP()`. ### 1.0 Other key - `KC_NO` for no action @@ -192,7 +246,10 @@ There are 8 modifiers which has discrimination between left and right. - `KC_WSCH`, `KC_WHOM`, `KC_WBAK`, `KC_WFWD`, `KC_WSTP`, `KC_WREF`, `KC_WFAV` for web browser operation ### 1.5 Fn key -`KC_FNnn` are keycodes for `Fn` key which not given any actions at the beginning unlike most of keycodes has its own inborn action. To use these keycodes in `KEYMAP()` you need to assign action you want at first. Action of `Fn` key is defined in `fn_actions[]` and its index of the array is identical with number part of `KC_FNnn`. Thus `KC_FN0` keycode indicates the action defined in first element of the array. ***32 `Fn` keys can be defined at most.*** +You don't need to use this functionality under QMK since this is a backward compatibility functionality. Unlike TMK, you can write action code itself directly in **`static const uint16_t PROGMEM keymaps[]`** C array using `MO(layer)`, etc. + +`KC_FNnn` are keycodes for `Fn` key which not given any actions at the beginning unlike most of keycodes has its own inborn action. To use these keycodes in `KEYMAP()` you need to assign action you want at first. Action of `Fn` key is defined in `fn_actions[]` and its index of the array is identical with number part of `KC_FNnn`. Thus `KC_FN0` keycode indicates the action defined in first element of the array. ***Only 32 `Fn` keys can be defined at most.*** + ### 1.6 Keycode Table See keycode table in [`doc/keycode.txt`](./keycode.txt) for description of keycodes. @@ -581,15 +638,11 @@ Similar to layer tap toggle, this works as a momentary modifier when holding, bu ## 5. Legacy Keymap -This was used in prior version and still works due to legacy support code in `common/keymap.c`. Legacy keymap doesn't support many of features that new keymap offers. ***It is not recommended to use Legacy Keymap for new project.*** - -To enable Legacy Keymap support define this macro in `config.h`. - - #define USE_LEGACY_KEYMAP +In QMK, `tmk_core/common/keymap.c` is missing and its replacement `quantum/keymap_common.c` lacks Legacy Keymap support. Legacy Keymap uses two arrays `fn_layer[]` and `fn_keycode[]` to define Fn key. The index of arrays corresponds with postfix number of `Fn` key. Array `fn_layer[]` indicates destination layer to switch and `fn_keycode[]` has keycodes to send when tapping `Fn` key. -In following setting example, `Fn0`, `Fn1` and `Fn2` switch layer to 1, 2 and 2 respectively. `Fn2` registers `Space` key when tapping while `Fn0` and `Fn1` doesn't send any key. +In the following legacy keymap setting example, `Fn0`, `Fn1` and `Fn2` switch layer to 1, 2 and 2 respectively. `Fn2` registers `Space` key when tapping while `Fn0` and `Fn1` doesn't send any key. static const uint8_t PROGMEM fn_layer[] = { 1, // Fn0 @@ -603,6 +656,7 @@ In following setting example, `Fn0`, `Fn1` and `Fn2` switch layer to 1, 2 and 2 KC_SPC, // Fn2 }; +Under QMK, these can be realized using action code ACTION_LAYER_TAP_KEY(1, KC_NO), ACTION_LAYER_TAP_KEY(2, KC_NO), and ACTION_LAYER_TAP_KEY(2, KC_SPC) in the `keymaps` directly. ## 6. Terminology ***TBD*** From 71da013995ec72293ab1f3e2518a99d64ec486fb Mon Sep 17 00:00:00 2001 From: Travis La Marr Date: Wed, 29 Mar 2017 23:03:04 -0400 Subject: [PATCH 171/181] Add RN42 Bluetooth module support Added support for sending HID keycodes over the RN42/reflashed HC05 module. Tested on OS X and iOS. --- tmk_core/common.mk | 5 +++++ tmk_core/protocol/lufa.mk | 5 +++++ tmk_core/protocol/lufa/bluetooth.h | 16 +++++++++++++++- tmk_core/protocol/lufa/lufa.c | 19 ++++++++++++++++++- 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 47f6fc5719..3e0bd7dbc8 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -107,6 +107,11 @@ ifeq ($(strip $(BLUETOOTH)), AdafruitEZKey) TMK_COMMON_DEFS += -DMODULE_ADAFRUIT_EZKEY endif +ifeq ($(strip $(BLUETOOTH)), RN42) + TMK_COMMON_DEFS += -DBLUETOOTH_ENABLE + TMK_COMMON_DEFS += -DMODULE_RN42 +endif + ifeq ($(strip $(ONEHAND_ENABLE)), yes) TMK_COMMON_DEFS += -DONEHAND_ENABLE endif diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk index 5b15779723..7ce727dab0 100644 --- a/tmk_core/protocol/lufa.mk +++ b/tmk_core/protocol/lufa.mk @@ -36,6 +36,11 @@ ifeq ($(strip $(BLUETOOTH)), AdafruitEZKey) $(TMK_DIR)/protocol/serial_uart.c endif +ifeq ($(strip $(BLUETOOTH)), RN42) + LUFA_SRC += $(LUFA_DIR)/bluetooth.c \ + $(TMK_DIR)/protocol/serial_uart.c +endif + ifeq ($(strip $(VIRTSER_ENABLE)), yes) LUFA_SRC += $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/CDCClassDevice.c endif diff --git a/tmk_core/protocol/lufa/bluetooth.h b/tmk_core/protocol/lufa/bluetooth.h index 78ece1cd0b..f4b2f6f8b1 100644 --- a/tmk_core/protocol/lufa/bluetooth.h +++ b/tmk_core/protocol/lufa/bluetooth.h @@ -62,4 +62,18 @@ void bluefruit_serial_send(uint8_t data); (usage == AC_REFRESH ? 0x0000 : \ (usage == AC_BOOKMARKS ? 0x0000 : 0))))))))))))))))))) -#endif \ No newline at end of file +#define CONSUMER2RN42(usage) \ + (usage == AUDIO_MUTE ? 0x0040 : \ + (usage == AUDIO_VOL_UP ? 0x0010 : \ + (usage == AUDIO_VOL_DOWN ? 0x0020 : \ + (usage == TRANSPORT_NEXT_TRACK ? 0x0100 : \ + (usage == TRANSPORT_PREV_TRACK ? 0x0200 : \ + (usage == TRANSPORT_STOP ? 0x0400 : \ + (usage == TRANSPORT_STOP_EJECT ? 0x0800 : \ + (usage == TRANSPORT_PLAY_PAUSE ? 0x0080 : \ + (usage == AL_EMAIL ? 0x0200 : \ + (usage == AL_LOCAL_BROWSER ? 0x8000 : \ + (usage == AC_SEARCH ? 0x0400 : \ + (usage == AC_HOME ? 0x0100 : 0)))))))))))) + + #endif diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 60cba8d2a9..ae6129d1a2 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -606,6 +606,13 @@ static void send_keyboard(report_keyboard_t *report) if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) { #ifdef MODULE_ADAFRUIT_BLE adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys)); + #elif MODULE_RN42 + bluefruit_serial_send(0xFD); + bluefruit_serial_send(0x09); + bluefruit_serial_send(0x01); + for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { + bluefruit_serial_send(report->raw[i]); + } #else bluefruit_serial_send(0xFD); for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { @@ -726,6 +733,16 @@ static void send_consumer(uint16_t data) if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) { #ifdef MODULE_ADAFRUIT_BLE adafruit_ble_send_consumer_key(data, 0); + #elif MODULE_RN42 + static uint16_t last_data = 0; + if (data == last_data) return; + last_data = data; + uint16_t bitmap = CONSUMER2RN42(data); + bluefruit_serial_send(0xFD); + bluefruit_serial_send(0x03); + bluefruit_serial_send(0x03); + bluefruit_serial_send(bitmap&0xFF); + bluefruit_serial_send((bitmap>>8)&0xFF); #else static uint16_t last_data = 0; if (data == last_data) return; @@ -1132,7 +1149,7 @@ int main(void) // midi_send_noteoff(&midi_device, 0, 64, 127); #endif -#ifdef MODULE_ADAFRUIT_EZKEY +#if defined(MODULE_ADAFRUIT_EZKEY) || defined(MODULE_RN42) serial_init(); #endif From d145a1192f5833a427d58d69b355935232fb37fb Mon Sep 17 00:00:00 2001 From: Callum Oakley Date: Thu, 30 Mar 2017 13:22:16 +0100 Subject: [PATCH 172/181] changed hotkey cluster to accomodate awkward software --- keyboards/planck/keymaps/callum/keymap.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/keyboards/planck/keymaps/callum/keymap.c b/keyboards/planck/keymaps/callum/keymap.c index aede27df75..d50b04319a 100644 --- a/keyboards/planck/keymaps/callum/keymap.c +++ b/keyboards/planck/keymaps/callum/keymap.c @@ -14,7 +14,7 @@ extern keymap_config_t keymap_config; #define _FUNC 4 #define ENDASH LALT(KC_MINS) #define POUND LALT(KC_3) -#define H(X) LALT(LCTL(X)) +#define H(X) RALT(X) enum planck_keycodes { MOVE = SAFE_RANGE, @@ -48,19 +48,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* MOVE * ,-----------------------------------------------------------------------------------. - * | H(3) | H(F1)| H(F2)| H(F3)| H(F4)| H(F5)| H(8) | Home | Up | End | H(7) | Esc | + * | H(F7)| H(F8)| H(6) | H(5) | H(4) | H(F9)|H(F10)| Home | Up | End | H(A) | Esc | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | H(4) | H(F6)| H(F7)| H(F8)| H(F9)|H(F10)| H(9) | Left | Down | Right| Caps | Del | + * | H(F3)| H(F4)| H(3) | H(2) | H(1) | H(F5)| H(F6)| Left | Down | Right| Caps | Del | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | |H(F11)|H(F12)| H(0) | H(1) | H(2) | H(A) | Pg Dn| Pg Up| H(5) | H(6) | | + * | | H(0) | H(9) | H(8) | H(7) | H(F1)| H(F2)| Pg Dn| Pg Up|H(F11)|H(F12)| | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ [_MOVE] = { - {H(KC_3), H(KC_F1),H(KC_F2),H(KC_F3),H(KC_F4),H(KC_F5),H(KC_8), KC_HOME, KC_UP, KC_END, H(KC_7), KC_ESC }, - {H(KC_4), H(KC_F6),H(KC_F7),H(KC_F8),H(KC_F9),H(KC_F10),H(KC_9),KC_LEFT, KC_DOWN, KC_RGHT, KC_CAPS, KC_DEL }, - {_______, H(KC_F11),H(KC_F12),H(KC_0),H(KC_1),H(KC_2), H(KC_A), KC_PGDN, KC_PGUP, H(KC_5), H(KC_6), _______}, + {H(KC_F7),H(KC_F8),H(KC_6), H(KC_5), H(KC_4), H(KC_F9),H(KC_F10),KC_HOME,KC_UP, KC_END, H(KC_A), KC_ESC }, + {H(KC_F3),H(KC_F4),H(KC_3), H(KC_2), H(KC_1), H(KC_F5),H(KC_F6),KC_LEFT, KC_DOWN, KC_RGHT, KC_CAPS, KC_DEL }, + {_______, H(KC_0), H(KC_9), H(KC_8), H(KC_7), H(KC_F1),H(KC_F2),KC_PGDN,KC_PGUP,H(KC_F11),H(KC_F12),_______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} }, From 3f3f208113abb928209d608d4d763267005d488b Mon Sep 17 00:00:00 2001 From: Callum Oakley Date: Thu, 30 Mar 2017 14:20:18 +0100 Subject: [PATCH 173/181] changed hotkey cluster to accomodate awkward software... again --- keyboards/planck/keymaps/callum/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/planck/keymaps/callum/keymap.c b/keyboards/planck/keymaps/callum/keymap.c index d50b04319a..09063cb97f 100644 --- a/keyboards/planck/keymaps/callum/keymap.c +++ b/keyboards/planck/keymaps/callum/keymap.c @@ -14,7 +14,7 @@ extern keymap_config_t keymap_config; #define _FUNC 4 #define ENDASH LALT(KC_MINS) #define POUND LALT(KC_3) -#define H(X) RALT(X) +#define H(X) LALT(LCTL(X)) enum planck_keycodes { MOVE = SAFE_RANGE, From 3a1ee48cda5f185ebb3a4f989b389edf029992bb Mon Sep 17 00:00:00 2001 From: Osamu Aoki Date: Mon, 13 Mar 2017 17:11:05 +0000 Subject: [PATCH 174/181] Typo fix --- quantum/template/template.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantum/template/template.h b/quantum/template/template.h index e912188bad..7e2b14f3c1 100644 --- a/quantum/template/template.h +++ b/quantum/template/template.h @@ -20,7 +20,7 @@ // This a shortcut to help you visually see your layout. // The following is an example using the Planck MIT layout -// The first section contains all of the arguements +// The first section contains all of the arguments // The second converts the arguments into a two-dimensional array #define KEYMAP( \ k00, k01, k02, \ From ccbdf90f02067bc37975130ca8c4b26d2497dcf7 Mon Sep 17 00:00:00 2001 From: Osamu Aoki Date: Sun, 12 Mar 2017 02:41:47 +0900 Subject: [PATCH 175/181] Update to match QMK keymap --- doc/keymap.md | 232 +++++++++++++++++++++++++++++++------------------- 1 file changed, 143 insertions(+), 89 deletions(-) diff --git a/doc/keymap.md b/doc/keymap.md index 2b0d2cd959..bc7809905a 100644 --- a/doc/keymap.md +++ b/doc/keymap.md @@ -1,15 +1,30 @@ Keymap framework - how to define your keymap ============================================ -***NOTE: This is not final version, may be inconsistent with source code and changed occasionally for a while.*** +***NOTE: This is updated for QMK but this is still work in progress. This may still be inconsistent with the source code.*** + +QMK is based on TMK. Understanding the essential changes made should help you understand variable names etc. + +## TMK vs. QMK + +| Firmware |TMK |QMK | +|-------------------------------------------------|-----------------------|-------------------------| +| Maintainer |hasu |Jack Humbert et al. | +| Build path customization | `TMK_DIR = ...` | `include .../Makefile` | +| `keymaps` data | 3D array of `uint8_t` holding **keycode** | 3D array of `uint16_t` holding **action code** | +| `fn_actions` data | 1D array of `uint16_t` holding **action code** | 3D array of `uint16_t` holding **action code** | + +Since QMK is based on TMK and uses major portion of TMK code as is, understanding the essential changes made should help you understand the code. ## 0. Keymap and layers -**Keymap** is comprised of multiple layers of key layout, you can define **32 layers** at most. -**Layer** is an array of **keycodes** to define **actions** for each physical keys. -respective layers can be validated simultaneously. Layers are indexed with 0 to 31 and higher layer has precedence. +In QMK, **`const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS]`** holds multiple **layers** of keymap information in **16 bit** data holding the **action code**. You can define **32 layers** at most. - Keymap: 32 Layers Layer: Keycode matrix +For trivial key definitions, the higher 8 bits of the **action code** are all 0 and the lower 8 bits holds the USB HID usage code generated by the key as **keycode**. + +Respective layers can be validated simultaneously. Layers are indexed with 0 to 31 and higher layer has precedence. + + Keymap: 32 Layers Layer: action code matrix ----------------- --------------------- - stack of layers array_of_keycode[row][column] + stack of layers array_of_action_code[row][column] ____________ precedence _______________________ / / | high / ESC / F1 / F2 / F3 .... 31 /___________// | /-----/-----/-----/----- @@ -22,11 +37,15 @@ respective layers can be validated simultaneously. Layers are indexed with 0 to 0 /___________/ V low 0 `-------------------------- +Sometimes, the action code stored in keymap may be referred as keycode in some documents due to the TMK history. -### 0.1 Keymap status -Keymap has its state in two parameters: -**`default_layer`** indicates a base keymap layer(0-31) which is always valid and to be referred, **`keymap_stat`** is 16bit variable which has current on/off status of layers on its each bit. +### 0.1 Keymap layer status +Keymap layer has its state in two 32 bit parameters: +* **`default_layer_state`** indicates a base keymap layer(0-31) which is always valid and to be referred. +* **`layer_state`** () has current on/off status of the layer on its each bit. + +Keymap has its state in two parameter**`default_layer`** indicates a base keymap layer(0-31) which is always valid and to be referred, **`keymap_stat`** is 16bit variable which has current on/off status of layers on its each bit. Keymap layer '0' is usually `default_layer` and which is the only valid layer and other layers is initially off after boot up firmware, though, you can configured them in `config.h`. To change `default_layer` will be useful when you switch key layout completely, say you want Colmak instead of Qwerty. @@ -67,97 +86,132 @@ On the other hand, you shall change `layer_state` to overlay base layer with som ### 0.2 Layer Precedence and Transparency Note that ***higher layer has higher priority on stack of layers***, namely firmware falls down from top layer to bottom to look up keycode. Once it spots keycode other than **`KC_TRNS`**(transparent) on a layer it stops searching and lower layers aren't referred. -You can place `KC_TRNS` on overlay layer changes just part of layout to fall back on lower or base layer. -Key with `KC_TRANS` doesn't has its own keycode and refers to lower valid layers for keycode, instead. +You can place `KC_TRANS` on overlay layer changes just part of layout to fall back on lower or base layer. +Key with `KC_TRANS` (`KC_TRNS` and `_______` are the alias) doesn't has its own keycode and refers to lower valid layers for keycode, instead. See example below. ### 0.3 Keymap Example -Keymap is **`keymaps[]`** C array in fact and you can define layers in it with **`KEYMAP()`** C macro and keycodes. To use complex actions you need to define `Fn` keycode in **`fn_actions[]`** array. +Keymap in this QMK is **`static const uint16_t PROGMEM keymaps[]`** C array in fact and you can define layers in it with **`KEYMAP()`** C macro and keycodes. To use complex actions you need to define `Fn` keycode in **`fn_actions[]`** array. It holds the 16 bit quantum keycode (action code). + +> Please note that keymap in the TMK, which QMK was forked from, is **`static const uint8_t PROGMEM keymaps[]`** C array which holds the 8 bit keycode (~USB HID usage code). This is a keymap example for [HHKB](http://en.wikipedia.org/wiki/Happy_Hacking_Keyboard) keyboard. -This example has three layers, 'Qwerty' as base layer, 'Cursor' and 'Mousekey'. +This example has three layers, 'QWERTY' as base layer, 'FN' and 'MOUSE'. + In this example, - `Fn0` is a **momentary layer switching** key, you can use keys on Cursor layer while holding the key. - - `Fn1` is a momentary layer switching key with tapping feature, you can get semicolon **';'** with taping the key and switch layers while holding the key. The word **'tap'** or **'tapping'** mean to press and release a key quickly. - - `Fn2` is a **toggle layer switch** key, you can stay switched layer after releasing the key unlike momentary switching. + `MO(layer)` is a **momentary layer switching** key. You can find other keymap definitions in file `keymap.c` located on project directories. +``` +/* + * dbroqua HHKB Layout + */ +#include "hhkb.h" - static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: Qwerty - * ,-----------------------------------------------------------. - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| - * |-----------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs| - * |-----------------------------------------------------------| - * |Contro| A| S| D| F| G| H| J| K| L|Fn1| '|Enter | - * |-----------------------------------------------------------| - * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn0| - * `-----------------------------------------------------------' - * |Gui|Alt |Space |Alt |Fn2| - * `-------------------------------------------' - */ - KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, \ - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSPC, \ - LCTL,A, S, D, F, G, H, J, K, L, FN1, QUOT,ENT, \ - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,RSFT,FN0, \ - LGUI,LALT, SPC, RALT,FN2), - /* 1: Cursor(HHKB mode) - * ,-----------------------------------------------------------. - * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Caps | | | | | | | |Psc|Slk|Pus|Up | |Backs| - * |-----------------------------------------------------------| - * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | - * |-----------------------------------------------------------| - * |Shift | | | | | | +| -|End|PgD|Dow|Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt |Space |Alt |Gui| - * `--------------------------------------------' - */ - KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, TRNS,BSPC, \ - LCTL,VOLD,VOLU,MUTE,TRNS,TRNS,PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ - LSFT,TRNS,TRNS,TRNS,TRNS,TRNS,PPLS,PMNS,END, PGDN,DOWN,RSFT,TRNS, \ - LGUI,LALT, SPC, RALT,RGUI), - /* 2: Mousekey - * ,-----------------------------------------------------------. - * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del| - * |-----------------------------------------------------------| - * |Tab | | | | | |MwL|MwD|MwU|MwR| | | |Backs| - * |-----------------------------------------------------------| - * |Contro| | | | | |McL|McD|McU|McR| | |Return | - * |-----------------------------------------------------------| - * |Shift | | | | |Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | - * `-----------------------------------------------------------' - * |Gui |Alt |Mb1 |Alt | | - * `--------------------------------------------' - * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel - */ - KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ - TAB, TRNS,TRNS,TRNS,TRNS,TRNS,WH_L,WH_D,WH_U,WH_R,TRNS,TRNS,TRNS,BSPC, \ - LCTL,TRNS,ACL0,ACL1,ACL2,TRNS,MS_L,MS_D,MS_U,MS_R,TRNS,QUOT,ENT, \ - LSFT,TRNS,TRNS,TRNS,TRNS,BTN3,BTN2,BTN1,BTN4,BTN5,SLSH,RSFT,TRNS, \ - LGUI,LALT, BTN1, RALT,TRNS), - }; +#define BASE 0 +#define FN 1 +#define MOUSE 2 - static const uint16_t PROGMEM fn_actions[] = { - ACTION_LAYER_MOMENTARY(1), // FN0 - ACTION_LAYER_TAP_KEY(2, KC_SCLN), // FN1 - ACTION_LAYER_TOGGLE(2), // FN2 - }; +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* BASE Level: Default Layer + * ,-----------------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + * |-----------------------------------------------------------------------------------------+ + * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Bksp | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl | A | S | D | F | G | H | J | K | L | ; | ' | Enter | + * |-----------------------------------------------------------------------------------------+ + * | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | fn | + * +-----------------------------------------------------------------------------------------+ + * | Gui | Alt | Space | AltGr |Mouse| + * `----------------------------------------------------------------´ + */ + [BASE] = KEYMAP( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_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_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(FN), \ + KC_LGUI, KC_LALT, /* */ KC_SPC, KC_RALT, MO(MOUSE) + ), + /* FN Layer + * ,-----------------------------------------------------------------------------------------. + * | Pwr | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F0 | F11 | F12 | Ins | Del| + * |-----------------------------------------------------------------------------------------+ + * | Caps | | | | | | | |PrtSc| Slck| Paus| Up | | | + * |-----------------------------------------------------------------------------------------+ + * | | Vol-| Vol+| Mute| | | * | / | Home| PgUp| Left |Right| | + * |-----------------------------------------------------------------------------------------+ + * | | Prev| Play| Next| | | + | - | End |PgDwn| Down| | | + * +-----------------------------------------------------------------------------------------+ + * | | | | Stop | | + * `----------------------------------------------------------------´ + */ + [FN] = KEYMAP( + KC_PWR, 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_INS, KC_DEL, \ + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, \ + KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_MSTP, KC_TRNS + ), + /* MOUSE Layer + * ,-----------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | WUp | | | | | | | | Btn1| Up | Btn2| | + * |-----------------------------------------------------------------------------------------+ + * | | WLt | WDn | WRt | | | | | | | Left |Right| | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | | | Btn3| Down| | | + * +-----------------------------------------------------------------------------------------+ + * | | | | | | + * `----------------------------------------------------------------´ + */ + [MOUSE] = KEYMAP( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_WH_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_TRNS, \ + KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_R, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN3, KC_MS_D, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ) +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + // MACRODOWN only works in this function + switch(id) { + case 0: + if (record->event.pressed) { + register_code(KC_RSFT); + } else { + unregister_code(KC_RSFT); + } + break; + } + return MACRO_NONE; +}; +``` ## 1. Keycode -See [`common/keycode.h`](../common/keycode.h) or keycode table below for the detail. Keycode is internal **8bit code** to indicate action performed on key in keymap. Keycode has `KC_` prefixed symbol respectively. Most of keycodes like `KC_A` have simple action registers key to host on press and unregister on release, while some of other keycodes has some special actions like `Fn` keys, Media control keys, System control keys and Mousekeys. +See [`tmk_core/common/keycode.h`](../tmk_core/common/keycode.h) or keycode table below for the detail. Keycode is internal **8bit code** to indicate action performed on key in keymap. Keycodes are based on [HID Usage Keyboard/Keypad Page(0x07)](http://www.usb.org/developers/hidpage/Hut1_12v2.pdf) plus special codes in the `0xA5-DF` range. - ***In `KEYMAP()` macro you should omit prefix part `KC_` of keycode to keep keymap compact.*** For example, just use `A` instead you place `KC_A` in `KEYMAP()`. Some keycodes has 4-letter **short name** in addition to descriptive name, you'll prefer short one in `KEYMAP()`. +Keycode has `KC_` prefixed symbol respectively. Most of keycodes like `KC_A` have simple action registers key to host on press and unregister on release, while some of other keycodes has some special actions like `Fn` keys, Media control keys, System control keys and Mousekeys. + +keymaps[] + +In `KEYMAP()` macro, TMK recommends you to keep prefix part `KC_` of keycode to keep keymap compact. For example, just use `A` instead you place `KC_A` in `KEYMAP()`. But this doesn't apply for QMK. + +The `KEYMAP()` macro defines correspondence between the physical key location to the electrical key connection. + +Some keycodes has 7-letter **short name** such as `KC_COMM` in addition to descriptive name `KC_COMMA`, you'll prefer short one in `KEYMAP()`. ### 1.0 Other key - `KC_NO` for no action @@ -192,7 +246,10 @@ There are 8 modifiers which has discrimination between left and right. - `KC_WSCH`, `KC_WHOM`, `KC_WBAK`, `KC_WFWD`, `KC_WSTP`, `KC_WREF`, `KC_WFAV` for web browser operation ### 1.5 Fn key -`KC_FNnn` are keycodes for `Fn` key which not given any actions at the beginning unlike most of keycodes has its own inborn action. To use these keycodes in `KEYMAP()` you need to assign action you want at first. Action of `Fn` key is defined in `fn_actions[]` and its index of the array is identical with number part of `KC_FNnn`. Thus `KC_FN0` keycode indicates the action defined in first element of the array. ***32 `Fn` keys can be defined at most.*** +You don't need to use this functionality under QMK since this is a backward compatibility functionality. Unlike TMK, you can write action code itself directly in **`static const uint16_t PROGMEM keymaps[]`** C array using `MO(layer)`, etc. + +`KC_FNnn` are keycodes for `Fn` key which not given any actions at the beginning unlike most of keycodes has its own inborn action. To use these keycodes in `KEYMAP()` you need to assign action you want at first. Action of `Fn` key is defined in `fn_actions[]` and its index of the array is identical with number part of `KC_FNnn`. Thus `KC_FN0` keycode indicates the action defined in first element of the array. ***Only 32 `Fn` keys can be defined at most.*** + ### 1.6 Keycode Table See keycode table in [`doc/keycode.txt`](./keycode.txt) for description of keycodes. @@ -584,15 +641,11 @@ Similar to layer tap toggle, this works as a momentary modifier when holding, bu ## 5. Legacy Keymap -This was used in prior version and still works due to legacy support code in `common/keymap.c`. Legacy keymap doesn't support many of features that new keymap offers. ***It is not recommended to use Legacy Keymap for new project.*** - -To enable Legacy Keymap support define this macro in `config.h`. - - #define USE_LEGACY_KEYMAP +In QMK, `tmk_core/common/keymap.c` is missing and its replacement `quantum/keymap_common.c` lacks Legacy Keymap support. Legacy Keymap uses two arrays `fn_layer[]` and `fn_keycode[]` to define Fn key. The index of arrays corresponds with postfix number of `Fn` key. Array `fn_layer[]` indicates destination layer to switch and `fn_keycode[]` has keycodes to send when tapping `Fn` key. -In following setting example, `Fn0`, `Fn1` and `Fn2` switch layer to 1, 2 and 2 respectively. `Fn2` registers `Space` key when tapping while `Fn0` and `Fn1` doesn't send any key. +In the following legacy keymap setting example, `Fn0`, `Fn1` and `Fn2` switch layer to 1, 2 and 2 respectively. `Fn2` registers `Space` key when tapping while `Fn0` and `Fn1` doesn't send any key. static const uint8_t PROGMEM fn_layer[] = { 1, // Fn0 @@ -606,6 +659,7 @@ In following setting example, `Fn0`, `Fn1` and `Fn2` switch layer to 1, 2 and 2 KC_SPC, // Fn2 }; +Under QMK, these can be realized using action code ACTION_LAYER_TAP_KEY(1, KC_NO), ACTION_LAYER_TAP_KEY(2, KC_NO), and ACTION_LAYER_TAP_KEY(2, KC_SPC) in the `keymaps` directly. ## 6. Terminology ***TBD*** From eedb767279df6c43763cbf37b8fe75cfc224c80c Mon Sep 17 00:00:00 2001 From: Travis La Marr Date: Wed, 29 Mar 2017 23:03:04 -0400 Subject: [PATCH 176/181] Add RN42 Bluetooth module support Added support for sending HID keycodes over the RN42/reflashed HC05 module. Tested on OS X and iOS. --- tmk_core/common.mk | 5 +++++ tmk_core/protocol/lufa.mk | 5 +++++ tmk_core/protocol/lufa/bluetooth.h | 16 +++++++++++++++- tmk_core/protocol/lufa/lufa.c | 19 ++++++++++++++++++- 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 47f6fc5719..3e0bd7dbc8 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -107,6 +107,11 @@ ifeq ($(strip $(BLUETOOTH)), AdafruitEZKey) TMK_COMMON_DEFS += -DMODULE_ADAFRUIT_EZKEY endif +ifeq ($(strip $(BLUETOOTH)), RN42) + TMK_COMMON_DEFS += -DBLUETOOTH_ENABLE + TMK_COMMON_DEFS += -DMODULE_RN42 +endif + ifeq ($(strip $(ONEHAND_ENABLE)), yes) TMK_COMMON_DEFS += -DONEHAND_ENABLE endif diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk index 5b15779723..7ce727dab0 100644 --- a/tmk_core/protocol/lufa.mk +++ b/tmk_core/protocol/lufa.mk @@ -36,6 +36,11 @@ ifeq ($(strip $(BLUETOOTH)), AdafruitEZKey) $(TMK_DIR)/protocol/serial_uart.c endif +ifeq ($(strip $(BLUETOOTH)), RN42) + LUFA_SRC += $(LUFA_DIR)/bluetooth.c \ + $(TMK_DIR)/protocol/serial_uart.c +endif + ifeq ($(strip $(VIRTSER_ENABLE)), yes) LUFA_SRC += $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/CDCClassDevice.c endif diff --git a/tmk_core/protocol/lufa/bluetooth.h b/tmk_core/protocol/lufa/bluetooth.h index 78ece1cd0b..f4b2f6f8b1 100644 --- a/tmk_core/protocol/lufa/bluetooth.h +++ b/tmk_core/protocol/lufa/bluetooth.h @@ -62,4 +62,18 @@ void bluefruit_serial_send(uint8_t data); (usage == AC_REFRESH ? 0x0000 : \ (usage == AC_BOOKMARKS ? 0x0000 : 0))))))))))))))))))) -#endif \ No newline at end of file +#define CONSUMER2RN42(usage) \ + (usage == AUDIO_MUTE ? 0x0040 : \ + (usage == AUDIO_VOL_UP ? 0x0010 : \ + (usage == AUDIO_VOL_DOWN ? 0x0020 : \ + (usage == TRANSPORT_NEXT_TRACK ? 0x0100 : \ + (usage == TRANSPORT_PREV_TRACK ? 0x0200 : \ + (usage == TRANSPORT_STOP ? 0x0400 : \ + (usage == TRANSPORT_STOP_EJECT ? 0x0800 : \ + (usage == TRANSPORT_PLAY_PAUSE ? 0x0080 : \ + (usage == AL_EMAIL ? 0x0200 : \ + (usage == AL_LOCAL_BROWSER ? 0x8000 : \ + (usage == AC_SEARCH ? 0x0400 : \ + (usage == AC_HOME ? 0x0100 : 0)))))))))))) + + #endif diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 60cba8d2a9..ae6129d1a2 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -606,6 +606,13 @@ static void send_keyboard(report_keyboard_t *report) if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) { #ifdef MODULE_ADAFRUIT_BLE adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys)); + #elif MODULE_RN42 + bluefruit_serial_send(0xFD); + bluefruit_serial_send(0x09); + bluefruit_serial_send(0x01); + for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { + bluefruit_serial_send(report->raw[i]); + } #else bluefruit_serial_send(0xFD); for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { @@ -726,6 +733,16 @@ static void send_consumer(uint16_t data) if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) { #ifdef MODULE_ADAFRUIT_BLE adafruit_ble_send_consumer_key(data, 0); + #elif MODULE_RN42 + static uint16_t last_data = 0; + if (data == last_data) return; + last_data = data; + uint16_t bitmap = CONSUMER2RN42(data); + bluefruit_serial_send(0xFD); + bluefruit_serial_send(0x03); + bluefruit_serial_send(0x03); + bluefruit_serial_send(bitmap&0xFF); + bluefruit_serial_send((bitmap>>8)&0xFF); #else static uint16_t last_data = 0; if (data == last_data) return; @@ -1132,7 +1149,7 @@ int main(void) // midi_send_noteoff(&midi_device, 0, 64, 127); #endif -#ifdef MODULE_ADAFRUIT_EZKEY +#if defined(MODULE_ADAFRUIT_EZKEY) || defined(MODULE_RN42) serial_init(); #endif From 200ae0c519c0bba927e417ec154783ce4fd306fe Mon Sep 17 00:00:00 2001 From: Callum Oakley Date: Thu, 30 Mar 2017 13:22:16 +0100 Subject: [PATCH 177/181] changed hotkey cluster to accomodate awkward software --- keyboards/planck/keymaps/callum/keymap.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/keyboards/planck/keymaps/callum/keymap.c b/keyboards/planck/keymaps/callum/keymap.c index aede27df75..d50b04319a 100644 --- a/keyboards/planck/keymaps/callum/keymap.c +++ b/keyboards/planck/keymaps/callum/keymap.c @@ -14,7 +14,7 @@ extern keymap_config_t keymap_config; #define _FUNC 4 #define ENDASH LALT(KC_MINS) #define POUND LALT(KC_3) -#define H(X) LALT(LCTL(X)) +#define H(X) RALT(X) enum planck_keycodes { MOVE = SAFE_RANGE, @@ -48,19 +48,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* MOVE * ,-----------------------------------------------------------------------------------. - * | H(3) | H(F1)| H(F2)| H(F3)| H(F4)| H(F5)| H(8) | Home | Up | End | H(7) | Esc | + * | H(F7)| H(F8)| H(6) | H(5) | H(4) | H(F9)|H(F10)| Home | Up | End | H(A) | Esc | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | H(4) | H(F6)| H(F7)| H(F8)| H(F9)|H(F10)| H(9) | Left | Down | Right| Caps | Del | + * | H(F3)| H(F4)| H(3) | H(2) | H(1) | H(F5)| H(F6)| Left | Down | Right| Caps | Del | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | |H(F11)|H(F12)| H(0) | H(1) | H(2) | H(A) | Pg Dn| Pg Up| H(5) | H(6) | | + * | | H(0) | H(9) | H(8) | H(7) | H(F1)| H(F2)| Pg Dn| Pg Up|H(F11)|H(F12)| | * |------+------+------+------+------+------+------+------+------+------+------+------| * | | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ [_MOVE] = { - {H(KC_3), H(KC_F1),H(KC_F2),H(KC_F3),H(KC_F4),H(KC_F5),H(KC_8), KC_HOME, KC_UP, KC_END, H(KC_7), KC_ESC }, - {H(KC_4), H(KC_F6),H(KC_F7),H(KC_F8),H(KC_F9),H(KC_F10),H(KC_9),KC_LEFT, KC_DOWN, KC_RGHT, KC_CAPS, KC_DEL }, - {_______, H(KC_F11),H(KC_F12),H(KC_0),H(KC_1),H(KC_2), H(KC_A), KC_PGDN, KC_PGUP, H(KC_5), H(KC_6), _______}, + {H(KC_F7),H(KC_F8),H(KC_6), H(KC_5), H(KC_4), H(KC_F9),H(KC_F10),KC_HOME,KC_UP, KC_END, H(KC_A), KC_ESC }, + {H(KC_F3),H(KC_F4),H(KC_3), H(KC_2), H(KC_1), H(KC_F5),H(KC_F6),KC_LEFT, KC_DOWN, KC_RGHT, KC_CAPS, KC_DEL }, + {_______, H(KC_0), H(KC_9), H(KC_8), H(KC_7), H(KC_F1),H(KC_F2),KC_PGDN,KC_PGUP,H(KC_F11),H(KC_F12),_______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} }, From b9225a28f253e1ec33b8c96798bfef4b8cc0918d Mon Sep 17 00:00:00 2001 From: Callum Oakley Date: Thu, 30 Mar 2017 14:20:18 +0100 Subject: [PATCH 178/181] changed hotkey cluster to accomodate awkward software... again --- keyboards/planck/keymaps/callum/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/planck/keymaps/callum/keymap.c b/keyboards/planck/keymaps/callum/keymap.c index d50b04319a..09063cb97f 100644 --- a/keyboards/planck/keymaps/callum/keymap.c +++ b/keyboards/planck/keymaps/callum/keymap.c @@ -14,7 +14,7 @@ extern keymap_config_t keymap_config; #define _FUNC 4 #define ENDASH LALT(KC_MINS) #define POUND LALT(KC_3) -#define H(X) RALT(X) +#define H(X) LALT(LCTL(X)) enum planck_keycodes { MOVE = SAFE_RANGE, From 7e54332890f4c376314f942574c6183c87a6e9c8 Mon Sep 17 00:00:00 2001 From: nielsenz Date: Thu, 30 Mar 2017 19:15:43 -0700 Subject: [PATCH 179/181] Pulling and pushing troubles --- quantum/process_keycode/process_unicode.c | 75 ------------------- .../process_keycode/process_unicode_common.c | 15 ++++ 2 files changed, 15 insertions(+), 75 deletions(-) diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c index cecfaeee9b..1f16b9bdb2 100644 --- a/quantum/process_keycode/process_unicode.c +++ b/quantum/process_keycode/process_unicode.c @@ -16,81 +16,6 @@ #include "process_unicode.h" #include "action_util.h" -static uint8_t input_mode; -static uint8_t first_flag = 0; - -__attribute__((weak)) -uint16_t hex_to_keycode(uint8_t hex) -{ - if (hex == 0x0) { - return KC_0; - } else if (hex < 0xA) { - return KC_1 + (hex - 0x1); - } else { - return KC_A + (hex - 0xA); - } -} - -void set_unicode_input_mode(uint8_t os_target) -{ - input_mode = os_target; - eeprom_update_byte(EECONFIG_UNICODEMODE, os_target); -} - -uint8_t get_unicode_input_mode(void) { - return input_mode; -} - -__attribute__((weak)) -void unicode_input_start (void) { - switch(input_mode) { - case UC_OSX: - register_code(KC_LALT); - break; - case UC_LNX: - register_code(KC_LCTL); - register_code(KC_LSFT); - register_code(KC_U); - unregister_code(KC_U); - unregister_code(KC_LSFT); - unregister_code(KC_LCTL); - break; - case UC_WIN: - register_code(KC_LALT); - register_code(KC_PPLS); - unregister_code(KC_PPLS); - break; - case UC_WINC: - register_code(KC_RALT); - unregister_code(KC_RALT); - register_code(KC_U); - unregister_code(KC_U); - } - wait_ms(UNICODE_TYPE_DELAY); -} - -__attribute__((weak)) -void unicode_input_finish (void) { - switch(input_mode) { - case UC_OSX: - case UC_WIN: - unregister_code(KC_LALT); - break; - case UC_LNX: - register_code(KC_SPC); - unregister_code(KC_SPC); - break; - } -} - -void register_hex(uint16_t hex) { - for(int i = 3; i >= 0; i--) { - uint8_t digit = ((hex >> (i*4)) & 0xF); - register_code(hex_to_keycode(digit)); - unregister_code(hex_to_keycode(digit)); - } -} - bool process_unicode(uint16_t keycode, keyrecord_t *record) { if (keycode > QK_UNICODE && record->event.pressed) { diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c index 6012b4f07e..b4d4231dbd 100644 --- a/quantum/process_keycode/process_unicode_common.c +++ b/quantum/process_keycode/process_unicode_common.c @@ -16,11 +16,14 @@ #include "process_unicode_common.h" +static uint8_t input_mode; +static uint8_t first_flag = 0; uint8_t mods; void set_unicode_input_mode(uint8_t os_target) { input_mode = os_target; + eeprom_update_byte(EECONFIG_UNICODEMODE, os_target); } uint8_t get_unicode_input_mode(void) { @@ -92,6 +95,18 @@ void unicode_input_finish (void) { if (mods & MOD_BIT(KC_RGUI)) register_code(KC_RGUI); } +__attribute__((weak)) +uint16_t hex_to_keycode(uint8_t hex) +{ + if (hex == 0x0) { + return KC_0; + } else if (hex < 0xA) { + return KC_1 + (hex - 0x1); + } else { + return KC_A + (hex - 0xA); + } +} + void register_hex(uint16_t hex) { for(int i = 3; i >= 0; i--) { uint8_t digit = ((hex >> (i*4)) & 0xF); From d1e66e2e0715c680a8da3216525b54fd8f2b671f Mon Sep 17 00:00:00 2001 From: nielsenz Date: Thu, 30 Mar 2017 20:10:34 -0700 Subject: [PATCH 180/181] Worked around some new Makefile issues. --- keyboards/planck/keymaps/zach/Makefile | 2 +- keyboards/planck/keymaps/zach/config.h | 2 +- .../keymaps/zach/zach_common_functions.c | 50 +++++++++---------- keyboards/preonic/keymaps/zach/Makefile | 4 +- keyboards/preonic/keymaps/zach/config.h | 2 +- .../keymaps/zach/zach_common_functions.c | 50 +++++++++---------- quantum/process_keycode/process_tap_dance.c | 2 + quantum/process_keycode/process_unicode.c | 1 + .../process_keycode/process_unicode_common.c | 1 - 9 files changed, 58 insertions(+), 56 deletions(-) diff --git a/keyboards/planck/keymaps/zach/Makefile b/keyboards/planck/keymaps/zach/Makefile index 977f1a9013..9d86fc81fc 100644 --- a/keyboards/planck/keymaps/zach/Makefile +++ b/keyboards/planck/keymaps/zach/Makefile @@ -17,7 +17,7 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 #VARIABLE_TRACE = no # Debug changes to variable values -UNICODE_ENABLE = yes # Unicode +UNICODE_ENABLE = no # Unicode (can't be used with unicodemap) UNICODEMAP_ENABLE = yes # Enable extended unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. diff --git a/keyboards/planck/keymaps/zach/config.h b/keyboards/planck/keymaps/zach/config.h index 7deb9ebfe8..d309c94935 100644 --- a/keyboards/planck/keymaps/zach/config.h +++ b/keyboards/planck/keymaps/zach/config.h @@ -77,7 +77,7 @@ along with this program. If not, see . /* disable action features */ //#define NO_ACTION_LAYER #define NO_ACTION_TAPPING -#define NO_ACTION_ONESHOT +//#define NO_ACTION_ONESHOT #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION #define PREVENT_STUCK_MODIFIERS diff --git a/keyboards/planck/keymaps/zach/zach_common_functions.c b/keyboards/planck/keymaps/zach/zach_common_functions.c index b77f2b2418..2c47b22896 100644 --- a/keyboards/planck/keymaps/zach/zach_common_functions.c +++ b/keyboards/planck/keymaps/zach/zach_common_functions.c @@ -141,31 +141,31 @@ qk_tap_dance_action_t tap_dance_actions[] = { }; #endif -#ifdef UNICODE_ENABLE +//#ifdef UNICODE_ENABLE // Unicode shortcuts -#define IBANG UC(0x203D) -#define RAROW UC(0x2192) -#define LAROW UC(0x2190) -#define DEGREE UC(0x00B0) -#define OMEGA UC(0x03A9) -#define WOMEGA UC(0x03C9) -#define MICRO UC(0x00B5) -#define PLUMIN UC(0x00B1) -#define SUPA2 UC(0x00B2) -#define ROMAN1 UC(0x2160) -#define ROMAN2 UC(0x2161) -#define ROMAN3 UC(0x2162) -#define ROMAN4 UC(0x2163) -#define ROMAN5 UC(0x2164) -#define ROMAN6 UC(0x2165) -#define ROMAN7 UC(0x2166) -#define roman1 UC(0x2170) -#define roman2 UC(0x2171) -#define roman3 UC(0x2172) -#define roman4 UC(0x2173) -#define roman5 UC(0x2174) -#define roman6 UC(0x2175) -#define roman7 UC(0x2176) +#define IBANG X(0x203D) +#define RAROW X(0x2192) +#define LAROW X(0x2190) +#define DEGREE X(0x00B0) +#define OMEGA X(0x03A9) +#define WOMEGA X(0x03C9) +#define MICRO X(0x00B5) +#define PLUMIN X(0x00B1) +#define SUPA2 X(0x00B2) +#define ROMAN1 X(0x2160) +#define ROMAN2 X(0x2161) +#define ROMAN3 X(0x2162) +#define ROMAN4 X(0x2163) +#define ROMAN5 X(0x2164) +#define ROMAN6 X(0x2165) +#define ROMAN7 X(0x2166) +#define roman1 X(0x2170) +#define roman2 X(0x2171) +#define roman3 X(0x2172) +#define roman4 X(0x2173) +#define roman5 X(0x2174) +#define roman6 X(0x2175) +#define roman7 X(0x2176) #ifdef UNICODEMAP_ENABLE // For Unicode characters larger than 0x8000. Send with X() enum Ext_Unicode{ @@ -192,7 +192,7 @@ const uint32_t PROGMEM unicode_map[] = { #define TMBL X(TUMBLER) #endif -#endif +//#endif static uint16_t key_timer; static uint8_t caps_status = 0; diff --git a/keyboards/preonic/keymaps/zach/Makefile b/keyboards/preonic/keymaps/zach/Makefile index f0a84abac4..eebf413495 100644 --- a/keyboards/preonic/keymaps/zach/Makefile +++ b/keyboards/preonic/keymaps/zach/Makefile @@ -17,8 +17,8 @@ BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 #VARIABLE_TRACE = no # Debug changes to variable values -UNICODE_ENABLE = yes # Unicode -UNICODEMAP_ENABLE = no # Enable extended unicode +UNICODE_ENABLE = no # Unicode +UNICODEMAP_ENABLE = yes # Enable extended unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/preonic/keymaps/zach/config.h b/keyboards/preonic/keymaps/zach/config.h index 59959524fa..bb8913c7af 100644 --- a/keyboards/preonic/keymaps/zach/config.h +++ b/keyboards/preonic/keymaps/zach/config.h @@ -84,7 +84,7 @@ along with this program. If not, see . /* disable action features */ //#define NO_ACTION_LAYER #define NO_ACTION_TAPPING -#define NO_ACTION_ONESHOT +//#define NO_ACTION_ONESHOT #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION #define PREVENT_STUCK_MODIFIERS diff --git a/keyboards/preonic/keymaps/zach/zach_common_functions.c b/keyboards/preonic/keymaps/zach/zach_common_functions.c index b77f2b2418..2c47b22896 100644 --- a/keyboards/preonic/keymaps/zach/zach_common_functions.c +++ b/keyboards/preonic/keymaps/zach/zach_common_functions.c @@ -141,31 +141,31 @@ qk_tap_dance_action_t tap_dance_actions[] = { }; #endif -#ifdef UNICODE_ENABLE +//#ifdef UNICODE_ENABLE // Unicode shortcuts -#define IBANG UC(0x203D) -#define RAROW UC(0x2192) -#define LAROW UC(0x2190) -#define DEGREE UC(0x00B0) -#define OMEGA UC(0x03A9) -#define WOMEGA UC(0x03C9) -#define MICRO UC(0x00B5) -#define PLUMIN UC(0x00B1) -#define SUPA2 UC(0x00B2) -#define ROMAN1 UC(0x2160) -#define ROMAN2 UC(0x2161) -#define ROMAN3 UC(0x2162) -#define ROMAN4 UC(0x2163) -#define ROMAN5 UC(0x2164) -#define ROMAN6 UC(0x2165) -#define ROMAN7 UC(0x2166) -#define roman1 UC(0x2170) -#define roman2 UC(0x2171) -#define roman3 UC(0x2172) -#define roman4 UC(0x2173) -#define roman5 UC(0x2174) -#define roman6 UC(0x2175) -#define roman7 UC(0x2176) +#define IBANG X(0x203D) +#define RAROW X(0x2192) +#define LAROW X(0x2190) +#define DEGREE X(0x00B0) +#define OMEGA X(0x03A9) +#define WOMEGA X(0x03C9) +#define MICRO X(0x00B5) +#define PLUMIN X(0x00B1) +#define SUPA2 X(0x00B2) +#define ROMAN1 X(0x2160) +#define ROMAN2 X(0x2161) +#define ROMAN3 X(0x2162) +#define ROMAN4 X(0x2163) +#define ROMAN5 X(0x2164) +#define ROMAN6 X(0x2165) +#define ROMAN7 X(0x2166) +#define roman1 X(0x2170) +#define roman2 X(0x2171) +#define roman3 X(0x2172) +#define roman4 X(0x2173) +#define roman5 X(0x2174) +#define roman6 X(0x2175) +#define roman7 X(0x2176) #ifdef UNICODEMAP_ENABLE // For Unicode characters larger than 0x8000. Send with X() enum Ext_Unicode{ @@ -192,7 +192,7 @@ const uint32_t PROGMEM unicode_map[] = { #define TMBL X(TUMBLER) #endif -#endif +//#endif static uint16_t key_timer; static uint8_t caps_status = 0; diff --git a/quantum/process_keycode/process_tap_dance.c b/quantum/process_keycode/process_tap_dance.c index 68c8425bb4..b807ec3c30 100644 --- a/quantum/process_keycode/process_tap_dance.c +++ b/quantum/process_keycode/process_tap_dance.c @@ -16,6 +16,8 @@ #include "quantum.h" #include "action_tapping.h" +uint8_t get_oneshot_mods(void); + static uint16_t last_td; static int8_t highest_td = -1; diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c index 1f16b9bdb2..678a15234d 100644 --- a/quantum/process_keycode/process_unicode.c +++ b/quantum/process_keycode/process_unicode.c @@ -16,6 +16,7 @@ #include "process_unicode.h" #include "action_util.h" +static uint8_t first_flag = 0; bool process_unicode(uint16_t keycode, keyrecord_t *record) { if (keycode > QK_UNICODE && record->event.pressed) { diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c index b4d4231dbd..1dbdec3e71 100644 --- a/quantum/process_keycode/process_unicode_common.c +++ b/quantum/process_keycode/process_unicode_common.c @@ -17,7 +17,6 @@ #include "process_unicode_common.h" static uint8_t input_mode; -static uint8_t first_flag = 0; uint8_t mods; void set_unicode_input_mode(uint8_t os_target) From caab4d7e4576c10e45becea4a8fc69a7c9c064e0 Mon Sep 17 00:00:00 2001 From: Osamu Aoki Date: Sat, 1 Apr 2017 01:39:00 +0900 Subject: [PATCH 181/181] Fix typo --- doc/keymap.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/keymap.md b/doc/keymap.md index bc7809905a..3ea138ea8f 100644 --- a/doc/keymap.md +++ b/doc/keymap.md @@ -6,12 +6,12 @@ QMK is based on TMK. Understanding the essential changes made should help you ## TMK vs. QMK -| Firmware |TMK |QMK | -|-------------------------------------------------|-----------------------|-------------------------| -| Maintainer |hasu |Jack Humbert et al. | -| Build path customization | `TMK_DIR = ...` | `include .../Makefile` | -| `keymaps` data | 3D array of `uint8_t` holding **keycode** | 3D array of `uint16_t` holding **action code** | -| `fn_actions` data | 1D array of `uint16_t` holding **action code** | 3D array of `uint16_t` holding **action code** | +| Firmware |TMK |QMK | +|---------------------------|-----------------------|-------------------------| +| Maintainer |hasu |Jack Humbert et al. | +| Build path customization | `TMK_DIR = ...` | `include .../Makefile` | +| `keymaps` data | 3D array of `uint8_t` holding **keycode** | 3D array of `uint16_t` holding **action code** | +| `fn_actions` data | 1D array of `uint16_t` holding **action code** | 1D array of `uint16_t` holding **action code** | Since QMK is based on TMK and uses major portion of TMK code as is, understanding the essential changes made should help you understand the code. @@ -45,7 +45,7 @@ Keymap layer has its state in two 32 bit parameters: * **`default_layer_state`** indicates a base keymap layer(0-31) which is always valid and to be referred. * **`layer_state`** () has current on/off status of the layer on its each bit. -Keymap has its state in two parameter**`default_layer`** indicates a base keymap layer(0-31) which is always valid and to be referred, **`keymap_stat`** is 16bit variable which has current on/off status of layers on its each bit. +Keymap has its state in two parameter **`default_layer`** indicates a base keymap layer(0-31) which is always valid and to be referred, **`keymap_stat`** is 16bit variable which has current on/off status of layers on its each bit. Keymap layer '0' is usually `default_layer` and which is the only valid layer and other layers is initially off after boot up firmware, though, you can configured them in `config.h`. To change `default_layer` will be useful when you switch key layout completely, say you want Colmak instead of Qwerty.